Linux核心驅動GPIO的使用

2021-06-16 13:39:43 字數 4399 閱讀 7643

linux核心中gpio

是最簡單

,最常用的資源

(和 interrupt ,dma,timer一樣)驅動程式,應用程式都能夠通過相應的介面使用gpio,gpio使用0~max_int之間的整數標識,不能使用負數,gpio與

硬體體系密切相關的

,不過linux

有乙個框架

處理gpio

,能夠使用統一的介面來操作gpio.在講gpio核心(gpiolib.c)之前先來看看gpio是怎麼使用的

1 測試

gpio埠是否合法 int gpio_is_valid(int number); 

2 申請某個

gpio埠

當然在申請之前需要

顯示的配置該gpio埠的

pinmux

int gpio_request(unsigned gpio, const char *label)

3 標記gpio的使用方向包括輸入還是輸出

/*成功返回零失敗返回負的錯誤值*/ 

int gpio_direction_input(unsigned gpio); 

int gpio_direction_output(unsigned gpio, int value); 

4 獲得gpio引腳的值和設定gpio引腳的值(對於輸出)

int gpio_get_value(unsigned gpio);

void gpio_set_value(unsigned gpio, int value); 

5 gpio當作中斷口使用

int gpio_to_irq(unsigned gpio); 

返回的值即中斷編號可以傳給request_irq()和free_irq()

核心通過呼叫該函式將gpio埠轉換為中斷,在使用者空間也有類似方法

6 匯出gpio埠到使用者空間

int gpio_export(unsigned gpio, bool direction_may_change); 

核心可以對已經被gpio_request()申請的gpio埠的匯出進行明確的管理,

引數direction_may_change表示使用者程式是否允許修改gpio的方向,假如可以

則引數direction_may_change為真

/* 撤銷gpio的匯出 */ 

void gpio_unexport(); 

使用者空間訪問gpio,即通過sysfs介面訪問gpio,下面是/sys/class/gpio目錄下的

三種檔案: 

--export/unexport檔案

--gpion指代具體的gpio引腳

--gpio_chipn指代gpio控制器

必須知道以上介面沒有標準device檔案和它們的鏈結。 

/sys/class/gpio/export,該介面只能寫不能讀

使用者程式通過寫入gpio的編號來向核心申請將某個gpio的控制權匯出到

使用者空間當然前提是沒有核心**申請這個gpio埠

比如  echo 19 > export 

上述操作會為19號gpio建立乙個節點gpio19,此時

/sys/class/gpio目錄下邊生成乙個gpio19的目錄

/sys/class/gpio/unexport和匯出的效果相反。 

比如 echo 19 > unexport

上述操作將會移除gpio19這個節點。 

指代某個具體的gpio埠,裡邊有如下屬性檔案

direction 表示gpio埠的方向,讀取結果是in或out。該檔案也可以寫,

寫入out

時該gpio設為輸出同時電平預設為低。寫入low或high則不僅可以

設定為輸出 還可以設定輸出的電平。 當然如果核心不支援或者核心**不願意,將不會存在這個屬性,比如核心呼叫了gpio_export(n,0)就

表示核心不願意修改

gpio埠方向屬性 

value      表示gpio引腳的電平,0(低電平)1(高電平),如果gpio

被配置為輸出,這個值是可寫的,記住任何非零的值都將輸出高電平, 如

果某個引腳

能並且已經

被配置為中斷,則可以呼叫poll(2)函式監聽該中斷,中斷觸發後poll(2)函式就會返回。

edge      表示中斷的觸發方式,edge檔案有如下四個值:"none", "rising", "falling","both"。

none表示引腳為輸入,不是中斷引腳

rising表示引腳為中斷輸入,上公升沿觸發

falling表示引腳為中斷輸入,下降沿觸發

both表示引腳為中斷輸入,邊沿觸發

這個檔案節點只有在引腳被配置為輸入引腳的時候才存在。 當值是none時可以通過如下方法將變為中斷引腳

echo "both" > edge;對於是both,falling還是rising依賴具體硬體的中斷的觸發方式。此方法即使用者態gpio轉換為中斷引腳的方式

active_low 不怎麼明白,也木有用過

gpiochipn表示的就是乙個gpio_chip,用來管理和控制一組gpio埠的控制器,該目錄下存

在一下屬性檔案: 

base   和n相同,表示控制器管理的最小的埠編號。 

lable   診斷使用的標誌(並不總是唯一的) 

ngpio  表示控制器管理的gpio埠數量(埠範圍是:n ~ n+ngpio-1) 

首先需要將該gpio

配置為中斷

echo  "rising" > /sys/class/gpio/gpio12/edge

以下是偽**

int gpio_id;

struct pollfd fds[1];

gpio_fd = open("/sys/class/gpio/gpio12/value",o_rdonly);

if( gpio_fd == -1 )

err_print("gpio open");

fds[0].fd = gpio_fd;

fds[0].events  = pollpri;

ret = read(gpio_fd,buff,10);

if( ret == -1 )

err_print("read");

while(1) }

記住使用poll()

函式,設定事件

監聽型別為

pollpri

和pollerr

在poll(

)返回後,使用

lseek()

移動到檔案

開頭讀取新的值或者關閉它再重新開啟讀取新值。

必須這樣做否則poll

函式會總是返回。

example code:

1 #include

2 #include

3 #include

4 #include

5 #include

6 #include

7 #include

8 #include 910

11 void tdelay(int d)

12 40

41     ret = write(gpio_fd,dir,strlen(dir));

42     if(ret < 0)

46     close(gpio_fd);

4748     gpio_fd = open("/sys/class/gpio/gpio242/value",o_rdwr);

49     if(gpio_fd < 0)

5354     int i;

55     char off="1";

56     char on = "0";

57     for(i=0;i < 10;i++)

64         tdelay(10);

65         printf("led on\n");

66         ret = write(gpio_fd,on,strlen(on));

67         if(ret < 0)

71         tdelay(10);

72     }

73     close(gpio_fd);

7475     gpio_fd = open("/sys/class/gpio/unexport",o_wronly);

76     if(gpio_fd < 0)

80     ret = write(gpio_fd,gpio,strlen(gpio));

81     if(ret < 0)

85     close(gpio_fd);

8687     printf("test gpio led ok\n");

8889     return 0;

90 }

91

Linux核心驅動GPIO的使用

linux核心中gpio 是最簡單 最常用的資源 和 interrupt dma,timer一樣 驅動程式,應用程式都能夠通過相應的介面使用gpio,gpio使用0 max int之間的整數標識,不能使用負數,gpio與 硬體體系密切相關的 不過linux 有乙個框架 處理gpio 能夠使用統一的介...

Linux通過核心檢視晶元gpio配置使用情況

使用者空間使用gpio輸出試,出錯 使用pb08輸出1 對應40 32 b a 08 40 echo 40 export sh write error device or resource busy echo 41 export sh write error device or resource b...

Linux核心驅動之gpio子系統的使用

linux 核心中gpio 是最簡單,最常用的資源 和 interrupt dma,timer一樣 驅動程式,應用程式都能夠通過相應的介面使用 gpio gpio使用0 max int 之間的整數標識,不能使用負數 gpio 與硬體體系密切相關的,不過 linux 有乙個框架處理 gpio 能夠使用...