linux8250驱动支持5路串口,linux设备驱动之8250串口驱动.doc

本文深入剖析了Linux kernel 2.6.25中的8250串口驱动初始化过程,主要关注serial8250_init()函数。通过注册uart_driver、初始化中断列表及设备节点,实现串口驱动的加载。同时,介绍了UART_NR表示的串口数量及其默认配置。代码解析详细,有助于理解专业驱动代码编写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

linux设备驱动之8250串口驱动

一:前言

前一段时间自己实践了一下8250芯片串口驱动的编写。今天就在此基础上分析一下linux kernel自带的串口驱动。毕竟只有对比专业的驱动代码才能更好的进步,同以往一样,基于linix kernel2.6.25.相应驱动代码位于:linux-2.6.25/drivers/serial/8250.c。

二:8250串口驱动初始化

相应的初始化函数为serial8250_init().代码如下:

static int __init serial8250_init(void)

{

int ret, i;

if (nr_uarts > UART_NR)

nr_uarts = UART_NR;

printk(KERN_INFO "Serial: 8250/16550 driver $Revision: 1.90 $ "

"%d ports, IRQ sharing %sabled\n", nr_uarts,

share_irqs ? "en" : "dis");

for (i = 0; i < NR_IRQS; i++)

spin_lock_init(&irq_lists[i].lock);

ret = uart_register_driver(&serial8250_reg);

if (ret)

goto out;

serial8250_isa_devs = platform_device_alloc("serial8250",

PLAT8250_DEV_LEGACY);

if (!serial8250_isa_devs) {

ret = -ENOMEM;

goto unreg_uart_drv;

}

ret = platform_device_add(serial8250_isa_devs);

if (ret)

goto put_dev;

serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev);

ret = platform_driver_register(&serial8250_isa_driver);

if (ret == 0)

goto out;

platform_device_del(serial8250_isa_devs);

put_dev:

platform_device_put(serial8250_isa_devs);

unreg_uart_drv:

uart_unregister_driver(&serial8250_reg);

out:

return ret;

}

这段代码涉及到的知识要求,如platform ,uart等我们在之前都已经做过详细的分析。这里不再重复。在代码中UART_NR:表示串口的个数。这个参数在编译内核的时候可以自己配置,默认为32。

我们按照代码中的流程一步一步进行研究。

1:注册uart_driver.

对应uart-driver的结构为serial8250_reg.定义如下:

static struct uart_driver serial8250_reg = {

.owner = THIS_MODULE,

.driver_name = "serial",

.dev_name = "ttyS",

.major = TTY_MAJOR,

.minor = 64,

.nr = UART_NR,

.cons = SERIAL8250_CONSOLE,

};

TTY_MAJOR定义如下:

#define TTY_MAJOR 4

从上面可以看出。串口对应的设备节点为/dev/ ttyS0 ~ /dev/ ttyS0(UART_NR).设备节点号为(4。64)起始的UART_NR个节点..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值