做Linux驱动开发的小伙伴,是不是总被硬件改动坑惨?换个引脚就得改驱动、重编译,费时又费力。其实Linux早就有最优解:总线-设备-驱动分层架构+设备树,轻松实现软硬件解耦,新手也能快速吃透核心。
为啥要做分层设计?
传统驱动把硬件信息硬编码进代码,硬件一变,驱动全改,复用性极差。Linux直接把驱动拆成三部分,各司其职:设备管硬件资源、驱动管操作逻辑,总线当“红娘”做匹配,硬件改动只改设备信息,驱动代码丝毫不碰,省心又高效。
核心架构:总线-设备-驱动
这是Linux驱动的核心逻辑,三者配合撑起整套体系,内核也配套了专属结构体与API。
总线:驱动圈的“金牌红娘”,分物理总线(I2C、USB)和虚拟Platform总线(最常用)。它维护设备、驱动链表,靠match函数配对,匹配成功调用probe函数初始化,卸载时触发remove函数释放资源,全程包办匹配与管理。
设备:硬件的“说明书”,记录引脚、寄存器等资源,内核用device结构体定义,必须写release函数避免报错,注册后交由总线等待配对。
驱动:硬件的“操控手”,负责写操作逻辑,probe是驱动入口,of_match_table负责设备树匹配,注册后静待总线牵线即可。
设备树:软硬件解耦神器
想彻底摆脱硬编码,全靠设备树。它是树形配置文件,单独存放硬件信息,分为.dtsi(芯片通用)、.dts(板级配置)、.dtb(内核可解析二进制)三类。
设备树靠节点+属性描述硬件,compatible是核心匹配属性,设备与驱动字符串一致才能配对;status控制设备启停,reg标注寄存器地址,改动硬件只需修改设备树,驱动完全不用动。驱动通过OF函数(以_of_开头)读取树中信息,简单易上手。
整套流程速览
内核启动解析dtb文件生成设备节点→总线注册创建设备、驱动链表→设备、驱动依次注册→总线匹配配对→probe函数初始化硬件→卸载触发remove释放资源,全程自动化,适配性拉满。
核心总结:Linux驱动核心是软硬件分离,总线牵线、设备存信息、驱动写逻辑,设备树彻底解耦。吃透这套模型,就能告别硬编码,写出灵活复用的驱动代码。