1.Linux设备驱动特点
在Linux系统中,一切硬件、软件设备都视为文件。
设备驱动程序功能:
- 初始化和释放设备
- 把数据从内核传递到硬件和从硬件读取数据
- 读取应用程序传送给设备文件的数据和回送应用程序请求的数据
- 检测和处理设备出现的错误
2.Linux系统3大类设备特点
- 字符设备:按照字符流的方式呗有序访问
- 块设备:系统中能够随机访问固定大小数据片的设备
- 网络设备:面向数据包的接收和发送而设计
3.字符设备驱动程序的编程模型:
- 杂项设备驱动模型
- 早期经典字符设备驱动模型
- Linux2.6版本中新的Linux2.6标准字符设备驱动模型
4.字符设备相关重要结构
- struct file_operation
- struct inode:索引节点,每个存储设备或存储设备的分区被格式化成文件系统后,应该有两部分,一部分是inode,另一部分是block。inode用来存储文件大小,属主,归属的用户组等
- struct file:表示一个打开文件,设备对应于设备文件。在open时创建,close时被释放
5.杂项设备驱动模板
- Linux里面的misc杂项设备是主设备为10的驱动设备注册和使用都比较简单
- 注册函数:int misc_register(struct miscdevice *misc)
- 注销函数:int misc_deregister(struct miscdevice *misc)
6.早期标准字符设备驱动模板
- 注册函数:int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops)
- 注销函数:void unregister_chrdev(unsigned int major, const char *name)
7.Linux2.6标准字符设备驱动模型
- 设备驱动核心结构:struct cdev:用来描述一个字符设备
- 设备号:用dev_t描述设备号,主设备号高12位,次设备号低20位
- 相关API函数:
* int register_chrdev_region(dev_t first, unsigned int count , char *name):静态注册指定设备编号
* int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name):动态申请设备编号
* void unregister_chrdev_region(dev_t first, unsigned int count):释放设备号
* struct cdev *cdev_alloc(void):开辟struct cdev结构空间
* void cdev_init(struct cdev *cdev, const struct file_operations *fops):清空cdev指向的struct cdev空间,并填充fops
* int cdev_add(struct cdev *p, dev_t dev, unsigned count):注册字符设备结构到内核
* void cdev_add(struct cdev *p):从内核中移除设备结构
- 编写流程
* 为struct cdev分配空间:struct cdev *my_cdev = cdev_alloc()
* 初始化struct cdev:void cdev_init(struct cdev *cdev, const struct file_operations *fops)
* 初始化cdev.owner:cdev.owner = THIS_MODULE
* 注册到内核:int cdev_add(struct cdev *dev, dev_t num, unsigned count)
* 在驱动卸载函数中调用cdev_del(),在从系统中移除一个字符设备:void unregister_chrdev_region()释放设备号
8.早期字符设备驱动自动生成设备节点文件
- mdev基本介绍及使用方法
* 主要的两个应用:初始化对象和动态更新
- 相关数据结构及函数介绍:
* struct class:设备类对象,注册一个类结构会在根文件系统的/sys/class目录下生成name的文件夹
* struct class *class_create(struct module *owner, const char *name):创建一个class结构
* struct device *device_create(struct class *class, struct device *parent, dev_t devt, void *drvdata, const char *fmt,...):创建一个设备
* void device_destroy(struct class *class, dev_t devt):删除一个设备
* void class_destory(struct class *cls):销毁一个类