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

Linux 字符设备驱动框架学习记录(三)

Linux字符设备驱动开发新框架详解

一、新旧驱动框架对比

传统字符设备驱动流程

  1. 手动分配设备号 (register_chrdev_region)
  2. 实现file_operations结构体
  3. 使用mknod手动创建设备节点

新式驱动框架优势

  • 自动设备号分配:动态申请避免冲突
  • 自动节点创建:通过class_create/device_create实现
  • 更好的设备管理:通过struct cdev规范设备操作 cdev_add 向 Linux 系统添加字符设备…

二、自动设备号申请机制

核心函数实现

/* 动态分配设备号 */
alloc_chrdev_region(&newchrled.devid, 0, 1, LED_NAME);
newchrled.major = MAJOR(newchrled.devid); // 提取主设备号
newchrled.minor = MINOR(newchrled.devid); // 提取次设备号/* 传统静态分配示例(对比) */
// register_chrdev_region(devid, 1, "led");

设备号管理流程

  1. 调用alloc_chrdev_region申请未使用设备号
  2. 通过MAJOR/MINOR宏分解主次设备号
  3. 驱动卸载时使用unregister_chrdev_region释放

三、自动创建设备节点

现代驱动节点创建

/* 创建设备类 */
newchrled.class = class_create(THIS_MODULE, LED_NAME);/* 创建设备节点 */
newchrled.dev = device_create(newchrled.class, NULL, newchrled.devid, NULL, LED_NAME);

工作机制说明

  1. class_create:在/sys/class下创建设备类
  2. device_create:基于udev机制自动创建/dev节点
  3. 无需手动执行mknod命令

四、完整驱动加载流程

初始化函数实现

static int __init newchrled_init(void)
{/* 硬件初始化 */ioremap(CCM_CCGR1_BASE, 4); // 寄存器地址映射/* 字符设备注册四部曲 */1. alloc_chrdev_region() // 设备号申请2. cdev_init()           // 初始化cdev结构体3. cdev_add()            // 添加设备到系统4. device_create()       // 自动创建设备节点
}

驱动卸载流程

static void __exit newchrled_exit(void)
{/* 逆向释放资源 */1. device_destroy()      // 删除设备节点2. class_destroy()       // 销毁设备类3. cdev_del()           // 移除字符设备4. unregister_chrdev_region() // 释放设备号
}

五、应用层交互示例

int main(int argc, char *argv[])
{// 打开自动创建的设备节点int fd = open("/dev/newchrled", O_RDWR);// 控制指令下发unsigned char cmd = 1; // 1:开灯 0:关灯write(fd, &cmd, sizeof(cmd));// 关闭设备close(fd);return 0;
}

六、测试命令集

# 加载驱动模块
insmod newchrled.ko
# 方法二
modporbe nwechrled.ko# 查看自动生成的设备节点
ls -l /dev/newchrled# 查看内核分配的设备号
dmesg | grep newchrled# 测试LED控制
./ledAPP /dev/newchrled 1  # 开灯
./ledAPP /dev/newchrled 0  # 关灯

七、常见问题排查

  1. 设备节点未生成

    • 检查class_create返回值
    • 确认udev服务正常运行
    • 查看/sys/class下是否生成对应类目录
  2. 权限问题

    sudo chmod 666 /dev/newchrled
    
  3. 设备号冲突

    cat /proc/devices | grep newchrled
    
http://www.xdnf.cn/news/19790.html

相关文章:

  • Spring Boot 全局异常处理问题分析与解决方案
  • PastePal for Mac 剪贴板历史记录管理器
  • prometheus+grafana搭建
  • 7.4Element Plus 分页与表格组件
  • js设计模式-装饰器模式
  • CI(持续集成)、CD(持续交付/部署)、CT(持续测试)、CICD、CICT
  • Few-Shot Prompting 实战:用5个例子让GPT-4学会复杂任务
  • (二)文件管理-基础命令-cd命令的使用
  • 中州养老:资源添加功能
  • gitlab推送失败,内存不足的处理
  • 深入浅出Spring IoC与DI:设计思想、实现方式与反射技术详解
  • Excel 电影名匹配图片路径教程:自动查找并写入系统全路径
  • PostgreSQL 中唯一索引的工作原理
  • 分布式AI算力系统番外篇-----超体的现实《星核》
  • Vue基础知识-重要的内置关系:vc实例.__proto__.__proto__ === Vue.prototype
  • 股指期货可以通过移仓长线持有吗?
  • AppInventor2 如何自定义包名?
  • 华为云云原生架构赋能:大腾智能加速业务创新步伐
  • 【深度学习新浪潮】视觉大模型在预训练方面有哪些关键进展?
  • 鸿蒙UI开发实战:解决布局错乱与响应异常
  • 企业实用——MySQL的备份详解
  • 基于机器学习的Backtrader波动性预测与管理
  • Kubernetes ConfigMap 更新完整指南:原理、方法与最佳实践
  • PyTorch实战——ResNet与DenseNet详解
  • Huggingface终于没忍住,OpenCSG坚持开源开放
  • flume拓扑结构详解:从简单串联到复杂聚合的完整指南
  • Linux 的信号 和 Qt 的信号
  • IO_HW_9_3
  • MySQL数据库恢复步骤(基于全量备份和binlog)
  • 揭秘ArrowJava核心:IndexSorter高效排序设计