驱动和设备如何配对?
无论是向内核注册设备还是驱动,最终均会出发一个设备和驱动配对的过程,今天把这个如何配对的过程详细的解析下:
背景
遇到了一个问题,内核启动到usb初始化控制器时,单板卡死,触发了3秒看门狗复位了。修改代码关闭看门狗,重启之后,依然卡死,但时不会重启了。怀疑是ubs控制器初始化失败,影响到了时钟中断。这里具体不讲解这个故障,在解决这个故障的时候,发现dts中并没有和ubs驱动相匹配的节点,但是usb驱动依然被调用了probe,probe时,写ubs控制器的内存引发故障。所以,本文主要思考dts节点和驱动如何匹配的问题,对于写内存失败,不解析。
ubs控制器的dts节点
usb@210000 {
#address-cells = <0x1>;
#size-cells = <0x0>;
compatible = "fsl-usb2-mph-v2.5", "fsl-usb2-mph";
dr_mode = "host";
fsl,iommu-parent = <0x32>;
fsl,liodn = <0x229>;
fsl,liodn-reg = <0x33 0x520>;
fsl,usb-erratum-a007792;
interrupts = <0x2c 0x2 0x0 0x0>;
phy_type = "utmi_dual";
port0;
reg = <0x210000 0x1000>;
sleep = <0x10 0x20>;
};
usb驱动初始化
内核驱动、设备初始化流程:
[ 2.164234] Call Trace:
[ 2.166700] [c0000000790df610] [c0000000008c2d88] .dump_stack+0xac/0xec (unreliable)
[ 2.174487] [c0000000790df6a0] [c00000000069f730] .fsl_ehci_drv_probe+0x2c/0x4f0
[ 2.181919] [c0000000790df740] [c000000000461f94] .platform_drv_probe+0x74/0xf8
[ 2.189259] [c0000000790df7d0] [c00000000045fe3c] .driver_probe_device+0x2e8/0x388
[ 2.196860] [c0000000790df870] [c00000000045ffd0] .__driver_attach+0xf4/0xf8
[ 2.203937] [c0000000790df900] [c00000000045d49c] .bus_for_each_dev+0x84/0xe4
[ 2.211101] [c0000000790df9a0] [c00000000045f5f0] .driver_attach+0x24/0x38
[ 2.218004] [c0000000790dfa10] [c00000000045f028] .bus_add_driver+0x254/0x2d0
[ 2.225168] [c0000000790dfab0] [c0000000004608b4] .driver_register+0x8c/0x158
[ 2.232333] [c0000000790dfb30] [c000000000461e94] .__platform_driver_register+0x48/0x5c
[ 2.240372] [c0000000790dfba0] [c000000000c26658] .ehci_fsl_init+0x90/0xc4
[ 2.247279] [c0000000790dfc20] [c000000000001958] .do_one_initcall+0x5c/0x1d0
[ 2.254449] [c0000000790dfd00] [c000000000be2eb8] .kernel_init_freeable+0x238/0x310
[ 2

本文深入解析Linux内核中驱动与设备配对的过程,详细介绍了通过compatible字符串、OF风格匹配、ACPI风格匹配等五种方式判断驱动与设备是否配对。并以USB控制器为例,展示了实际的匹配流程。
2万+

被折叠的 条评论
为什么被折叠?



