字符设备驱动基础知识(设备号-设备文件)

对驱动程序的字符设备的操作整体可以分为两部分,分别是对设备号的操作和对设备的操作。

一、基础知识

1.主设备号用来辨别哪类设备,次设备号用来辨别哪个设备(同类型的设备)。

2.用dev_t来描述住次设备号,其实主次设备号的描述就是一个32位的整数。高12位是主设备号,低20十位是次设备号。

3.使用MAJOR(dev_t dev)宏提取主设备号,使用MINOR(dev_t dev)宏来提取次设备号。

4.字符设备文件通过主设备号来和字符设备驱动建立联系。

 

 下面主要说的是设备号的操作:

二、分配主设备号的方式

1.静态申请

   ①根据Documentation/devices.txt,确定一个没有使用的主设备号。

      缺点是容易冲突。

    ②int register_chrdev_region(dev_t from,unsigned count, const char *name)

       参数:
              from:希望申请使用的设备号
              count:希望申请使用设备号数目
              name:设备名(体现在/proc/devices)

静态申请的缺点是容易冲突,因为一旦驱动被广泛使用, 这个随机选定的主设备号可能会致设备号冲突,而使驱动程序无法注册。

2.动态分配

函数:int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,const char *name)

参数:
dev:分配到的设备号
baseminor:起始次设备号
count:需要分配的设备数目
name:设备名(体现在/proc/devices)

缺点:无法在安装驱动前创建设备文件(因为安装前还没有分配到主设备)。

解决办法:
安装驱动后, 从 /proc/devices 中查询设备号。

 

三、注销设备号

 注销设备号是字符驱动程序必须的过程。因为不论使用何种方法分配设备号,都应该在不再使用它们时释放这些设备号。

函数:void unregister_chrdev_region(dev_t from, unsigned count);

 

 下面主要说的是设备文件的操作:

四、创建一个设备文件

1.手动创建:使用mknod 命令。

执行mknod命令的格式:mknod filename type major minor

参数:filename:设备文件名
          type: 设备文件类型
          major: 主设备号
          minor: 次设备号

2.自动创建。

 

五、linux字符驱动三种最重要的数据结构

1.struct file

struct file代表一个打开的文件。系统中每个打开的文件在内核空间都有一个关联的 struct file。它由内核在打开文件时创建, 在文件关闭后释放。

重要成员:loff_t f_pos /*文件读写位置*/
                 struct file_operations *f_op

2.stuct inode

用来记录文件的物理上的信息。因此, 它和代表打开文件的file结构是不同的。一个文件可以对应多个file结构, 但只有一个inode 结构。

重要成员:dev_ti_rdev:设备号

3.struct file_operations

 一个函数指针的集合,定义能在设备上进行的操作。结构中的成员指向驱
动中的函数, 这些函数实现一个特别的操作, 对于不支持的操作保留为NULL。

 

六、应用程序最终怎么找到驱动程序

1.设备注册

字符设备的注册可分为如下3个步骤:
① 分配cdev

分配可使用cdev_alloc函数来完成。

函数:structcdev *cdev_alloc(void)
②初始化cdev

初始化使用cdev_init函数来完成。

函数:void cdev_init(struct cdev *cdev, const struct file_operations *fops)

参数:cdev: 待初始化的cdev结构
          fops: 设备对应的操作函数集
③添加cdev

添加使用cdev_add函数来完成。

函数:int cdev_add(struct cdev *p, dev_t dev, unsigned count)

参数:p: 待添加到内核的字符设备结构
          dev: 设备号
          count: 添加的设备个数

2.设备操作

int (*open)(structinode *, struct file *)在设备文件上的第一个操作,并不要求驱动程序
一定要实现这个方法。如果该项为NULL,设备的打开操作永远成功。

void (*release)(struct inode *, struct file *)当设备文件被关闭时调用这个操作。与open相仿,release也可以没有。

还有很多其他的设备操作函数,如读取、选择、控制等。

3.设备注销

函数:intcdev_del(structcdev *p)
参数:p: 要注销的字符设备结构

下面附上读函数的数据模型一张。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值