MTK平台GPIO的使用与调试
一,DWS的配置
二,Kernel中配置和使用GPIO
三,使用ADB获取/配置GPIO
我们在LINUX外设驱动的开发与调试中,GPIO的正确使用是一门必修课,本文主要描述MTK平台GPIO的使用和调试方法。
一,DWS的配置
打开dws文件的工具 DrvGen.exe 有新和旧两种,不同平台使用的工具可能不一样,新平台大多使用新的 DrvGen.exe,两种工具只是打开的方式和界面不一样,其实GPIO的配置项两个都大同小异,本文以MT6739平台为例,使用新的 DrvGen.exe 工具。
路径在:alps\vendor\mediatek\proprietary\scripts\dct下,打开后选择左上角Pro然后open我们项目上所使用的 codegen.dws 文件,配置完成后保存即可,使用起来非常方便。
如下图:
EintMode:是否当作中断引脚来使用,例如GPIO3,如果选中了该模式,其它模式是不可见的。 Def.Mode:GPIO默认的模式,即在系统启动过程中GPIO口的模式,GPIO口启动模式是定义在文件 cust_gpio_boot.h 文件中的,例如GPIO2的启动模式就是作为普通的GPIO口来使用。 M0~M7:由于GPIO口是可以复用的,除了作为普通的GPIO口使用之外,还有其它用途,例如GPIO4则作为UART1RX来使用,所以勾选对应的复选模式为M2。 nPull En:是指GPIO是否使能上拉或下拉,只有当GPIO作为输入模式时才生效。 InPull SelHigh:上面只设置了是否使能上拉或下拉,但并没有指出到底是上拉还是下拉,此处勾选了就表示上拉,否则表示设置下拉,同样只有当GPIO作为输入模式时才生效。 Def.Dir: 设置GPIO的默认方向,是输入还是输出,都需要设置的。 In、Out:In和Out这两个选项暂时不知道有何用处,根据字面意思,应该是允许输入或输出的。 OutHigh:指示GPIO口作为普通IO输出时的电平高低。 VarName1:变量的名字,就是为GPIO口定义一个别名,在 Preloader 和 LK 驱动中只需要这个属性就可以操作这个GPIO,如设置输入电平的高低等。 SMT:是否使能斯密特触发器。 IES:输入使能,控制输入是否有效。
Preloader初始化:
文件:alps\vendor\mediatek\proprietary\bootable\bootloader\preloader\platform\mt6739\src\drivers\gpio_init.c
mt_gpio_set_default()->mt_gpio_set_default_chip()
LK初始化代:
文件:alps\vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt6739\gpio_init.c
mt_gpio_set_default()->mt_gpio_set_default_chip()
具体的初始化流程此处不作分析,有兴趣的朋友可以到上面文件中分析。
二,Kernel中配置和使用GPIO
上面讲了DWS文件的配置,在 Preloader 和 LK 中我们会对GPIO进行初始化,在Preloader 和 LK 驱动中我们会根据需要对部分GPIO进行操作,如果在 Kernel 中我们不再对某些GPIO进行初始化和操作,将继续沿用 Preloader 和 LK 的属性。
pinctrl 子系统
在内核中我们使用 pinctrl 子系统对GPIO进行初始化。
dts部分配置:
&pio {xxx_default: xxx_default {};xxx_init: xxxinit {pins_cmd0_dat {pinmux = <MT8163_PIN_142_EINT21__FUNC_GPIO142>; /*普通gpio模式*/slew-rate = <0>; /*0输入 1输出*/ bias-disable; /*浮空 bias-pull-up = <00>上拉 bias-pull-down= <00>下拉*/};pins_cmd1_dat {pinmux = <MT8163_PIN_27_EINT5__FUNC_GPIO27>;slew-rate = <0>;bias-disable; };};
};&xxx {pinctrl-names = "xxx_default", "xxx_init";pinctrl-0 = <&xxx_default>;pinctrl-1 = <&xxx_init>;status = "okay";
};
在dts配置中,如果需要使用GPIO的复用功能,只需在 pinmux = <XXX> 中配置对应的复用功能即可。
如:
pinmux = <MT8163_PIN_142_EINT21__FUNC_ANT_SEL0>;
驱动中 Pinctrl API 的
应用:
struct pinctrl *pctl = devm_pinctrl_get(&pdev->dev);
获取一个 pinctrl 句柄,参数dev是包含这个 pin 的device结构体,即xxx这个设备的device。
struct pinctrl_state *dc_charge_init = pinctrl_lookup_state(pctl, "dc_charge_init");
获取这个pin对应pin_state。
pinctrl_select_state(pctl, dc_charge_init);
设置引脚为某个stata。
GpioLib 库函数使用
使用 pinctrl 子系统我们也能对GPIO进行控制,如输入输出等,但是使用 gpiolib 库函数来控制GPIO的输入输出等更为方便,我们只需获取对应的 GPIO_NUM 即可。
获取 GPIO_NUM:
- 直接定义->
#define GPIO_XXX_PIN (GPIO84| 0x80000000)
从dts里获取
xxx-gpio = <&pio 22 0>;
node = of_find_matching_node(NULL, of_match); //node = client->dev.of_node
gpio_num = of_get_named_gpio(node, "xxx-gpio", 0);
获取 IRQ_NUM:
gpio_to_irq->irq_num = gpio_to_irq(gpio_num);
从dts里获取
interrupt-parent = <&pio>;
interrupts = <22 IRQ_TYPE_LEVEL_LOW>;
irq_num = irq_of_parse_and_map(node, 0);
获取到了 GPIO_NUM 和 IRQ_NUM 之后,我们就可以使用 gpiolib 库函数对GPIO进行操作了。
主要函数有:
static inline int gpio_request(unsigned int gpio, const char *label)
static inline void gpio_free(unsigned gpio)
static inline int gpio_direction_input(unsigned int gpio)
static inline int gpio_direction_output(unsigned int gpio, int v)
static inline int gpio_set_debounce(unsigned gpio, unsigned debounce) //防抖
static inline int gpio_get_value(unsigned int gpio)
static inline void gpio_set_value(unsigned int gpio, int v)
static inline int gpio_to_irq(unsigned int gpio)
static inline int irq_to_gpio(unsigned int irq的)
至于上面函数的功能也非常好理解,功能基本就是函数名的字面意思,这里就不做解释了。
三,使用ADB获取/配置GPIO
节点位置
在MTK平台,我们可以通过cat节点(mt_gpio)来查看对应的状态。不同的平台,该管脚对应的位置也是不同的。
需要先执行:adb root
查找节点位置:find sys/ -name "mt_gpio"
一般位于:/sys/devices/platform/soc/1000b000.pinctrl/mt_gpio
查看GPIO状态:
adb输入命令:cat ./sys/devices/platform/soc/1000b000.pinctrl/mt_gpio
PIN: [MODE] [DIR] [DOUT] [DIN] [PULL_EN] [PULL_SEL] [IES] [SMT] [DRIVE] ( [R1] [R0] )
0: 011110100 01
1: 000010100 01
2: 000111100 01
3: 000010100 01
4: 011100100 00
5: 000010100 01
6: 000100110
...
对应的属性基本与DWS配置项一致,这里只对 [DRIVE] ( [R1] [R0] ) 两项进行说明
[DRIVE]:驱动能力,一般可取值0~7
([R1] [R0]):当前GPIO pin的(上下拉)并联电阻的使能状态
1 0表示enable R1,disable R0
0 1表示disable R1,enable R0
1 1表示enable R1, enable R0
不打印出来,表示当前的GPIO pin不支持PUPD状况,即只有一个上拉电阻、一个下拉电阻。
通过对比上面信息我们可以看出GPIO的设置是否生效,如对应属性和驱动中设置不符,则需要检查驱动是否有疏漏,还要检查对应的GPIO是否有其他模块也使用了,我们也可以使用adb将GPIO配置成我们需要的状态,来验证此GPIO是否能配置成我们驱动中需要的状态。
使用adb设置GPIO属性:
设置模式:echo mode 14 0 > mt_gpio
设置输入/输出:echo dir 14 1 > mt_gpio
输出高/低:echo out 14 1 > mt_gpio
设置pullen: echo pullen 14 1 > 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
以上如有不当之处欢迎私信或底下评论给小编指导更正,非常感谢查阅!
MTK平台GPIO的使用与调试相关推荐
- LinuxGPIO操作和MTK平台GPIO
GPIO口配置是一个历史性的问题,不管我们使用什么MCU,单片机也好,ARM也好,都离不开驱动GPIO口.Linux下有一个宏,GPIO_GPIO_SYSFS,打开这个宏后,编译烧录到设备端,去看看s ...
- 32. mtk平台androidN cts步骤及调试日志
新增1.判断前摄还是后摄failgrep "camera 0 | camera 1"后摄failed:camera 0 is opened前摄failed:camera 0 is ...
- 安霸平台gpio扩展芯片aw9523b调试
公司的一个车载项目由于gpio扣较少,所以用了艾为的一颗16路gpio口扩展芯片,下面描述一下调试过程 硬件原理图如下 aw9523b芯片寄存器较少,直接自己写了个简单的gpio驱动,采用gpio子系 ...
- mtk平台androidl usb uvc camera 调试记录
USB video class(又称为USB video device class or UVC)就是USB device class视频产品在不需要安装任何的驱动程序下即插即用,包括摄像头.数字摄影 ...
- 零基础学习MTK平台camera引脚配置
目录 一.MTK平台的GPIO配置 1. MTK平台GPIO驱动程序提供了两个接口: 2.配置dws文件 3.配置dts文件 二.MTK平台camera模块的GPIO配置 一.MTK平台的GPIO配置 ...
- MTK 平台TP调试遇坑
#前言 最近在调试我们项目上的TP驱动,奈何一直不能使用,而且这个项目的硬件确定是没有问题的「这个是前提」,我们在软件上提升了SDK基线,在之前的基线版本上软件是没有问题的. 然后我就赶紧检查了两个方 ...
- MTK平台驱动调试的资料
最近要从事MTK6260平台方面的开发工作.工作内容包括BSP调试及部分功能的代码移植.之前没有接触过这类工作内容,所以在网上查找了一些资料,并添加到自己的博客上,方便自己查找. 以下为其他人的资料: ...
- mtk平台的gpio控制
https://yq.aliyun.com/ziliao/273436 一.mtk平台的gpio控制 1.1 内核中的gpio配置 //设置gpio18为GPIO模式 mt_set_gpio_m ...
- MTK平台充电调试总结
摘要:调试电池的充放电管理,首先需要深入了解锂电池的电池原理和特点,充放电特性以及基本的电池安全问题.然后需要对MTK的电池管理驱动程序有深入的了解,理解电池充放电算法的基本原理.在此基础上,对充放电 ...
最新文章
- python里none什么意思_python中stream=None什么意思?
- golang channel本质——共享内存
- Chrome浏览器扩展开发系列之五:Page Action类型的Chrome浏览器扩展
- Swoole之I/O操作
- 数据分析-pands分析美国选民对总统的喜好(python实现)
- 命令及串口命令_嵌入式Linux系列第7篇:使用串口
- oracle此环境不满嘴,2.Oracle歌词说唱流行音乐说唱歌曲
- 正则表达式电话和姓名加星
- springmvc(4)注解简单了解
- springboot学习笔记-5 springboot整合shiro
- 火车站(codevs 2287)
- golang 微信小程序获取二维码scene参数报错 invalid scene rid: f05f96ab-5382f139-14b13d2f
- Permission denied:通过共享复制,与打包后解压,目录权限不一样
- Python——输入姓名,返回姓名笔画小程序
- Java项目架构的演变
- 发散思维能力(1-2)
- SecureCRT注册机使用方法
- Java8新特性——Lambda函数式编程
- c言语或符号怎么输入
- 谷歌AAB 安装到手机或者模拟器上