内核驱动和设备匹配函数platform_match(struct device *dev, struct device_driver *drv) 解析

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

驱动和设备如何配对?

无论是向内核注册设备还是驱动,最终均会出发一个设备和驱动配对的过程,今天把这个如何配对的过程详细的解析下:

背景

遇到了一个问题,内核启动到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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值