linux驅(qū)動之GPIO子系統(tǒng)

一、前言

在嵌入式中,GPIO作為一個常用的信息輸入輸出手段經(jīng)常被用在各種場合,那么今天本文就來簡單地說一下嵌入式linux中的GPIO子系統(tǒng)。本文為筆者的理解,如果錯漏還望指出

二、GPIO子系統(tǒng)介紹

在嵌入式linux中,GPIO引腳 通常聯(lián)系在一起。但是在嵌入式linux系統(tǒng)的代碼結(jié)構(gòu)中,他們的關(guān)系遠比我們想象的復(fù)雜。

2.1 pinctrl

在嵌入式linux中,用 pin control subsystem 來對一款芯片的引腳進行管理,我們經(jīng)常在設(shè)備樹中看到 pinctrl 這樣的節(jié)點,其實就是 引腳控制子系統(tǒng) 驅(qū)動的設(shè)備樹節(jié)點。該子系統(tǒng)的幫助各個驅(qū)動設(shè)備管理引腳,包括 引腳功能復(fù)用(pin multiplexing) 、引腳配置(pin configuration)(如輸出電平及上下拉電阻) 等。所以其他的設(shè)備驅(qū)動在調(diào)用 pin control subsystem 提供的接口來對本驅(qū)動所需要的引腳進行相關(guān)功能的配置。
各個設(shè)備如果需要復(fù)用引腳,則在設(shè)備樹的 pinctrl 對各個設(shè)備的引腳進行配置,將這些配置作為 pinctrl 的子節(jié)點,然后設(shè)備驅(qū)動在自己的設(shè)備樹節(jié)點中引腳這些配置節(jié)點
一般 ARM soc 的數(shù)據(jù)手冊會把 pin controller 的內(nèi)容放入 GPIO controller 的章節(jié)中,各個設(shè)備可以通過自己節(jié)點的屬性來指向 pinctrl 的某個子節(jié)點,也就是 pin configuration 來獲取相應(yīng)的引腳配置

2.1 GPIO子系統(tǒng)

GPIO子系統(tǒng) 相對于 pin control subsystem 來說是更加上層的子系統(tǒng),它將 引腳 配置為 GPIO 并且控制其輸入輸出,所以從這方面來看,GPIO引腳 在系統(tǒng)軟件層面并不是一個概念

三、GPIO子系統(tǒng)使用

3.1 應(yīng)用使用方法

應(yīng)用層的使用放到相對簡單,可以直接通過 sysfs 來操作 GPIO口

  1. 使用命令 echo num > /sys/class/gpio/export 導(dǎo)出 GPIO口,其中 numGPIO口 的編號
  2. 導(dǎo)出后會生成節(jié)點 /sys/class/gpio/gpioN
  3. 通過讀寫(比如使用 echocat 等工具)生成的節(jié)點來獲取 GPIO口 的信息及狀態(tài)

3.2 驅(qū)動使用方法

3.2.1 獲取設(shè)備樹信息

獲取 GPIO口 信息的設(shè)備樹接口 在of_gpio.h,這里不做詳細講解,讀者們可以直接通過接口函數(shù)的命名來熟悉使用方法

另外,關(guān)于 GPIO口 設(shè)備樹節(jié)點的屬性命名方式是一般為 name-gpios , 其中 name 通常用于指該 GPIO口在設(shè)備里的具體用途。比如用于復(fù)位,則屬性可以命名為 reset-gpios,舉例在設(shè)備樹中表示為 reset-gpios = <&gpio1 15 1>。在驅(qū)動中使用 of_get_named_gpi函數(shù) 返回值來得到對應(yīng)的 GPIO號

3.2.2 接口說明

int gpio_request(unsigned gpio, const char *label)

  1. 作用:申請GPIO
  2. 參數(shù)分析:
  • unsigned gpio:gpio端口號
  • const char *label:給該gpio端口起的名字
  1. 返回值:
  • 成功返回0
  • 失敗返回負數(shù)的錯誤碼

int gpio_direction_output(unsigned gpio, int value)

  1. 作用:GPIO的初始化為輸出,并設(shè)置輸出電平:
  2. 參數(shù)分析:
  • unsigned gpio:gpio端口號
  • int value:輸出值

int gpio_direction_input(unsigned gpio)

  1. 作用:初始化為輸入
  2. 參數(shù)分析:
  • unsigned gpio:gpio端口號

void gpio_set_value(unsigned gpio, int value)

  1. 作用:GPIO的輸出電平設(shè)置:
  2. 參數(shù)分析:
  • unsigned gpio:gpio端口號
  • int value:輸出值

int gpio_get_value(unsigned gpio)

  1. 作用:得到GPIO的電平
  2. 參數(shù)分析:
  • unsigned gpio:gpio端口號

void gpio_free(unsigned gpio)

  1. 作用:釋放GPIO
  2. 參數(shù)分析:
  • unsigned gpio:gpio端口號

int gpio_to_irq(unsigned gpio)

  1. 作用:申請GPIO口中斷,返回的值即中斷編號可以傳給request_irq()和free_irq()
  2. 參數(shù)分析:
  • unsigned gpio:gpio端口號

int gpio_export(unsigned gpio, bool direction_may_change)
內(nèi)核可以對已經(jīng)被gpio_request()申請的gpio端口的導(dǎo)出進行明確的管理,

  1. 參數(shù)分析:
  • unsigned gpio:gpio端口號
  • direction_may_change:表示用戶程序是否允許修改gpio的方向,假如可以則參數(shù)direction_may_change為真

void gpio_unexport(unsigned gpio)

  1. 作用:撤銷GPIO的導(dǎo)出
  2. 參數(shù)分析:
  • unsigned gpio:gpio端口號

四、參考鏈接

應(yīng)用層使用GPIO:https://blog.csdn.net/mirkerson/article/details/8464290
gpio_direction_output 和 gpio_set_value之間的使用關(guān)系https://blog.csdn.net/zhaoqi2617/article/details/53082813

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容