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

2021-07-27 16:04:57 字數 4516 閱讀 4163

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...