實驗: GPIO 的存取
存取 OpenWRT 上的 GPIO,實驗與電壓數值量測
GPIO 的硬體需求
GPIO 和硬體相關,因此,若是要能夠在 OpenWRT 上存取 GPIO,就需要硬體與韌體的支援。對於我們所使用的平台 (GL-AR300M 和 GL-AR750S) 來說,都支援 GPIO ,因此我們在這兩個平台上進行測試。以下是 GL-AR300M 和 GL-AR750S 的對應表。
GL-AR300M
GL-AR750S
I2C
GPIO16
GPIO5
I2C
GPIO17
GPIO21
UART
GPIO9
GPIO18
UART
GPIO10
GPIO22
GPIO 的操作指令
以下指令以操作 GL-AR300M 的 GPIO16 為例。
初始化 GPIO16: $ echo 16 > /sys/class/gpio/export
設定 GPIO16 為輸出: $ echo out > /sys/class/gpio/gpio16/direction
設定 GPIO16 為輸入: $ echo in > /sys/class/gpio/gpio16/direction
設定 GPIO16 為高電位: $ echo 1 > /sys/class/gpio/gpio16/value
設定 GPIO16 為低電位: $ echo 0 > /sys/class/gpio/gpio16/value
查看 GPIO16 的數值:
$ cat /sys/class/gpio/gpio16/value
$ cat /sys/kernel/debug/gpio
解除 GPIO16 : $ echo 16 > /sys/class/gpio/unexport
可以參考以下資訊:
若是我們需要查看 GPIO 的目前設置,可以使用指令: $ cat /sys/kernel/debug/gpio

GPIO 輸出電壓值量測
當我們改變了 GPIO 輸出,在物理上就會改變其電壓數值,我們用電壓計來查詢改變後的電壓值,以下是我們的實驗內容,量測電位的的腳位可以參考"測試硬體與功能列表"的章節。


以下是我們對 GL-AR300M 的測試結果。
GL-AR300M
LOW
HIGH
GPIO16
0V
2.56V
GPIO17
0V
3.30V
GPIO9
0V
2.53V
GPIO10
0V
2.56V
將分配給 I2C 的腳位改回 GPIO
在 GL-AR750S 這塊板子上,我們可以看到 I2C 已經預設開啟。因此,原本能夠使用的 GPIO,也只剩下 18、22,而5, 21被指定為 I2C 的通訊介面 (SDA、SCL)。 因此,若是要使用 GPIO 5 和21,則必須先把 I2C 的功能關閉,否則就無法 export。若我們需要將原本分配給 I2C 的腳位 (GPIO 5) 改回 GPIO,則可以使用以下指令:
root@GL-AR750S:~# echo "i2c-gpio.0" > /sys/bus/platform/drivers/i2c-gpio/unbind
root@GL-AR750S:~# echo 5 > /sys/class/gpio/export
root@GL-AR750S:~# cat /sys/class/gpio/gpio5/direction
in
root@GL-AR750S:~# echo out > /sys/class/gpio/gpio5/direction
root@GL-AR750S:~# cat /sys/class/gpio/gpio5/value
0
root@GL-AR750S:~# echo 1 > /sys/class/gpio/gpio5/value
root@GL-AR750S:~# cat /sys/class/gpio/gpio5/value
1
相同的,對 pin 21 也可以進行一樣的操作。
root@GL-AR750S:~# echo 21 > /sys/class/gpio/export
root@GL-AR750S:~# cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-31, parent: platform/ath79-gpio, ath79-gpio:
gpio-1 ( |gl-ar750s:white:powe) out lo
gpio-2 ( |reset ) in hi
gpio-5 ( |sysfs ) out hi
gpio-7 ( |gl-ar750s:white:usbp) out hi
gpio-8 ( |right ) in hi
gpio-19 ( |gl-ar750s:white:wlan) out hi
gpio-20 ( |gl-ar750s:white:wlan) out hi
gpio-21 ( |sysfs ) in hi
gpio-22 ( |sysfs ) out hi
gpiochip1: GPIOs 489-511, parent: platform/qca956x_wmac, ath9k-phy1:
gpio-490 ( |ath9k-phy1 ) in lo
重開機之後,就重新回到分配給 I2C 的設定:
root@GL-AR750S:~# cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-31, parent: platform/ath79-gpio, ath79-gpio:
gpio-1 ( |gl-ar750s:white:powe) out lo
gpio-2 ( |reset ) in hi
gpio-5 ( |sda ) in hi
gpio-7 ( |gl-ar750s:white:usbp) out hi
gpio-8 ( |right ) in hi
gpio-19 ( |gl-ar750s:white:wlan) out lo
gpio-20 ( |gl-ar750s:white:wlan) out hi
gpio-21 ( |scl ) in hi
gpiochip1: GPIOs 489-511, parent: platform/qca956x_wmac, ath9k-phy1:
gpio-490 ( |ath9k-phy1 ) in lo
我們可以寫一隻簡單的 script 來進行設定 unbind I2C 的設定,並測試 GPIO 的寫入結果。
echo "i2c-gpio.0" > /sys/bus/platform/drivers/i2c-gpio/unbind
echo 5 > /sys/class/gpio/export
echo 18 > /sys/class/gpio/export
echo 21 > /sys/class/gpio/export
echo 22 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio5/direction
echo out > /sys/class/gpio/gpio18/direction
echo out > /sys/class/gpio/gpio21/direction
echo out > /sys/class/gpio/gpio22/direction
echo "===== all gpio {5,18,21,22} set to LOW ====="
echo 0 > /sys/class/gpio/gpio5/value
echo 0 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio21/value
echo 0 > /sys/class/gpio/gpio22/value
cat /sys/kernel/debug/gpio
echo "===== all gpio {5,18,21,22} set to HIGH ====="
echo 1 > /sys/class/gpio/gpio5/value
echo 1 > /sys/class/gpio/gpio18/value
echo 1 > /sys/class/gpio/gpio21/value
echo 1 > /sys/class/gpio/gpio22/value
cat /sys/kernel/debug/gpio
結果顯示, AR750S 的 GPIO {5、18、21} 腳位沒有問題,但是, GPIO 22 腳位無法寫入為 LOW 的數值。
# sh unbindi2c.sh
===== all gpio {5,18,21,22} set to LOW =====
gpiochip0: GPIOs 0-31, parent: platform/ath79-gpio, ath79-gpio:
gpio-1 ( |gl-ar750s:white:powe) out lo
gpio-2 ( |reset ) in hi
gpio-5 ( |sysfs ) out lo
gpio-7 ( |gl-ar750s:white:usbp) out hi
gpio-8 ( |right ) in hi
gpio-18 ( |sysfs ) out lo
gpio-19 ( |gl-ar750s:white:wlan) out lo
gpio-20 ( |gl-ar750s:white:wlan) out hi
gpio-21 ( |sysfs ) out lo
gpio-22 ( |sysfs ) out hi
gpiochip1: GPIOs 489-511, parent: platform/qca956x_wmac, ath9k-phy1:
gpio-490 ( |ath9k-phy1 ) in lo
===== all gpio {5,18,21,22} set to HIGH =====
gpiochip0: GPIOs 0-31, parent: platform/ath79-gpio, ath79-gpio:
gpio-1 ( |gl-ar750s:white:powe) out lo
gpio-2 ( |reset ) in hi
gpio-5 ( |sysfs ) out hi
gpio-7 ( |gl-ar750s:white:usbp) out hi
gpio-8 ( |right ) in hi
gpio-18 ( |sysfs ) out hi
gpio-19 ( |gl-ar750s:white:wlan) out lo
gpio-20 ( |gl-ar750s:white:wlan) out hi
gpio-21 ( |sysfs ) out hi
gpio-22 ( |sysfs ) out hi
gpiochip1: GPIOs 489-511, parent: platform/qca956x_wmac, ath9k-phy1:
gpio-490 ( |ath9k-phy1 ) in lo
以下是我們對 GL-AR750S 的電壓測試結果。
GL-AR750S
LOW
HIGH
GPIO5 (SDA)
0V
2.56V
GPIO18
0V
2.56V
GPIO21 (SCL)
0V
2.34V
GPIO22
--
2.56V
Last updated