英创信息技术EM9560工控主板GPIO的使用介绍

描述

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);

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分