試圖編寫簡單的字符設備驅動程序後,我現在希望編寫一個字符設備驅動程序來訪問嵌入式Linux板(如Beagleboard)上的GPIO引腳。我有興趣編寫一個模塊"mygpiomodule"
,它在加載時必須出現在/dev/mygpiomodule
中,以便從用戶空間讀取,寫入訪問GPIO。我不希望從用戶空間訪問GPIO。我想這樣做是因爲我第一次嘗試編寫可以與某些外設進行交互的模塊。我想將一些LED插入端口並試圖打開或關閉它們。從內核空間進行GPIO訪問
我該如何嘗試這樣做?
感謝
米爾
試圖編寫簡單的字符設備驅動程序後,我現在希望編寫一個字符設備驅動程序來訪問嵌入式Linux板(如Beagleboard)上的GPIO引腳。我有興趣編寫一個模塊"mygpiomodule"
,它在加載時必須出現在/dev/mygpiomodule
中,以便從用戶空間讀取,寫入訪問GPIO。我不希望從用戶空間訪問GPIO。我想這樣做是因爲我第一次嘗試編寫可以與某些外設進行交互的模塊。我想將一些LED插入端口並試圖打開或關閉它們。從內核空間進行GPIO訪問
我該如何嘗試這樣做?
感謝
米爾
幸運編寫的Linux驅動程序是不是過於複雜,雖然有點多,可這個論壇內授課。然而好消息是,網絡上有很多可用的資源可以很好地解釋你想要做的事情。這裏只是我用過的幾個(甚至是製作GPIO/LED控制驅動程序),它們確實提供了可用的源代碼,並且可以用作驅動程序的基礎。
Free Software Magazine article
Linux Documentation Project article
的Linux非常 「TinkerToy」 性質提供了很大的靈活性。例如,你可以考慮讓你的驅動程序也連接到「/ proc」文件系統(使用create_proc_entry()API),這樣你就可以訪問你的驅動程序,而無需通過簡單的「echo YOURSTRING>/proc/mygpiomodule「字符串到您的驅動程序。從驅動程序讀取將使用「貓/ proc/mygpiomodule」。上面的鏈接還包括這樣做的例子。這可以幫助您進行測試,並在需要時通過啓動腳本訪問您的驅動程序。
需要一些時間來審查我上面列出的文章/書籍,當然谷歌更多,如果你需要。繼續前進,編譯並運行一些示例,然後您將快速加速。
Linux內核允許您輕鬆「玩」GPIO。
有一個包含文件與工作的GPIO:
#include <linux/gpio.h>
的GPIO必須在使用前,雖然目前的實現並不強制這個要求進行分配。基本配置功能是:
int gpio_request(unsigned int gpio, const char *label);
的GPIO參數指示GPIO是必需的,而標籤關聯與它一個字符串,以後可以出現在sysfs。通常的慣例適用:零返回代碼表示成功;否則返回值將是一個負的錯誤號。一個GPIO可以返回到系統:
void gpio_free(unsigned int gpio);
一些個GPIO用於輸出,其他的輸入。可以在任何一種模式下使用適當連接的GPIO,但在任何給定時間只有一個方向有效。內核代碼必須通知GPIO內核如何使用一條線;用這些函數完成:
int gpio_direction_input(unsigned int gpio);
int gpio_direction_output(unsigned int gpio, int value);
無論哪種情況,gpio都是GPIO編號。在輸出情況下,還必須指定GPIO的值(零或一)。 GPIO將作爲呼叫的一部分相應設置。對於這兩個函數,返回值再次爲零或負的錯誤編號。 (適當的)GPIO的方向可以隨時更改。
對於輸入的GPIO,電流值可以與被讀取:
int gpio_get_value(unsigned int gpio);
該函數返回提供GPIO的值;它沒有規定返回錯誤代碼。假設(在幾乎所有情況下都正確),當調用gpio_direction_input()時會發現任何錯誤,因此檢查該函數的返回值很重要。
設置輸出的GPIO的值可以總是使用gpio_direction_output()來完成,但是,如果GPIO已知是在輸出模式下已經,gpio_set_value()可以是多一點效率:
void gpio_set_value(unsigned int gpio, int value);
欲瞭解更多信息,請查看此鏈接:enter link description here
如果你只想從一個內核驅動切換幾個GPIO位,那麼你可能不希望使用用戶omotto「中提到的gpio_xxx的API,因爲意主要是爲了允許其他驅動程序通過名稱訪問GPIO,並提供對用戶空間的訪問。 davroslyrad的快速和骯髒的解決方案將更適合你。