背景:
由于在调试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);}