15:08 2009-9-22
½ñÌì·ÖÎöÁËÒ»°Ñ4020µÄIRQ½øÈëºÍÍ˳ö¹ý³Ì£¬·¢ÏÖ²»ÉÙ¶«¶«£¬°´ÕÕ³£Àí½øIRQµÄ¹ý³ÌÊÇÓ²¼þÍê³ÉµÄ£¬¶ø³öÖжϵĹý³ÌÔòÐèÒª¸ù¾Ý¾ßÌå¹ý³Ì½øÐмӼõ²½ÖèÁË¡£
Õý³£µÄÖжϽøÈë¹ý³ÌÊÇ£º
£¨1£©¿½±´CPSRµ½SPSR_<mode>
£¨2£©ÉèÖÃÕýÈ·µÄCPSR룬arm×Ô¶¯Ó²¼þÍê³ÉÏÂÃæÈýÏ×÷£ºÇл»µ½ARM״̬£¬Çл»µ½Ò쳣ģʽ£¬½ûÖ¹Öжϡ£
£¨3£©±£´æ·µ»ØµØÖ·ÔÚLR_<mode>
£¨4£©ÉèÖÃPCµ½Òì³£ÏòÁ¿µØÖ·
ÒÔÉÏÕâËĸö²Ù×÷ÊÇÓ²¼þÍê³ÉµÄ£¬ÁíÍâÎÒ·¢ÏÖµ±Ä£Ê½»»µ½IRQģʽÏ£¬´ËʱµÄ¶ÑÕ»Ö¸ÕëspÒѾÔÚÖжÏÕ»Ö¸Õ루Ìáǰָ¶¨ºÃµÄ£©ÉϼÓ8ÁË£¬ÎªÉ¶ÄØ£¿£¿
¶øÎÒÃÇÔÚÕæÕý²Ù×÷Öл¹ÐèÒª½«ÆäËû¼Ä´æÆ÷ÈëÕ»£¬Õâ¸ö¹ý³ÌÊÇÎÒÃÇ×Ô¼ºÐ´µÄ¡£
£¨5£©½«r0-r12ѹջ
ÕâÑùʵÏÖµÄÊDz»ÄÜÖжÏǶÌ׵Ĺý³Ì£¬Èç¹ûÏëʵÏÖÖжÏǶÌ×£¬»¹ÐèÒª½«r14£¬spsr£¬Ò²Ñ¹Õ»¡£
³öÖжÏʱ£¬ÎÒÃÇ×Ô¼ºÐèÒª×öÒÔϲÙ×÷£º
£¨1£©r0-r12³öÕ»
£¨2£©´ÓSPSR_<mode>»Ö¸´CPSR
£¨3£©´ÓLR_<mode>»Ö¸´PCÖµSUBS pc, lr, #4
Ò»°ã£¨2£©£¨3£©¹ý³ÌÊÇÒ»ÏÂÍê³ÉµÄ£¬Óà LDMFD sp!,{pc} ^ ¼´¿ÉÍê³É£¬ÓÃËü´úÂëʵÏÖÊDZȽÏÂé·³µÄ¡£
ÔÀ´ÔÚSEP4020µÄÖжϴ¦Àí´úÂëÈçÏ£¬¿ÉÒÔ¿´³öÊÇÏ൱Âé·³µÄ¡£
IRQ_DO
stmfd sp!, {r0,r1}
ldr r0, =IRQ_R1
str r1, [r0]
ldmfd sp!, {r0}
ldr r1, =IRQ_R0
str r0, [r1] ;±£´æR0ºÍR1¼Ä´æÆ÷£¨ÒòΪÕâÁ½¸ö¼Ä´æÆ÷ÔÙºóÃæÒªÓõ½£©
add r13, r13, #4 ;»Ö¸´ÖжÏÕ»Õë
sub r14, r14, #4 ;ʹr14Ö¸ÏòÖжϷµ»ØµÄÏÂÌõÓï¾ä
mov r0, r14 ;LR_irq(R14)¼õ4²¢±£´æÔÚR0
mrs r1, spsr
orr r1, r1, #0x80 ;½«SPSR_irqµÄÖÐ¶ÏÆÁ±ÎλÖá®1¡¯£¨ÆÁ±ÎÖжϣ©£¬²¢±£´æÔÙR1 ÖÐ
msr cpsr_cxsf, r1 ;½«Ä£Ê½Çл»µ½ÖжÏǰµÄģʽ£¬¼´Õâ¸öʱºò¾ÍÓֻص½ÁËSVCģʽÁË£¬µ«´ËʱÊDz»ÔÊÐíÖжϵġ£
;---------------ÏÖÔÚÓÖ½øÈëSVCģʽÁË------------------------------------------------------------------------------
bic r1, r1, #0x80 ;½«ÔÏȱ£´æµÄSPSR_irqµÄR1µÄÖÐ¶ÏÆÁ±ÎλÇåÁ㣨ÔÊÐíÖжϣ©
stmfd sp!, {r0}
stmfd sp!, {r14}
stmfd sp!, {r1} ;ÒÀ´Î½«R0,R14,R1µÄֵѹÈëÖжÏǰģʽϵĶÑÕ»£¨µ±Ç°R0,R14,R1Öдæ·ÅµÄ·Ö±ðÊÇLR_irq-4£¬ÖжÏǰģʽϵÄLR£¬SPSR_irq)
ldr r0, =IRQ_R1
ldr r1, [r0]
stmfd sp!, {r1}
ldr r1, =IRQ_R0
ldr r0, [r1]
stmfd sp!, {r0}
ldmfd sp!, {r0,r1} ;»Ö¸´ÔÏȱ£´æµÄR0ºÍR1
stmfd sp!, {r0-r12} ;½«r0--r12È«²¿Ñ¹ÈëÖжÏÒÔǰģʽ¼´SVCģʽϵĶÑÕ»
;-----------------------------
IMPORT int_vector_handler
bl int_vector_handler ;Ìø×ªµ½ÖжÏÔ´ÅжϺÍÖжϴ¦Àí³ÌÐò
;-----------------ÖжϷµ»Ø------------ ;restore the register
ldmfd sp!, {r0-r12} ;»Ö¸´ÔÏȱ£´æµÄR0-R12
ldmfd sp!, {r14}
msr cpsr_cxsf, r14 ;»Ö¸´SVCϵÄcpsr£¬²¢ÇÒÔÊÐíÖжÏ
ldmfd sp!, {r14} ;½«ÔÏȱ£´æµÄSPSR_irq»Ö¸´µ½CPSRÖÐ
ldmfd sp!, {pc}
ÎÒºóÀ´×Ô¼º¸ÄµÄÒ»¸öÁ÷³Ì£¬Õâ¸öÊÇÖжÏÔÊÐíǶÌ×µÄ×ö·¨
IRQ_DO
stmfd sp!, {r0,r1}
ldr r0, =IRQ_R1 ;¼ÓÔØ ³£ÊýIRQ_R1µÄµØÖ·µ½r0
str r1, [r0]
ldmfd sp!, {r0}
ldr r1, =IRQ_R0
str r0, [r1] ;±£´æR0ºÍR1¼Ä´æÆ÷£¨ÒòΪÕâÁ½¸ö¼Ä´æÆ÷ÔÙºóÃæÒªÓõ½£©
;add r13, r13, #4 ;restore the sp_irq top to original irq top
sub r14, r14, #4
mov r0, r14 ;LR_irq(R14)¼õ4²¢±£´æÔÚR0
mrs r1, spsr ;±£´æSVCģʽϵÄcpsrµ½r1ÖУ¬×¼±¸Ñ¹Õ»±£´æ£¬ÒԱ㷵»ØÊ±ÓÃ
stmfd sp!, {r0} ;lr-4
stmfd sp!, {r14} ;r14
stmfd sp!, {r1} ;spsr_irq
ldr r0, =IRQ_R1
ldr r1, [r0]
stmfd sp!, {r1}
ldr r1, =IRQ_R0
ldr r0, [r1]
stmfd sp!, {r0}
ldmfd sp!, {r0,r1} ;»Ö¸´ÔÏȱ£´æµÄR0ºÍR1
stmfd sp!, {r0-r12} ;½«r0--r12È«²¿Ñ¹ÈëÖжÏÒÔǰģʽϵĶÑÕ»
;mrs r5,cpsr
;bic r5,r5,#0x80
;msr cpsr_cxsf,r5 ;ʹÖжÏÄܹ»Ç¶Ì×,µ«²»ÄÜÔÚ´ËÓã¬ÒòΪÖжÏÔ´»¹Ã»±ðÇ壬ÕâÊÇ¿ªÖжÏÓÖ»á½øÈëÖжÏÁË
;-----------------------------
IMPORT int_vector_handler
bl int_vector_handler ;Ìø×ªµ½ÖжÏÔ´ÅжϺÍÖжϴ¦Àí³ÌÐò
;----------------------------- ;restore the register
ldmfd sp!, {r0-r12} ;»Ö¸´ÔÏȱ£´æµÄR0-R12
ldmfd sp!, {r14}
msr spsr_cxsf, r14
ldmfd sp!, {r14} ;½«ÔÏȱ£´æµÄSPSR_irq»Ö¸´µ½CPSRÖÐ
ldmfd sp!, {pc}^
EXPORT ENABLE_IRQ
;----------ÏÂÃæÊǺ¯ÊýÕ»£¬¿ÉÒÔ¶Ô±ÈÏÂÖжÏÕ»ÓÚº¯ÊýÕ»µÄÇø±ð-----------------------------
ENABLE_IRQ
stmfd sp!,{r5,r14} ;º¯Êý½øÈëʱ£¬º¯Êýѹջ
mrs r5,cpsr
bic r5,r5,#0x80
msr cpsr_cxsf,r5 ;ʹÖжÏÄܹ»Ç¶Ì×,
ldmfd sp!,{r5,pc} ;º¯Êý·µ»Ø
;¿ÉÒÔ·¢ÏÖÖжÏÕ»Ó뺯ÊýÕ»µÄÇø±ðÔÚÓÚ£¬ÖжÏÕ»Òª±£´æcpsr£¬¶øº¯ÊýÕ»²»ÓùÜcpsrÁË£¬Òò´Ë·µ»ØÊ±Ò²²»ÓÃÇл»Ä£Ê½ÁË¡£
ÔÚÖжϺ¯ÊýÖн«irq´ò¿ª¼´¿ÉÔÙ´ÎÒýÆðÖжϣ¬ÓÃENABLE_IRQ¼´¿É£¬¶øÓÉÓÚÕâʱºòÉϴεÄÖжÏÏÖ³¡¶¼ÒѾ±£´æËùÒÔÔٴνøÖжÏÊÇ¿ÉÒԵ쬵«Ç°ÌáÊÇÉÏ´ÎÖжÏÒѾÇå³ýÁË¡£

