nycu-OpenWrt
Search…
實驗: 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 的數值:
1
$ cat /sys/class/gpio/gpio16/value
2
$ cat /sys/kernel/debug/gpio
Copied!
解除 GPIO16 : $ echo 16 > /sys/class/gpio/unexport
當 GPIO16 初始化之後,/sys/class/gpio/gpio16/資料夾才建立,同時,只有在 GPIO16 設定為輸出後,才可以設定 GPIO 的數值,GPIO為輸入或是輸出會保留之前設定。在解除 GPIO 之後,資料夾也會移除。
可以參考以下資訊:
若是我們需要查看 GPIO 的目前設置,可以使用指令: $ cat /sys/kernel/debug/gpio
GL-AR750S 的 GPIO 設置

GPIO 輸出電壓值量測

當我們改變了 GPIO 輸出,在物理上就會改變其電壓數值,我們用電壓計來查詢改變後的電壓值,以下是我們的實驗內容,量測電位的的腳位可以參考"測試硬體與功能列表"的章節。
GPIO9 的低電位
GPIO9 的高電位
以下是我們對 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,則可以使用以下指令:
1
[email protected]:~# echo "i2c-gpio.0" > /sys/bus/platform/drivers/i2c-gpio/unbind
2
3
[email protected]:~# echo 5 > /sys/class/gpio/export
4
[email protected]:~# cat /sys/class/gpio/gpio5/direction
5
in
6
[email protected]:~# echo out > /sys/class/gpio/gpio5/direction
7
[email protected]:~# cat /sys/class/gpio/gpio5/value
8
0
9
[email protected]:~# echo 1 > /sys/class/gpio/gpio5/value
10
[email protected]:~# cat /sys/class/gpio/gpio5/value
11
1
Copied!
相同的,對 pin 21 也可以進行一樣的操作。
1
[email protected]:~# echo 21 > /sys/class/gpio/export
2
[email protected]:~# cat /sys/kernel/debug/gpio
3
gpiochip0: GPIOs 0-31, parent: platform/ath79-gpio, ath79-gpio:
4
gpio-1 ( |gl-ar750s:white:powe) out lo
5
gpio-2 ( |reset ) in hi
6
gpio-5 ( |sysfs ) out hi
7
gpio-7 ( |gl-ar750s:white:usbp) out hi
8
gpio-8 ( |right ) in hi
9
gpio-19 ( |gl-ar750s:white:wlan) out hi
10
gpio-20 ( |gl-ar750s:white:wlan) out hi
11
gpio-21 ( |sysfs ) in hi
12
gpio-22 ( |sysfs ) out hi
13
14
gpiochip1: GPIOs 489-511, parent: platform/qca956x_wmac, ath9k-phy1:
15
gpio-490 ( |ath9k-phy1 ) in lo
16
Copied!
重開機之後,就重新回到分配給 I2C 的設定:
1
[email protected]:~# cat /sys/kernel/debug/gpio
2
gpiochip0: GPIOs 0-31, parent: platform/ath79-gpio, ath79-gpio:
3
gpio-1 ( |gl-ar750s:white:powe) out lo
4
gpio-2 ( |reset ) in hi
5
gpio-5 ( |sda ) in hi
6
gpio-7 ( |gl-ar750s:white:usbp) out hi
7
gpio-8 ( |right ) in hi
8
gpio-19 ( |gl-ar750s:white:wlan) out lo
9
gpio-20 ( |gl-ar750s:white:wlan) out hi
10
gpio-21 ( |scl ) in hi
11
12
gpiochip1: GPIOs 489-511, parent: platform/qca956x_wmac, ath9k-phy1:
13
gpio-490 ( |ath9k-phy1 ) in lo
Copied!
我們可以寫一隻簡單的 script 來進行設定 unbind I2C 的設定,並測試 GPIO 的寫入結果。
1
echo "i2c-gpio.0" > /sys/bus/platform/drivers/i2c-gpio/unbind
2
3
echo 5 > /sys/class/gpio/export
4
echo 18 > /sys/class/gpio/export
5
echo 21 > /sys/class/gpio/export
6
echo 22 > /sys/class/gpio/export
7
8
echo out > /sys/class/gpio/gpio5/direction
9
echo out > /sys/class/gpio/gpio18/direction
10
echo out > /sys/class/gpio/gpio21/direction
11
echo out > /sys/class/gpio/gpio22/direction
12
13
echo "===== all gpio {5,18,21,22} set to LOW ====="
14
15
echo 0 > /sys/class/gpio/gpio5/value
16
echo 0 > /sys/class/gpio/gpio18/value
17
echo 0 > /sys/class/gpio/gpio21/value
18
echo 0 > /sys/class/gpio/gpio22/value
19
cat /sys/kernel/debug/gpio
20
21
echo "===== all gpio {5,18,21,22} set to HIGH ====="
22
23
echo 1 > /sys/class/gpio/gpio5/value
24
echo 1 > /sys/class/gpio/gpio18/value
25
echo 1 > /sys/class/gpio/gpio21/value
26
echo 1 > /sys/class/gpio/gpio22/value
27
cat /sys/kernel/debug/gpio
Copied!
結果顯示, AR750S 的 GPIO {5、18、21} 腳位沒有問題,但是, GPIO 22 腳位無法寫入為 LOW 的數值。
1
# sh unbindi2c.sh
2
===== all gpio {5,18,21,22} set to LOW =====
3
gpiochip0: GPIOs 0-31, parent: platform/ath79-gpio, ath79-gpio:
4
gpio-1 ( |gl-ar750s:white:powe) out lo
5
gpio-2 ( |reset ) in hi
6
gpio-5 ( |sysfs ) out lo
7
gpio-7 ( |gl-ar750s:white:usbp) out hi
8
gpio-8 ( |right ) in hi
9
gpio-18 ( |sysfs ) out lo
10
gpio-19 ( |gl-ar750s:white:wlan) out lo
11
gpio-20 ( |gl-ar750s:white:wlan) out hi
12
gpio-21 ( |sysfs ) out lo
13
gpio-22 ( |sysfs ) out hi
14
15
gpiochip1: GPIOs 489-511, parent: platform/qca956x_wmac, ath9k-phy1:
16
gpio-490 ( |ath9k-phy1 ) in lo
17
===== all gpio {5,18,21,22} set to HIGH =====
18
gpiochip0: GPIOs 0-31, parent: platform/ath79-gpio, ath79-gpio:
19
gpio-1 ( |gl-ar750s:white:powe) out lo
20
gpio-2 ( |reset ) in hi
21
gpio-5 ( |sysfs ) out hi
22
gpio-7 ( |gl-ar750s:white:usbp) out hi
23
gpio-8 ( |right ) in hi
24
gpio-18 ( |sysfs ) out hi
25
gpio-19 ( |gl-ar750s:white:wlan) out lo
26
gpio-20 ( |gl-ar750s:white:wlan) out hi
27
gpio-21 ( |sysfs ) out hi
28
gpio-22 ( |sysfs ) out hi
29
30
gpiochip1: GPIOs 489-511, parent: platform/qca956x_wmac, ath9k-phy1:
31
gpio-490 ( |ath9k-phy1 ) in lo
32
Copied!
以下是我們對 GL-AR750S 的電壓測試結果。
GL-AR750S
LOW
HIGH
GPIO5 (SDA)
0V
2.56V
GPIO18
0V
2.56V
GPIO21 (SCL)
0V
2.34V
GPIO22
--
2.56V
Last modified 2yr ago