我正在研究内核代码中的UART驱动程序,我想知道,谁首先进入图片,device_register()还是driver_register()调用?
对于它们之间的差异,请遵循这。
在UART探测中,我们调用
uart_register_driver(struct uart_driver *drv)在成功注册后,
uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)请详细解释一下。
发布于 2016-02-05 14:08:41
这实际上是两个问题,但我会尽量解决这两个问题。
谁首先出现在图片中,
device_register()还是driver_register()调用?
正如它在文档/驱动程序-模型/binding.txt中指出的那样,您调用device_register()和driver_register()的特定顺序并不重要。
device_register()将设备添加到设备列表中,并在驱动程序列表上进行迭代以找到匹配项。driver_register()将驱动程序添加到驱动程序列表中,并在设备列表上进行迭代以找到匹配项。一旦找到匹配,就会绑定匹配的设备和驱动程序,并在驱动程序代码中调用相应的探测函数。
如果您仍然好奇哪一个是第一个(因为这并不重要) --通常是device_register(),因为设备通常是在从core_initcall到arch_initcall的内部调用中注册的,而驱动程序通常是在device_initcall上注册的,后者随后执行。
另请参阅:
uart_register_driver与platform_driver_register的差异?
正如您注意到的,一个设备有两个驱动程序(平台驱动程序和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_*函数)。因此,有两个不同的API:平台驱动程序和UART驱动程序。
https://stackoverflow.com/questions/35220964
复制相似问题