Linux GPIO驅動 驅動框架概述

2021-07-07 03:40:42 字數 1216 閱讀 3432

gpio是嵌入式開發中最常見的介面,之前自己就有寫過小的gpio驅動,提供ioctl介面給使用者空間操作。但直到最近才發現linux自身就有完善的gpio驅動框架,並且通過sysfs向使用者空間提供操作介面。

linux的gpio驅動框架層次及資料結構如下:最上層是用來向向使用者空間提供介面,使用者可以通過該介面方去控制gpio pin腳。gpio通用介面層主要是維護了乙個gpio pin的陣列gpio_desc[arch_nr_gpios],每註冊乙個gpio控制器,該控制器上所有的pin都會新增到這個全域性陣列裡面,這樣就有了乙個統一的gpio管理介面。gpio硬體抽象層主要是對gpio控制器的描述,核心裡面用了乙個gpio_chip的結構體來描述乙個gpio控制器,結構體裡面定義了gpio操作的函式集。硬體部分跟具體的硬體平台相關,都會提供特定的暫存器組來控制gpio口。

要想通過/sys/class/gpio操作gpio口,需要在編譯核心的時候開啟config_gpio_sysfs標誌,系統起來之後就可以在/sys下面看到對應的目錄。以手上的專案為例:

sh-3.2# ls /sys/class/gpio/

export  gpiochip0  unexport

可以看到在/sys/class/gpio/目錄下面有兩個檔案和乙個目錄,目錄gpiochip0表示當前有註冊乙個gpio控制器,檔案export是用來把某個gpio pin匯出到使用者空間,而unexport起相反的作用。比如用以下命令把gpio-35匯出到使用者空間,

sh-3.2# echo 35 > export 

sh-3.2# ls

export  gpio35  gpiochip0  unexport

sh-3.2# ls gpio35/

active_low  direction  edge  subsystem  uevent  value

在/sys/class/gpio目錄下多了個gpio35的目錄,該目錄裡面的檔案就是用來對改gpio pin進行設定的,direction是用來設定gpio的方向,gpio設成output時可以通過value來設定high/low,當gpio pin被用來做中斷線時,可以利用edge設定中斷觸發的方式。

sh-3.2# cat gpio35/direction  in

sh-3.2# cat gpio35/value 1

sh-3.2# cat gpio35/edge 

none

從上面的log看出,gpio-35目前是input pin,值為1。

linux gpio驅動示例

include include include include include include include include include include define jt gpio magic k define jt gpio read io jt gpio magic,1 define j...

linux gpio字元裝置驅動

在linux下編寫led驅動,控制相應的gpio管腳。在這裡有兩種方式 1 直接操作相應的暫存器 2 通過核心提供的gpio操作庫函式 第一種方式就省略了,只講第二種方式。這裡板卡上有兩個led燈,在使用者空間採用兩種方式控制led 1.dev led0 dev led1 fd0 open dev ...

Linux GPIO驅動 GPIO通用層

如果在核心配置的時候有開啟config gpio sysfs標誌,核心就會在 sys目錄下匯出gpio的使用者空間操作介面。gpiolib sysfs init drivers gpio gpiolib.c 是gpio lib的初始化函式,該函式首先在 sys class 目錄下面建立乙個gpio的...