我正在学习内核代码中的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)
请详细解释这个。
我正在学习内核代码中的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)
device_register()
和driver_register()
的顺序并不重要。
device_register()
将设备添加到设备列表中,并遍历驱动程序列表以查找匹配项;driver_register()
将驱动程序添加到驱动程序列表中,并遍历设备列表以查找匹配项。一旦找到匹配项,匹配的设备和驱动程序将被绑定,并在驱动程序代码中调用相应的探测函数。device_register()
,因为设备通常在core_initcall
到arch_initcall
的initcalls上注册,而驱动程序通常在稍后执行的device_initcall
上注册。uart_register_driver
和platform_driver_register
之间有什么区别?让我们使用 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中断等)。uart_*
函数)。因此有两种不同的API:平台驱动程序和UART驱动程序。