Cortex-R52:GIC配置

        在Cortex-R52:GIC里我们简述了GIC相关配置寄存器和中断类型,接下来聊一聊SGI、SPI、PPI的配置方法。

        根据R52 TRM中的描述,一个中断有INTID表示,且一个中断相关设置如下:

  • 使能:只有使能的中断才会送到核里;但是没有使能的中断如果发生了会被pending住;
  • 优先级:5bit优先级配置,值越小,优先级越高
  • 中断触发行为:电平触发 or 边沿触发
  • 设置Group:IRQ or FIQ
  • 设置路由目标:目标core或者cores

一、SPI、PPI和SGI中断的配置

1.1 配置项

SettingSPIsSGIs & PPIs
EnableGICD_ISENABLERn
GICD_ICENABLERn
GICR_ISENABLERn
GICR_ICENABLERn
PriorityGICD_IPRIORITYnGICR_IPRIORITYn
Configuration (level or edge)GICD_ICFGRnGICR_ICFGRn
GroupGICD_IGROUPnGICR_IGROUPn
Routing (target core/cores)GICD_IROUTERnN/A

        PPI不需要配置Route,因为本身就是核私有的

1.2 代码示例

if(INT_IS_SPI(intID))
{
    REG32_WRITE(gicd_base_addr, gicd_isenabler_offset_x,  enable_mask)
    REG32_WRITE(gicd_base_addr, gicd_irouter_offset_x,    affinity_mask)
    REG8_WRITE (gicd_base_addr, gicd_ipriorityr_offset_x, prio_mask)
    REG32_WRITE(gicd_base_addr, gicd_icfgr_offset_x,      cfg_mask)
}
else
{
    REG32_WRITE(gicr_base_addr, gicr_isenabler0/1, enable_mask)
    REG8_WRITE (gicr_base_addr, gicr_ipriorityr0/1, prio_mask)
    if(INT_IS_PPI(intID))
    {
        REG32_WRITE(gicr_base_addr, gicr_icfgr1,      cfg_mask)
    }
}

        这里要提出来解释的是router寄存器IROUTER32-991。该寄存器位域结构如下:

        对于R52来说,Aff3 只读为0,Aff2/1根据芯片设计时的配置也是固定死了,实际上对于单核簇的R52来说,Aff2、1基本上也就是0;那么唯一可以改变的就只有Aff0,该位域详细解释如下:

         那么这个值从哪里来呢?MPIDR(详见Cortex-R52:affinity)

        也就是说,现在我想把一个SPI路由到核2,那么肯定要先获取该核的affnity0(通过MPIDR),然后写到该寄存器里。并且,注意,该寄存器是64bit的。

 二、注意事项

2.1 GIC模块的初始化

        GIC由三个模块构成,因此这三个模块也是要进行初始化的

模块寄存器操作解释
Distributor

1、GICD_CTRL.EnableGrp0/1 设置 1

2、GICD_CTRL.ARE不用设置(默认使能,RAO/WI(Read as one、write ignore))

默认值为0,使能IRQ和FIQ的group;

亲和度路由默认开启

Redistributor

GICR_WAKER.ProcessorSleep 设置 0

告诉相连的core,我要醒了

默认值为1;

软件必须轮询ChildrenAsleep状态为0才能跳转;

配置CPU interface之前必须完成这个操作

CPU interface

1、检查ICC_SRE.SRE是否为1(RAO/WI)

2、ICC_IGRPEN0/1 

3、ICC_PMR.Priority 设置优先级mask 

4、ICC_BRPn设置抢占策略       

1、硬件默认为1

2、设置Group0、1使能

3、配置送入到cpu的优先级mask,一般默认FF

   2.2 中断配置总结

中断类型配置项
SPI(32-991)

1、优先级:        GICD_IPRIORITYRn

2、中断Group     GICD_IGROUPRn

3、触发类型        GICD_ICFGRn

4、路由目的        GICD_IROUTERn

5、中断使能        GICD_ISENABLERn

PPI(16-31)

&

SGI(0-15)

1、优先级            GICR_IRPIORITYRn(n= 0-7)

2、中断Group      GICR_IGROUPR0

3、触发类型         GICR_ICFGR0/1

4、中断使能         GICR_ISENABLER0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CyberSecurity_zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值