insmod错误
当我们用insmod 加载驱动,然后在应用程中调用open 驱动文件,有时候会出现这个错误:cannot open ***:no such file or directory.
出现这个问题的原因很简单。你执行ls /dev命令看下在设备文件下面是否有你要打开的设备文件名(比如/dev/led),如果没有的话,那么错误的原因就是没有创建设备节点。通过cdev创建的字符设备是不能自动创建设备节点的。这个时候可以使用命令mknod去创建设备节点,如:
mknod /dev/led c 253 0(假设的)。
这样再执行自己的应用程序的时候就不会报错了。
另外一种方法,也是我要推荐的方法,就是用udev指令去动态的创建节点,自动创建节点之后每次只要insmod加载模块,应用程序就可以打开设备,而不是每次调试的时候都mknod。方法如下:
static struct class *led_class;
在模块初始化函数:int xxx_init(void)中添加这两句:
led_class = class_create(THIS_MODULE, "led_class");
device_create(led_class, NULL, MKDEV(major, 0), NULL,"led_device");
在模块卸载函数void xxx_exit(void)中添加这两句:
unregister_chrdev(major,"led");
device_destroy(led_class,MKDEV(major, 0));
主要思路:先创建一个类,在类下创建设备!这样我们就不需要在开发板上查看主设备号,然后手动创建设备节点了!在开发板上:ls /sys/class/会看到我们创建的类,ls /sys/class/led_class/会看到我们在类下创建的设备!不过真正的设备节点在/dev目录下面,通过命令:ls /dev可以查看到!
需要注意的是,我们在编写应用程序的时候,open函数里面的设备名字要跟驱动里面device_create指定的设备名字相一致!
rmmod错误
在开发板上烧录了新移植的文件系统后,使用rmmod命令来卸载一个调试的驱动时,出现无法卸载驱动的错误,提示如下:
rmmod: chdir(/lib/modules): No such file or directory
用lsmod查看时发现hixx模块并没有被卸载掉。
查看/lib目录,果然没有modules这个目录存在,于是在/lib/目录下手动创建了modules目录。
再次执行卸载命令时,又提示:
rmmod: chdir(3.0.8): No such file or directory
于是又在modules目录下再新建目录3.0.8,再次执行卸载命令时,提示:
rmmod: module 'hixx' not found
此时再用lsmod查看,发现hixx驱动模块已经卸载掉了。
上面提示: module 'hixx' not found,是因为编译内核时开启了如下选项:
【*】Enable loadable module support --->
所以系统在运行时会自动到/lib/modules/目录下去搜索相关的模块。
如果在制作文件系统时,把hixx.ko放置到/lib/modules/目录下,则在任意目录下执行rmmod命令来卸载相应驱动模块时都不会提示这个错误的。
另外一种方法是,在系统启动脚本里加上如下一行创建modules目录的命令也可以:
mkdir -p /lib/modules/$(uname -r)