跳到主要内容

Linux通过sysfs控制GPIO

阅读量

0

阅读人次

0

sysfs控制gpio的方式主要基于内核提供的gpio控制接口文件。也就是通过读写/sys/class/gpio目录下的文件来控制对应的gpio接口。

  • /sys/class/gpio/目录下各个文件说明:
  • /sys/class/gpio/export文件用于通知系统需要导出控制的GPIO引脚编号;
  • /sys/class/gpio/unexport 用于通知系统取消导出;
  • /sys/class/gpio/gpioX/direction文件,可以写入in(设置输入方向)或out(设置输出方向);
  • /sys/class/gpio/gpioX/value文件是可以读写GPIO状态;
  • /sys/class/gpio/gpiochipX目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号,寄存器名称,引脚总数;其中X表示具体的引脚编号。

引脚计算

GPIO pin脚计算公式:pin = bank * 32 + number

GPIO 小组编号计算公式:number = group * 8 + X (group:A=0,B=1,C=2,......)

例如:GPIO3_C4_d ,bank = 3,group = C,X=4。即:3 * 32 + 2 * 8 + 4 = 116

操作引脚

在终端/sys/class/gpio路径下使用命令来操作GPIO116:

echo 116 > /sys/class/gpio/export        // gpio_request 申请导出相应的gpio
echo out > /sys/class/gpio/gpio116/direction //gpio_direction_output 设置相应gpio为输出方向
echo 1 > /sys/class/gpio/gpio116/value // gpio_set_value 设置输出高电平
echo 0 > /sys/class/gpio/gpio116/value
cat /sys/class/gpio/gpio116/value // gpio_get_value 获取gpio当前状态值
echo 116 > /sys/class/gpio/unexport // gpio_free 释放申请的gpio

查看gpio占用状态:

cat /sys/kernel/debug/gpio

gpiochip0: GPIOs 0-31, parent: platform/pinctrl, gpio0:
gpio-0 ( |reset ) out hi
gpio-2 ( |sysfs ) out hi
gpio-5 ( |bt_default_wake_host) in hi
......
gpiochip3: GPIOs 96-127, parent: platform/pinctrl, gpio3:
gpio-104 ( |vcc18_lcd_n ) out hi
gpio-105 ( |sysfs ) out hi
gpio-116 ( |sysfs ) out lo
gpio-117 ( |sysfs ) out lo

查看pinmux-pins(gpio全部信息):

cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins
cat /sys/kernel/debug/pinctrl/pinctrl/pinmux-pins

Pinmux settings per pin
Format: pin (name): mux_owner gpio_owner hog?
pin 0 (gpio0-0): (MUX UNCLAIMED) gpio0:0
pin 1 (gpio0-1): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 2 (gpio0-2): (MUX UNCLAIMED) gpio0:2
......
pin 128 (gpio4-0): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 129 (gpio4-1): (MUX UNCLAIMED) (GPIO UNCLAIMED)

libgpio

在C/C++有一个libgpio库,就是利用sysfs接口操作GPIO的。