欢迎大家来到IT世界,在知识的湖畔探索吧!
MR 框架
欢迎大家来到IT世界,在知识的湖畔探索吧!
(1)宏定义部分:模式操作封装
#define PIN_MODE_SET(_pin, _number, _mode) \ do { \ MR_BIT_CLR((_pin)->pins[(_number) / 8], (0xf << (((_number) % 8) * 4))); \ MR_BIT_SET((_pin)->pins[(_number) / 8], ((_mode) << (((_number) % 8) * 4))); \ } while (0) #define PIN_MODE_GET(_pin, _number) \ ((int)(((_pin)->pins[(_number) / 8] >> (((_number) % 8) * 4)) & 0xf))
欢迎大家来到IT世界,在知识的湖畔探索吧!
解读:
- 使用 pins[] 来压缩存储每个 GPIO 引脚的模式值,每个引脚占用 4bit。
- 相当于 8 个引脚共用一个 32 位整型单元。
- SET/GET 宏本质上是位操作技巧,属于轻量级状态映射机制,避免使用结构体数组。
(2)内部封装接口:pin_set_mode() & pin_get_mode()
欢迎大家来到IT世界,在知识的湖畔探索吧!int pin_set_mode(struct mr_pin *pin, int number, struct mr_pin_config config)
- 校验引脚编号合法性;
- 调用底层平台实现的 configure() 函数进行实际模式配置;
- 再通过 PIN_MODE_SET 记录设置状态。
该函数不仅设置了底层硬件,还更新了上层状态缓存,是对 状态同步封装 的经典做法。
int pin_get_mode(struct mr_pin *pin, int number, struct mr_pin_config *config)
(3)设备接口实现部分
欢迎大家来到IT世界,在知识的湖畔探索吧!int mr_pin_close(struct mr_dev *dev)
- 当关闭设备时,自动将所有使用过的引脚设置为 NONE;
- 避免引脚悬空或占用;
- 条件编译宏 MR_USING_PIN_AUTO_DISABLE 控制是否启用自动 disable 功能;
- 使用 PIN_MODE_GET 查状态再决定是否关闭该引脚。
这是一个安全性加强设计,有助于系统资源释放。
ssize_t mr_pin_write(struct mr_dev *dev, const void *buf, size_t count)
欢迎大家来到IT世界,在知识的湖畔探索吧!int mr_pin_ioctl(struct mr_dev *dev, int cmd, void *args)
- MR_IOC_PIN_SET_MODE:设置某个引脚模式;
- MR_IOC_PIN_GET_MODE:读取某个引脚当前模式;
ssize_t mr_pin_isr(struct mr_dev *dev, int event, void *args)
(4)注册接口:mr_pin_register
欢迎大家来到IT世界,在知识的湖畔探索吧!int mr_pin_register(struct mr_pin *pin, const char *path, struct mr_drv *drv)
- 该函数将 pin 注册到系统设备树中;
- 使用的是 mr_dev_register(通用设备注册函数);
- 传入统一的设备操作结构体 ops;
- 注册成功后还会调用 _mr_fast_pin_init(),进行引脚快速访问初始化。
这是真正把引脚纳入设备系统管理的入口函数。
(5)整体架构总结图示(逻辑调用流程)
+---------------------------+ | 应用层 | | (调用 pin 读写函数) | +------------+-------------+ | v +---------------------------+ | mr_dev 操作接口 | | mr_pin_read/write/ioctl | +------------+-------------+ | v +---------------------------+ | struct mr_pin_ops | | -> read / write / config | | (平台相关的底层操作) | +------------+-------------+ | v +---------------------------+ | 硬件寄存器操作(HAL) | +---------------------------+
总结亮点设计
|
特性 |
实现方式说明 |
|
模式管理高效 |
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
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/132539.html