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):销毁一个类