Linux驱动开发
文章平均质量分 87
耶伊叶
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【Linux驱动开发】第24天:SPI 数据收发机制
分层模型:最小数据分片;:完整一次CS选中的事务,由多个transfer组成;同步传输spi_sync阻塞,适合绝大多数外设驱动,开发成本最低;简易封装接口覆盖90%寄存器读写场景,优先使用;多线程访问SPI必须互斥锁保护,避免多条message交错执行;一条message内部默认全程CS低,仅全部transfer完成后释放;单transfer末尾可通过cs_change提前释放片选。原创 2026-07-04 23:25:34 · 422 阅读 · 0 评论 -
【Linux驱动开发】第23天:spi_driver 的 probe / remove 函数实现规范
对应 I2C:无完全对等接口,I2C 时序参数由适配器驱动统一配置,从设备无需单独设置。匹配就认为设备存在,必须通过 SPI 通信读取 ID 校验,这是驱动鲁棒性的基本要求。私有数据结构体是驱动的"全局变量容器",保存设备状态、硬件资源、数据缓存等,向 SPI 控制器驱动提交当前设备的时序参数,控制器会据此配置硬件寄存器,是 SPI 从设备的核心描述符,内核已经根据设备树填充了基础参数。根据外设类型,将设备注册到对应的内核子系统,向用户空间暴露操作接口。每一步失败都必须撤销之前的操作,避免资源泄漏。原创 2026-07-04 23:19:41 · 419 阅读 · 0 评论 -
【Linux驱动开发】第22天:SPI 设备树 + spi_driver
RK3568的SPI控制器统一在中预定义,板级DTS仅需启用并追加从设备。属性必选说明compatible是固定为,与SPI控制器驱动匹配reg是控制器寄存器基地址+地址空间大小interrupts是SPI控制器中断号clocks是外设总线时钟与功能时钟,名称为pclkspi是固定为<1>,片选号用1个cell表示是固定为<0>,SPI从设备无独立地址空间cs-gpios否GPIO模拟片选时使用,数组形式,索引对应从设备reg值。原创 2026-07-03 21:07:33 · 408 阅读 · 0 评论 -
【Linux驱动开发】第21天:SPI总线协议与SPI子系统基础理解
和I2C完全对应,Linux SPI子系统也是经典的三层架构,思路和I2C高度一致,只是结构体和API名称不同。:主设备和从设备各有一个移位寄存器,SCLK每跳变一次,两边同时移出1位数据到对方的寄存器里。SPI通过两个参数配置时序,组合成4种标准模式,不同外设可能要求不同模式,驱动必须和外设匹配。,你写一个字给我的同时,我也写一个字给你,节拍由其中一个人(主设备)统一打拍子控制。的串行总线,标准模式下需要4根信号线,比I2C多2根,但通信能力更强。通俗理解:SPI通信就像。原创 2026-06-28 18:13:41 · 392 阅读 · 0 评论 -
【Linux驱动开发】第20天:I2C 驱动框架与读写 API 详解
【代码】【Linux驱动开发】第20天:I2C 驱动框架与读写 API 详解。原创 2026-06-28 14:04:42 · 283 阅读 · 0 评论 -
【Linux驱动开发】第19天:I2C设备树
在pinctrl/* I2C1引脚复用定义 */i2c1 {<4 RK_PA1 RK_FUNC_2 &pcfg_pull_none>, // GPIO4_A1复用为I2C1_SDA// GPIO4_A2复用为I2C1_SCL/* I2C4引脚复用定义示例 */i2c4 {<1 RK_PB3 RK_FUNC_2 &pcfg_pull_none>, // GPIO1_B3复用为I2C4_SDA// GPIO1_B4复用为I2C4_SCL。原创 2026-06-28 14:01:41 · 207 阅读 · 0 评论 -
【Linux驱动开发】第18天:I2C驱动深度解析
RK3399的I2C驱动分为适配器驱动(控制器)和设备驱动(外设),适配器驱动是硬件层实现,设备驱动是业务层实现,通过I2C核心层解耦。适配器驱动基于,通过设备树匹配硬件,核心是实现的(中断驱动的数收发)。中断是RK3399 I2C高效传输的核心,负责逐字节处理、错误检测、传输状态更新。Client驱动通过i2c_driver注册,调用对接核心层,无需关心底层硬件细节,实现跨平台复用。原创 2026-06-01 19:54:49 · 422 阅读 · 0 评论 -
【Linux驱动开发】第17天:I2C子系统整体架构
I2C(Inter-Integrated Circuit)是嵌入式系统中最常用的低速串行总线,用于连接各种低速外设,如触摸屏、传感器、EEPROM、RTC时钟等。I2C本质:主从架构的低速串行总线,只用两根线就能连接多个外设三层架构适配器驱动层:直接操作I2C控制器硬件核心层:提供通用API,管理总线和设备从设备驱动层:实现具体外设的功能核心关系:一个适配器对应一条总线,一条总线上可以挂多个从设备,每个从设备有唯一地址设备树规则I2C控制器节点在中定义。原创 2026-05-28 17:06:02 · 508 阅读 · 0 评论 -
【Linux驱动开发】第16天:按键中断完整实战
板级DTS定位:通过命令可100%准确找到对应的DTS文件按键分类:OK3399-C板载按键分为ADC模拟按键和GPIO中断按键,后者是嵌入式开发主流方案中断语法:GPIO简写配置与标准中断配置可相互转换,核心是和interrupts两个属性中断架构:RK3399采用GICv3+GPIO组的二级中断级联架构,所有GPIO中断都遵循统一的配置规则驱动最佳实践使用devm_*系列API自动管理资源,避免内存泄漏严格遵守顶半部/底部分工:顶半部只调度底半部,底半部处理耗时操作。原创 2026-05-27 17:58:39 · 428 阅读 · 0 评论 -
【Linux驱动开发】第15天:中断顶半部/底半部 + tasklet VS 工作队列
中断处理函数有一个。原创 2026-05-26 14:47:11 · 302 阅读 · 0 评论 -
【Linux驱动开发】第14天:中断基础理论
如果你是一名应用开发者,那么你写的代码就像你在公司的日常工作:按计划写代码、改bug、回邮件,一件事做完再做下一件,可以随时停下来喝口水、去厕所(睡眠/阻塞)。而硬件中断,就是公司突然发来的紧急会议通知——不管你手头在做什么,必须立刻放下,去会议室开会,会议结束后再回来继续之前的工作。硬件中断就是公司的紧急会议:必须立刻参加、必须短、不能睡觉、不能处理日常工作,所有耗时的事都会后再做。原创 2026-05-25 14:28:21 · 366 阅读 · 0 评论 -
【Linux驱动开发】第13天:Linux内核设备树解析 OF API 超详细全解
OF API是Linux内核提供的一套设备树解析函数集访问设备树节点读取节点的属性值获取硬件资源(寄存器地址、中断号、GPIO、时钟等)遍历设备树结构功能API使用频率检查节点是否可用⭐⭐⭐⭐⭐读取32位整数⭐⭐⭐⭐⭐读取字符串⭐⭐⭐⭐⭐读取布尔属性⭐⭐⭐⭐获取寄存器资源⭐⭐⭐⭐⭐获取中断号⭐⭐⭐⭐⭐获取GPIO号⭐⭐⭐⭐⭐映射寄存器地址⭐⭐⭐⭐⭐遍历子节点⭐⭐⭐。原创 2026-05-24 11:29:00 · 908 阅读 · 0 评论 -
【Linux驱动开发】第12天:Linux设备树核心:树形结构+节点+属性 完整全解
设备树采用分层树形结构描述硬件,和计算机的文件系统目录结构几乎完全一致。它以根节点为起点,向下逐层展开,真实反映了计算机系统中硬件的物理连接关系。原创 2026-05-22 15:32:02 · 584 阅读 · 0 评论 -
【Linux驱动开发】第11天:设备树(Device Tree)超详细全解:从诞生背景到工作原理
设备树(Device Tree,简称DT)是一种描述硬件资源的数据结构CPU内存总线控制器(I2C、SPI、USB等)外设(LED、按键、传感器、显示屏等)中断、时钟、电源等硬件资源.dtsi是设备树头文件,相当于C语言的.h头文件,用于存放多个DTS文件共享的公共硬件信息。比如同一个芯片的所有开发板,芯片内部的外设(CPU、内存、UART、I2C控制器等)是完全相同的这些公共信息可以放在一个.dtsi文件中(如每个开发板自己的.dts文件只需要#include这个.dtsi。原创 2026-05-21 17:50:07 · 550 阅读 · 0 评论 -
【Linux驱动开发】第10天:设备树零基础入门——DTS/DTB/DTC全解+编译流程
三者分工明确,缺一不可。缩写全称中文名称大白话解释DTS设备树源文件人类可读的文本文件,用C语言风格的语法描述硬件信息,相当于Word文档DTC设备树编译器把人类可读的DTS文本文件,编译成内核能识别的二进制文件,相当于Word转PDF的转换器DTB设备树二进制文件DTC编译后的二进制文件,内核启动时加载并解析,相当于PDF文件.dtsi是设备树头文件,相当于C语言的.h头文件,用于存放多个DTS文件共享的公共硬件信息。比如同一个芯片的所有开发板,芯片内部的外设信息是相同的,可以放在。原创 2026-05-21 16:15:32 · 576 阅读 · 0 评论 -
【Linux驱动开发】第9天:platform驱动常用函数+纯平台框架代码+匹配失败排查全解
platform驱动常用函数分为:驱动注册、设备注册、资源获取、私有数据管理、devm资源管理五大类纯平台驱动通过名称匹配工作,不需要设备树,适合老系统纯平台驱动需要同时注册和,两者name必须完全一致90%的platform驱动匹配失败都是因为匹配关键字不一致匹配失败通用排查步骤:查看日志→确认驱动已加载→确认设备已注册→对比匹配关键字。原创 2026-05-17 00:06:37 · 416 阅读 · 0 评论 -
【Linux驱动开发】第8天:platform平台驱动深度解析——设计目的+probe/remove函数全解
platform总线是Linux内核专门为片上系统(SoC)中的集成外设设计的虚拟总线。为什么叫"虚拟总线"?因为它不像I2C、SPI、USB那样有真实的物理总线和硬件协议,它只是内核抽象出来的一个软件层,目的就是为了解决传统驱动的硬编码问题。platform驱动的核心设计目的是解决传统驱动的硬编码问题,实现硬件信息与驱动逻辑的彻底分离platform驱动是现代Linux驱动的标准写法,所有片上外设驱动都应该使用platform模型。原创 2026-05-14 16:37:08 · 589 阅读 · 0 评论 -
【Linux驱动开发】第7天:总线-设备-驱动三大核心模型:通俗讲解+完整流程图
总线-设备-驱动模型的核心思想是分离与解耦,把硬件信息和驱动逻辑彻底分开总线是核心管理者,负责维护设备和驱动链表,实现自动匹配设备只描述硬件信息,驱动只包含操作逻辑和匹配规则匹配成功后,总线调用驱动的probe函数初始化设备现代Linux驱动全部采用总线-设备-驱动模型,传统硬编码驱动已经被淘汰platform总线是最常用的总线,用于连接片上外设。原创 2026-05-13 20:48:26 · 594 阅读 · 0 评论 -
【Linux驱动开发】第6天:互斥锁mutex/自旋锁spinlock+驱动全流程+应用测试程序
mutex:等待时睡眠 → 不占CPU → 只能在进程上下文用spinlock:等待时自旋 → 占CPU →进程/中断都能用中断上下文绝对不能用mutex持有spinlock期间不能睡眠。原创 2026-05-11 20:49:39 · 502 阅读 · 0 评论 -
【Linux驱动开发】第5天:字符设备驱动核心原理:主次设备号+cdev+数据拷贝全解
主设备号标识驱动类型,次设备号标识同类型下的不同具体设备cdev结构体是字符设备的抽象,把设备号和驱动的操作函数集关联起来字符设备注册流程:申请设备号 → 初始化cdev → 注册cdev → 创建设备类 → 生成设备文件是用户态与内核态数据交互的唯一安全方式,必须严格遵守使用规则现代驱动优先使用动态设备号,避免设备号冲突,兼容性更好。原创 2026-05-07 13:58:17 · 437 阅读 · 0 评论 -
【Linux驱动开发】第四天:dmesg日志全解+驱动加载失败极速排查
本文深入解析Linux内核调试工具dmesg的核心原理与实战应用,重点涵盖以下内容: dmesg本质:作为内核环形缓冲区的查看工具,专门捕获printk输出,是驱动调试的首要利器。原创 2026-05-07 11:37:04 · 509 阅读 · 0 评论 -
【Linux驱动开发】第三天:上下文核心概念全解 —— 进程/中断上下文+切换开销+TLB刷新原理
本文深入解析Linux驱动开发中的进程上下文与中断上下文核心区别。进程上下文允许睡眠、调度和调用大多数内核API,而中断上下文则限制严格,必须原子化执行且不能睡眠。文章列举了中断上下文绝对禁止的10类操作,如调用可能睡眠的函数、使用互斥锁、执行耗时操作等,并通过正反示例对比展示了规范写法。关键点在于:中断处理必须极速完成(微秒级),不能阻塞系统,否则会导致崩溃或性能问题。理解这些差异是编写稳定高效驱动的基础。原创 2026-05-06 15:01:17 · 531 阅读 · 0 评论 -
【Linux驱动开发】第二天:内核模块生命周期+内存分配全解
Linux内核模块(.ko)与内存管理详解 内核模块关键点: 动态加载:按需加载/卸载驱动模块,无需重启系统 生命周期:包括加载、初始化、运行、卸载四个阶段 核心函数:module_init()和module_exit()定义模块入口 命令工具:insmod(简单加载)、modprobe(自动处理依赖) 内核内存分配三剑客: kmalloc:物理连续小内存,性能最佳 kzalloc:kmalloc+自动清零,推荐首选 vmalloc:虚拟连续大内存,物理可不连续原创 2026-04-28 13:40:50 · 475 阅读 · 0 评论 -
【Linux驱动开发】第一天:用户态与内核态通俗讲解+最简字符设备驱动实战
本文通过机场类比形象解释了Linux用户态与内核态的核心区别:用户态是受限游客,内核态是最高权限管理员。重点分析了四大差异:权限等级、内存隔离、工作模式和上下文环境。针对驱动开发不能使用C库函数的原因进行了详细说明,并提供了极简字符设备驱动完整实现,包括内核模块代码、用户态测试程序及完整部署流程。最后展示了用户态到内核态的系统调用全链路流程和常用API对照表,帮助开发者理解Linux系统底层权限模型与开发规范。原创 2026-04-27 12:17:31 · 503 阅读 · 0 评论
分享