# 查看 GPIO 芯片
gpioinfo
cat /proc/bus/input/devices | grep gpio-keys
結果:
返回空
cat /proc/bus/input/devices | grep kbd
結果:
H: Handlers=kbd mouse0 event0
H: Handlers=kbd event1
H: Handlers=kbd event3
它們都是「鍵盤類 input device」,(可能是 USB keyboard / 虛擬 console / IR / 其他)
結論
GPIO26「很可能還沒被設成 gpio-keys」(或名稱不是 gpio-keys)
正常情況應該會看到:Name="gpio-keys"
最快確認方法
sudo evtest
會看到:/dev/input/event0: ...
/dev/input/event1: ...
然後一個一個選
EV_KEY KEY_XXX value 1EV_KEY KEY_XXX value 0
GPIO26 根本沒有被註冊成 input device,「GPIO26 沒有掛到 gpio-keys(或 input subsystem),/dev/input/eventX 用不了
否則應該看到:
N: Name="gpio-keys"
H: Handlers=kbd eventX
現在可能Device Tree 沒設 gpio-keys
Raspberry Pi 需要:
gpio-keys {
compatible = "gpio-keys";
...
};
現在可能這個GPIO是接到 MCU / PMIC,不是 Linux
GPIO26其實只是「通知某個電源 IC / MCU」, Linux 根本不知道這顆按鍵
按鍵 → 電源 IC → 再丟 INT 給 CPU
這種通常「不是 gpio-keys」
在程式碼裡讀取GPIO
echo 26 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio26/direction
echo falling > /sys/class/gpio/gpio26/edge
1️⃣ echo 26 > /sys/class/gpio/export
- 作用:告訴 Linux「我要用 GPIO26」
-
Linux 裡的 GPIO 本身是隱藏的,不能直接操作,需要先
export出來。 - 執行後,你會看到新的目錄出現:
ls /sys/class/gpio/
# ...
gpio26/
這個目錄就是你 GPIO26 的操作介面。
2️⃣ echo in > /sys/class/gpio/gpio26/direction
- 作用:設定 GPIO26 是 輸入 還是 輸出
-
in→ 輸入(讀按鍵狀態) -
out→ 輸出(控制 LED、power kill 等)
所以這裡是告訴 Linux:GPIO26 是按鍵訊號,我要讀它的電平。
3️⃣ echo falling > /sys/class/gpio/gpio26/edge
- 作用:設定中斷觸發的方式(edge detection)
-
rising→ 低電平到高電平觸發 -
falling→ 高電平到低電平觸發 -
both→ 兩種都觸發
按鍵通常是 接地,按下時 GPIO 會從高電平變成低電平 → 所以用 falling。
一旦上面三步完成,你就可以讀 GPIO26 的值:
cat /sys/class/gpio/gpio26/value
# 0 → 按下
# 1 → 放開
或在 Qt 裡用 QFile("/sys/class/gpio/gpio26/value") 配合 QSocketNotifier 偵測變化。
簡單比喻:
| 行為 | 比喻 |
|---|---|
| export | 先打開這個電線的控制箱 |
| direction | 說這條線我要「看」還是「控制」 |
| edge | 說「我只想注意按下的瞬間」 |
要取消 / 回復剛才設定的 GPIO26,主要就是「把它從 sysfs 釋放」或「清掉設定」。分三步對應你之前做的:
1️⃣ 取消 edge 設定(可選)
echo none > /sys/class/gpio/gpio26/edge
-
none→ 不監控中斷 -
這樣
QSocketNotifier或poll就不會再被觸發了
2️⃣ 取消 direction 設定(可選)
# 這行不是必須,但可以清理
echo in > /sys/class/gpio/gpio26/direction
- 只是把 GPIO26 設回「輸入」或「預設」狀態
- Linux 不會真的阻止你再次使用
3️⃣ unexport(最重要)
echo 26 > /sys/class/gpio/unexport
- 作用:告訴 Linux「我不再使用 GPIO26」
-
系統會自動刪掉
/sys/class/gpio/gpio26/目錄 - GPIO26 回到原本「隱藏」狀態
💡 簡單比喻:
| 操作 | 比喻 |
|---|---|
| export | 打開控制箱 |
| direction / edge | 說明我要怎麼用 |
| unexport | 關掉控制箱,把線還回去 |
No comments:
Post a Comment