蜕变成蝶~Linux设备驱动之字符设备驱动

 

 

一、linux系统将设备分为3类:字符设备、块设备、网络设备。使用驱动程序:

蜕变成蝶~Linux设备驱动之字符设备驱动

  • 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据。字符设备是面向流的设备,常见的字符设备有鼠标、键盘、串口、控制台和LED设备等。
  • 块设备:是指可以从设备的任意位置读取一定长度数据的设备。块设备包括硬盘、磁盘、U盘和SD卡等。

  每一个字符设备或块设备都在/dev目录下对应一个设备文件。linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作字符设备和块设备。

 

二、字符设备、字符设备驱动与用户空间访问该设备的程序三者之间的关系。

蜕变成蝶~Linux设备驱动之字符设备驱动

  如图,在Linux内核中使用cdev结构体来描述字符设备,通过其成员dev_t来定义设备号(分为主、次设备号)以确定字符设备的唯一性。通过其成员file_operations来定义字符设备驱动提供给VFS的接口函数,如常见的open()、read()、write()等。

      在Linux字符设备驱动中,模块加载函数通过register_chrdev_region( ) 或alloc_chrdev_region( )来静态或者动态获取设备号,通过cdev_init( )建立cdev与file_operations之间的连接,通过cdev_add( )向系统添加一个cdev以完成注册。模块卸载函数通过cdev_del( )来注销cdev,通过unregister_chrdev_region( )来释放设备号。

       用户空间访问该设备的程序通过Linux系统调用,如open( )、read( )、write( ),来“调用”file_operations来定义字符设备驱动提供给VFS的接口函数。

 

三、字符设备驱动模型

蜕变成蝶~Linux设备驱动之字符设备驱动

 

1. 驱动初始化

     1.1. 分配cdev

        在2.6的内核中使用cdev结构体来描述字符设备,在驱动中分配cdev,主要是分配一个cdev结构体与申请设备号,以按键驱动为例:

 1 /*……*/
 2 /* 分配cdev*/
 3 struct cdev btn_cdev;
 4 /*……*/
 5 /* 1.1 申请设备号*/
 6     if(major){
 7         //静态
 8         dev_id = MKDEV(major, 0);
 9         register_chrdev_region(dev_id, 1, "button");
10     } else {
11         //动态
12         alloc_chardev_region(&dev_id, 0, 1, "button");
13         major = MAJOR(dev_id);
14     }
15 /*……*/
View Code

相关文章: