首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为i.MX6UL (linux内核)捕获断电中断

为i.MX6UL (linux内核)捕获断电中断
EN

Stack Overflow用户
提问于 2021-07-02 15:30:04
回答 1查看 405关注 0票数 0

上下文

我使用的是i.MX6 (IMXULL)应用程序处理器,我想知道在软件中何时按下了断电按钮:

幸运的是,IMX6ULL参考手册解释说,这应该是可能的:

第10.5节: ONOFF Button

该芯片支持使用按钮输入信号从PMU请求主SoC电源状态变化(即打开或关闭)。SNVS_LP内部的ONOFF逻辑允许直接连接到PMIC或其他电压调节器设备。该逻辑接收一个按钮输入信号,然后输出一个pmic_en_bset_pwr_off_irq信号。..。逻辑有两种不同的操作模式(Dumb和Smart模式)。Dumb模式使用pmic_en_b发出开关的电平信号。哑pmic模式有许多不同的配置选项,包括(取消,关闭到准时,最大超时)。

(也可在第18页以缩略版这里查阅)

尝试

因此,我构建了一个非常简单的内核模块来尝试捕获这个中断:

代码语言:javascript
复制
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/syscalls.h>
#include <linux/interrupt.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("John Doe <j.doe@acme.inc>");


// Forward declaration
irqreturn_t irq_handler (int, void *);


// Number of interrupt to capture
#define INTERRUPT_NO        36


static int __init pwr_ctl_init (void)
{
    pr_err("init()\n");
    return request_irq(INTERRUPT_NO, irq_handler, IRQF_SHARED, "onoff-button",
        (void *)irq_handler);
}

static void __exit pwr_ctl_exit (void)
{
    pr_err("exit()\n");
    free_irq(INTERRUPT_NO, NULL);
}


irqreturn_t irq_handler (int irq, void *dev_irq)
{
    pr_err("interrupt!\n");
    return IRQ_HANDLED;
}

module_init(pwr_ctl_init);
module_exit(pwr_ctl_exit);

问题

但是,我找不到关于中断数目的任何信息。当我在网上搜索的时候,我得到的只是这个NXP论坛的帖子:

这意味着应该是36。然而,我发现在我的平台上,情况并非如此。当我检查时,/proc/interrupts 36已经被20b4000.ethernet占用了。由于应用程序手册还提到它是由SNVS低功耗系统生成的,所以我检查了设备树并找到了以下信息:

代码语言:javascript
复制
                snvs_poweroff: snvs-poweroff {
                    compatible = "syscon-poweroff";
                    regmap = <&snvs>;
                    offset = <0x38>;
                    value = <0x60>;
                    mask = <0x60>;
                    status = "disabled";
                };

                snvs_pwrkey: snvs-powerkey {
                    compatible = "fsl,sec-v4.0-pwrkey";
                    regmap = <&snvs>;
                    interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
                    linux,keycode = <KEY_POWER>;
                    wakeup-source;
                    status = "disabled";
                };

这些信息似乎有助于了解SNVS是中断控制器,而不是如何捕获这个set_pwr_off_irq信号。

结论

  • 如何捕获据称由SNVS生成的ON/OFF中断?
  • 如何确定设备树中中断的数目(如果适用的话)
  • 我是不是误解了ONOFF功能是如何工作的?是否有可能从内核模块中捕捉到这一点?

编辑

这个编辑回答了一些用户的问题,然后进入关于我发现的问题的新信息:

用户问题

  • 处理器:处理器是NXP i.MX 6UltraLite / 6ULL / 6ULZ ARM Cortex A7。

新信息

  • SNVS驱动程序:使用我的构建系统内核配置,我修改并验证了启用了snvs_pwrkey驱动程序(参见这里)。我的修改包括向中断例程中添加一个kprint语句,以查看按钮是否触发了它。这不起作用
  • 我已经尝试将驱动程序更新到一个新版本,该版本声称支持较新的i.MX6处理器。这也不起作用
  • 为了便于调试,我尝试将驱动程序作为内核模块加载。这是不可能的,因为内核配置要求启用它,我不能将它从静态构建到内核中删除。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-12 09:51:32

答案是相当不合理的。简而言之,存在一个设备树覆盖,它禁用了我对snvs_pwrkey的更改,即使我已经启用了它。一旦我找到并删除了覆盖层,驱动程序(snvs_pwrkey.c)就会像预期的那样工作。

至于IRQ号,结果显示power按钮的IRQ是45,这是通过Linux解释的。中断未配置为共享,因此无法加载我的内核模块。

如果您想要捕获电源按钮切换事件,我建议修改驱动程序以添加一些输出,然后添加一个udev规则来按下捕获按钮。我将尽快用一个例子更新我的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68227835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档