Linux kernel uart\ U寄存器\驱动程序和平台\驱动程序\寄存器之间的差异?
我正在研究内核代码中的UART驱动程序,想知道谁是第一个进入画面的,Linux kernel uart\ U寄存器\驱动程序和平台\驱动程序\寄存器之间的差异?,linux-kernel,serial-port,kernel,linux-device-driver,uart,Linux Kernel,Serial Port,Kernel,Linux Device Driver,Uart,我正在研究内核代码中的UART驱动程序,想知道谁是第一个进入画面的,device\u register()或Driver\u register()调用 他们之间的区别如下 在UART探测中,我们调用 uart\u寄存器\u驱动程序(结构uart\u驱动程序*drv) 成功注册后, uart\u添加一个端口(结构uart\u驱动程序*drv,结构uart\u端口*uport) 请详细解释。这实际上是两个问题,但我将尝试解决这两个问题 谁第一个进入画面,device\u register()或d
device\u register()
或Driver\u register()
调用
他们之间的区别如下
在UART探测中,我们调用
uart\u寄存器\u驱动程序(结构uart\u驱动程序*drv)
成功注册后,
uart\u添加一个端口(结构uart\u驱动程序*drv,结构uart\u端口*uport)
请详细解释。这实际上是两个问题,但我将尝试解决这两个问题 谁第一个进入画面,
device\u register()
或driver\u register()
call
如中所述,调用device\u register()
和driver\u register()
的顺序并不重要
将设备添加到设备列表,并迭代驱动程序列表以查找匹配项device\u register()
driver\u register()
device\u register()
,因为设备通常在从core\u initcall
到arch\u initcall
的initcall上注册,而驱动程序通常在device\u initcall
上注册,后来执行的
另见:
[1]
[2]
[3]
uart\u寄存器\u驱动器
和平台\u驱动器\u寄存器
之间的区别
正如您所注意到的,一个设备有两个驱动程序(平台驱动程序和UART驱动程序)。但不要让这让您感到困惑:这只是一个(事实上)驱动程序中使用的两个驱动程序API。解释很简单:UART驱动程序API只是缺少我们需要的一些功能,而这个功能是在平台驱动程序API中实现的。以下是常规tty驱动程序中每个API的职责:
- 平台驱动程序API用于三个方面:
- 将设备(在设备树文件中描述)与驱动程序匹配;这样,探测功能将由平台驱动程序框架为我们执行
- 获取设备信息(从设备树读取)
- 装卸电源管理(PM)操作(暂停/恢复)
- UART驱动程序API:处理实际的UART功能:读、写等
drivers/tty/serial/omap serial.c
作为驱动程序参考,使用arch/arm/boot/dts/omap5.dtsi
作为设备参考。例如,我们在设备树中描述了下一个设备:
uart1:serial@4806a000 {
compatible=“ti,omap4 uart”;
reg=;
中断=;
ti,hwmods=“uart1”;
时钟频率=;
};
它将通过“ti,omap4 uart”
字符串与omap serial.c
中的平台驱动程序相匹配(您可以在驱动程序代码中找到它)。然后,使用该平台驱动程序,我们可以从上面的设备树节点读取属性,并将它们用于一些平台工作(设置时钟、处理UART中断等)
但是为了将我们的设备公开为标准的TTY设备,我们需要使用UART框架(所有那些UART.*
函数)。因此有两种不同的API:平台驱动程序和UART驱动程序