【个人工作笔记】MT8781 A13通过adb shell 修改/显示 GPIO 状态

MT8781 A13平台 通过adb shell 修改/显示 GPIO 状态

MTK平台到kernel5.10后,GPIO的控制相比之前有比较大的修改。不过大体流程是一样的。以下操作必须使用debug版本,确保电脑的adb 和fastboot命令能使用。

先解锁手机

通过连续点击 设置>关于手机 中的 build number 多次打开开发者选项
在开发者选项中打开OEM unlock
然后使用命令重启到fastboot

adb reboot bootloader

然后确认手机进入fastboot模式后使用命令

fastboot flashing unlock

按照提示按音量键确认解锁,然后使用命令重启手机

fastboot reboot

然后待进入系统后,使用以下adb命令

adb root
adb disable-verity

会出现Successful disable verity 表示最开始的步骤是成功的,如果没出现以上字符,请检测之前步骤是否有问题。
最后按照提示重启机器,或者输入一下命令重启

adb reboot

然后remount机器

adb root 
adb remount

设置、获取GPIO信息

使用命令进入shell窗口

adb root
adb shell

使用命令读取GPIO信息

cat proc/mtk_gpio/soc.pinctrl

会出现类似以下格式的数据
PIN: (MODE)(DIR)(DOUT)(DIN)(DRIVE)(SMT)(IES)(PULL_EN)(PULL_SEL)[(R1 R0)][(resl = X)]
PIN: (MODE)(DIR)(DOUT)(DIN)(DRIVE)(SMT)(IES)(PULL_EN)(PULL_SEL)(R1 R0)
正常情况下,proc/mtk_gpio/soc.pinctrl只有读取权限,如需要设置GPIO需要先修改权限

chmod 664 proc/mtk_gpio/soc.pinctrl

如需要设置gpio,参考FAQ04267,内容如下引用内容
一般我们设置GPIO的输出状态使用以下命令

echo out 36 1 > proc/mtk_gpio/soc.pinctrl

其中36是io口名称,1是输出为1。

[DESCRIPTION]

通过adb shell debug修改/显示 GPIO 状态

[KEYWORD]

GPIO

[SOLUTION]

1.显示 GPIO 状态:

1.1 MT6983(kernel-5.10)之后的格式如下

cat proc/mtk_gpio/soc.pinctrl

PIN: (MODE)(DIR)(DOUT)(DIN)(DRIVE)(SMT)(IES)(PULL_EN)(PULL_SEL)[(R1
R0)][(resl = X)] 注意需要root权限

1.2 MT6885之后的格式如下

cat /sys/devices/platform/pinctrl/mt_gpio

PIN: (MODE)(DIR)(DOUT)(DIN)(DRIVE)(SMT)(IES)(PULL_EN)(PULL_SEL)(R1 R0)
例如 (kernel-4.14 之后DRIVE列宽度为2,其他列为1,其他kernel版本列宽度为1,注意对应关系):

cat sys/devices/platform/pinctrl/mt_gpio

pins base: 285, pins count: 227 PIN:
(MODE)(DIR)(DOUT)(DIN)(DRIVE)(SMT)(IES)(PULL_EN)(PULL_SEL)(R1 R0) 000:
0001001111 001: 0000001110 002: 0000001110 … NOTE:

各平台的mt_gpio的路径可能存在差异,可以使用以下命令进行查找

adb shell

find sys/ -name “mt_gpio” 例如:mt6763平台 输出如下:

find sys/ -name “mt_gpio”

sys/devices/platform/10005000.pinctrl/mt_gpio

1.3 MT6763之后的格式如下

cat /sys/devices/platform/XXX.pinctrl/mt_gpio //XXX.pinctrl因平台而异

PIN: [MODE] [DIR] [DOUT] [DIN] [PULL_EN] [PULL_SEL] [IES] [SMT]
[DRIVE] ( [R1] [R0] ) 例如:mt6763平台 输出如下:

cat /sys/devices/platform/10005000.pinctrl/mt_gpio

PIN: [MODE] [DIR] [DOUT] [DIN] [PULL_EN] [PULL_SEL] [IES] [SMT]
[DRIVE] ( [R1] [R0] )

0: 000111110 1: 010000110 2: 000010110 …

1.4 更旧的平台 cd /sys/class/misc/mtgpio 或者 cd /sys/devices/virtual/misc/mtgpio

cat pins

A、如果show出来的格式是xx: x x x x x x x x (冒号后面跟8个数字)

其对应的含义如下:

PIN: [MODE] [PULL_SEL] [DIN] [DOUT] [PULL_EN] [DIR] [IES] [SMT]

B、如果show出的格式是xx: x x x x x x x (冒号后面跟7个数字)(某些kernel-3.10)

其对应的含义如下:

PIN: [MODE] [PULL_SEL] [DOUT] [PULL_EN] [DIR] [IES]

  1. 各描述项含义 名称 含义 PIN IO编号 MODE 当前pin处于的mode DIR 0:input pin, 1:output pin DOUT 输出值 DIN 输入值 DRIVE 驱动能力,一般可取值0~7,可占用两位数字 PULL_EN] 只对input
    pin有效,使能上/下拉 PULL_SEL 只对input pin有效,1:上拉 0:下拉 IES 输入使能,1:input信号有效
    0:input信号无效 SMT 使能施密特触发器 (R1) (R0) 当前GPIO pin的(上下拉)并联电阻的使能状态 1
    0表示enable R1,disable R0 0 1表示disable R1,enable R0 1 1表示enable R1,
    enable R0 rsel I2C专用上下拉电阻 0:75k 1:10k, 2:5k, 3:4k, 4:3k, 5:2k, 6:1.5k,
    7:1k 不打印出来,表示当前的GPIO pin不支持PUPD/resl状况,即只有一个上拉电阻、一个下拉电阻

3.设置 GPIO 状态:

3.1 MT6983(kernel-5.10)之后: 单个设置命令:

echo [option] $pin_num $value > /proc/mtk_gpio/soc.pinctrl
[option]表示要设置的状态,可选值:mode,dir,out,pullen,pullsel,ies,smt,driving,
r1r0, rsel

一次性全部设置命令:

echo set $pin_num $mode $dir $dout $driving $smt $ies $pullen $pullsel

/proc/mtk_gpio/soc.pinctrl

3.2 MT6885(kernel-4.14)之后: 设置命令与MT6779一样,但注意mt_gpio节点属性为只读,如下,

-r--r--r-- 1 root root 4096 2019-07-01 08:20 sys/devices/platform/pinctrl/mt_gpio

进行设置前,需要root(user版本获取不了root权限)之后,chmod 0664 mt_gpio改变节点属性。

3.3 MT6768,MT6779: 单个设置命令:

echo [option] $pin_num $value > /sys/devices/platform/pinctrl/mt_gpio
[option]表示要设置的状态,可选值:mode,dir,out,pullen,pullsel,ies,smt,driving

$pin_num表示设置的gpio编号 $value表示待写入的值

例如:

echo mode 99 6 > /sys/devices/platform/pinctrl/mt_gpio echo dir 99 1

/sys/devices/platform/pinctrl/mt_gpio echo out 99 1 > /sys/devices/platform/pinctrl/mt_gpio echo pullen 99 1 >
/sys/devices/platform/pinctrl/mt_gpio NOTE:设置pullen时, For pin with 2
pull resistors, $value can be 0 (R1=0, R0=0), 1 (R1=0, R0=1), 2 (R1=1,
R0=0), 3 (R1=1, R0=1) For pin with 1 pull resistor, $value can be 0 or
1

一次全部设置命令:

echo set $pin_num $mode $dir $dout $din $driving $smt $ies $pullen
$pullsel > /sys/devices/platform/pinctrl/mt_gpio echo set $pin_num
$mode $dir $dout $din $driving $smt $ies $pullen $pullsel $r1 $r0 >
/sys/devices/platform/pinctrl/mt_gpio NOTE:

▪Set all attributes in a single command ▪Note1: all attributes shall
not be separated with space ▪Note2: all attributes is 1 digit except
$driving is 2 digits ▪Note3: din cannot be changed, $din is leaved
here for convenience of command typing. Therefore, user can change
fields from read string (obtained via cat mt_gpio) without removing
$din

3.4 MT6763后的设置: 单个设置命令(可参考上文说明):

echo mode $pin_num $value >
/sys/devices/platform/10005000.pinctrl/mt_gpio echo dir $pin_num
$value > /sys/devices/platform/10005000.pinctrl/mt_gpio echo dout
$pin_num $value > /sys/devices/platform/10005000.pinctrl/mt_gpio echo
pullen $pin_num $value >
/sys/devices/platform/10005000.pinctrl/mt_gpio For pin with 2 pull
resistors, $value can be 0 (R1=0, R0=0), 1 (R1=0, R0=1), 2 (R1=1,
R0=0), 3 (R1=1, R0=1) For pin with 1 pull resistor, $value can be 0 or
1

echo pullsel $pin_num $value >
/sys/devices/platform/10005000.pinctrl/mt_gpio 一次性设置如下:

echo set $pin_num $mode $dir $dout $din $pullen $pullsel $ies $smt
$driving > /sys/devices/platform/10005000.pinctrl/mt_gpio echo set
$pin_num $mode $dir $dout $din $pullen $pullsel $ies $smt $driving $r1
$r0 > /sys/devices/platform/10005000.pinctrl/mt_gpio ▪Set all
attributes in a single command ▪Note1: all all attributes shall not be
separated with space ▪Note2: din cannot be changed, $din is leaved
here for convenience of command typing. Therefore, user can change
fields from read string (obtained via cat mt_gpio) without removing
$din

例如:

设置GPIO99 mode 3

echo mode 99 3 > mt_gpio

设置GPIO99 dir out

echo dir 99 1 > mt_gpio

设置GPIO99 dir in

echo dir 99 0 > mt_gpio

MT6763一次全部设置:

echo set 99 000011110 > /sys/devices/platform/10005000.pinctrl/mt_gpio

3.5 更旧平台的设置: 单独设置GPIO的某项信息如下:

echo -wmode num x > pin //num: pin number x: the mode 0~7 echo -wpsel
num x > pin //x: 1,pull up; 0,pull down echo -wdout num x > pin
//x:1,high; 0,low echo -wpen num x > pin //x: 1,pull enable; 0,pull
disable echo -wies num x > pin //x: 1,ies enable; 0, ies disable echo
-wdir num x > pin //x: 1,output; 0,input 一次性设置GPIO的所有项值如下:

echo -w=num:x x x x x x x > pin //x: [MODE] [PSEL] [DOUT] [PEN] [DIR]
[IES] [SMT] 如上面某些kenrel-3.10只能show出来当前pin的7个数字的GPIO的一次性设置GPIO各项值 echo
-w=num:x x x x x x > pin //x: [MODE] [PSEL] [DOUT] [PEN] [DIR] [IES]

例如:

echo “-w=99:0 1 0 0 0 1 0” >/sys/devices/virtual/misc/mtgpio/pin

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值