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.pswp.cn/pingmian/95278.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《计算机网络安全》实验报告一 现代网络安全挑战 拒绝服务与分布式拒绝服务攻击的演变与防御策略(1)

目 录 摘 要 一、研究背景与目的 1.1 介绍拒绝服务(DoS)和分布式拒绝服务(DDoS)攻击的背景 (1)拒绝服务攻击(DoS)  (2)分布式拒绝服务攻击&#xff0…

深度学习篇---模型组成部分

模型组成部分:在 PyTorch 框架下进行图像分类任务时,深度学习代码通常由几个核心部分组成。这些部分中有些可以在不同网络间复用,有些则需要根据具体任务或网络结构进行修改。下面我将用通俗易懂的方式介绍这些组成部分:1. 数据准…

关于ANDROUD APPIUM安装细则

1,可以先参考一下连接 PythonAppium自动化完整教程_appium python教程-CSDN博客 2,appium 需要对应的版本的node,可以用nvm对node 进行版本隔离 3,对应需要安装android stuido 和对应的sdk ,按照以上连接进行下载安…

八、算法设计与分析

1 算法设计与分析的基本概念 1.1 算法 定义 :算法是对特定问题求解步骤的一种描述,是有限指令序列,每条指令表示一个或多个操作。特性 : 有穷性:算法需在有限步骤和时间内结束。确定性:指令无歧义&#xff…

机器学习从入门到精通 - 神经网络入门:从感知机到反向传播数学揭秘

机器学习从入门到精通 - 神经网络入门:从感知机到反向传播数学揭秘开场白:点燃你的好奇心 各位,有没有觉得那些能识图、懂人话、下棋碾压人类的AI特别酷?它们的"大脑"核心,很多时候就是神经网络!…

神经网络模型介绍

如果你用过人脸识别解锁手机、刷到过精准推送的短视频,或是体验过 AI 聊天机器人,那么你已经在和神经网络打交道了。作为深度学习的核心技术,神经网络模仿人脑的信息处理方式,让机器拥有了 “学习” 的能力。一、什么是神经网络&a…

苹果开发中什么是Storyboard?object-c 和swiftui 以及Storyboard到底有什么关系以及逻辑?优雅草卓伊凡

苹果开发中什么是Storyboard?object-c 和swiftui 以及Storyboard到底有什么关系以及逻辑?优雅草卓伊凡引言由于最近有个客户咨询关于 苹果内购 in-purchase 的问题做了付费咨询处理,得到问题:“昨天试着把您的那几部分code 组装成…

孩子玩手机都近视了,怎样限制小孩的手机使用时长?

最近两周,我给孩子检查作业时发现娃总是把眼睛眯成一条缝,而且每隔几分钟就会用手背揉眼睛,有时候揉得眼圈都红了。有一次默写单词,他把 “太阳” 写成了 “大阳”,我给他指出来,他却盯着本子说 “没有错”…

医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(六)

第五章 案例三:GoEHRStream - 实时电子病历数据流处理系统 5.1 案例背景与需求分析 5.1.1 电子病历数据流处理概述 电子健康记录(Electronic Health Record, EHR)系统是现代医疗信息化的核心,存储了患者从出生到死亡的完整健康信息,包括 demographics、诊断、用药、手术、…

GEM5学习(2):运行x86Demo示例

创建脚本 配置脚本内容参考官网的说明gem5: Creating a simple configuration script 首先根据官方说明创建脚本文件 mkdir configs/tutorial/part1/ touch configs/tutorial/part1/simple.py simple.py 中的内容如下: from gem5.prebuilt.demo.x86_demo_board…

通过 FinalShell 访问服务器并运行 GUI 程序,提示 “Cannot connect to X server“ 的解决方法

FinalShell 是一个 SSH 客户端,默认情况下 不支持 X11 图形转发(不像 ssh -X 或 ssh -Y),所以直接运行 GUI 程序(如 Qt、GNOME、Matplotlib 等)会报错: Error: Cant open display: Failed to c…

1.人工智能——概述

应用领域 替代低端劳动,解决危险、高体力精力损耗领域 什么是智能制造?数字孪生?边缘计算? 边缘计算 是 数字孪生 的 “感官和神经末梢”,负责采集本地实时数据和即时反应。琐碎数据不上传总服务器,实时进行…

传统园区能源转型破局之道:智慧能源管理系统驱动的“源-网-荷-储”协同赋能

传统园区能源结构转型 政策要求:福建提出2025年可再生能源渗透率≥25%,山东强调“源网荷储一体化”,安徽要求清洁能源就地消纳。系统解决方案:多能协同调控:集成光伏、储能、充电桩数据,通过AI算法动态优化…

[光学原理与应用-353]:ZEMAX - 设置 - 可视化工具:2D视图、3D视图、实体模型三者的区别,以及如何设置光线的数量

在光学设计软件ZEMAX中,2D视图、3D视图和实体模型是三种不同的可视化工具,分别用于从不同维度展示光学系统的结构、布局和物理特性。它们的核心区别体现在维度、功能、应用场景及信息呈现方式上,以下是详细对比:一、维度与信息呈现…

《sklearn机器学习》——交叉验证迭代器

sklearn 交叉验证迭代器 在 scikit-learn (sklearn) 中,交叉验证迭代器(Cross-Validation Iterators)是一组用于生成训练集和验证集索引的工具。它们是 model_selection 模块的核心组件,决定了数据如何被分割,从而支持…

Trae+Chrome MCP Server 让AI接管你的浏览器

一、核心优势1、无缝集成现有浏览器环境直接复用用户已打开的 Chrome 浏览器,保留所有登录状态、书签、扩展及历史记录,无需重新登录或配置环境。对比传统工具(如 Playwright)需独立启动浏览器进程且无法保留用户环境,…

Shell 编程 —— 正则表达式与文本处理器

目录 一. 正则表达式 1.1 定义 1.2 用途 1.3 Linux 正则表达式分类 1.4 正则表达式组成 (1)普通字符 (2)元字符:规则的核心载体 (3) 重复次数 (4)两类正则的核心…

Springboot 监控篇

在 Spring Boot 中实现 JVM 在线监控(包括线程曲线、内存使用、GC 情况等),最常用的方案是结合 Spring Boot Actuator Micrometer 监控可视化工具(如 Grafana、Prometheus)。以下是完整实现方案: 一、核…

Java 大视界 --Java 大数据在智能教育学习资源整合与知识图谱构建中的深度应用(406)

Java 大视界 --Java 大数据在智能教育学习资源整合与知识图谱构建中的深度应用(406)引言:正文:一、智能教育的两大核心痛点与 Java 大数据的适配性1.1 资源整合:42% 重复率背后的 “三大堵点”1.2 知识图谱&#xff1a…

2025年新版C语言 模电数电及51单片机Proteus嵌入式开发入门实战系统学习,一整套全齐了再也不用东拼西凑

最近有同学说想系统学习嵌入式,问我有没有系统学习的路线推荐。刚入门的同学可能不知道如何下手,这里一站式安排上。先说下学习的顺序,先学习C语言,接着学习模电数电(即模拟电路和数字电路)最后学习51单片机…