CODE_LINUX_APP_GPIO

主要用途:该模块实现了应用层对于GPIO设备操作的封装,能够实现对于GPIO的初始化、参数配置,读和写等功能。

能力分类:嵌入式

应用领域:电源电池,机器人,智能家居,照明显示,国防军工

交易方式: 定制

参考价格:50000.00 小贴士:当前佣金是0%

好评率:100%| 综合评分:5.0| 已购买:0次
联系我 收藏店铺
分享: 

 模块描述

1.1  原理及方式

定义一个Struct GPIO的结构来存储传入的GPIO配置参数(通道号,方向,值等)、设备文件名称等信息,采用libc库标准文件操作实现GPIO设备的初始化、配置以及读写操作。

1.2  主要功能

该模块实现了应用层对于GPIO设备操作的封装,能够实现对于GPIO初始化、参数配置,读和写等功能。

 标准模块

 模块设计

结构体设计

1. Struct GPIO的结构来存储传入的GPIO配置参数(通道号,方向,值等)、设备文件名称等信息

typedef struct gpio_comm{

    uint16 chan;//logic channel:0~GPIO_MAX_LOGIC_NUM-1

    uint16 userChan;//user defined channel:0~GPIO_MAX_USER_NUM-1

    int8   direction;//0:out,1:in

    int8   value;

}gpio_comm;

typedef  struct GPIO{

dll_t node;

devClass    class;

#define GPIO_NAME_LEN  (32)

char  name[GPIO_NAME_LEN];//unused

uint32 base;//the mapped basic GPIO address

    gpio_comm comm;

uint32 flag;

#define  GPIO_FLAG_EXPORTED   (0x00000001)

}objGPIO;

 

 

主要函数说明

GPIO初始化函数

函数原型

objGPIO *   gpio_init( gpio_comm pVal[], int32 len )

功能描述

初始化GPIO模块

输入参数

gpio_comm pVal[]GPIO的索引,方向值;

int32 lenGPIO数量 

输出参数

全局变量值的变化

返回值

NULL-失败;

GPIO对象指针-成功

 

配置GPIO函数

函数原型

STATUS gpio_cfg(objGPIO *  obj)

功能描述

配置GPIO通道,方向,值

输入参数

objGPIO *  obj GPIO对象指针

输出参数

全局变量值的变化

返回值

OK-成功

ERROR-失败

 

读取GPIO函数

函数原型

STATUS gpio_get(objGPIO *  obj)

功能描述

读取GPIO数据

输入参数

objGPIO *  obj GPIO对象指针

输出参数

全局变量值的变化

返回值

OK-成功

ERROR-失败

 

数据到GPIO函数

函数原型

STATUS gpio_put(objGPIO *  obj)

功能描述

写入数据到循环缓冲

输入参数

objGPIO *  obj GPIO对象指针

输出参数

全局变量值的变化

返回值

OK-成功

ERROR-失败

 

 类定义

应用举例

基于API实现能够测试GPIO配置和读写功能的测试程序

int gpiotest(int argc, char **argv)

{

STATUS  ret  =  OK;

int i = 0;

int error = 0;

int result = PASS;

uint32 count = 0;

    int testval[]= {1,0};

objGPIO * pGpio = NULL;

int chan = 0;

 

   pGpio = gpio_init();

   if(NULL == gpGpio)

{

ret |= ERR_INIT_GPIO;

OUT_MSG("init gpio error\n");

goto QUIT;

}

 /*  gpio output test */

OUT_MSG("***********************test GPIO start***************************\n");

for(i=0; i < count; ++i)

{

      for(chan = 1; chan  < GPIO_MAX_USER_NUM; ++chan)

      {

           delay();

            if (

              ((chan >= 33)  && (chan <= 41))   ||

              ((chan >= 44) && (chan <= 55))    ||

              ((chan >= 78) && (chan < GPIO_MAX_USER_NUM ))

             )

            {/* out */

                pGpio[chan].comm.value = testval[i];

                if (OK == gpio_put(&pGpio[chan]))

                {

                      OUT_MSG("set GPIO%d %d ,",chan,pGpio[chan].comm.value);

                 }else{

                       OUT_MSG("set GPIO%d failed,",chan);

                 }

           }

           if ( (chan > 55) && (chan < 78)  )

           {/* set 0 to light control LED  */

               pGpio[chan].comm.value = 1- testval[i];

             if (OK == gpio_put(&pGpio[chan]))

               {

                    OUT_MSG("set GPIO%d %d ,",chan,pGpio[chan].comm.value);

                }else{

 

                      OUT_MSG("set GPIO%d failed,",chan);

                }

           }

            pGpio[chan].comm.value = 1- testval[i];

            if (OK == gpio_get(&pGpio[chan]))

             {

               OUT_MSG("get GPIO%d:%d .\n",chan,pGpio[chan].comm.value);

              }else{

                  OUT_MSG("get GPIO%d failed.\n",chan);

              }

      }

        PAUSE();

   }

OUT_MSG("-----------test input voltage change--------------\n");

PAUSE();

for(i = 0; i < count; ++i)

{

      for(chan = 1; chan  <= 11; ++chan)

      {

            pGpio[chan].comm.value = 0;

            if (OK == gpio_get(pGpio[chan]))

            {

               OUT_MSG("get GPIO%d:%d .\n",chan,pGpio[chan].comm.value);

              }else{

 

               OUT_MSG("get GPIO%d failed.\n",chan);

              }

        }

         for(chan =14; chan  <= 32; ++chan)

          {

                pGpio[chan].comm.value = 0;

                if (OK == gpio_get(&pGpio[chan]))

                {

                   OUT_MSG("get GPIO%d:%d .\n",chan,pGpio[chan].comm.value);

                 }else{

 

                    OUT_MSG("get GPIO%d failed.\n",chan);

                }

         }

         for(chan =42; chan  <= 43; ++chan)

          {

                pGpio[chan].comm.value = 0;

                if (OK == gpio_get(&gpGpio[chan]))

                {

                   OUT_MSG("get GPIO%d:%d .\n",chan,pGpio[chan].comm.value);

                 }else{

 

                    OUT_MSG("get GPIO%d failed.\n",chan);

                }

         }

    

             PAUSE();

}

 OUT_MSG("*******************test GPIO OK*********************\n");

QUIT:

     return ret;

}

 

其他


总体评价

好评率:100%

好评数量:0

总体评分

工作速度:5分

工作质量:5分

工作态度:5分

暂无评价

企业其他能力

More>