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_CLOEXEC
和GFD_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。