工具/软件:Linux
在我们的系统中、DRA744 (J6)处理器通过两条 SPI 总线(GPIO7)以及一些 GPIO4引脚连接到 SPC560B64微控制器。 Linux 版本4.14.40在 J6处理器的 A15内核上运行。 J6中的 IPU (M4)通过 SPI 和 GPIO 引脚处理 J6和 SPC560B64之间的通信。 IPU 通过 J6中的共享存储器和硬件邮箱向 A15 Linux 发送/接收数据。 Linux 中的可加载内核驱动程序可处理 Linux 中 M4和 A15之间的通信。 一旦我将 LKM 插入内核、内核就会在矢量00持续生成大量意外的 IRQ 陷阱。 会发生与该线程类似的情况:
dmesg 的一部分显示了以下问题:
[53.692626] IRQ 0、描述:ee803700、深度:1、计数:0、未处理:0
[53.692631]-> Handle_IRQ(): c0175ab0、
[53.692648] Handle_BAD_IRQ+0x0/0x268
[53.692653] -> irq_data.chip(): c0931aa4、
[53.692659] 0xc0931aa4.
[53.692666]-> 操作(): (空)
[53.692671] IRQ_NOPROBE 置1
[53.692675] IRQ_NOREQUEST 置位
[53.69261] 矢量00处发生意外的 IRQ 陷阱
[53.697017] cxx_CAN -已注册 MQ 消息引擎
[53.712686] cxx_CAN -接收到的 CAN 位时序参数(1)
[53.712701] 无法在虚拟地址00000000处处理内核 NULL 指针解除引用
[53.715042] IRQ 0、描述:ee803700、深度:1、计数:0、未处理:0
[53.715045] -> Handle_IRQ(): c0175ab0、
[53.715054] handle_bad_IRQ+0x0/0x268
[53.715057] -> irq_data.chip(): c0931aa4、
[53.715062] 0xc0931aa4.
[53.715066]-> 操作(): (空)
[53.715070] IRQ_NOPROBE 置1
[53.715073] IRQ_NOREQUEST 置1
[53.715077] 矢量00处的意外 IRQ 陷阱
[53.725145] PgD = c0004000
[53.727890] [00000000]* PgD=00000000
[53.731489] 内部错误:Oops -错误:5 [#1]抢占 SMP ARM
[53.745892] IRQ 0、描述:ee803700、深度:1、计数:0、未处理:0
[53.745896] -> Handle_IRQ(): c0175ab0、
[53.745904] Handle_BAD_IRQ+0x0/0x268
[53.745907]-> irq_data.chip(): c0931aa4、
[53.745912] 0xc0931aa4.
[53.745916]-> 操作(): (空)
[53.745920] IRQ_noprobe set
[53.745923] IRQ_NOREQUEST 置位
[53.745926] 矢量00处的意外 IRQ 陷阱
[53.780151] IRQ 0、desc:ee803700、depth:1、count:0、unhandled:0
[53.780155] -> Handle_IRQ(): c0175ab0、
[53.780164] handle_bad_IRQ+0x0/0x268
[53.780167]-> irq_data.chip(): c0931aa4、
[53.780172] 0xc0931aa4.
[53.780176] ->操作(): (空)
[53.780180] IRQ_NOPROBE 置1
[53.780182] IRQ_NOREQUEST 置位
[53.780186] 引导程序00处的意外 IRQ 陷阱
[53.814638] IRQ 0、描述:ee803700、深度:1、计数:0、未处理:0
[53.814641] -> Handle_IRQ(): c0175ab0、
[53.814650] Handle_BAD_IRQ+0x0/0x268
[53.814653] -> irq_data.chip(): c0931aa4、
[53.814658] 0xc0931aa4.
[53.814661] ->操作(): (空)
[53.814664] IRQ_NOPROBE 置1
[53.814667] IRQ_NOREQUEST 置位
[53.814670] 矢量00处的意外 IRQ 陷阱
[53.816696] 引导程序00处的意外 IRQ 陷阱
[53.821296] 矢量00处的意外 IRQ 陷阱
[53.897185] CPU:1 PID:317 Comm:K_cxx_CAN_Rx 被污染:G O 4.14.40 #1
[53.904874] 硬件名称:通用 DRA74X (平展器件树)
[53.910994] 任务:ecca8600 task.stack:ecde8000
[53.915559] PC 位于 cxx_CAN_Rx_thread+0x678/0xf08 [cxx_CAN]
[53.921248] LR 位于 IRQ_Work_queue+0xc8/0xf0
[53.925623] PC:[ ] LR:[ ] PSR:60010013
[53.931917] sp:ecde9f10 IP:ecde9dd0 fp:ecde9f74
[53.937165] R10:3b9aca00 R9:bf2cb660 R8:ece2c000
[53.942412] r7:bf2ca230 r6:00000825 r5:bf2cc5c0 r4:ecf80000
[53.948967] r3:00000000 r2:00000000 r1:00000001 r0:ecdc1c00
[53.955523] 标志: 模式 SVC_32 ISA ARM 段无时 FIQ 上的 nZCv IRQ
[53.96269] 控制:10c5387d 表:ad88806a DAC:00000051
[53.968460] 处理 k_cxx_CAN_Rx (pid:317、栈限制= 0xecde8210)
[53.974929] 堆栈:(0xecde9f10至0xecdea000)
[53.979306] 9f00: ecde9f34 ecde9f20 c05f6d84 c05f64b4
[53.987522] 9f20:ecdc1c04 ecdc1c00 ecde9f44 ecde9f38 c05f6de0 00000000 ecc8600 c016a584
[53.995738] 9f40:ecde9f40 ecde9f40 bf2c7b3c 00000000 ecd36f00 ecd36e80 ecde8000 ece2c000
[54.00181] 引导程序00处出现意外的 IRQ 陷阱
[54.008233] 9f60:bf2c7b3c ecdc1c00 ecde9f13ecde9f78 c014d684 bf2c7b48 36fecd1c 36fecd1c
[54.016447] 9f80:ecde9ecd36ecd80 c014d538 00000000 00000000 00000000 00000000 00000000 00000000 0000 00000000
[54.024663] 9fa0:00000000 ecde9fb0 c0108048 c014d544 00000000 00000000 00000000 00000000 00000000
[54.032877] 9fc0:00000000 00000000 00000000 00000000 00000000 00000000 00000000
[54.041091] 9fe0:00000000 00000000 00000000 000000000013 00000000 00000000 00000000 00000000 00000000
[54.049301] 回溯:
[54.051778] [ ](cxx_CAN_Rx_thread [cxx_CAN])、来自[ ](kthread+0x14c/0x164)
[54.060429] r10:ecdc1c00 r9:bf2c7b3c r8:ece2c000 r7:ecde8000 r6:ecd36e80 r5:ecd36f00
[54.068291] R4:00000000
[54.070844][ ](kthread)、来自[ ](RET_FANK_F叉+0x14/0x2C)
[54.078099] R10:00000000 R9:00000000 R8:00000000 r7:00000000 R6:00000000 R5:c014d538
[54.078304] 引导程序00处出现意外的 IRQ 陷阱
[54.090243] R4:ecd36e80
[54.092790] 代码:e3530000 1a00018d e3a03000 e51b0050 (e893000a)
[54.098957] --[结束线迹6da5cd570c595e54 ]--
[54.114547] 矢量00处的意外 IRQ 陷阱
[54.159991] 矢量00处的意外 IRQ 陷阱
[54.178104] 引导程序00处的意外 IRQ 陷阱
[54.196223] 矢量00处的意外 IRQ 陷阱
[54.210230] 矢量00处的意外 IRQ 陷阱
[54.241379] 矢量00处的意外 IRQ 陷阱
[54.255514] 矢量00处的意外 IRQ 陷阱
[54.273634] 矢量00处的意外 IRQ 陷阱
[54.290206] 引导程序00处的意外 IRQ 陷阱
[54.300825] 矢量00处的意外 IRQ 陷阱
[54.313863] 在矢量00处发生意外的 IRQ 陷阱
[54.331978] 向量00处的意外 IRQ 陷阱
[54.364140] 矢量00处的意外 IRQ 陷阱
[54.382354] 引导程序00处的意外 IRQ 陷阱
[54.413660] 矢量00处的意外 IRQ 陷阱
[54.431780] 矢量00处的意外 IRQ 陷阱
[54.445781] 引导程序00处发生意外的 IRQ 陷阱
[54.458821] 矢量00处的意外 IRQ 陷阱
插入 LKM 之前"cat /proc/interrupts 命令的输出:
CPU0 CPU1
17: 0 0 CBAR 32级别 gp_timer
20: 87665 76686 GIC-027 电平 ARCH_TIMER
22: 0 0 CBAR 4级 L3-dbg-IRQ
23: 0 0 WUGEN 10 Level L3-APP-IRQ
25: 1 0 CBAR 121电平 警报器
27: 51 0 CBAR 8级 OMAP-DMA-引擎
30: 0 0 CBAR 361级别 43300000。EDMA_ccint
32: 0 0 CBAR 359级别 43300000。EDMA_cerrint
35: 0 0 CBAR 24级别 4ae1000.GPIO
36: 10 0 CBAR 25电平 48055000.GPIO
37: 0 0 CBAR 26电平 48057000.GPIO
38: 0 0 CBAR 27电平 480590.GPIO
39: 0 0 CBAR 28电平 4805b000.GPIO
40: 0 0 CBAR 29电平 4805d000.GPIO
41: 0 0 CBAR 30电平 480510.GPIO
42: 0 0 CBAR 116级别 480530.GPIO
43: 2329 0 CBAR 67级别 4806a000.serial
62: 8 0 CBAR 108级 OMAP_DMM_IRQ_handler
63: 451 0 CBAR 51电平 48070000.i2c
64: 510 0 CBAR 52 Level 48072000.i2c
65: 8779 0 CBAR 57电平 4807a000.i2c
66: 6144 0 CBAR 81级 mmc0
67: 0 0 CBAR 23级别 40d01000.MMU
68: 0 0 CBAR 145级 40d02000.MMU
69: 0 0 CBAR 395级 588820.MMU
70: 0 0 CBAR 396级别 55082000.MMU
73: 0 0 CBAR 217电平 rtc0
77: 0 0 CBAR 149电平 48464000.McASP_TX
78: 0 0 CBAR 148电平 48464000.McASP_Rx
79: 0 0 CBAR 161电平 4847c000.McASP_TX
80: 0 0 CBAR 160电平 4847c000.McASP_Rx
82: 126 0 CBAR 335级别 48484000以太网
83: 0 0 CBAR 336级 48484000以太网
85: 754259 0 CBAR 16级 SGX ISR
90: 0 0 CBAR 46级别 4b101000.sham
91: 0 0 CBAR 47电平 48090000.rng
92: 0 0 CBAR 354级别 VPE
93: 0 0 CBAR 146级别 41501000.MMU
94: 0 0 CBAR 147级别 41500.MMU
95: 0 0 CBAR 352电平 vip2-s0
97: 0 0 WUGEN 131级别 ARM-PMU
98: 0 0 WUGEN 132级 ARM-PMU
99: 188827 0 CBAR 20级 OMAP DISPC
194: 10 0 48055000。GPIO 26边缘 3-0024
IPI0: 0 1 个 CPU 唤醒中断
IPI1: 0 定时器广播中断
IPI2: 374440 783251 重新安排中断
IPI3: 1085 1134 函数调用中断
IPI4: 0 0 CPU 停止中断
IPI5: 0 IRQ 工作中断
IPI6: 0 0 完成中断
错误: 0
以及之后:
CPU0 CPU1
0: 108 0 无 边沿
17: 0 0 CBAR 32级别 gp_timer
20: 2710 3197 GIC-027 级 ARI_TIMER
22: 0 0 CBAR 4级 L3-dbg-IRQ
23: 0 0 WUGEN 10 Level L3-APP-IRQ
25: 2 0 CBAR 121电平 talert
27: 51 0 CBAR 8级 OMAP-DMA-引擎
30: 0 0 CBAR 361级别 43300000。EDMA_ccint
32: 0 0 CBAR 359级别 43300000。EDMA_cerrint
35: 0 0 CBAR 24级别 4ae1000.GPIO
36: 10 0 CBAR 25电平 48055000.GPIO
37: 0 0 CBAR 26电平 48057000.GPIO
38: 0 0 CBAR 27电平 480590.GPIO
39: 0 0 CBAR 28电平 4805b000.GPIO
40: 0 0 CBAR 29电平 4805d000.GPIO
41: 335 0 CBAR 30电平 480510.GPIO
42: 0 0 CBAR 116级别 480530.GPIO
43: 442 0 CBAR 67级 4806a000.serial
44: 748 0 CBAR 21边缘 CAN 处理程序
62: 8 0 CBAR 108级 OMAP_DMM_IRQ_handler
63: 451 0 CBAR 51电平 48070000.i2c
64: 510 0 CBAR 52 Level 48072000.i2c
65: 394 0 CBAR 57电平 4807a000。i2c
66: 3369 0 CBAR 81级 mmc0
67: 0 0 CBAR 23级别 40d01000.MMU
68: 0 0 CBAR 145级 40d02000.MMU
69: 0 0 CBAR 395级 588820.MMU
70: 0 0 CBAR 396级别 55082000.MMU
73: 0 0 CBAR 217电平 rtc0
77: 0 0 CBAR 149电平 48464000.McASP_TX
78: 0 0 CBAR 148电平 48464000.McASP_Rx
79: 0 0 CBAR 161电平 4847c000.McASP_TX
80: 0 0 CBAR 160电平 4847c000.McASP_Rx
82: 0 0 CBAR 335级别 48484000。以太网
83: 0 0 CBAR 336级 48484000以太网
85: 18745 0 CBAR 16级 SGX ISR
90: 0 0 CBAR 46级别 4b101000.sham
91: 0 0 CBAR 47电平 48090000.rng
92: 0 0 CBAR 354级别 VPE
93: 0 0 CBAR 146级别 41501000.MMU
94: 0 0 CBAR 147级别 41500.MMU
95: 0 0 CBAR 352电平 vip2-s0
97: 0 0 WUGEN 131级别 ARM-PMU
98: 0 0 WUGEN 132级 ARM-PMU
99: 4949 0 CBAR 20级 OMAP DISPC
194: 10 0 48055000。GPIO 26边缘 3-0024
IPI0: 0 1 个 CPU 唤醒中断
IPI1: 0 定时器广播中断
IPI2: 9348 21719 重新安排中断
IPI3: 1841 621 函数调用中断
IPI4: 0 0 CPU 停止中断
IPI5: 82 0 IRQ 工作中断
IPI6: 0 0 完成中断
错误: 108
应该提到的是、在 IPU (M4)代码内、GPIO4和 GPIO7 IRQ 连接到 A15内核被禁用:
//取消 GPIO_4 IRQ 交叉开关连接到 A15
*(uint32_t *) CTRL_CORE_MPU_IRQ_32_33 = 0x1c0000;
//取消 GPIO_7 IRQ 交叉开关连接到 A15
*(uint32_t *) CTRL_CORE_MPU_IRQ_34_35 = 0x1d;
此外、在 Linux 器件树中、这些子系统完全禁用:
#define disable_complete (label)&label{status ="disabled";ti、no-idle;ti、no-reset-on-init;}
/*从 Linux 禁用的模块*/
disable_complete (mmc1);
disable_complete (MMC4);
disable_complete (mcspi1);
disable_complete (mcspi2);
disable_complete (vin4a);
disable_complete (i2c5);
disable_complete (i2c3);
disable_complete (GPMC);
disable_complete (dcan1);
disable_complete (dcan2);
disable_complete (vin1a);
disable_complete (ipu2);
disable_complete (ipu1);
disable_complete (dsp1);
disable_complete (dsp2);
disable_complete (uart2);
disable_complete (uart3);
disable_complete (uart4);
disable_complete (uart5);
disable_complete (uart6);
disable_complete (WDT2);
插入 LKM 后、中断交叉开关寄存器的内容如下:
# devmem2 0x4a002a7c
/dev/mem 已打开。
映射到地址 bb6fa4000的内存。
地址0x4A002A7C (0xb6fa4a7c)的值:0x1C0000
# devmem2 0x4a002a80
/dev/mem 已打开。
映射到地址 bb6f5e000的内存。
地址0x4A002A80 (0xb6f5ea80)的值:0x1D
为了解决这个问题、我想知道为什么以及如何创建中断#0、以及如何在 Linux 中避免中断#0?!
CPU0 CPU1
0: 108 0 无 边沿
谢谢、此致、
Armin