modprobe: can‘t load module Device or resource busy加载驱动时出现xxx is already registered, aborting【已解决】

真是太太太不容易了,这个问题找了我整整一天。本来就不太熟悉,网上还没有人遇到和我一样的问题,只能慢慢摸索。
问题的开始是这样的。加载驱动的时候出现Unable to request touchscreen IRQ
但是这不是API函数来申请的吗,怎么会申请失败呢?我就很疑惑
请添加图片描述
于是定位到了我写的驱动代码devm_request_threaded_irq()函数,这怎么会出错呢?但是设备树是匹配成功的。于是就去找为什么中断号申请失败,网上也很少有相应的分享错误信息。
modprobe: can‘t load module Device or resource busy加载驱动时出现xxx is already registered, aborting【已解决】_第1张图片
期间一个一个字对比过官方例程,代码写的是没有问题
也重装过linux内核、修改过设备树、修改过根文件,每次加载这个多点电容触摸驱动的时候都会出现以下的问题


Error: Driver 'edt_ft5x06' is already registered, aborting...
Error: Driver 'edt_ft5x06' is already registered, aborting...
modprobe: can't load module ft5426.ko (ft5426.ko): Device or resource busy

这里显示edt_ft5x06设备正在忙碌,于是继续网上查阅,这两篇文章给了我一些启发
请大家帮帮忙:关于申请中断号失败问题?
linux下中断号分配和申请的问题

于是在开发板上输入cat /proc/interrupts可以查看当前的中断
modprobe: can‘t load module Device or resource busy加载驱动时出现xxx is already registered, aborting【已解决】_第2张图片
上图就解释了为什么会出现modprobe: can't load module ft5426.ko (ft5426.ko): Device or resource busy了,因为中断本身就存在了!!!怪不得忙碌中,所以目标就是把它给杀掉。

有时候修改驱动代码找问题的时候,会出现下面什么错误信息都没有打印出,但是也是加载驱动成功,只不过不是我所想要的成功,因为并没有设备树匹配成功的信息!!!modprobe: can‘t load module Device or resource busy加载驱动时出现xxx is already registered, aborting【已解决】_第3张图片

解决办法:

1.首先在根文件系统中查看中断 命令是:cat /proc/interrupts 此时可以看到当前的中断

2.检查设备树中的compatible属性,并且修改完设备树的时候,再次输入cat /proc/interrupts检查中断是否还存在edt_ft5x06这个中断,我是修改了设备树的compatible后edt_ft5x06这个中断便消失了

3.之所以出现xxx is already registered, aborting,主要还是因为驱动代码中的设备结构体的.name出现了问题
例如此时我的设备结构体是这样的

/*i2c_driver*/
static struct i2c_driver ft5x06_driver = {
	.probe = ft5x06_probe,
	.remove = ft5x06_remove,
	.driver = {
		.owner = THIS_MODULE,
		.name = "edt_ft5x06",
		.of_match_table = of_match_ptr(ft5x06_of_match),
	},
	.id_table = ft5x06_id,
};

这代码确实没有问题,也是正点原子官方的代码,但是在我实际操作的时候就会出现问题
此时应该修改设备结构体的.name
例如我修改成这样,把.name修改了

/*i2c_driver*/
static struct i2c_driver ft5x06_driver = {
	.probe = ft5x06_probe,
	.remove = ft5x06_remove,
	.driver = {
		.owner = THIS_MODULE,
		.name = "ft5x06",
		.of_match_table = of_match_ptr(ft5x06_of_match),
	},
	.id_table = ft5x06_id,
};

重新加载驱动、问题便解决了,如果再次把.name修改回"edt_ft5x06",就会依旧报原来的错误提示,具体原因我也不清楚,只不过这是我调试一天才调试出的问题,特此记录一下。

你可能感兴趣的:(Linux,驱动开发,驱动开发,linux,c#,c语言,centos)