设备驱动-arm64中断-相关


中断硬件相关

arm64 中断分类 sync exception; irq ; fiq ; serror;

arm64 中断处理相关寄存器: SP_EL0,SP_EL1,SPSR_EL1,ELR_EL1,ESR_EL1,VBAR_EL1

硬件处理过程:
a:保存PSTATE到SPSR_EL1;
b:PSTATE中 DAIF 置位;
c:返回地址保存到ELR_EL1;
d:异常原因保存ESR_EL1;
e:异常处理地址到PC;
f:使用SP_EL1;


arm64 中断向量表格式及内容

参考这篇文章:

https://blog.csdn.net/jasonactions/article/details/115689462  

gic_handle_irq 后的高层处理和 softirq 

   GICC_IAR 中获取 hw_irqnr  - 读取GICC_IAR寄存器就是对中断的ACK,会让中断从pending状态进入到active状态 

   irq_enter 

   map hw_irqnr to  irq 

   generic_irq_handle(irq )

           irq_desc *desc = irq to desc

           generic_handle_irq_desc(desc ) ; 

           desc->handle_irq

              handle_irq_event

                     for each action of desc

                              res = action->handler( irq,  action->dev_id ) ; 

   iqr_exit 

            if local softirq pending 

                    invoke  softirq

参考这篇文章:

https://blog.csdn.net/jasonactions/article/details/115751815

注册中断 

request_irq( irq,  handler, flags, char* name, void *dev)

参考这篇文章: 

https://blog.csdn.net/jasonactions/article/details/115657310

中断注册需要的 irq 从dts 中解析出来

上面 注册中断 需要 irq 号,但是 这个 irq 号 从 哪儿来呢 ?

参考 这篇文章 -  irq_of_parse_and_map

https://www.freesion.com/article/88611328271/