gpt4 book ai didi

linux - 为什么我不能在 Linux 2.6.26 中注册边沿触发中断?

转载 作者:太空狗 更新时间:2023-10-29 12:22:02 25 4
gpt4 key购买 nike

第一次发帖,所以请原谅所有的愚蠢。

我正在为从 2.6.22 到 2.6.26 的 MPC83xx 构建的 linux 内核移植自定义 CPLD 驱动程序,并且收到意外的糟糕消息。该驱动程序适用于 .22 内核,但 .26 内核在我调用 request_irq 时出现问题。有谁知道为什么行为会发生变化,或者更好的是,我需要做什么来解决它?

我已经追踪到调用 kernel/irq/manage.c 的 Oops 的来源,其中 desc->chip->enable(irq)setup_irq 中被调用(),看起来在 arch/powerpc/sysdev/ipic.c 中调用 ipic_set_irq_type() 时,enable 函数指针被清除了。不幸的是,我不知道为什么。

我已经包括了糟糕和一个复制问题的示例内核模块。

糟糕 -

Unable to handle kernel paging request for instruction fetch
Faulting instruction address: 0x00000000
Oops: Kernel access of bad area, sig: 11 [#1]
PREEMPT SCPA-G2
Modules linked in: cpld(+)
NIP: 00000000 LR: c004b930 CTR: 00000000
REGS: df8b5df0 TRAP: 0400 Not tainted (2.6.26-twacs-100.0.0)
MSR: 20001032 <ME,IR,DR> CR: 24022422 XER: 20000000
TASK = dfbcfc00[488] 'insmod' THREAD: df8b4000
GPR00: 00000000 df8b5ea0 dfbcfc00 00000017 00000001 00000001 00000000 c02d1fb4
GPR08: 00002268 00000000 00000000 00000000 44022484 10073f68 1ffcb000 007ffeb0
GPR16: 00000000 00000000 00800000 00000000 bffff7f0 00000000 1006e3dc 00000000
GPR24: 00000002 00000000 00000000 00009032 df9d04c0 00000017 df8b4000 c02d40e4
NIP [00000000] 0x0
LR [c004b930] setup_irq+0x404/0x430
Call Trace:
[df8b5ea0] [c004b8ec] setup_irq+0x3c0/0x430 (unreliable)
[df8b5ed0] [c004bbd8] request_irq+0xe0/0x130
[df8b5f00] [e1078054] cpld_init+0x54/0xd0 [cpld]
[df8b5f10] [c0048ba0] sys_init_module+0x14c/0x1d8
[df8b5f40] [c0010008] ret_from_syscall+0x0/0x38
--- Exception: c01 at 0xff27bb0
LR = 0x10019ca8
Instruction dump:
XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
Kernel panic - not syncing: Fatal exception

模块 -

#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/module.h>

static unsigned int cpld_virq = NO_IRQ;
unsigned value = 0xdeadbeef;

static irqreturn_t cpld_isr(int irq, void *dev_id) {
return IRQ_HANDLED;
}

void __exit cpld_cleanup(void) {
free_irq(cpld_interrupt, &value);
irq_dispose_mapping(cpld_virq);
return;
}

int __init cpld_init(void) {
int retval;
unsigned long cpld_interrupt = 23;

cpld_virq = irq_create_mapping(NULL, cpld_interrupt);
if (cpld_virq == NO_IRQ) {
return -EBUSY;
}

retval = request_irq(cpld_virq, cpld_isr,
IRQF_DISABLED | IRQF_SHARED | IRQF_TRIGGER_FALLING,
"CPLD", &value);
if (retval) {
irq_dispose_mapping(cpld_virq);
return retval;
}

return 0;
}

module_init(cpld_init);
module_exit(cpld_cleanup);
MODULE_LICENSE("Dual BSD/GPL");

感谢您的帮助。几天来我一直在为此苦思冥想,愿意接受任何建议。

最佳答案

我的 2.6.26 内核的 ipic_set_irq_type() 副本没有对 enable() 指针做任何事情。但是,它确实有以下 2.6.22 中没有的注释:

/* ipic only supports low assertion and high-to-low change senses
*/

/* ipic supports only edge mode on external interrupts */

看起来您在 2.6.22 上所做的事情不受硬件支持。

关于linux - 为什么我不能在 Linux 2.6.26 中注册边沿触发中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2623650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com