RPI的GPIO控制

# 查看 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 1
EV_KEY       KEY_XXX   value 0
那個就是你的按鍵 device

如果「完全沒有任何 event 有反應」
那就確定一件事:
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 → 不監控中斷
  • 這樣 QSocketNotifierpoll 就不會再被觸發了

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

半導體產業簡介

半導體產業簡介: 所謂微電子產業,就是生產 積體電路 ( 大陸稱為 集成電路 ) 的產業 。 積體電路 (Integrated Circuit ,簡稱 IC) 在電子學中是一種把電路(包括半導體裝置、元件)小型化的方式、並製造在半導體晶圓表面上。所以半導體只是製作「 ...