EM9560工控主板是以EM9460工控主板為基礎,并針對客戶應用的需求,增加了更多通用數字IO,于2012年初推出的一款低成本嵌入式主板產品。該產品保持了Linux操作系統作為客戶應用程序的軟件平臺,其基本接口功能API函數上也與前期產品EM9460完全兼容,從而保證了客戶的應用程序可不加修改的直接運行于EM9560。
EM9560的GPIO數量從原有的16位(即EM9460的GPIO數)增加到46位。為了方便客戶應用程序的一致性,EM9560的GPIO驅動支持用戶應用程序采用現有API函數就可操作所有的GPIO。本文主要介紹如何利用現有API函數實現EM9560的GPIO操作。
EM9560的46位GPIO分成了2組,第一組為原有的16位GPIO,稱為GPIO0–GPIO15,第二組為擴展的新的GPIO,為區別說明,成為GPIOX0–GPIOX29。注意這兩組GPIO都沒有用到最高bit,即BIT31。新的API函數正是利用BIT31作為輸入參數,當BIT31為“0”時,表示操作基本的GPIO0–GPIO15;而BIT31=“1”時,則表示操作擴展的GPIOX0–GPIOX29。舉例說明如下:
#define GPIOX_FLAG (1 << 31) // 定義操作標志
以設置GPIO位輸出高電平為例,其基本操作函數保持不變:
int GPIO_OutSet(int fd, unsigned int dwSetBits)
{
int rc;
rc = ioctl(fd, EM9X60_GPIO_IOCTL_OUT_SET, &dwSetBits);
return rc;
}
當操作基本的GPIO0–GPIO15時,調用方式為:
unsigned int uBits = GPIOm | … | GPIOn; // 設置相關GPIO位
rc = GPIO_OutSet(fd, uBits );
而當操作擴展的GPIOX0–GPIOX29時,調用方式為:
unsigned int uBits = GPIOm | … | GPIOn; // 設置相關GPIO位
rc = GPIO_OutSet(fd, uBits |GPIOX_FLAG ); // 設置擴展標志位
由于GPIO的API大多數是輸出類型的,對僅操作基本GPIO0 – GPIO15,原有程序可不做修改,就可直接使用。但對讀取GPIO狀態,則需要特別注意,其輸出參數必須事先設置標志位,才能調用狀態讀取函數,其相關代碼如下:
基本的狀態讀取函數不變:
int GPIO_PinState(int fd, unsigned int* pPinState)
{
int rc;
unsigned int dwCurrPinState;
rc = ioctl(fd, EM9X60_GPIO_IOCTL_PIN_STATE, &dwCurrPinState);
if(rc == 0) // ioctl successful
{
*pPinState = dwCurrPinState;
}
return rc;
}
對讀取基本GPIO0–GPIO15的狀態,需要對輸出參數先賦0,再調用:
unsigned int uState = 0;
rc = GPIO_PinState(fd, &uState);
對讀取擴展GPIOX0 – GPIOX29的狀態,需要對輸出參數先設置擴展GPIO標志,再調用:
unsigned int uState = GPIOX_FLAG; // 設置擴展標志位
rc = GPIO_PinState(fd, &uState);
-
Linux
+關注
關注
87文章
11329瀏覽量
209967 -
嵌入式主板
+關注
關注
7文章
6086瀏覽量
35486
發布評論請先 登錄
相關推薦
評論