gpiofd接口的實現

SylixOS中會把GPIO抽象爲設備文件,應用層通過訪問設備文件即可操作GPIO。除了按照文件的方式訪問GPIO外,系統還封裝了GpioFd接口,簡化了應用層對GPIO的操作。這一篇來說明GpioFd接口是如何實現的,實現代碼如下:

/*********************************************************************************************************
** 函數名稱: gpiofd
** 功能描述: 打開 gpiofd 文件
** 輸 入  : gpio           gpio 號
**           flags          打開標誌 GFD_CLOEXEC / GFD_NONBLOCK
**           gpio_flags     gpio 屬性標誌
** 輸 出  : gpiofd 文件描述符
*********************************************************************************************************/
LW_API  
int  gpiofd (unsigned int gpio, int flags, int gpio_flags)
{
    INT  iFd;
    INT  iError;
    CHAR cGpioName[MAX_FILENAME_LENGTH];

    flags &= (GFD_CLOEXEC | GFD_NONBLOCK);
    
    snprintf(cGpioName, MAX_FILENAME_LENGTH, "%s/%d", LW_GPIOFD_DEV_PATH, gpio);
    
    iFd = open(cGpioName, O_RDWR | flags);
    if (iFd >= 0) {
        iError = ioctl(iFd, GPIO_CMD_SET_FLAGS, gpio_flags);
        if (iError < 0) {
            close(iFd);
            return  (iError);
        }
    }
    
    return  (iFd);
}
/*********************************************************************************************************
** 函數名稱: gpiofd_read
** 功能描述: 讀取 gpiofd 文件
** 輸 入  : fd        文件描述符
**           value     讀取緩衝
** 輸 出  : 0 : 成功  -1 : 失敗
*********************************************************************************************************/
LW_API  
int  gpiofd_read (int fd, uint8_t *value)
{
    return  (read(fd, value, sizeof(uint8_t)) != sizeof(uint8_t) ? PX_ERROR : ERROR_NONE);
}
/*********************************************************************************************************
** 函數名稱: gpiofd_write
** 功能描述: 寫 gpiofd 文件
** 輸 入  : fd        文件描述符
**           value     寫入數據
** 輸 出  : 0 : 成功  -1 : 失敗
*********************************************************************************************************/
LW_API  
int  gpiofd_write (int fd, uint8_t  value)
{
    return  (write(fd, &value, sizeof(uint8_t)) != sizeof(uint8_t) ? PX_ERROR : ERROR_NONE);
}
  • gpiofd接口是基於設備文件訪問標準接口(open,close,read,write,ioctl)實現的。

  • 對輸入的文件打開方式進行了調整,保留了GFD_CLOEXECGFD_NONBLOCK,增加了O_RDWR

    GFD_CLOEXEC      close_on_exec
    GFD_NONBLOCK   非阻塞訪問,讀寫數據時不會阻塞
    O_RDWR          讀寫訪問

  • 將GPIO編號轉爲相應的GPIO設備文件名,包含文件路勁。

  • 打開成功則通過ioctl函數設置gpio_flags,標準open函數是沒有gpio_flags參數的,所以要通過ioctl函數設置。

  • 讀寫則是直接調用的read,write函數,同時設置讀寫緩存固定爲1字節。

  • 參考該實現代碼,應用層也可以直接使用設備文件訪問標準接口來操作GPIO。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章