linux下对/sys/class/gpio中的gpio的编号确定
在网上看到了很多的/sys/class/gpio中的控制,大部分都是抄的,特别是关于GPIO编号的确认,很多基本没有几个说得明白。
引脚编号 = 控制引脚的寄存器基数 + 控制引脚寄存器位数
但如何确定控制引脚的寄存器基数和控制引脚寄存器位数?
1. 首先进入gpio目录,并查看文件
# cd /sys/class/gpio/
# ls
文件下有若干个 gpiochipX 文件夹,X代表数字。gpiochipX目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号
2. 查看每个gpiochipX目录中的信息
# for i in gpiochip* ; do echo `cat $i/label`: `cat $i/base` ; done
对于不同的Linux系统打印出的结果会有所不同。
1)最方便的情况
打印出的结果标识了所有控制引脚的寄存器基数,那么引脚编号就直接计算,如:
GPIOA: 0 GPIOE: 128 GPIOF: 160 GPIOG: 192 GPIOH: 224 GPIOB: 32 GPIOC: 64 GPIOD: 96
则GPIOF_8的编号 = 160 + 8 =168
有些系统显示的有GPIO的绝对地址,那么就需要查找数据手册看地址对应的GPIO了
2)普遍情况
对于GPIOx_y的编号 = 控制引脚的寄存器基数(32 * x)+ 控制引脚寄存器位数(y)=32*x+y
若x为字母,则x=x-'A'.
3)无法直观确认时
查找开发板的数据手册。
例如CQR40平台开发手册中写明端口组号为:
PA_BASE 0
PB_BASE 32
PC_BASE 64
PD_BASE 96
... ...