- 没有一个标准的GPIO序号宏定义规则,目前使用个人定义的一套方法。SylixOS中GPIO序号宏定义
- GPIO属性参数有好几套,没有统一为标准的一套。使得各层处理中往往需要添加参数转换操作。
#define GPIO_FLAG_DIR_OUT 0x0000
#define GPIO_FLAG_DIR_IN 0x0001
#define GPIO_FLAG_INIT_LOW 0x0000
#define GPIO_FLAG_INIT_HIGH 0x0002
#define GPIO_FLAG_IN (GPIO_FLAG_DIR_IN)
#define GPIO_FLAG_OUT_INIT_LOW (GPIO_FLAG_DIR_OUT | GPIO_FLAG_INIT_LOW)
#define GPIO_FLAG_OUT_INIT_HIGH (GPIO_FLAG_DIR_OUT | GPIO_FLAG_INIT_HIGH)
#define GPIO_FLAG_OPEN_DRAIN 0x0004
#define GPIO_FLAG_OPEN_SOURCE 0x0008
#define GPIO_FLAG_PULL_DEFAULT 0x0000
#define GPIO_FLAG_PULL_UP 0x0010
#define GPIO_FLAG_PULL_DOWN 0x0020
#define GPIO_FLAG_PULL_DISABLE 0x0040
#define GPIO_FLAG_TRIG_FALL 0x0100
#define GPIO_FLAG_TRIG_RISE 0x0200
#define GPIO_FLAG_TRIG_LEVEL 0x0400
#define LW_GPIODF_REQUESTED 0x0001
#define LW_GPIODF_IS_OUT 0x0002
#define LW_GPIODF_TRIG_FALL 0x0004
#define LW_GPIODF_TRIG_RISE 0x0008
#define LW_GPIODF_TRIG_LEVEL 0x0010
#define LW_GPIODF_OPEN_DRAIN 0x0020
#define LW_GPIODF_OPEN_SOURCE 0x0040
#define LW_GPIOF_DIR_OUT (0 << 0)
#define LW_GPIOF_DIR_IN (1 << 0)
#define LW_GPIOF_INIT_LOW (0 << 1)
#define LW_GPIOF_INIT_HIGH (1 << 1)
#define LW_GPIOF_IN (LW_GPIOF_DIR_IN)
#define LW_GPIOF_OUT_INIT_LOW (LW_GPIOF_DIR_OUT | LW_GPIOF_INIT_LOW)
#define LW_GPIOF_OUT_INIT_HIGH (LW_GPIOF_DIR_OUT | LW_GPIOF_INIT_HIGH)
#define LW_GPIOF_OPEN_DRAIN (1 << 2)
#define LW_GPIOF_OPEN_SOURCE (1 << 3)
API_GpioGetIrq
和API_GpioSetupIrq
函数参数直接使用数字量,没有通过宏来命名。
/*********************************************************************************************************
** 函数名称: API_GpioSetupIrq
** 功能描述: 根据指定 GPIO 号设置相应的外部中断, 并返回对应的 IRQ 号
** 输 入 : uiGpio GPIO 号
** bIsLevel 是否为电平触发
** uiType 如果为电平触发, 1 表示高电平触发, 0 表示低电平触发
** 如果为边沿触发, 1 表示上升沿触发, 0 表示下降沿触发, 2 表示双边沿触发
** 输 出 : IRQ 号, 错误返回 LW_VECTOR_INVALID
*********************************************************************************************************/
LW_API
ULONG API_GpioSetupIrq (UINT uiGpio, BOOL bIsLevel, UINT uiType)
-
GPIODrv 接口中的中断处理可以进一步封装简化。例如:在驱动层使用GPIO的中断功能的简化接口
-
有些API接口没有必要,如:
API_GpioRequestArray
,API_GpioFreeArray
,在比如API_GpioSetDebounce
接口,实际硬件中GPIO输入具备滤波特性的型号非常的少,这个接口自然也是在绝大部分情况下都无实用性。 -
API_GpioGetIrq
接口的后两个参数没有意义,即不是用来设置中断类型的也不能获取中断类型。
/*********************************************************************************************************
** 函数名称: API_GpioGetIrq
** 功能描述: 根据指定 GPIO 号返回对应的 IRQ 号
** 输 入 : uiGpio GPIO 号
** bIsLevel 是否为电平触发
** uiType 如果为电平触发, 1 表示高电平触发, 0 表示低电平触发
** 如果为边沿触发, 1 表示上升沿触发, 0 表示下降沿触发, 2 表示双边沿触发
** 输 出 : IRQ 号, 错误返回 LW_VECTOR_INVALID
** 全局变量:
** 调用模块:
API 函数
*********************************************************************************************************/
LW_API
ULONG API_GpioGetIrq (UINT uiGpio, BOOL bIsLevel, UINT uiType)
其他缺陷待补充。。。