字符设备驱动,如果没有调用device_create函数,则表示需要使用mknod命令手动创建设备
下面这个函数是字符设备实现的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目录下创建设备文件。