設定 GPIO Bank 復用模式

設定 GPIO Bank 復用模式

我正在使用 ARM 機器,該機器在 GPIO 引腳 102 上連接有一個蜂鳴器。當我第一次嘗試讓蜂鳴器工作時,我嘗試瞭如下操作:

# cd /sys/class/gpio
# echo 102 > export
# cd gpio102
# echo out > direction
# echo 1 > value

令我沮喪的是,機器沒有發出任何噪音。然而,在檢查為 WinCE 編寫的蜂鳴器驅動程式的原始程式碼時,我注意到 GPIO 多工器應該設定為某種模式。我不太擅長軟體領域之外的東西,所以我仍然不確定這意味著什麼。然而,由於我獲得了用於在機器上啟動 Linux 的 U-Boot 版本的源代碼,因此我可以通過將這行代碼添加到板的頭文件 ( u-boot/board/somecompany/someboard/someboard.h) 來編輯它以設置 GPIO 組模式:

MUX_VAL(CP(CCDC_DATA3), (IDIS | PTD | DIS | M4));

我重新編譯了引導程序,將其複製過來,重新啟動機器,然後重新運行上面的測試,它成功了!我以為我已經完成我的任務了。然而,我被告知我的做法可能並不安全,因為 GPIO 庫可能用於其他驅動程式。當我掛載 debugfs 並檢查時/sys/kernel/debug/gpio,確實顯示 GPIO 群組中的其他 GPIO 引腳正在用於驅動程式。

然後我嘗試了一種不同的方法 - 由於蜂鳴聲在啟動時最重要,我決定嘗試向引導程式添加一些程式碼以發出蜂鳴聲:

MUX_VAL(CP(CCDC_DATA3), (IDIS | PTD | DIS | M4));

if(!gpio_request(102, "buzzer")){
    gpio_direction_output(102, 1);
    udelay (500000);
    gpio_direction_output(102, 0);
}

MUX_VAL(CP(CCDC_DATA3), (IEN  | PTD | DIS | M0));

這是可行的,因為引導程式是單執行緒的,因此它不必爭奪 GPIO 群組。最後一行將 GPIO 群組多工模式重設為先前在程式碼中設定的方式。

這確實在引導程式執行期間​​成功發出蜂鳴聲,據我所知,它不會幹擾任何驅動程序,因為 GPIO 群組已恢復到所需的狀態。但是,它並不像我想要的那麼有用,因為引導程式序列期間的蜂鳴聲並不一定表示完全引導成功。相反,如果我可以從 Linux 內部存取蜂鳴器,以指示成功啟動或其他事件,那就更好了。但是,我沒有找到有關在 Linux 中設定 GPIO 群組復用器模式的文件。因此,我的問題如下:

有沒有辦法從核心空間設定 GPIO 群組的多路復用模式?

相關內容