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