【Linux驱动调试技巧】如何弄清楚为什么在内核阶段GPIO不能被软件控制?

在目前的Qualcom平台B系列芯片组上,我们使用pinctrl框架来控制内核的gpio。

无法控制gpio的问题。 需要按照下面的步骤来解释原因。


1.首先添加下面的调试代码,看是否有一些未知的模块是控制gpio的,这里以gpio38作为exmaple

+++ b/drivers/pinctrl/pinctrl-msm-tlmm.c @@ -400,11 +400,17 @@ static int msm_tlmm_gp_cfg(uint pin_no, unsigned long *config,

       u32 mask = 0, shft = 0;
       void __iomem *inout_reg = NULL;
       void __iomem *cfg_reg = TLMM_GP_CFG(pinfo, pin_no);
- + if (pin_no==38)
+ {
+ WARN_ON(1);
+
+ }
+
       id = pinconf_to_config_param(*config);
       val = readl_relaxed(cfg_reg);
       /* Get mask and shft values for this config type */
       switch (id) {
+
       case PIN_CONFIG_BIAS_DISABLE:
               mask = TLMM_GP_PULL_MASK;
               shft = TLMM_GP_PULL_SHFT;
@@ -623,6 +629,11 @@ static void msm_tlmm_gp_fn(uint pin_no, u32 func, bool enable,

{
       unsigned int val;
       void __iomem *cfg_reg = TLMM_GP_CFG(pinfo, pin_no);
+ if(pin_no==38)
+ {
+ WARN_ON(1);
+ }
+
       val = readl_relaxed(cfg_reg);
       val &= ~(TLMM_GP_FUNC_MASK << TLMM_GP_FUNC_SHFT);
       if (enable)
@@ -652,6 +663,10 @@ static int msm_tlmm_gp_dir_in(struct gpio_chip *gc, unsigned offset)

       unsigned int val;
       struct msm_pintype_info *pinfo = gc_to_pintype(gc);
       void __iomem *cfg_reg = TLMM_GP_CFG(pinfo, offset);
+ if(offset==38) + { + WARN_ON(1); + }
       val = readl_relaxed(cfg_reg);
       val &= ~BIT(GPIO_OE_BIT);
@@ -663,6 +678,10 @@ static int msm_tlmm_gp_dir_out(struct gpio_chip *gc, unsigned offset, int val)
{
       struct msm_pintype_info *pinfo = gc_to_pintype(gc);
       void __iomem *cfg_reg = TLMM_GP_CFG(pinfo, offset);
+ if(offset==38) + { + WARN_ON(1); + }

       msm_tlmm_gp_set(gc, offset, val);
       val = readl_relaxed(cfg_reg);



如果有调试信息有控制gpio的调用堆栈,那么你需要检查不应该控制gpio的代码并删除它

2.如果没有明显的控制gpio输出的调试信息,那么我认为你需要删除/ firmware / images下的所有image再次测试。 如果你可以控制gpio,那么意味着一些子系统正在控制这个gpio,然后你逐个添加删除image来找出哪个子系统正在控制它。

3.如果你仍然无法控制这个GPIO,那么我认为首先你需要检查你是否添加了不使用pinctrl来控制GPIO的代码, 如果你确认没有添加任何旁路pinctrl的代码,请移动到下一个。

4.由于所有软件控制路径都已经过验证,所以现在需要删除此GPIO上的所有连接以再次测试GPIO。 如果你可以控制的GPIO。那么你需要联系你的硬件团队来检查你的硬件,并让你的硬件团队知道你的gpio配置(方向/拉式/驱动程序的强度)。 如果你仍然无法控制gpio,那么你需要读取芯片组的gpio寄存器软件界面(通常TLMM部分)来加倍你的gio配置。

5.一个特别的,请确认你的gpio是否只能在电源崩溃后才能控制,如果是的话,请先禁用free_io进行测试, 这只是测试,如果工作的话需要和你的硬件小组核对是否需要外部拉动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值