Skip to main content

1 GPIO request失败

:::info 文档信息

发布版本:0.01 · 页数:6 · 语言:中文

原始文档:Rockchip_Problem_Shooting_Linux_GPIO_CN.pdf

:::

章节大纲​

  • 1 GPIO request失败(P4)
  • 2 IOMUX(P4)
  • 3 io的电压值不对(P4)
  • 4 设置某个gpio的默认电平(P5)
  • 5 善用io命令调试(P5)

在线预览​

若预览无法显示,请直接下载 PDF 后用本地阅读器打开。


Rockchip​

GPIO 常见问题​

发布版本:0.01​

日期:2018.05​

Rockchip 开发指南 前言

前言​

概述​

GPIO 作为驱动开发人员最常接触的外设接口,本文简单介绍了开发GPIO 过程中的几个常见问题。更多技术细节请参考 Rockchip Pin-Ctrl 开发指南 V1.0-20160725.pdf

产品版本​

芯片名称内核版本
全芯片Linux 4.4

读者对象​

本文档(本指南)主要适用于以下工程师:技术支持工程师软件开发工程师

修订记录​

日期版本作者修改说明
2018.5.01V1.0XZY

II

1 GPIO request 失败​

当 pin 使用为GPIO 功能时候,请先确保该pin 脚没有被其他模块复用为其他功能使用。/* GPIO4_A0 已被ff4a0000.dwmmc(sdio)使用 */ [ 0.922783] rockchip-pinctrl pinctrl: pin gpio4-0 already requested by ff4a0000.dwmmc; cannot claim for gpio-keys [ 0.922848] rockchip-pinctrl pinctrl: pin-128 (gpio-keys) status -22

2 IOMUX​

当某个模块功能异常的时候,请优先确保该模块的 io 对应的 IOMUX 是否正确。可以通过 io 命令读取GRF对应寄存器。

3 io 的电压值不对​

量某pin 脚的电压不对时,可以先确认下该 pin 所在的 io 电源是否正确,以及 io-domain 配置是否正确。

如图,SDIO 的功能引脚属于 APIO4_VDD 这个电源域,VCCIO_SDIO 这个电源域的电压决定了SDIO_D[0:3],SDIO_CMD,SDIO_CLK 这些pin 脚的电压值。另外需要注意的是,vccio_sdio 可能为1.8v 或者3.3v,我们需要正确设置 vccio_sdio 对应的 io-domain 的值(一般对应到 GRF 的 io_vsel 寄存器)。

&io_domains {
status = "okay";
vccio0-supply = <&vcc_io>;
vccio1-supply = <&vcc_io>;

3-1

vccio2-supply = <&vcc_1v8>;
vccio3-supply = <&vccio_flash>;
vccio4-supply = <&vccio_sdio>;
vccio5-supply = <&vcc_io>;

};

当某个驱动模块修改 supply 对应的regulator 的电压时,power regulator 框架会 notifiy 到 io-domain驱动,使其修改 GRF 对应的寄存器值。其中,supply 的名称因平台而异,详细细节请参考Documentation/devicetree/bindings/power/rockchip-io-domain.txt。当测量到某个pin 脚的电压值偏低,如 1.56v(其io 电源域电压值为 1.8v)。可以适当地提高该 pin 脚的驱动强度。

flash_bus8: flash-bus8 {

rockchip,pins = <3 RK_PA0 1 &pcfg_pull_up_12ma>, <3 RK_PA1 1 &pcfg_pull_up_12ma>, <3 RK_PA2 1 &pcfg_pull_up_12ma>, <3 RK_PA3 1 &pcfg_pull_up_12ma>, <3 RK_PA4 1 &pcfg_pull_up_12ma>, <3 RK_PA5 1 &pcfg_pull_up_12ma>, <3 RK_PA6 1 &pcfg_pull_up_12ma>, <3 RK_PA7 1 &pcfg_pull_up_12ma>; };

需要注意的是,如果使用太大的驱动强度,则可能会引起信号过冲。

4 设置某个 gpio 的默认电平​

在硬件电路设计上通常会为某个电源域设计一个gpio 开关。一般驱动都会管理这些 gpio-regulator,在这里简单说明,当没有驱动模块管理这些gpio-regulator 的情况,我们可以设置一个pin 的默认功能为GPIO,且设置输出电平。

&pinctrl {
pinctrl-names = "default";
pinctrl-0 = <&xxx_pwren>;

xxx-pwren {

xxx_pwren: xxx-pwren {
rockchip,pins = <0 RK_PA2 RK_FUNC_GPIO &pcfg_output_high>;

}; }; };

5 善用 io 命令调试​

在驱动开发调试过程,我们可以通过 io 命令访问寄存器,如需判断IOMUX,gpio direction/电平,提高/减小驱动强度,使能施密特触发,这是一个高效又准确的调试手段。但是需要注意的一点是,访问寄存器的前提是 clk 已经被使能。很多客户反应说,通过 io 命令无法设置某gpio 的电平值,是因为其clock 没有打开。pinctrl 驱动为了省功耗,设计理念是有使用才打开 clock。

5-2 commit 07a06ae99ef9b8eda3ec0b69c8f477856042a511 Author: Lin Huang <hl@rock-chips.com> Date: Tue Aug 11 18:12:04 2015 +0800

pinctrl: rockchip: only enable gpio clock when it setting

gpio can keep state even the clock disable, for save power consumption, only enable gpio clock when it setting如下,pclk_gpio7, pclk_gpio8 没有打开,此时通过 io 命令设置gpio7 和 gpio8 的电平值是无法生效的。root@linaro-alip:~# cat /sys/kernel/debug/clk/clk_summary |grep gpio clock enable_cnt prepare_cnt rate accuracy phase pclk_gpio0 2 1 24750000 0 0 pclk_gpio6 0 1 24750000 0 0 pclk_gpio5 0 1 24750000 0 0 pclk_gpio4 1 1 24750000 0 0 pclk_gpio3 0 1 24750000 0 0 pclk_gpio2 0 1 24750000 0 0 pclk_gpio1 0 1 24750000 0 0 pclk_gpio7 0 1 24750000 0 0 pclk_gpio8 0 1 24750000 0 0

通过以下命令打开pclk_gpio8 的时钟,即可通过io 命令设置gpio8 的寄存器值。

echo 1 > /sys/kernel/debug/clk/pclk_gpio8/clk_enable_count

5-3