文件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