linux驱动错误:no such file or directory

当我们用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指定的设备名字相一致!

你可能感兴趣的:(arm/2440)