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

  ... ...

 

posted @ 2020-05-20 15:35  MoreABetter  阅读(4857)  评论(0编辑  收藏  举报