设备驱动-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/