当前位置: 首页 > news >正文

三、字符设备驱动(基于北京迅为电子)

一、概述

字符设备的驱动包括设备号、字符设备结构体、自动创建设备节点、fops结构体

二、知识点

  1. 设备号:一个32bit的数据,高12bit表示主设备号,低20bit表示次设备号
  2. 宏定义:MAJOR(dev),MINOR(dev),MKDEV(ma,mi)
  3. 分配设备号:register_chrdev_region、alloc_chrdev_region前者静态分配设备号,后者动态分配设备号
  4. cat /proc/devices 查看已经分配的设备号
  5. 分配设备号
register_chrdev_region(dev_t, unsigned, const char*);      // 起始设备号、数量、名称
alloc_chrdev_region(dev_t*, unsigned, unsigned, const char*);  // 保存申请到的设备号、起始次设备号、数量、名称
unregister_chrdev_region(dev_t, unsigned);                // 要释放的设备号、要释放的设备号的数量
  1. 注册一个字符设备
struct cdev {struct kobject kobj;                    // 父对象struct module *owner;                   // 所有者const struct file_operations *ops;      // fopsstruct list_head list;                  // 链表头dev_t dev;                              // 设备号unsigned int count;                     // 数量
} __randomize_layout;
void cdev_init(struct cdev *, const struct file_operations *);        // 初始化cdev结构体并关联fops
int cdev_add(struct cdev *, dev_t, unsigned);        // 关联设备号和数量,并注册cdev
void cdev_del(struct cdev *);                        // 注销cdev    
  1. 文件操作函数结构体
struct file_operations ;
应用层的open、read、write、close、ioctl函数均有驱动层的相应函数对应,这些函数指针都放在file_operation结构体中
  1. 创建设备节点
手动创建设备节点 mknod /dev/xxx c 250 0
struct class *cls = class_create(owner, name);
void class_destroy(struct class *cls);
device_create(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...);
void device_destroy(struct class *cls, dev_t devt);
  1. 用户空间和内核空间
    通过系统调用、软中断、硬件中断,进程由用户空间陷入内核空间。两个空间拷贝数据的API:copy_from_usercopy_to_user
  2. file结构体的私有数据,一般驱动空间中会由一个自定义的结构体,这样在open时设置file的private_data为该结构体实例对象的指针,在后续的read/write函数中通过访问file的private_data就可以得到有用数据
  3. container_of(type, struct, name); 通过结构体成员的地址得到结构体的地址
  4. 错误处理:使用goto完成不同阶段的错误处理退出,使用IS_ERR判断指针是否有效,通过PTR_TO_ERR将错误指针返回错误

三、杂项设备

  1. 杂项设备是无法归类的一系列设备,主设备号都是10,用来避免主设备号的浪费
  2. 杂项设备不需要手动设置设备节点,实现相应的miscdevice结构体,填充name、minor和fops即可(minor使用MISC_DYNAMIC_MINOR表示动态申请次设备号)
  3. 实现miscdevice结构体之后,调用misc_register就可以注册一个杂项设备并自动生成设备节点
  4. 调用misc_unregister注销杂项设备

四、字符设备的驱动框架

  1. 定义cdev结构体
  2. 动态分配一个设备号alloc_chrdev_region
  3. 初始化cdev结构体并添加到系统中cdev_init cdev_add
  4. 设置自动创建设备节点class_create device_create
  5. cdev_init时需要传入fops,因此需要实现fops的几个函数,open、read、write等等
  6. 出口函数中需要反过来一步一步地注销
http://www.jsqmd.com/news/31623/

相关文章:

  • 使用1panel一键建站
  • React 中 useCallback 的基本使用和原理解析
  • SpringCloud和K8s实现的微服务各有什么优缺点
  • Zabbix告警:value cache working in low memory mode
  • 计算机导论
  • go语言实现腾讯股票获取示例(并发)
  • 出海 AI 公司招 Java 大佬|北京
  • 在欧拉系统上安装openGauss数据库
  • 2025.11.4总结
  • 医疗非结构化数据价值挖掘:文档抽取技术的工作原理与场景实践
  • 18、Flink CDC监听MySQL-Binlog实现数据监听
  • Ai元人文构想并不神秘—系统化流程图
  • 2025 年 11 月 EVA 厂家推荐排行榜,eva塑料,eva板材,eva卷材,eva发泡材料,eva橡塑制品公司推荐
  • 2025 年 11 月防爆电磁阀厂家推荐排行榜,气动防爆电磁阀,先导式防爆电磁阀,直动式防爆电磁阀,不锈钢防爆电磁阀,禁铜禁锌防爆电磁阀公司推荐
  • 11.04
  • 20251104 正睿
  • 【做题记录】多校-dp
  • CSP-S 题解反思考场游记
  • 新学期每日总结(第19天)
  • 2025 年 11 月扑灭司林厂家推荐排行榜:专业杀虫剂,高效农药,卫生防疫用药,农业喷洒用药源头厂家精选!
  • 2025 年 11 月高压清洗机厂家推荐排行榜,超高压清洗机组,超高压水清洗设备,超高压清洗装置,工业超高压清洗设备公司精选
  • Centos7安装新版本python3.10
  • 2025 年 11 月高温轴承厂家权威推荐榜:耐高温轴承,真空高温轴承,窑炉高温轴承,BOPP链夹高温轴承,高温调心球轴承,高温关节轴承,高温滚针轴承,高温角接触轴承,高温圆柱滚子轴承公司推荐
  • 2025 年 11 月不干胶轮转机厂家推荐排行榜,商标不干胶轮转机,高速轮转印刷设备,高效稳定生产解决方案
  • swagger-typescript-api
  • HAL库DMA框架
  • 2025 年 11 月电线电缆厂家推荐排行榜,国标电线电缆,中缆电线电缆,工程电线电缆,环保电线电缆,家用电线电缆,工业电线电缆,光伏电线电缆,耐火电线电缆公司推荐
  • 2025 年 11 月清洗机厂家推荐排行榜,全自动/工业/零排放/双溶剂/碳氢/改性醇/真空/全密闭清洗机设备公司精选
  • 2025 年 11 月电线电缆厂家推荐排行榜,电力电缆,控制电缆,通信电缆,阻燃电缆,高压电缆公司推荐
  • 2025 年 11 月电磁阀线圈厂家推荐排行榜,电磁线圈,电磁铁线圈,小型电磁线圈,微型线圈,汽车电磁线圈,车用感应线圈,防爆线圈,防爆电磁线圈,直流电磁线圈,电磁线圈定制公司推荐