Linux kernel uart\ U寄存器\驱动程序和平台\驱动程序\寄存器之间的差异?

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

我正在研究内核代码中的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()
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驱动程序