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, constchar *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, intvalue);
5 gpio
當作中斷口使用
int gpio_to_irq(unsigned gpio);
返回的值即中斷編號可以傳給
request_irq()
和free_irq()
核心通過呼叫該函式將
gpio
埠轉換為中斷,在使用者空間也有類似方法
6 匯出
gpio
埠到使用者空間
int gpio_export(unsigned gpio, booldirection_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
配置該gpio
為上公升沿觸發中斷
以下是偽**
int gpio_fd;
struct pollfd fds[1];
system("echofalling > /sys/class/gpio/gpio12/edge"); //
也可以使用上述**來配置
gpio
的中斷觸發方式
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 = lseek(gpio_fd,0,seek_set);
if( ret == -1 )
err_print("lseek");
ret =read(gpio_fd,&value,1);
if( ret ==-1 )
err_print("read");
while(1) }
記住使用
poll()
函式,設定事件監聽型別為
pollpri
和pollerr,
在poll()
返回後,必須使用
lseek()
移動到檔案開頭並讀取新的值必須這樣做,否則
poll
函式會總是返回。
華清遠見濟南中心高階講師焦老師
Linux核心驅動GPIO的使用
linux核心中gpio 是最簡單 最常用的資源 和 interrupt dma,timer一樣 驅動程式,應用程式都能夠通過相應的介面使用gpio,gpio使用0 max int之間的整數標識,不能使用負數,gpio與 硬體體系密切相關的 不過linux 有乙個框架 處理gpio 能夠使用統一的介...
Linux核心驅動GPIO的使用
linux核心中gpio 是最簡單 最常用的資源 和 interrupt dma,timer一樣 驅動程式,應用程式都能夠通過相應的介面使用gpio,gpio使用0 max int之間的整數標識,不能使用負數,gpio與 硬體體系密切相關的 不過linux 有乙個框架 處理gpio 能夠使用統一的介...
Linux裝置驅動之《玩轉GPIO》
在linux裝置驅動之 點亮一盞led 中,編寫了ioctl c.h這樣的標頭檔案,在本文中將繼續使用這一頭檔案,如下 然後則是驅動模組程式,如下所示 這裡只說明與前面模組程式的區別,首先是ioctl test函式 static int ioctl test struct inode inode,s...