一. am5728 mailbox中断相关概念
1. crossbar。由于am5728的中断数太多,难以管理,现在引入crossbar来集中管理am5728中的中断。每个crossbar的中断线对应一个中断,对应关系如下,以下列出部分仅供参考
2. 每个cpu核心拥有多个irq,在手册中已经编好号。比如 dsp的中断DSP1_IRQ_0等,对应关系如下表:
3. 与中断相关的寄存器。此处以 mailbox3 的中断寄存器为例,以下列出了mailbox所有中断寄存器的地址,关键寄存器为
MAILBOX_IRQSTATUS_RAW_u(查看中断是否触发)
MAILBOX_IRQSTATUS_CLR_u(清中断状态)
MAILBOX_IRQENABLE_SET_u 和 MAILBOX_IRQENABLE_CLR_u (使能或者关闭对应中断)
二. 在程序中使用中断
此处以 dsp1端使用 mailbox3_user1的方法为例,介绍使用中断的方法(基于sys/bios)
1. 首先在使用中断时,需要将属于一个属于 dsp1的中断与 crossbar的中断线相绑定。查手册 17.3.12 ,可以得到 MAILBOX3_IRQ_USER1 与 IRQ_CROSSBAR_242 相对应,将其与 DSP_IRQ_44 绑定到一起。
2. 绑定方法:设置形如 CTRL_CORE_X_IRQ_B_A 的寄存器,X代表不同的 cpu, B/A代表一个寄存器可以绑定 cpu中的两个irq线。
此处的寄存器为 CTRL_CORE_DSP1_IRQ_44_45,此寄存器设置的方法如下,有两种,第一种是直接操作寄存器,第二种是调用 API。
A. sys/bios中:CSL_xbarIrqConfigure(CSL_XBAR_IRQ_CPU_ID_DSP1, CSL_XBAR_INST_DSP1_IRQ_44, CSL_XBAR_MAILBOX3_IRQ_USER1);
B. 直接写寄存器。HW_WR_REG32((0x4A002960U), 0xE00F2);
3. 创建中断。(sys/bios中)
4. 使能中断。
A. sys/bios中:Hwi_enableInterrupt(4);
B. 直接写寄存器。HW_WR_REG32((0x4883C000U + 0x108U + 0x10), 0x1);
5. 在中断服务程序中清中断。Hwi_clearInterrupt(4);
三. sys/bios中,中断相关的完整设置流程。
四. 触发mailbox中断的方式
按照手册中的描述,仅需往指定 mailbox 寄存器中写入数据,即可自动触发中断。如下图,arm端在寄存器 MAILBOX_MESSAGE_0 中写入数据,即可触发中断,在DSP端读取此寄存器,即可收到arm发送过来的消息。