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);
全部0条评论
快来发表一下你的评论吧 !