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