# GPIO操作
本文讲述linux下,用户空间的GPIO操作的常规方法和python脚本操作的方法
## 文件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
~~~
## C语言操作
待搬运
http://www.cnblogs.com/zym0805/p/5814351.html
## python操作
Zero将GPIO的基本操作封装成了Python库,因此你可以使用python脚本方便地操作GPIO。
首先下载python-lpi.gpio库并安装
`sudo python setup.py install `
点亮绿灯的简单示例:
~~~
import LPi.GPIO as GPIO
GPIO.init()
GPIO.setcfg(GPIO.PG0, GPIO.OUT)
GPIO.output(GPIO.PG0, GPIO.LOW)
~~~
详细操作见python库的README。