uart_register_driver和platform_driver_register有什么区别?

4

我正在学习内核代码中的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)

请详细解释这个。
1个回答

6
实际上这是两个问题,但我将尝试回答它们。
Documentation/driver-model/binding.txt所述,调用device_register()driver_register()的顺序并不重要。 device_register()将设备添加到设备列表中,并遍历驱动程序列表以查找匹配项;driver_register()将驱动程序添加到驱动程序列表中,并遍历设备列表以查找匹配项。一旦找到匹配项,匹配的设备和驱动程序将被绑定,并在驱动程序代码中调用相应的探测函数。
如果您仍然想知道哪个先被调用(因为没有关系),通常是device_register(),因为设备通常在core_initcallarch_initcall的initcalls上注册,而驱动程序通常在稍后执行的device_initcall上注册。
另请参见:
[1] 平台设备从哪里获得名称 [2] 谁调用驱动程序的探测函数 [3] module_init() vs. core_initcall() vs. early_initcall() uart_register_driverplatform_driver_register之间有什么区别?
正如您注意到的,一个设备有两个驱动程序(平台驱动程序和UART驱动程序)。但是不要让这使您困惑:这些只是在一个(实际上)驱动程序中使用的两个驱动程序API。解释很简单:UART驱动程序API缺少我们需要的一些功能,这些功能在平台驱动程序API中实现。以下是常规tty驱动程序中每个API的职责: 平台驱动程序API用于三件事情:
1.将设备(在设备树文件中描述)与驱动程序匹配;这样,平台驱动程序框架将通过probe函数为我们执行操作。
2.获取设备信息(从设备树中读取)。
3.处理电源管理(PM)操作(挂起/恢复)。 UART驱动程序API:处理实际的UART功能:读、写等。

让我们使用 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_*函数)。因此有两种不同的API:平台驱动程序和UART驱动程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接