# 文件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
~~~
- 前言
- 荔枝派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等級設置