本帖最后由 renshengrumeng 于 2020-8-24 16:02 编辑
Linux 应用层直接操作GPIO 一、gpio目录说明 进入 /sys/class/gpio目录 会发现有两个文件和两类文件说明如下: - export文件: 文件用于通知系统需要导出控制的GPIO引脚编号
- 解析:通过向export 文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间。
- unexport文件: 用于通知系统取消导出
- gpioxxx文件:xxx文件是GPIO编号,gpioxxx是链接文件,其原目录包含direction value等信息。通过控制 direction 来控制输入输出,控制value 来控制高低电平。
- gpiochipxxx文件:xxx 是GPIO 每组io口个数的整数倍如0,32,64,128 文件链接到GPIO 有关寄存器地址等信息目录。
计算GPIO编号:nr=(P -1)* 32 + N; gpioP_N;
注意:要在应用层直接使用提供好的gpio的驱动,需要在Linux的内核编译前使用menuconfig,增加Linux的gpio驱动部分。
device drivers -> gpio support->/sys/class/gpio.....(sysfs interface)
并且对应的GPIO在设备树中已经设置成普通GPIO。
默认系统没有导出控制蜂鸣器的 129引脚 通过如下命令导出
- echo 129 > /sys/class/gpio/export
复制代码
上面命令执行完就会发现有了个 gpio129软连接文件在/sys/class/gpio/。如果没有出现相应的软连接,说明此引脚不可导出。
通过如下命令设置为输出
- echo out > /sys/class/gpio/gpio129/direction
复制代码
通过写入高低电平控制有源蜂鸣器响还是不响
- echo 1 > /sys/class/gpio/gpio129/value ---> 写高电平
复制代码
图可知led 所在GPIO。
程序实现GPIO led案件
- #include
- #include
- #include
- #include
- #include
- //define O_WRONLY and O_RDONLY
- //芯片引脚: CPIO5_3
- #define SYSFS_GPIO_EXPORT "/sys/class/gpio/export"
- #define SYSFS_GPIO_LED_PIN_VAL "131"
- #define SYSFS_GPIO_LED_DIR "/sys/class/gpio/gpio131/direction"
- #define SYSFS_GPIO_LED_DIR_VAL "OUT"
- #define SYSFS_GPIO_LED_VAL "/sys/class/gpio/gpio131/value"
- #define SYSFS_GPIO_LED_VAL_H "1"
- #define SYSFS_GPIO_LED_VAL_L "0"
- int main()
- {
- int fd;
- //打开端口/sys/class/gpio# echo 117 > export
- fd = open(SYSFS_GPIO_EXPORT, O_WRONLY);
- if (fd == -1)
- {
- printf("ERR: Radio hard reset pin open error.n");
- return EXIT_FAILURE;
- }
- write(fd, SYSFS_GPIO_LED_PIN_VAL, sizeof(SYSFS_GPIO_LED_PIN_VAL));
- close(fd);
- //设置端口方向/sys/class/gpio/gpio117# echo out > direction
- fd = open(SYSFS_GPIO_LED_DIR, O_WRONLY);
- if (fd == -1)
- {
- printf("ERR: Radio hard reset pin direction open error.n");
- return EXIT_FAILURE;
- }
- write(fd, SYSFS_GPIO_LED_DIR_VAL, sizeof(SYSFS_GPIO_LED_DIR_VAL));
- close(fd);
- //输出复位信号: 拉高>100ns
- fd = open(SYSFS_GPIO_LED_VAL, O_RDWR);
- if (fd == -1)
- {
- printf("ERR: Radio hard reset pin value open error.n");
- return EXIT_FAILURE;
- }
- while (1)
- {
- write(fd, SYSFS_GPIO_LED_VAL_H, sizeof(SYSFS_GPIO_LED_VAL_H));
- usleep(1000000);
- write(fd, SYSFS_GPIO_LED_VAL_L, sizeof(SYSFS_GPIO_LED_VAL_L));
- usleep(1000000);
- }
- close(fd);
- printf("INFO: Radio hard reset pin value open error.n");
- return 0;
- }
复制代码
|