打印

关于linxu i2c设备驱动的请教

[复制链接]
1364|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sinc_mark|  楼主 | 2013-11-29 10:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟刚开始写I2C驱动,刚刚写了一个mpu6050的设备驱动,编译后加载进内核(2.6.38),加载后,在系统的/sys/下可以看到设备的节点,但卸载驱动后,相应的节点不消失,且再次加载后,出现以下错误:
i2c i2c-0: Failed to register i2c client mpu6050 at 0x68 (-16),0x68是我的设备地址,这句话的意思应该是在卸载的时候i2c_client没清除,我想问的问题是:
1:在正常的情况下,卸载内核模块后,相应的设备节点是不是应该消失?
2:我现在的情况应该怎么解决?有经验的请给些指导,谢谢!

相关帖子

沙发
sinc_mark|  楼主 | 2013-11-29 10:03 | 只看该作者
自己顶一个,请知道的指导,谢谢!

使用特权

评论回复
板凳
sinc_mark|  楼主 | 2013-12-4 09:19 | 只看该作者
结贴吧,现在只能是insmod 一次,调试,不行就重启系统之后再加载!
还是不知道这样的情况是不是正常的!

使用特权

评论回复
地板
rocdove| | 2013-12-13 23:27 | 只看该作者
应该是你代码,里面没有写删除相关的代码吧。你可以手动删除节点,如果设备号还在,也的删除,然后再安装就应该没事了。

使用特权

评论回复
5
dong_abc| | 2013-12-14 01:56 | 只看该作者
在编写驱动程序的时候有时候会出现这种情况,模块加载之后不能卸载或卸载之后不能在加载,cat /proc/devices 后发现设备还占用着设备号,这种情况下,再次加载驱动模块肯定不会成功,必须重新启动才可以解决。最近仔细看书后发现自己在驱动程序的卸载函数中少写了两个函数调用,以至于在加载模块的时候申请或添加的设备没有被释放或删除。

  解决方案:

  第一步、在/lib/modules/目录中建立与当前内核版本号一致的目录 如 uname -r 得到 2.6.31.6则mkdir -p /lib/modules/2.6.31.6 否则会出现“rmmod: chdir(2.6.31.6): No such file or directory”类似的错误,而模块也没有被卸载;

  第二步、在驱动模块卸载函数__exit中的cdev_del(struct cdev *)函数调用后即注销字符设备后调用 unregister_chrdev_region(dev_t devno,  unsigned count)函数释放在驱动加载函数__init中通过register_chrdev_region、alloc_chrdev_region,注册的主设备号。(cdev_del函数、unregister_chrdev_region函数缺一不可);

  经过以上两步操作后,rmmod 模块名称 卸载模块就不会错误了,而且cat /proc/devices也不会再有已经卸载的模块的信息,这样再次加载模块也不会出错了!

  这个问题,我也遇到过,那要看人的模块名,和设备名是不是一样, 要是一样的话,就直接rmmod *.ko 如果不是一样的话,就得,rmmod  设备名.ko,主要是在模块名,和设备名,这二者之间。

  至于mini2440开发板,是需要建立/lib/modules/2.6.29.4-Friendlyarm

  但是还得看你的内核的版本,所以2.6.29.4不一定和你的一样,你需要

  #uname -r

  查看一下你的内核版本,替换掉才行。
                                                         ——选自网络

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:教育,就是把娃围起来,一期一期的收钱。 医疗,就是把命围起来,一天一天的收钱。

47

主题

301

帖子

0

粉丝