GPIO 驱动模型简介

更新时间:
2024-01-09
下载文档

GPIO 驱动模型简介

GPIO 是嵌入式系统最简单、最常用的资源。比如点亮 LED、控制蜂鸣器、输出高低电平、检测按键等。GPIO 分输入和输出,在 SylixOS 中有关 GPIO 最底层的寄存器驱动的相关描述见文件“bsp/SylixOS/driver/gpio/gpio.c”。

GPIO 是与硬件密切相关的,SylixOS 提供一个模型来让驱动统一处理 GPIO,即各个板卡都有实现自己的 LW_GPIO_CHIP 控制模块:request,free,input,output,get,set 等,然后把控制模块注册到内核中。当用户请求 GPIO 时,系统调用这个 GPIO 对应的 LW_GPIO_CHIP 的处理函数。

SylixOS 将 GPIO 控制器功能抽象成了 LW_GPIO_CHIP 结构体,该结构体包含了 GPIO 所有可能的操作:

typedef struct lw_gpio_chip {
    CPCHAR               GC_pcLabel;
    LW_LIST_LINE         GC_lineManage;
    INT   (*GC_pfuncRequest)(struct lw_gpio_chip  *pgchip, UINT  uiOffset);
    VOID  (*GC_pfuncFree)(struct lw_gpio_chip  *pgchip, UINT  uiOffset);
    INT   (*GC_pfuncGetDirection)(struct lw_gpio_chip  *pgchip, 
                                 UINT                  uiOffset);
    INT   (*GC_pfuncDirectionInput)(struct lw_gpio_chip  *pgchip, 
                                 UINT                  uiOffset);
    INT   (*GC_pfuncGet)(struct lw_gpio_chip  *pgchip, UINT  uiOffset);
    INT   (*GC_pfuncDirectionOutput)(struct lw_gpio_chip  *pgchip, 
                                 UINT                  uiOffset, 
                                 INT                   iValue);
    INT   (*GC_pfuncSetDebounce)(struct lw_gpio_chip  *pgchip, 
                                 UINT                  uiOffset, 
                                 UINT                  uiDebounce);
    INT   (*GC_pfuncSetPull)(struct lw_gpio_chip  *pgchip, 
                                 UINT                  uiOffset, 
                                 UINT                  uiType);
    VOID   (*GC_pfuncSet)(struct lw_gpio_chip  *pgchip, 
                                 UINT                  uiOffset, 
                                 INT                   iValue);
    INT   (*GC_pfuncSetupIrq)(struct lw_gpio_chip  *pgchip, 
                                 UINT                  uiOffset,
                                 BOOL                  bIsLevel, 
                                 UINT                  uiType);
    VOID   (*GC_pfuncClearIrq)(struct lw_gpio_chip  *pgchip, UINT  uiOffset);
    irqreturn_t (*GC_pfuncSvrIrq)(struct lw_gpio_chip  *pgchip, 
                                 UINT                  uiOffset);
                                 UINT                  GC_uiBase;
                                 UINT                  GC_uiNGpios;
    struct lw_gpio_desc         *GC_gdDesc;
    ULONG                        GC_ulPad[16];      /*  保留未来扩展          */
} LW_GPIO_CHIP;
typedef LW_GPIO_CHIP            *PLW_GPIO_CHIP;
文档内容是否对您有所帮助?
有帮助
没帮助