文件IO方式操作

GPIO编号及复用功能

在Linux中,GPIO 使用0~MAX_INT之间的整数标识。

对于32位CPU,每组GPIO 32个,引脚号就是按顺序排列。

LicheePi Zero的所有IO的复用功能及GPIO标识号为:

>> 总共52个IO,所有IO上电默认状态为高阻态, 驱动电流强度20mA >> PB和PG具有中断功能

Pin Name Pin Number Func2 Func3 Func4 Func5 Func6
PB0 32 UART2_TX - - - PB_EINT0
PB1 33 UART2_RX - - - PB_EINT1
PB2 34 UART2_RTS - - - PB_EINT2
PB3 35 UART2_CTS - - - PB_EINT3
PB4 36 PWM0 - - - PB_EINT4
PB5 37 PWM1 - - - PB_EINT5
PB6 38 TWI0_SCK - - - PB_EINT6
PB7 39 TWI0_SDA - - - PB_EINT7
PB8 40 TWI1_SCK UART0_TX - - PB_EINT8
PB9 41 TWI1_SDA UART0_RX - - PB_EINT9
PC0 64 SDC2_CLK SPI0_MISO - - -
PC1 65 SDC2_CMD SPI0_CLK - - -
PC2 66 SDC2_RST SPI0_CS - - -
PC3 67 SDC2_D0 SPI0_MOSI -    
PE0 128 CSI_PCLK LCD_CLK - - -
PE1 129 CSI_MCLK LCD_DE - - -
PE2 130 CSI_HSYNC LCD_HSYNC - - -
PE3 131 CSI_VSYNC LCD_VSYNC - - -
PE4 132 CSI_D0 LCD_D2 - - -
PE5 133 CSI_D1 LCD_D3 - - -
PE6 134 CSI_D2 LCD_D4 - - -
PE7 135 CSI_D3 LCD_D5 - - -
PE8 136 CSI_D4 LCD_D6 - - -
PE9 137 CSI_D5 LCD_D7 - - -
PE10 138 CSI_D6 LCD_D10 - - -
PE11 139 CSI_D7 LCD_D11 - - -
PE12 140 CSI_D8 LCD_D12 - - -
PE13 141 CSI_D9 LCD_D13 - - -
PE14 142 CSI_D10 LCD_D14 - - -
PE15 143 CSI_D11 LCD_D15 - - -
PE16 144 CSI_D12 LCD_D18 - - -
PE17 145 CSI_D13 LCD_D19 - - -
PE18 146 CSI_D14 LCD_D20 - - -
PE19 147 CSI_D15 LCD_D21 - - -
PE20 148 CSI_FIELD CSI_MIPI_MCLK - - -
PE21 149 CSI_SCK TWI1_SCK UART1_TX - -
PE22 150 CSI_SDA TWI1_SDA UART1_RX - -
PE23 151 - LCD_D22 UART1_RTS - -
PE24 152 - LCD_D23 UART1_CTS - -
PF0 160 SDC0_D1 JTAG_MS - - -
PF1 161 SDC0_D0 JTAG_DI - - -
PF2 162 SDC0_CLK UART0_TX - - -
PF3 163 SDC0_CMD JTAG_DO - - -
PF4 164 SDC0_D3 UART0_RX - - -
PF5 165 SDC0_D2 JTAG_CK - - -
PF6 166 - - - - -
PG0 192 SDC1_CLK - - - PG_EINT0
PG1 193 SDC1_CMD - - - PG_EINT1
PG2 194 SDC1_D0 - - - PG_EINT2
PG3 195 SDC1_D1 - - - PG_EINT3
PG4 196 SDC1_D2 - - - PG_EINT4
PG5 197 SDC1_D3 - - - PG_EINT5

sysfs操作GPIO

/sys/class/gpio目录下的三种文件:

  • export/unexport文件
  • gpioN指代具体的gpio引脚
  • gpio_chipN指代gpio控制器

export/unexport:

  • /sys/class/gpio/export,只写,写入GPIO编号来向内核申请GPIO控制权(前提是没有内核代码申请这个gpio端口), 成功后会在目录下生成gpioN目录。
  • /sys/class/gpio/unexport和导出的效果相反。

gpioN:

指代某个具体的gpio端口, 内有以下属性文件:

Attribution Read/Write Value Function
direction RW in,out;low,high 设置输入输出
value RW 0,非零 读取或者写入IO电平
edge RW none , rising , falling , both 配置中断触发方式
active_low RW 0,非零 设置低电平有效

gpiochipN

gpiochipN表示的就是一个gpio_chip,用来管理和控制一组gpio端口的控制器,该目录下存在以下属性文件:

Attribution Function
base 和N相同,表示控制器管理的最小的端口编号。
lable 诊断使用的标志,寄存器地址,1c20800.pinctrl
ngpio 表示控制器管理的gpio端口数量,A~G,224

使用sysfs操作GPIO的例子:

#echo 192 > /sys/class/gpio/export  #导出 PG0, GREEN
#ls /sys/class/gpio/
export     gpio192    gpiochip0  unexport
#ls /sys/class/gpio/gpio192/
active_low direction subsystem/ value device/ power/ uevent
#echo "out" > /sys/class/gpio/gpio192/direction #设置为输出
#echo 0 > /sys/class/gpio/gpio192/value     #亮灯
#echo 1 > /sys/class/gpio/gpio192/value #灭灯
#echo "in" > /sys/class/gpio/gpio192/direction #设置为输入
#cat /sys/class/gpio/gpio192/value #读取电平
0

用户可以参考以上操作进行GPIO控制。

注意对重要引脚的导出操作可能会使系统崩溃。

LicheePi Zero提供了简单的shell脚本进行GPIO读写(代码在https://github.com/Lichee-Pi/lichee-pi-zero/tree/master/SoftWare,下同):

gpio.sh init 192 out
gpio.sh set 192 out
gpio.sh get 192
gpio.sh w 192 1
gpio.sh r 192
gpio.sh deinit 192

附录(gpio.sh源码)

#!/bin/sh
function help()
{
echo "gpio.sh usage:"
echo "        gpio.sh init PG0 out"
echo "        gpio.sh set PG0 out"
echo "        gpio.sh get PG0"
echo "        gpio.sh w PG0 1"
echo "        gpio.sh r PG0"
echo "        gpio.sh deinit PG0"
}

if [ $# -lt 2 ]; then
        help;
        exit;
fi

portpin=`echo $2 | tr 'a-z' 'A-Z'`;
port=${portpin:1:1};
pin=${portpin:2:1};
#echo $port
#echo $pin
num=`printf "%d" "'$port"`;
num=`expr \( $num - 65 \) \* 32 + $pin`;
if [ $? -ne 0 ]; then
        help;
        exit
fi
#echo $num

case $1 in
        init)
        echo $num > /sys/class/gpio/export
        echo $3 > /sys/class/gpio/gpio${num}/direction
        ;;
        set)
        echo $3 > /sys/class/gpio/gpio${num}/direction
        ;;
        get)
        echo `cat /sys/class/gpio/gpio${num}/direction`
        ;;
        w)
        echo $3 > /sys/class/gpio/gpio${num}/value
        ;;
        r)
        echo `cat /sys/class/gpio/gpio{num}/value`
        ;;
        deinit)
        echo $num > /sys/class/gpio/unexport
        ;;
        *)
        help
        ;;
esac