在Linux 中的应用层操作gpio的方法

背景:

       由于在调试WiFi驱动模块的时候需要增加一个功能:就是用户按下一个按键就可以,将WiFi的ssid和psk恢复到出场模式。所以这里就需要开辟一个线程去检测按键的状态。第一步首先是用户按下按键后应用层能够检测到相应的gpio的电平的变化。

       gpio的状态应该是mpu中最基本的操作,所以在厂家提供的SDK中应该已经有相应的驱动了,所以用户层可以直接使用,通过上网查询后,先整理如下:

要在应用层字节使用提供好的gpio的驱动,需要在Linux的内核编译前使用menuconfig,增加Linux的gpio驱动部分。

device drivers -> gpio support ->/sys/class/gpio.....(sysfs interface)

在应用层可以使用sysfs中的gpio子系统。

 

编译好了之后烧写到目标板子中,gpio的操作有多种方法:

1.在命令行界面操作。

(1)进入gpio的目录:

cd /sys/class/gpio/  

(2)将相应的gpio引脚从内核层导入到用户层,下面中的d,是具体的gpio引脚。笔者使用的是瑞星微的rv1108芯片。

GPIOx_yZ  -----------d= x*32 + (y - a) * 8 + Z

例如:

GPIO0_A7  -----------d= 0*32 + (a - a) * 8  + 7 = 7

echo d > export

执行完成后可以通过ls命令查看:

进入生成的gpio7目录:

(3)设置gpio的输入输出方向

 

echo "in" > direction     -----------输入方向

echo "out" > direction    -----------输出方向

(4)获取或者控制gpio的状态

获取:(在direction 为 in的情况下)

cat value

0 ----------引脚电平为低

1 ----------引脚电平为高

控制:(在direction为out的情况下)

echo 1 > value  -------输出高电平

echo 0 > value  -------输出低电平

编译好了之后烧写到目标板子中,gpio的操作有多种方法:

1.在命令行界面操作。

         (1)进入gpio的目录:

cd /sys/class/gpio/  

         (2)将相应的gpio引脚从内核层导入到用户层,下面中的d,是具体的gpio引脚。笔者使用的是瑞星微的rv1108芯片。

GPIOx_yZ  -----------d= x*32 + (y - a) * 8 + Z

例如:

GPIO0_A7  -----------d= 0*32 + (a - a) * 8  + 7 = 7

echo d > export

         (3)设置gpio的输入输出方向

echo "in" > direction     -----------输入方向

echo "out" > direction    -----------输出方向

         (4)获取或者控制gpio的状态

获取:(在direction 为 in的情况下)

cat value

0 ----------引脚电平为低

1 ----------引脚电平为高

控制:(在direction为out的情况下)

echo 1 > value  -------输出高电平

echo 0 > value  -------输出低电平

2.在应用程序中操作。

{
char value;
        int export_fd, direction_fd, gpiovalue_fd;

        export_fd = open("/sys/class/gpio/export", O_WRONLY);
        if(-1 == export_fd)
        {
                printf("[%s]:[%d] open gpio export file error\r\n", __FUNCTION__, __LINE__);
                exit(1);
        }
        if(-1 == write(export_fd, "7", 1))
        {
                printf("write file operation error\r\n");
                exit(1);
        }
        close(export_fd);
        //sleep(2000);
        direction_fd = open("/sys/class/gpio/gpio7/direction", O_WRONLY);
        if(-1 == direction_fd)
        {
                printf("[%s]:[%d] open gpio direction file error\r\n", __FUNCTION__, __LINE__);
                
                exit(1);
        }
        if(-1 == write(direction_fd, "in", sizeof("in")))
        {
                printf("[%s]:[%d] write operation direction error\r\n", __FUNCTION__, __LINE__);
                close(direction_fd);
                exit(1);
        }
        close(direction_fd);
        printf("[%s]:[%d] debug information print\r\n", __FUNCTION__, __LINE__);
        gpiovalue_fd = open("/sys/class/gpio/gpio7/value", O_RDONLY);
        if(-1 == gpiovalue_fd)
        {
                printf("[%s]:[%d]: open value file error\r\n", __FUNCTION__, __LINE__);
                
                exit(1);
        }

        while(1)
        {
                if(-1 == read(gpiovalue_fd, &value, sizeof(value)))
                {
                        printf("[%s]:[%d] read gpiovalue is fail\r\n", __FUNCTION__, __LINE__);
                        close(gpiovalue_fd);
                        exit(1);
                }
                if('0' == value)
                {

                        printf("now, the reset key is pressing and the key value = %c  !!!!\r\n", value);
                lseek(gpiovalue_fd, 0, SEEK_SET);
                sleep(1);
        }
        close(gpiovalue_fd);
}

 


版权声明:本文为u010299133原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。