linux-kernel之uart_register_driver 和 platform_driver_register 的区别
JustinYoung
阅读:47
2024-09-07 23:24:14
评论:0
我正在研究内核代码中的UART驱动程序,想知道谁最先出现,device_register()
或 driver_register()
称呼?
对于它们之间的区别,请遵循 this .
在 UART 探测中,我们调用
uart_register_driver(struct uart_driver *drv)
并且注册成功后,
uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
请详细说明这一点。
请您参考如下方法:
这实际上是两个问题,但我会尝试解决这两个问题。
who first comes into picture,
device_register()
ordriver_register()
call?
正如 Documentation/driver-model/binding.txt 中所述,您调用
device_register()
的特定顺序并不重要和
driver_register()
.
device_register()
将设备添加到设备列表并遍历 驱动列表寻找匹配driver_register()
将驱动程序添加到驱动程序列表并迭代 设备列表寻找匹配一旦找到匹配,匹配的设备和驱动程序被绑定(bind),并在驱动程序代码中调用相应的探测函数。
如果您仍然好奇首先调用哪个(因为这无关紧要)- 通常是
device_register()
, 因为设备通常是在来自
core_initcall
的初始化调用上注册的至
arch_initcall
,并且驱动程序通常在
device_initcall
上注册,稍后执行。
也可以看看:
[1] From where platform device gets it name
[2] Who calls the probe() of driver
[3] module_init() vs. core_initcall() vs. early_initcall()
Difference between
uart_register_driver
andplatform_driver_register
?
如您所见,一台设备有 2 个驱动程序(平台驱动程序和 UART 驱动程序)。但是不要让这让您感到困惑:这些只是在一个(实际上)驱动程序中使用的两个驱动程序 API。解释很简单:UART驱动API只是缺少一些我们需要的功能,而这个功能是在平台驱动API中实现的。以下是常规 tty 驱动程序中每个 API 的职责:
让我们使用
drivers/tty/serial/omap-serial.c
供驱动引用和
arch/arm/boot/dts/omap5.dtsi
供设备引用。例如,假设我们在设备树中描述了下一个设备:
uart1: serial@4806a000 {
compatible = "ti,omap4-uart";
reg = <0x4806a000 0x100>;
interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
ti,hwmods = "uart1";
clock-frequency = <48000000>;
};
将与
omap-serial.c
中的平台驱动匹配通过
"ti,omap4-uart"
字符串(您可以在驱动程序代码中找到它)。然后,使用该平台驱动程序,我们可以从上面的设备树节点读取属性,并将它们用于一些平台内容(设置时钟、处理 UART 中断等)。
但是为了将我们的设备公开为标准 TTY 设备,我们需要使用 UART 框架(所有这些
uart_*
函数)。因此有 2 个不同的 API:平台驱动程序和 UART 驱动程序。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。