SylixOS中现有GPIO设备体系缺陷

  • 没有一个标准的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_GpioGetIrqAPI_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_GpioRequestArrayAPI_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)

其他缺陷待补充。。。

发布了39 篇原创文章 · 获赞 6 · 访问量 5071

猜你喜欢

转载自blog.csdn.net/ScilogyHunter/article/details/102526179