This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TPS65911:PMIC IRQ 状态胜出't 自动复位

Guru**** 2814795 points

Other Parts Discussed in Thread: TPS65910, TPS65911

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1265353/tps65911-pmic-irq-status-won-t-reset-automatically

器件型号:TPS65911
主题中讨论的其他器件:TPS65910

大家好!

我们的器件使用 TPS659114A2NMAR 作为 PMIC、我们的内核版本为4.1.15。

在我们的预期中,我们认为当我们按下电源按钮时, INT1 需要设置为低电平;否则,当释放电源按钮时, INT1将被重置,自动返回到高电平。  但驱动程序似乎没有实现此功能、我们只能手动复位0x50寄存器的 INT 状态。

在内核3.6中、似乎是一个"tps65910-IRQ.c"来管理 IRQ 状态、但在内核4.1.15中、"tps65910-IRQ.c"合并到"tps65910.c"中、但 IRQ 状态管理函数(复位 IRQ 状态)似乎消失了。

我想知道这一点、

1.是否真的删除了 IRQ 状态管理,因而不会自动重置 IRQ 状态?

2.如果我想有这个功能(当我们按下电源按钮时,INT1 需要设置为低级别; 否则、当释放电源按钮时、INT1将被复位、自动恢复到高电平)、唯一的方法是编写一个脚本来检测 tps65911寄存器的状态、半自动复位状态?

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下午好,Tony

    您使用的内核版本较旧是否有特定原因? 最新的内核具有有关驱动程序的文档、其中包括中断处理:

    https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/mfd/tps65910.txt

    此外、在查看源代码后、最新内核中的最新驱动程序似乎支持中断:

    https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/mfd/tps65910.c?h=master

    如果这不能回答您的问题、您能否提供 内核3.6中的驱动程序 tps65910-irq.c 的代码、以便我将其与当前的驱动程序版本进行比较?

    此致、

    C·吉莱特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Conner、

    感谢您的回复、我们使用的是较旧的内核版本(4.1.15)、因为原始项目是为此版本开发的。

    您刚才提到该驱动程序包含中断处理功能、所以我们想要的按钮按下中断行为(亮黄灯表示)已经在驱动程序中实现了? 在设备树的驱动程序文档中是否有任何属性我需要添加以打开此函数?

    我们提到内核3.6.11的原因是、 内核3.6.11中的 tps65910-irq.c 似乎具有重置 STS 寄存器的函数、因此我们估计这可能就是我们需要的按钮按压行为; 但我们在 tps65910.c 中找不到类似的函数、而且 tps65910-irq.c 在内核4.1.15中已被删除。

    静态 irqreturn_t tps65910_irq(){

     ...

     /*写回 STS 寄存器以清除我们处理的 IRQ */

      REG = IRQ_STS & 0xFF

     ...

    }  

    KENEL 3.6.11

    https://elixir.bootlin.com/linux/v3.6.11/source/drivers/mfd/tps65910-irq.c

    https://elixir.bootlin.com/linux/v3.6.11/source/drivers/mfd/tps65910.c

    内核4.1.15

    https://elixir.bootlin.com/linux/v4.1.15/source/drivers/mfd/tps65910.c

    谢谢。

    托尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您提供更多的背景信息和链接。 由于该驱动程序较旧、因此目前没有任何工程师可用于处理该驱动程序。

    我将查看3.6.11、4.1.15的驱动程序以及当前版本、并查看它们之间的功能是否明显更改。

    这将需要我一些时间,因为我之前没有这位车手的经验。 我最迟将在下周结束时向您提供最新情况。

    此致、

    C·吉莱特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的耐心。 查看 IRQ 驱动程序(已从较新的内核版本中删除)后、似乎清除中断的功能已被删除。

    此致、

    C·吉莱特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的康纳:

    感谢您对 IRQ 驱动程序的答复、现在我对该驱动程序有两个问题:

    1.我们想要更改 i2c 寄存器的一些初始值、因此我们将这些代码添加到驱动程序源代码中、但似乎未按我们的想法在启动时进行设置。 添加这些代码的位置是否错误或给我们的值是否错误、请告知我们添加这些初始代码的位置以及要设置的值。

    在内核4.1.15 tps65910.c 中

    static int tps65910_i2c_probe ()
    {
     ...
     tps65910_ck32k_init (tps65910、PMIC_plat_data);
     tps65910_sleepinit (tps65910、PMIC_plat_data);
      
      tps65910_reg_write (tps65910、0x3E、0x31);
      tps65910_reg_write (tps65910、0x20、0x41);
     tps65910_reg_write (tps65910、0x28、0x42);
     tps65910_reg_write (tps65910、0x50、0xff);
     tps65910_reg_write (tps65910、0x51、0xfb
    );
     ...

    2.您是否有其他方法可以帮助我们实现 IRQ 自动复位的行为?

    谢谢。

    托尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我正在咨询一位在这方面有经验的同事。 我将于明天、2012年9月12日给您提供最新的 EOB。

    此致、

    康纳

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我很抱歉,托尼,我还在和我的同事一起审查这件事。

    此致、

    康纳

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tony:

    感谢您的耐心。

    关于问题1:

    • 请注意 reg_write 函数参数中的第3个参数、它们用于无符号的 INT、我知道您发送的是0xff。
    • 我想您确实选择了正确的位置来更改 i2c 寄存器的初始值、因为通过对 init 函数的其他调用、该位置应该在探测函数内。
    • 如果您对 tps65911使用 i2c 通信、建议查看此类似文件、看看列出的 i2c 驱动程序是否适用于您的用例。 https://elixir.bootlin.com/linux/v3.6.11/source/drivers/mfd/tps65912-i2c.c
    • 注意:如果使用内核版本4.1.15、请考虑第493行的注释、其在通过 i2c 发送数据时建议使用虚拟传输、如以下链接中所示: https://elixir.bootlin.com/linux/v4.1.15/source/drivers/mfd/tps65910.c
    • 不确定为什么选择用于初始化某些 i2c 寄存器的值、但如果这些值是基于技术参考手册或数据表、请仔细检查这些位是否与您实际希望针对每个地址启用的功能一致。

    关于问题2:

    • 我建议根据您之前发送的函数中的 reg = IRQ_STS 和0xFF 的上下文对 IRQ 自动复位进行建模。  从内核3.6.11版本中实现,因为它已被批准包含在内核中,表示它已得到 Linux 维护人员批准用于该第三个版本。 基本上将您的 IRQ 文件版本添加到您的程序中、从而对内核3.6.11中存在的文件进行建模


    此致、

    S·拉马莫尔西