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