一般一个普通的字符类设备驱动要经历下面的几个步骤
整个流程如下
/*头文件
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/stat.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include <linux/device.h>
整个驱动模块大框架 module_init(scdev_init);
申请设备号 num_dev = MKDEV(numdev_major,numdev_minor);
ret = register_chrdev_region(num_dev,DEVICE_MINOR_NUM,DEVICE_NAME);
ret = alloc_chrdev_region(&num_dev,numdev_minor,DEVICE_MINOR_NUM,DEVICE_NAME);
创建设备类 myclass=class_create(THIS_MODULE , DEVICE_NAME);
申请你想要的数据类型的内存
struct reg_dev *my_devices;
my_devices = kmalloc(DEVICE_MINOR_NUM * sizeof(struct reg_dev),GFP_KERNEL);
初始化这段内存
memset(my_devices,0,DEVICE_MINOR_NUM * sizeof(struct reg_dev));
实现设备函数fops
cdev_init(&dev->cdev,&my_fops);
dev->cdev.owner = THIS_MODULE;
dev->cdev.ops = &my_fops;
注册设备到系统
err = cdev_add(&dev->cdev,devno,1);
创建设备节点
device_create(myclass,NULL,MKDEV(numdev_major,numdev_minor+i),NULL,DEVICE_NAME"%d",i);
初始化具体硬件 iic io spi....
xxxx_init();
*/
这其中不能忘记硬件的初始化,因为这是个板集支持包和板子Linux系统的桥梁
另外就是设备节点的设备号要和注册设备到系统 cdev_add 中的设备号一致
这样才能完成一个设备的使用。
申请的内存要记得释放,而且要逐级释放,不能有遗漏,否则会造成内存漏洞