中断与芯片管脚

原文:http://www.mythroad.net/2009/10/31/interrupt_number_and_chip_pin_relationships/

一直以来搞不懂这个中断号的来历,总以为是中断控制器自己规定的一个号,但是最近在看了
s3c2440的中断控制后才发现不是这么一回事.2440的中断处理只能处理32个中断,但是其在内核中出现的中断号却有51,58等.而且它的外部中
断INT4~7共享一个中断控制寄存器的一位,INT8~23也是共享控制寄存器的一位.我就好奇了,它怎么区分这些中断呢?而且在内核代码中它又很清楚
的区分了这些中断.如下面的代码(2.6.13).

  1. "
    include/asm-arm/arch-s3c2410/irqs.h
    "
  2. .....
  3. /* interrupts generated from the external interrupts sources */
  4. #
    define

    IRQ_EINT4
         
    S3C2410_IRQ
    (
    32
    )
        
    /* 48 */
  5. #
    define

    IRQ_EINT5
         
    S3C2410_IRQ
    (
    33
    )
  6. #
    define

    IRQ_EINT6
         
    S3C2410_IRQ
    (
    34
    )
  7. #
    define

    IRQ_EINT7
         
    S3C2410_IRQ
    (
    35
    )
  8. #
    define

    IRQ_EINT8
         
    S3C2410_IRQ
    (
    36
    )
  9. #
    define

    IRQ_EINT9
         
    S3C2410_IRQ
    (
    37
    )
  10. #
    define

    IRQ_EINT10
        
    S3C2410_IRQ
    (
    38
    )
  11. #
    define

    IRQ_EINT11
        
    S3C2410_IRQ
    (
    39
    )
  12. #
    define

    IRQ_EINT12
        
    S3C2410_IRQ
    (
    40
    )
  13. #
    define

    IRQ_EINT13
        
    S3C2410_IRQ
    (
    41
    )
  14. #
    define

    IRQ_EINT14
        
    S3C2410_IRQ
    (
    42
    )
  15. #
    define

    IRQ_EINT15
        
    S3C2410_IRQ
    (
    43
    )
  16. #
    define

    IRQ_EINT16
        
    S3C2410_IRQ
    (
    44
    )
  17. ....

在看了N久之后才发现了其中的缘由:
在初始化的时候,在相关的启动代码中将这些中断源和中断号进行了一一的映射,然后再初始化irq_desc.而在执行中断的时候就根据中断控制器的一些状
态和控制寄存器来进行转换,将相应的中断源转换成中断号,再进行中断例程的执行.这里针对于2440的进行简单分析一下:
在”arch/arm/kernel/entry-armv.S” 的 irq_handler宏就是处理中断的,代码如下:

  1. /*
  2. * Interrupt handling.  Preserves r7, r8, r9
  3. */
  4. .
    macro
     
    irq_handler
  5. 1
    :     
    get_irqnr_and_base

    r0
    ,
    r6
    ,
    r5
    ,
    lr
     
    //而这里就是将中断源转换成相应中断号的一个宏,最后将中断号放到r0中
  6. movne
      
    r1
    ,
    sp
  7. @
  8. @
    routine

    called

    with

    r0
    =
    irq

    number
    ,
    r1
    =
    struct

    pt_regs
    *
  9. @
  10. adrne
      
    lr
    ,
    1
    b
  11. bne
        
    asm_do_IRQ
  12. //执行一般中断,函数原型:"arch/arm/kernel/irq.c"
  13. // asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
  14. //可以看出这里需要的参数有中断号和CPU发生中断时需要保存的寄存器
  15. #
    ifdef

    CONFIG_SMP
  16. /*
  17. * XXX
  18. *
  19. * this macro assumes that irqstat (r6) and base (r5) are
  20. * preserved from get_irqnr_and_base above
  21. */
  22. test_for_ipi

    r0
    ,
    r6
    ,
    r5
    ,
    lr
  23. movne
      
    r0
    ,
    sp
  24. adrne
      
    lr
    ,
    1
    b
  25. bne
        
    do_IPI
       
    //执行CPU内部中断或是异常
  26. #
    endif
  27. .
    endm

而对于中断源到中断号的转换宏get_irqnr_and_base这里要分析一下:
在”include/asm/arch/entry-macro.S” 中定义:

  1. .
    macro
     
    get_irqnr_and_base
    ,
    irqnr
    ,
    irqstat
    ,
    base
    ,
    tmp
  2. //irqnr: 是用来存放最后的中断号的,也就是上面传递过来的r0
  3. //irqstat: 用来存放中断状态的,即上面的r6
  4. //base: 这个在这宏当中没有使用
  5. //tmp:这个是用来存放中断控制器基地址的,
  6. //下面在获取个个控制寄存器值的时候都是在这个地址的基础之上加相应的值
  7. mov
         /
    tmp
    , #
    S3C24XX_VA_IRQ

    //获取中断控制器基地址(是虚地址)
  8. ldr
         /
    irqnr
    ,
    [
    /
    tmp
    , #
    0x14

    ]
             @
    get

    irq

    no
  9. 30000
    :
  10. teq
         /
    irqnr
    , #
    4
  11. teqne
       /
    irqnr
    , #
    5
  12. beq
        
    1002
    f
                               @
    external

    irq

    reg
  13. .....
  14. //这里即是对EINT4~EINT23的中断号的映射,
  15. //RQ_EINT4是一个基本号,就是这个号和前面的中断号是断开的,其间这些中断号是预留给其它一些总线下的设备使用的.
  16. //而之后的中断号都是在这个号的基础上不断+1的,这里是其代码.
  17. mov
         /
    irqnr
    , #
    IRQ_EINT4
                  @
    start

    extint

    nos
  18. mov
         /
    irqstat
    , /
    irqstat
    ,
    lsr
    #
    4
           @
    ignore

    bottom

    4

    bits
  19. 10021
    :
  20. movs
        /
    irqstat
    , /
    irqstat
    ,
    lsr
    #
    1
  21. //这里是根据起中断状态再判断到底是那一个中断发生了
  22. bcs
        
    1004
    f
  23. add
         /
    irqnr
    , /
    irqnr
    , #
    1
  24. cmp
         /
    irqnr
    , #
    IRQ_EINT23
  25. ble
        
    10021
    b
  26. .....

这里就完成了中断引脚和中断号的对应关系,哎,终于搞明白了!!!但是个个体系结构和中断控制器的映射方式应该是不一样的,这个只是真对于s3c2440来说的
这里就完成了中断

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值