如何得知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進行介面的。如果我們把計算機視為一台人類發明的智慧型的機器,那麼很自...