欢迎光临散文网 会员登陆 & 注册

字符设备驱动,如果没有调用device_create函数,则表示需要使用mknod命令手动创建设备

2023-03-31 23:55 作者:秋名山西  | 我要投稿

下面这个函数是字符设备实现的led驱动,这是最基本的字符设备驱动,设备文件需要使用手动添加:

mknode  /dev/led c 主设备号 次设备号(可以是0)

这个驱动加载的过程中出现这么两个错误:

(1)使用insmod加载驱动时:

insmod:can't load led.ko,invalid argument

原因:这是因为程序中调用的request_mem_region向内核申请内存失败,返回-EINVAL

解决办法:不使用这个函数

(2)出现段错误

出现段错误,一般是因为对空指针进行了解引用。经过排查,报错原因是在writel函数中。

writel需要的参数如下:

writel(value,addr)

但是程序中却将addr指针误写成一个unsigned int 的数据,也就是说操作了一个未知的地址。因此将其修改后成功运行。

通过这个程序,也明白了为什么有的驱动使用alloc_chrdev_region,因为使用这个函数,可以在后续的代码中调用device_create进行设备节点文件的自动创建。

流程如下:

(1)使用alloc_chrdev_region(),申请一个主设备号和相当数量的次设备号。

(2)使用class_create()创建自己的设备类,该函数在sys/class中定义。

(3)创建一个struct file_operations实例,每个设备都需要创建。传递给cdev_init和cdev_add初始化和注册这个设备。

        cdev_init:所需要的参数:

        (1)struct cdev的实例的地址。

        (2)struct file_operations的实例的地址。

        cdev_add所需要的参数:

        (1)struct cdev的实例的地址。

        (2)设备号(使用MKDEV把主设备号与次设备号合并得到的数据)。

        (3)设备数量。

(4)调用device_create()函数,根据跟定的设备文件名在/dev目录下创建设备文件。


字符设备驱动,如果没有调用device_create函数,则表示需要使用mknod命令手动创建设备的评论 (共 条)

分享到微博请遵守国家法律