(1)宏定义部分:模式操作封装
解读:
使用 pins[] 来压缩存储每个 GPIO 引脚的模式值,每个引脚占用 4bit。
相当于 8 个引脚共用一个 32 位整型单元。
SET/GET 宏本质上是位操作技巧,属于轻量级状态映射机制,避免使用结构体数组。
(2)内部封装接口:pin_set_mode() & pin_get_mode()
校验引脚编号合法性;
调用底层平台实现的 configure() 函数进行实际模式配置;
再通过 PIN_MODE_SET 记录设置状态。
该函数不仅设置了底层硬件,还更新了上层状态缓存,是对 状态同步封装 的经典做法。
只读取本地缓存的模式状态;
并未从底层硬件重新读取,高效但不完全精准,需确保状态同步一致。
(3)设备接口实现部分
当关闭设备时,自动将所有使用过的引脚设置为 NONE;
避免引脚悬空或占用;
条件编译宏 MR_USING_PIN_AUTO_DISABLE 控制是否启用自动 disable 功能;
使用 PIN_MODE_GET 查状态再决定是否关闭该引脚。
这是一个安全性加强设计,有助于系统资源释放。
与 read 对称:写入指定引脚的电平值;
仍基于 dev->position 表示当前操作的引脚编号;
每个字节写入一个值。
是控制命令接口,支持动态配置与查询模式:
MR_IOC_PIN_SET_MODE:设置某个引脚模式;
MR_IOC_PIN_GET_MODE:读取某个引脚当前模式;
本质是平台中对 GPIO 控制功能的“高级指令接口”;
具备通用扩展能力,未来可以支持如设置上拉、开漏、中断等新指令。
响应中断事件(如外部中断 EXTI);
当前仅实现了 MR_ISR_PIN_EXTI_INT,返回中断引脚号;
可作为平台中断通知机制与上层事件处理系统之间的桥梁。
(4)注册接口:mr_pin_register
该函数将 pin 注册到系统设备树中;
使用的是 mr_dev_register(通用设备注册函数);
传入统一的设备操作结构体 ops;
注册成功后还会调用 _mr_fast_pin_init(),进行引脚快速访问初始化。
这是真正把引脚纳入设备系统管理的入口函数。
(5)整体架构总结图示(逻辑调用流程)
总结亮点设计
特性 | 实现方式说明 |
模式管理高效 | pins[] 使用位操作压缩记录所有引脚模式,快速读写 |
安全性设计 | 配置合法性检查、自动 disable、assert 保护 |
与设备框架深度整合 | 实现设备标准接口 read/write/ioctl/close |
抽象 + 多态 | 所有操作通过 mr_pin_ops 实现平台无关 |
支持多引脚统一管理 | 通过 dev->position 定位目标引脚,实现统一操作 |
可扩展 IOCTL 命令 | SET_MODE/GET_MODE 只是开始,可扩展为完整控制指令集 |
开源代码:https://gitee.com/MacRsh/mr-library/tree/master
“掌”握科技鲜闻 (微信搜索techsina或扫描左侧二维码关注)
上一篇 小天鹅TG100YQ2洗烘一体机京东促销价1089元
下一篇 没有了