# 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。
- 前言
- 荔枝派TODO任务领取
- linux使用小贴士
- 入门篇
- 板卡介绍
- 开箱指南
- 烧录启动系统
- 联网方法
- 镜像使用
- 镜像说明
- buildroot系统使用
- debian系统使用
- 外设操作
- 外设操作概览
- 低速外设
- GPIO
- GPIO模拟低速接口
- UART
- PWM
- I2C
- SPI
- 高速接口
- SDIO
- USB
- EtherNet
- DVP CSI
- MIPI CSI
- 模拟外设
- CODEC
- LRADC
- 常见设备驱动
- USB摄像头
- USB 3G/4G 网卡
- 舵机
- 开发篇
- UBOOT适配
- UBOOT编译
- UBOOT配置
- UBOOT配置屏幕分辨率
- UBOOT配置SPI启动
- Linux内核开发
- Linux内核编译
- BSP Linux内核编译.md
- Linux内核选项
- 外设驱动与设备树
- RTL8723BS驱动
- 根文件系统定制
- buildroot定制系统
- buildroot添加软件包
- openwrt定制系统
- emdebian定制系统
- camdriod开发
- camdriod编译
- 主线Uboot引导Camdriod
- 系统镜像打包
- XBOOT适配
- 荔枝运行XBOOT
- 应用篇
- 游戏机-基于EmulationStation
- 游戏机-gnuboy
- 语音识别-科大讯飞云
- GUI-QT5
- 语音识别-离线关键词识别
- 路由器-Lichee Zero
- 投稿文章
- 荔枝派Zero开箱指南
- Zero i2c oled使用指南
- zero SPI LCD使用指南
- Zero u-boot编译和使用指南
- TF WiFi使用方法
- Zero Ethernet使用指南
- Zero 移植Qt5.4.1
- ZeroSpiNorFlash启动系统制作指南
- Visio-uboot-sunxi流程
- lichee 编译踩坑记录(ilichee ZERO)
- lichee_zero_外设GPIO接口
- TF WIFI 小白编
- 从零开始LicheePi Zero的开发
- 认识Zero的硬件
- 搭建Zero的开发环境
- 主线Uboot
- 主线kernel
- BSP kernel
- BSP内核启动
- bsp内核的摄像头使用
- BSP内核中的保留内存
- uboot启动BSP内核常见错误
- BSP内核 FBTFT移植
- BSP内核启动错误及警告解决
- buildroot 根文件系统
- emdebian 根文件系统
- SPI Flash 系统编译
- sunxi-fel增加对16M 以上flash的支持
- overlayfs的使用
- jffs2系统挂载不上的常见原因
- JFFS2 文件系统简介
- uboot对spi flash的识别
- bsp内核的SPI flash启动
- Docker开发环境
- Docker 命令速查
- 基础ubuntu系统配置
- docker离线镜像
- Zero系统烧录
- dd镜像烧录
- 分区镜像烧录
- SPI Flash系统烧录
- 一键镜像烧录
- Zero外设把玩
- I2C操作
- PWM输出
- CODEC的使用
- 以太网使用指南
- GPIO操作
- 文件IO方式
- C语言接口(mmap)
- Python操作GPIO
- pinctrl-sunxi介绍
- UART操作
- 点屏
- 点屏之RGB屏
- 点屏之SPI屏 ili9341
- 点屏之SPI OLED
- 点屏之I2C OLED
- 点屏之SPI屏 ili9488
- 点屏之MCU屏
- 点屏之触摸屏驱动
- 点屏之simple-framebuffer
- 点屏之屏幕时序
- 时钟控制器CCM
- 摄像头
- BSP DVP摄像头
- BSP MIPI 摄像头
- 主线DVP摄像头
- 主线 MIPI摄像头
- SPI 操作
- 应用层开发
- 开机自启动
- Segment Fault调试
- Zero通过OTG共享PC网络
- USB摄像头使用
- 基于QT的GUI开发
- 移植tslib
- 移植QT5.9.1
- 移植QT4.8.7
- QtCreator使用
- Qt5.x移植到Qt4.8
- Qt字体相关
- Qt移植总结
- Qt裁剪
- Qt去除鼠标指针显示
- zero_imager使用
- 驱动开发
- 设备树简介
- GPU/DRM 显示驱动
- sys下设备树查看
- atmel触摸屏驱动分析
- atmel触摸屏中断改轮询
- uboot下gpio操作
- helloworld驱动编译演示
- FBTFT分析
- 内核模块静态加载的顺序
- SPI驱动分析
- SPI 驱动编写
- Uboot开发
- 开机logo
- 看门狗的使用
- 关于系统reboot
- 内核printk等级设置