⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 int.s

📁 AT91SAM9261的USB设备驱动程序
💻 S
字号:
   AREA INTERRUPT_UART, CODE, READONLY
   CODE32
   EXPORT  DRIVER_AsmUARTInterruptHandler		; Assembler Interrupt Handler

   IMPORT  ISR_Driver 	; C Interrupt function

	;EXPORT DRIVER_AsmVBUSInterruptHandler
	;IMPORT ISR_VBus



GIC_BASE   	EQU   0xFFFFF000        ; Address of controller

GIC_SMR     EQU   GIC_BASE          ; Source Mode Register
GIC_SVR     EQU   GIC_SMR   + 32*4  ; Source Vector Register
GIC_IVR     EQU   GIC_SVR   + 32*4  ; IRQ Vector Register
GIC_FVR     EQU   GIC_IVR   + 4     ; FIQ Vector Register
GIC_ISR     EQU   GIC_FVR   + 4     ; Interrupt Status Register
GIC_IPR     EQU   GIC_ISR   + 4     ; Interrupt Pending Register
GIC_IMR     EQU   GIC_IPR   + 4     ; Interrupt Mask Register
GIC_CISR    EQU   GIC_IMR   + 4     ; Core Interrupt Status Register
GIC_IECR    EQU   GIC_CISR  + 3*4   ; Interrupt Enable Command Register
GIC_IDCR    EQU   GIC_IECR  + 4     ; Interrupt Disable Command Register
GIC_ICCR    EQU   GIC_IDCR  + 4     ; Interrupt Clear Command Register
GIC_ISCR    EQU   GIC_ICCR  + 4     ; Interrupt Set Command Register
GIC_EOICR   EQU   GIC_ISCR  + 4     ; End of Interrupt Command Register
GIC_SPU     EQU   GIC_EOICR + 4     ; Spurious Vector Register
ARM_MODE_USER     EQU   0x10
ARM_MODE_FIQ      EQU   0x11
ARM_MODE_IRQ      EQU   0x12
ARM_MODE_SVC      EQU   0x13
ARM_MODE_ABORT    EQU   0x17
ARM_MODE_UNDEF    EQU   0x1B
ARM_MODE_SYS      EQU   0x1F

; Control bits
I_BIT             EQU   0x80
F_BIT             EQU   0x40
T_BIT             EQU   0x20
;******************************************************************************
;* IRQ Entry
;******************************************************************************
   MACRO
   IRQ_ENTRY

; Adjust and save LR_irq in IRQ stack
   sub   r14, r14, #4
   stmfd sp!, {r14}

; Save SPSR and r0 in IRQ stack
   mrs   r14, SPSR
   stmfd sp!, {r0, r14}

; Enable Interrupt and Switch in SYS Mode
   mrs   r0, CPSR
   bic   r0, r0, #I_BIT
   orr   r0, r0, #ARM_MODE_SYS
   msr   CPSR_c, r0

; Save scratch/used registers and LR in User Stack
   stmfd sp!, { r1-r3, r12, r14}

   MEND

;******************************************************************************
;* IRQ Exit
;******************************************************************************
   MACRO
   IRQ_EXIT

; Restore scratch/used registers and LR from User Stack
   ldmia sp!, { r1-r3, r12, r14}

; Disable Interrupt and switch back in IRQ mode
   mrs   r0, CPSR
   bic   r0, r0, #ARM_MODE_SYS
   orr   r0, r0, #I_BIT:OR:ARM_MODE_IRQ
   msr   CPSR_c, r0

; Mark the End of Interrupt on the GIC
   ldr   r0, =GIC_EOICR
   str   r0, [r0]

; Restore SPSR_irq and r0 from IRQ stack
   ldmia sp!, {r0, r14}
   msr   SPSR_cxsf, r14

; Restore adjusted  LR_irq from IRQ stack directly in the PC
   ldmia sp!, {pc}^

   MEND

;******************************************************************************
;* UPIO0 Handler
;******************************************************************************
DRIVER_AsmUARTInterruptHandler
   IRQ_ENTRY
   bl    ISR_Driver
   IRQ_EXIT

;******************************************************************************
 

   
;DRIVER_AsmVBUSInterruptHandler
;   IRQ_ENTRY
;   bl    ISR_VBus
;   IRQ_EXIT
   END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -