實驗: 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

當 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,則可以使用以下指令:

相同的,對 pin 21 也可以進行一樣的操作。

重開機之後,就重新回到分配給 I2C 的設定:

我們可以寫一隻簡單的 script 來進行設定 unbind I2C 的設定,並測試 GPIO 的寫入結果。

結果顯示, AR750S 的 GPIO {5、18、21} 腳位沒有問題,但是, GPIO 22 腳位無法寫入為 LOW 的數值。

以下是我們對 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