2012-06-15 34 views
5

我有一個運行3.2內核的powerpc板。使用sysfs訪問gpio可以像預期的那樣工作,例如linux gpio c api

> echo 242 > /sys/class/gpio/export 
> cat /sys/class/gpio/gpio242/value 
> 1 

有沒有API可以直接從用戶空間訪問gpio引腳?我必須處理基於文本的sysfs接口嗎?

我尋找類似於: gpio_set(int no,int val);

感謝 克勞斯

+0

試試[this](http://foxlx.acmesystems.it/?id=22)或[this](http://www.mjmwired.net/kernel/Documentation/gpio.txt)。 –

回答

1

一旦你在VFS樹創建的設備,你可以打開他們像典型的文件,假設你寫了一個驅動器,並有在創建該MAKEDEV文件分配正確的主次編號vfs樹上的gpio引腳。

-1

每個GPIO都被映射爲一個寄存器,所以你可以通過/ dev/mem訪問它。請參閱here。如果你想直接訪問一個GPIO,你必須在內核空間級別工作

+1

對不起:這是錯誤的! Linux爲所有IO提供了一個定義良好的驅動程序接口。它還提供訪問不通過核心芯片上的寄存器訪問的IO。這使您還可以訪問「擴展器」芯片上的引腳。如果您閱讀我的問題,您會看到有一個驅動程序界面。問題不在於如何從內核驅動程序訪問寄存器映射引腳。相反,問題是如何在沒有文件系統映射的情況下訪問驅動程序。 – Klaus

+1

內存映射是訪問gpio而不是sysfs的替代方法 – b0b0b

+0

物理內存訪問既不是訪問任何硬件組件的好的甚至是可以容忍的方式,它依賴於代碼對其運行的目標做出非常強烈的假設。 如果代碼有問題或必須移植,會發生什麼情況? –

2

sysfs是最低級別,在這個級別上你可以在最近的內核中操縱GPIO。它可以是有點乏味,但它在舊風格的API提供了幾個優點:

  • 沒有醜陋的ioctl
  • 可以很容易地編寫腳本(想啓動腳本)
  • 對於輸入,「價值」的文件可以很容易地輪詢ID爲/下降/上升沿和這將是對硬件非常活潑中斷

我此刻沒有示例代碼,而是通過C代碼訪問它們時,我通常實現一個非常簡單的包裝器操作文件描述符並具有以下int的變體erface:

int gpio_open(int number, int out); /* returns handle (fd) */ 
int gpio_close(int gpio); 
int gpio_set(int gpio, int up); 
int gpio_get(int gpio, int *up); 
int gpio_poll(int gpio, int rising_edge, int timeout); 

從那時開始,實現非常簡單。