核心子系統運用 sysfs控制GPIO

2021-10-25 10:32:12 字數 3932 閱讀 5138

如何得知gpio的編號

最後我們可以整乙個指令碼來操作

linux 4.9在終端下檢視是否有/sys/class/gpio 目錄

沒有開啟核心選項

device drivers-》gpio support -》/sys/class/gpio/… (sysfs inte***ce) ==config_gpio_sysfs

1 echo 「166」 > /sys/class/gpio/export

2 echo 「out」 > /sys/class/gpio/gpio166/direction

3 echo 「1」 > /sys/class/gpio/gpio166/value

將166編號的gpio 匯出

將166編號的gpio方向設定成out

設定166編號的gpio電平

不同平台編號計算方式不一樣

以hisi 3559為例 166 對應 shub_gpio1_6

hisi3559 平台一共gpio0----gpio18 shub0—shub4 《shub(senosr hub)》

按編號模擬shub0 -》gpio19,shub_gpio1-》gpio20 以此類推。。。

(裝置樹檔案中可以檢視到)

hisi 每組gpio最多含8個腳,所以編號166==20 * 8 +6

有的平台可能就是20 * 32 ,不同平台計算方式不一樣

1.gpio的第二功能暫存器記得配置成gpio模式

2.hisigpio 資料暫存器的位址包含讀寫暫存器遮蔽位,熟讀並背誦資料手冊

若位址為為0x3fc(0b11_1111_1100),則對gpio_data[7:0]這8bit操作全部有

效。若位址為0x200(0b10_0000_0000),則僅對gpio_data[7]的操作有效。

由上面得知每乙個編號對應乙個gpio,這個編號其實是沒有意義的,只是認為的將gpio管腳人為的定義乙個號碼來對應,簡化操作。那麼我們最終操作的是gpio,那麼如何得知gpio他的編號是多少。這種管腳對應編號的編碼方式每個公司廠家的晶元可能都不一樣,最重要的是找到這個關係,才能知道編號

找到arch中描述gpio的檔案

arch\arm\plat-novatek\include\plat-na51089\nvt-gpio.h

/* gpio pin number translation  */

#define

c_gpio

(pin)

(pin)

#define

p_gpio

(pin)

(pin +

0x20)#

define

s_gpio

(pin)

(pin +

0x40)#

define

l_gpio

(pin)

(pin +

0x60)#

define

d_gpio

(pin)

(pin +

0x80)#

define

h_gpio

(pin)

(pin +

0xa0)#

define

a_gpio

(pin)

(pin +

0xc0)#

define

dsi_gpio

(pin)

(pin +

0xe0)#

define

c_gpio_num23#

define

p_gpio_num26#

define

s_gpio_num9#

define

l_gpio_num10#

define

h_gpio_num12#

define

d_gpio_num8#

define

a_gpio_num3#

define

dsi_gpio_num

11

nt平台不像hisi有順序的1 2 3 4 組,他分組c p s l d h a ,,

a_gpio 3 那麼他的編號就是 0xc0 + 3 ,這樣計算而來。

他這個排序的規則也是按照資料手冊暫存器的遞增的規則定義的

hisi平台的pinctl採用的是gpio-pl061驅動,而每組的gpio都有編號

比如gpio1_2,gpio14_7等。

裝置樹中每塊chip都有描述

從pl061的驅動來看,獲取gpio的alias

並將gpio的每組第乙個管腳編號即每個gpio chip的base為序號*8

比如gpio12,那麼他的gpio chip 的base 就是12*8;

static

intpl061_probe

(struct

amba_device

*adev,

const

struct

amba_id

*id)..

.ret =

gpiochip_add_data

(&chip->gc, chip);...}

然後在gpiochip_add_data中會對這個chip申請pl061_gpio_nr 個gpio的desc,

用來表示各個管腳,因為每個chip有8個管腳,所以前面gpio20_6,為什麼他的編號為166,是驅動定義導致的。

static

intpl061_get_value

(struct

gpio_chip

*gc,

unsigned offset)

在pl061中get value有+2的操作,是因為這個gpio口的data暫存器硬體設計原因。

他的bit[9:2]才描述gpiox_0----7的管腳狀態

gpio_data 暫存器利用 paddr[9:2] 實現了讀寫暫存器位元的遮蔽操作。

#!/bin/sh

gpio_dir=$1

gpio_num=$2

gpio_val=$3

if[["$"

!="out"]]

&&[["$"

!='in']]

&&[[$#

!=3]]

;then

echo

"para error!"

echo

"example: ./gpio out/in *** 1"

exit1fi

if[[$

!=0]]

;then

gpio_val=1

;fiif[

! -d "/sys/class/gpio/gpio$"];

then

echo

$> /sys/class/gpio/export

fiecho

$> /sys/class/gpio/gpio$/directionif[

"$"==

'out'];

then

echo

$> /sys/class/gpio/gpio$/value

else

echo

"gpio$: `

cat /sys/class/gpio/gpio$/value`

"fi

作業系統核心子系統的協調工作

第一部分 內務子系統 操作系統核心的管理功能以及執行最終也要歸於cpu的執行流,因此最簡單的設計就是將核心的內務也設計成程序,但是對於一些特別的內務這個辦法就不適用了,因為這些內務的特殊性恰恰在於它們是依賴cpu的,或者說是和cpu進行介面的。如果我們把計算機視為一台人類發明的智慧型的機器,那麼很自...

作業系統核心子系統的協調工作

第一部分 內務子系統 操作系統核心的管理功能以及執行最終也要歸於cpu的執行流,因此最簡單的設計就是將核心的內務也設計成程序,但是對於一些特別的內務這個辦法就不適用了,因為這些內務的特殊性恰恰在於它們是依賴cpu的,或者說是和cpu進行介面的。如果我們把計算機視為一台人類發明的智慧型的機器,那麼很自...

作業系統核心子系統的協調工作

第一部分 內務子系統 操作系統核心的管理功能以及執行最終也要歸於cpu的執行流,因此最簡單的設計就是將核心的內務也設計成程序,但是對於一些特別的內務這個辦法就不適用了,因為這些內務的特殊性恰恰在於它們是依賴cpu的,或者說是和cpu進行介面的。如果我們把計算機視為一台人類發明的智慧型的機器,那麼很自...