LDD-第三章 字符设备驱动程序

主设备号和次设备号

   对字符设备的访问是通过文件系统内部的设备名称(设备节点)进行的。它们通常位于/dev下。主设备号标识设备对应的驱动程序,次设备号用于确定设备文件所指的设备。MAJOR(dev_t dev); //获得主设备号

MINOR(dev_t dev);//获得次设备号

MKDEV(int major,int minor);//将主设备号和次设备号转换成dev_t类型

分配和释放设备编号

     在建立一个字符设备之前,驱动程序首先要做的是或得一个或多个设备编号:

int register_chrdev_region(dev_t first, unsigned int count, char *name);//first是要分配的设备编号范围的起始值,次设备号经常置为0,count是所请求的连续设备编号的个数。name是和该编号范围关联的设备名称,它将出现在/proc/devices和sysfs中。动态分配设备编号的函数如下:

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);//dev是用于输出的参数,在成功调用后保存已分配范围的第一个编号。firstminor是要使用的被请求的第一个次设备号,它通常是0。count 和 name参数与register_chrdev_region一致。在不再使用它们时应该释放设备号:

void unregister_chrdev_region(dev_t first, unsigned int count);

字符设备的注册

初始化的方式有两种:cdev_init()和cdev_alloc()。

  1. struct  cdev  my_cdev;

cdev_int(&my_cdev,  &fops);

my_cdev.owner  =  THIS_MODULE;

  1. struct  cdev  my_cdev  =  cdev_alloc();

my_cdev.ops  =  &fops;

my_cdev.owner  =  THIS_MODULE;

 在cdev结构设置好之后,通过如下函数告诉内核该结构的信息:

 int  cdev_add(struct  cdev  *dev,dev_t  num,unsigned  int  count);

从系统中移除一个字符设备:void  cdev_del(struct  cdev  *dev);

创建设备文件(设备节点)

  1. 利用cat  /proc/devices查看申请到的设备名,设备号

使用mknod手工创建:mknod  filename  type  major  minor

  1. 自动创建设备节点

利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev)。在驱动初始化代码里调用class_create为该设备创建一个class,再为每个设备调用device_create创建对应的设备。

open和release

    open方法提供给驱动以初始化的能力,从而为以后的操作完成初始化做准备。在大部分驱动程序中,open应该完成如下工作:

  1. 检查设备特定的错误(诸如设备未就绪或类似的硬件问题)
  2. 如果设备是首次打开,则对其进行初始化。
  3. 如有必要,更新f_op指针。
  4. 分配并填写置于filp->private_data里的数据结构。

int  (*open)(struct  inode  *inode, struct  file  *filp);//其中inode参数在其i_cdev字段中包含了我们所需要的信息,即我们设置的cdev结构。

release方法的作用和open相反,有时这个方法的实现是close,它的作用如下:

  1. 释放由open分配的、保存在filp->private_data中的所有内容。
  2. 在最后一次关闭操作时关闭设备。

小结

    字符设备、字符设备驱动、用户程序之间的关系:

   

Linux内核中:

  1. 使用cdev结构体来描述字符设备
  2. 通过成员dev_t来定义设备号(分主、次设备号)以确定字符设备的唯一性
  3. 通过成员file_operations来定义字符设备驱动提供给VFS的接口函数,如open()、read()、write()等

在Linux字符设备驱动中:

  1. 通过register_chrdev_region()或alloc_chrdev_region()获取设备号
  2. 通过cdev_init()或cdev_alloc建立cdev和file_operations之间的联系,通过cdev_add向系统添加一个cdev以完成注册
  3. 通过class_create、device_create创建设备节点
  4. 模块卸载函数通过cdev_del()来注销cdev,通过unregister_chrdev_region()来释放设备号

用户空间程序:

  1. 通过Linux系统调用,如open()、read()、write(),来调用file_operations提供的接口函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值