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;