用户空间通过sysfs操作GPIO & GPIO引脚编号计算
GPIO信息
RK3399 有 5 组 GPIO bank
GPIO0 ~ GPIO4
每组又以 A0~A7, B0~B7, C0~C7, D0~D7 作为编号区分
不是所有 bank 都有全部编号,例如 GPIO4 就只有 C0~C7, D0~D2
所有的 GPIO 在上电后的初始状态都是输入模式,可以通过软件设为上拉或下拉,也可以设置为中断脚,驱动强度都是可编程的
GPIO引脚编号计算
GPIO2_D3:64 + 24 + 3 = 91
GPIO1_A3:30 + 0 + 3 = 35
GPIO2_A2:64 + 0 + 2 = 66
GPIO2_A3:64 + 0 + 3 = 67
GPIO2_A5:64 + 0 + 5 = 69
https://cdn.modb.pro/db/88436
编程示例
1.导出控制的GPIO引脚编号 echo 22 > /sys/class/gpio/export /* * in 输入 * out 输出 * high, low high/low同时设置方向为输出 */ 2.设置GPIO方向(out表示输出,in表示输入) echo out > /sys/class/gpio/gpio22/direction /* * none 引脚为输入,不是中断引脚 * rising 引脚为中断输入,上升沿触发 * falling 引脚为中断输入,下降沿触发 * both 引脚为中断输入,边沿触发 */ 3.设置GPIO中断触发方式 echo none > /sys/class/gpio/gpio22/edge 4.设置GPIO输出电平(1表示高电平,0表示低电平) echo 1 > /sys/class/gpio/gpio22/value 5.取消导出 echo 22 > sys/class/gpio/unexport 示例 用户空间通过sysfs控制GPIO # echo 9 > /sys/class/gpio/export // 执行此命令会在gpio/下生成gpio9目录 # echo out > gpio9/direction // 设置GPIO9方向为输出 # echo 1 > gpio9/value // 设置GPIO9为高电平 # echo 0 > gpio9/value // 设置GPIO9为低电平 # echo 9 > /sys/class/gpio/unexport // 关闭对GPIO9的控制
https://www.cnblogs.com/hellokitty2/p/10535903.html https://www.cnblogs.com/dakewei/p/12810536.html
1 /* 2 * GPIO初始化(GPIO描述符,GPIO引脚编号, GPIO方向) 3 */ 4 #define init_gpio(fd, a, direction) \ 5 { \ 6 if(-1 == (fd = open("/sys/class/gpio/unexport", 1))) dbge(); \ 7 if(2 != write(fd, #a, 2)) dbge(); \ 8 close(fd); \ 9 \ 10 if(-1 == (fd = open("/sys/class/gpio/export", 1))) dbge(); \ 11 if(2 != write(fd, #a, 2)) dbge(); \ 12 close(fd); \ 13 \ 14 if(-1 == (fd = open("/sys/class/gpio/gpio"#a"/direction", 1))) dbge(); \ 15 if(sizeof(#direction) != write(fd, #direction, sizeof(#direction))) dbge(); \ 16 close(fd); \ 17 \ 18 if(-1 == (fd = open("/sys/class/gpio/gpio"#a"/edge", 1))) dbge(); \ 19 if(4 != write(fd, "none", 4)) dbge(); \ 20 close(fd); \ 21 \ 22 if(-1 == (fd = open("/sys/class/gpio/gpio"#a"/value", 2))) dbge(); \ 23 } 24 25 26 int fd; 27 init_gpio(fd, 66, in);