INTC中断控制器

模块功能介绍

intc中断控制器控制处理器的中断源。64bit中断源可以独立控制各个中断的打开和屏蔽。

驱动位置

驱动源码所在位置:

module_drives/drivers/irqchip/irq-ingenic-chip.c

module_drivers/drivers/irqchip/irq-ingenic-cpu.c

设备树配置

设备树所在位置:

kernel内核(version <= 5.10)dts文件路径:

module_driver/dts-stage/x2000/x2000.dtsi

kernel内核(version > 5.10)dts文件路径:

module_driver/dts/x2000/x2000.dtsi

INTC中断控制器描述:

cpuintc: interrupt-controller {

 ……

};

core_intc: core-intc@0x12300000 {

 ……

};

设备树默认配置

默认编译会产生intc设备

设备树自定义配置

内核编译配置

内核配置IRQ_INGENIC_CPU,配置说明如下:

 Symbol: IRQ_INGENIC_CPU [=y]

 Type : boolean

 Prompt: cpu interrupt driver

 Location:

 -> Ingenic device-drivers Configurations

 -> [Interrupt] Drivers

 Defined at module_drivers/drivers/irqchip/Kconfig:6

 Depends on: SOC_X2000 [=y] || SOC_X2100 [=n] || SOC_X2500 [=n] || SOC_M300 [=n]

 Selects: IRQ_DOMAIN [=y]

 Selected by: SOC_X2000 [=y] && <choice> || SOC_X2100 [=n] && <choice> || SOC_M300 [=n] && <choice> || SOC_X2500 [=n] && <choice>
Symbol: INGENIC_INTC_CHIP [=y]

Type : boolean

Prompt: intc v2 interrupt driver

Location:

 -> Ingenic device-drivers Configurations

 -> [Interrupt] Drivers

 -> cpu interrupt driver (IRQ_INGENIC_CPU [=y])

Defined at module_drivers/drivers/irqchip/Kconfig:13

Depends on: IRQ_INGENIC_CPU [=y]

Selects: IRQ_DOMAIN [=y]

Selected by: SOC_X2000 [=y] && <choice> || SOC_X2100 [=n] && <choice> || SOC_M300 [=n] && <choice> || SOC_X2500 [=n] && <choice>

内核默认编译配置

内核默认配置intc驱动。

内核自定义编译配置

设备节点生成

驱动注册成功后生成设备节点

/sys/devices/platform/apb/10000000.clock-controller/subsystem/devices/12300000.core-intc

应用程序使用说明

查看中断:

# cat /proc/interrupts

CPU0 CPU1

 2: 804742 730919 XBurst2 2 xburst2-intc

 3: 51396 90444 XBurst2 3 jz-mailbox

 4: 158406 343976 XBurst2 4 core_timerevent

 8: 0 0 XBurst2-irqchip 0 as-dma

 9: 34037 24092 XBurst2-irqchip 1 13500000.otg, 13500000.otg, dwc2_hsotg:usb1

 11: 0 0 XBurst2-irqchip 3 pdma

 12: 0 0 XBurst2-irqchip 4 pdmad

 14: 0 0 XBurst2-irqchip 6 pwm-interrupt

 15: 32684 24604 XBurst2-irqchip 7 13440000.sfc

 26: 0 0 XBurst2-irqchip 18 13810000.vic

 27: 25 136 XBurst2-irqchip 19 13710000.vic

 28: 0 0 XBurst2-irqchip 20 13800000.isp

……

ERR: 0

中断绑定

中断绑定即设置中断的CPU Affinity,让中断只在指定CPU核心上进行响应。

利用echo命令将CPU掩码写入/proc/irq /中断ID/smp_affinity文件中,即可实现修改某一中断的CPU亲和性。

例如:

# cat interrupts

 CPU0 CPU1

 2: 11613 15978 XBurst2 2 xburst2-intc

 3: 13054 11075 XBurst2 3 jz-mailbox

 4: 11063 8091 XBurst2 4 core_timerevent

 8: 0 0 XBurst2-irqchip 0 as-dma

 9: 35 42 XBurst2-irqchip 1 13500000.otg, 13500000.otg, dwc2_hsotg:usb1

 11: 0 0 XBurst2-irqchip 3 pdma

 12: 0 0 XBurst2-irqchip 4 pdmad

 13: 1 0 XBurst2-irqchip 5 mcu

 14: 0 0 XBurst2-irqchip 6 pwm-interrupt

 15: 10231 14732 XBurst2-irqchip 7 13440000.sfc

 26: 0 0 XBurst2-irqchip 18 13810000.vic

 27: 0 0 XBurst2-irqchip 19 13710000.vic

 28: 0 0 XBurst2-irqchip 20 13800000.isp

 29: 0 0 XBurst2-irqchip 21 13700000.isp

 30: 120 0 XBurst2-irqchip 22 13470000.hash

 35: 0 0 XBurst2-irqchip 27 ingenic-tcu-interrupt

 40: 0 0 XBurst2-irqchip 32 rtc 1Hz and alarm

 44: 1 1204 XBurst2-irqchip 36 mmc1

 52: 1204 0 XBurst2-irqchip 44 uart3

 56: 0 0 XBurst2-irqchip 48 mmc2

 61: 0 0 XBurst2-irqchip 53 134a0000.mac

 66: 4 0 XBurst2-irqchip 58 i2c3

 69: 15 0 XBurst2-irqchip 61 i2c0

 70: 0 0 XBurst2-irqchip 62 13200000.helix

 71: 0 0 XBurst2-irqchip 63 13300000.felix

 72: 0 0 GPIO 17 vbus_dete

 73: 0 0 GPIO 27 id_dete

 74: 0 0 ingenic-adc 0 ingenic-aux

 75: 0 0 ingenic-adc 1 ingenic-aux

 76: 0 0 ingenic-adc 2 ingenic-aux

 77: 0 0 ingenic-adc 3 ingenic-aux

 78: 0 0 ingenic-adc 4 ingenic-aux

 79: 0 0 ingenic-adc 5 ingenic-aux

 80: 0 0 GPIO 21 bluetooth bthostwake

 81: 0 0 GPIO 12 13490000.msc cd

 82: 0 0 GPIO 31 WAKEUP

 83: 0 0 GPIO 25 bootsel0

 84: 0 0 GPIO 26 bootsel1

 85: 2 0 GPIO 9 gt9xx

ERR: 0

例如第52号中断在cpu0上响应,通过以下修改可以实现只在cpu1上响应。

# echo 2 > smp_affinity

再次查看interrupts。

# cat interrupts

 CPU0 CPU1

 2: 12160 16479 XBurst2 2 xburst2-intc

 3: 13128 11240 XBurst2 3 jz-mailbox

 4: 11460 8493 XBurst2 4 core_timerevent

 8: 0 0 XBurst2-irqchip 0 as-dma

 9: 35 42 XBurst2-irqchip 1 13500000.otg, 13500000.otg, dwc2_hsotg:usb1

 11: 0 0 XBurst2-irqchip 3 pdma

 12: 0 0 XBurst2-irqchip 4 pdmad

 13: 1 0 XBurst2-irqchip 5 mcu

 14: 0 0 XBurst2-irqchip 6 pwm-interrupt

 15: 10249 14732 XBurst2-irqchip 7 13440000.sfc

 26: 0 0 XBurst2-irqchip 18 13810000.vic

 27: 0 0 XBurst2-irqchip 19 13710000.vic

 28: 0 0 XBurst2-irqchip 20 13800000.isp

 29: 0 0 XBurst2-irqchip 21 13700000.isp

 30: 120 0 XBurst2-irqchip 22 13470000.hash

 35: 0 0 XBurst2-irqchip 27 ingenic-tcu-interrupt

 40: 0 0 XBurst2-irqchip 32 rtc 1Hz and alarm

 44: 1 1204 XBurst2-irqchip 36 mmc1

 52: 1733 501 XBurst2-irqchip 44 uart3

 56: 0 0 XBurst2-irqchip 48 mmc2

 61: 0 0 XBurst2-irqchip 53 134a0000.mac

 66: 4 0 XBurst2-irqchip 58 i2c3

 69: 15 0 XBurst2-irqchip 61 i2c0

 70: 0 0 XBurst2-irqchip 62 13200000.helix

 71: 0 0 XBurst2-irqchip 63 13300000.felix

 72: 0 0 GPIO 17 vbus_dete

 73: 0 0 GPIO 27 id_dete

 74: 0 0 ingenic-adc 0 ingenic-aux

 75: 0 0 ingenic-adc 1 ingenic-aux

 76: 0 0 ingenic-adc 2 ingenic-aux

 77: 0 0 ingenic-adc 3 ingenic-aux

 78: 0 0 ingenic-adc 4 ingenic-aux

 79: 0 0 ingenic-adc 5 ingenic-aux

 80: 0 0 GPIO 21 bluetooth bthostwake

 81: 0 0 GPIO 12 13490000.msc cd

 82: 0 0 GPIO 31 WAKEUP

 83: 0 0 GPIO 25 bootsel0

 84: 0 0 GPIO 26 bootsel1

 85: 2 0 GPIO 9 gt9xx

ERR: 0

连续cat查看发现其只在cpu1上响应。