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() or driver_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 and platform_driver_register?



    如您所见,一台设备有 2 个驱动程序(平台驱动程序和 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 = <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 驱动程序。


    标签:linux
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号