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 能夠使用...