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.

[参考译文] Linux/AM3352:无法读取 INTC 寄存器

Guru**** 2595805 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/646848/linux-am3352-cannot-read-intc-registers

器件型号:AM3352

工具/软件:Linux

大家好、 我一直在尝试按照这个线程中关于改变 GPIO 中断优先级的指令: https://e2e.ti.com/support/arm/sitara_arm/f/791/t/523690

首先、我想读取 INTC_ILRm 寄存 器的当前值、我已尝试 devmem2和 omapconf 读取0x48200100、但我始终得到以下错误。  

root:~#./omapconf 读取0x48200100
[6065.393717]未处理的故障:在 bb6e7d100处对非线性蚀刻(0x1018)执行外部中止
[6065.401448] PgD = dbb14000
[6065.404169][b6e7d100]* PgD=9dfc4831、* Pte=48200303、* ppte=48200a33

即使读取 INTC_REVISION 寄存器也会返回相同的结果。 因此我已经读取了其他线程、我知道在为未通电和未计时模块映射内存时会返回此错误。 我无法看到如何禁用 INTC 模块、因为 Linux 正在引导并运行正常。

因此、我还尝试从内核驱动程序 IRQ-OMAP-INTC 中读取 INTC 寄存器。 以下代码在引导期间编译和打印、但始终返回0。  

静态 int __init omap_init_irq_of (struct device_node *节点)

内转台;
int i;

omap_irq_base = of _iomap (node、0);
if (warn_on (!omap_irq_BASE))
return -ENOMEM;

域= IRQ_DOMAIN_ADD_LINEAR (节点、OMAP-nR_IRQ、
&IRQ_general_chip_ops、NULL);

对于(i = 0;i < OMAP-nr_IRQ;i++)

PR_INFO ("INTC_ILR reg:0x%x val:0x%x\n"、(OMAP-IRQ_BASE +(INTC_ILR0 +(0x4 * I)))、INTC_READL (INTC_ILR0 + 0x4 * I));//96

READ_INTC_IRL_n ();
OMAP-IRQ_SOFT_RESET();

RET = OMAP_ALLOC_GC_of (域、OMAP_IRQ_BASE);
如果(RET < 0)
IRQ_DOMAIN_REMOVE (域);

回程;

那么、INTC 寄存器不可读是正常现象、还是 INTC 模块可能无法启用? 我无法看到 INTC 模块可能会被禁用、并且在 PRCM 中找不到 INTC 电源和时钟启用寄存器。  

提前感谢您提供的任何帮助。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 David:

    我确认默认情况下无法从用户空间访问 INTC。 我还从 u-boot 阶段尝试了、在那里我能够成功访问:

    md [.b、.w、.l]地址[#个对象]
    => MD 0x48200000 1.
    48200000:00000050 第...页
    => MD 0x48200100 1
    48200100:00000000 …
    => MD 0x48200010 1.
    48200010:00000000 …


    我将检查 u-boot 级和 Linux 内核之间的 INTC 配置差异、并返回给您。

    此致、
    帕维尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请参阅第6.1.2节"寄存器保护"。 我认为这是一个设置、因此您无法访问用户空间中的寄存器。

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

    David、

    正如 Steve 所解释的、保护功能阻止您从用户空间访问 INTC 寄存器。 您可以编辑 INTC 驱动程序并对保护使能函数进行注释:

    linux-kernel/drivers/irqchip/irq-omap-intc.c

    静态 int __init omap_init_IRQ (u32 base、struct device_node *node)


    //if (RET = 0)
    //omap_irq_enable_protection();

    回程;


    应用此更新后、您应该能够使用 devmem2工具从用户空间访问 INTC 寄存器。

    关于您尝试从内核级别访问这些寄存器的问题、我认为这是不正确的。 如果您仍需要从内核中打印 INTC 寄存器、请告诉我。

    此致、
    帕维尔