新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > mr-library中的GPIO是怎么封装的?完整拆解+实战思路

mr-library中的GPIO是怎么封装的?完整拆解+实战思路

作者:嵌入式芯视野 时间:2025-07-08 来源:今日头条 收藏

MR 框架

(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))

解读:

  • 使用 pins[] 来压缩存储每个 GPIO 引脚的模式值,每个引脚占用 4bit。

  • 相当于 8 个引脚共用一个 32 位整型单元。

  • SET/GET 宏本质上是位操作技巧,属于轻量级状态映射机制,避免使用结构体数组。

(2)内部封装接口:pin_set_mode() & pin_get_mode()

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)设备接口实现部分

    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)
  • 与 read 对称:写入指定引脚的电平值;

  • 仍基于 dev->position 表示当前操作的引脚编号;

  • 每个字节写入一个值。

  • int mr_pin_ioctl(struct mr_dev *dev, int cmd, void *args)
  • 是控制命令接口,支持动态配置与查询模式:

    • MR_IOC_PIN_SET_MODE:设置某个引脚模式;

    • MR_IOC_PIN_GET_MODE:读取某个引脚当前模式;

  • 本质是平台中对 GPIO 控制功能的“高级指令接口”;

  • 具备通用扩展能力,未来可以支持如设置上拉、开漏、中断等新指令。

  • ssize_t mr_pin_isr(struct mr_dev *dev, int event, void *args)
  • 响应中断事件(如外部中断 EXTI);

  • 当前仅实现了 MR_ISR_PIN_EXTI_INT,返回中断引脚号;

  • 可作为平台中断通知机制与上层事件处理系统之间的桥梁。

  • (4)注册接口:mr_pin_register

    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


关键词:

评论


相关推荐

技术专区

关闭