3.16 基于OHCI的USB主机 —— 中断向量处理
来源:互联网 发布:python list 遍历 编辑:程序博客网 时间:2024/05/18 20:07
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lancelot.blog.51cto.com/393579/261143
使用芯片提供的例程,中断向量处理程序也非常简单。在上面的AIC中断配置中,中断产生不是直接调用用于处理中断事务的函数,而是调用一个用汇编语言编写的函数,该函数主要功能是在中断处理函数调用前后,完成寄存器现场的保护和恢复。
这部分代码实际上与OHCI没有关系,是属于CPU的处理,不同的CPU其中断向量处理是不一样的。所以这里的代码仅作参考而已。
;------------------------------------------------------------------------------
;- ATMEL Microcontroller Software Support - ROUSSET -
;------------------------------------------------------------------------------
; The software is delivered "AS IS" without warranty or condition of any
; kind, either express, implied or statutory. This includes without
; limitation any warranty or condition with respect to merchantability or
; fitness for any particular purpose, or against the infringements of
; intellectual property rights of others.
;-----------------------------------------------------------------------------
;- File source : arm_isr.s
;- Object : Example of IT handler calling a C function
;- Compilation flag : None
;-
;- 1.0 26/11/02 FB : Creation ARM ADS
;------------------------------------------------------------------------------
AREA itHandler, CODE, READONLY
;------------------------------------------------------------------------------
;- LISR vector handler for system peripherals
;--------------------------------------------
;- This macro save the context, call the LISR dispatch routine, and restore
;- the context
;------------------------------------------------------------------------------
INCLUDE AT91RM9200.inc
;--------------------------------
;- ARM Core Mode and Status Bits
;--------------------------------
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
I_BIT EQU 0x80
F_BIT EQU 0x40
T_BIT EQU 0x20
;------------------------------------------------------------------------------
;- IRQ Entry
;-----------
;------------------------------------------------------------------------------
MACRO
IRQ_ENTRY $reg
;- Adjust and save LR_irq in IRQ stack
sub r14, r14, #4
stmfd sp!, {r14}
;- Write in the IVR to support Protect Mode
;- No effect in Normal Mode
;- De-assert the NIRQ and clear the source in Protect Mode
ldr r14, =AT91C_BASE_AIC
str r14, [r14, #AIC_IVR]
;- 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
IF "$reg" = ""
stmfd sp!, { r1-r3, r12, r14}
ELSE
stmfd sp!, { r1-r3, $reg, r12, r14}
ENDIF
MEND
;------------------------------------------------------------------------------
;- IRQ Exit
; ---------
;------------------------------------------------------------------------------
MACRO
IRQ_EXIT $reg
;- Restore scratch/used registers and LR from User Stack
IF "$reg" = ""
ldmia sp!, { r1-r3, r12, r14}
ELSE
ldmia sp!, { r1-r3, $reg, r12, r14}
ENDIF
;- 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 AIC
ldr r0, =AT91C_BASE_AIC
str r0, [r0, #AIC_EOICR]
;- 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
;------------------------------------------------------------------------------
; AT91F_ASM_UHP_Handler
; ---------------------
; Handler called by the AIC
;
; Save context
; Call C handler
; Restore context
;------------------------------------------------------------------------------
EXPORT AT91F_ASM_UHP_Handler
IMPORT AT91F_UHP_Handler
AT91F_ASM_UHP_Handler
IRQ_ENTRY
ldr r1, =AT91F_UHP_Handler
mov r14, pc
bx r1
IRQ_EXIT
END
- 3.16 基于OHCI的USB主机 —— 中断向量处理
- 3.17 基于OHCI的USB主机 —— 中断处理程序
- 基于OHCI的USB主机 —— OHCI(端点)
- 基于OHCI的USB主机 —— OHCI(HCCA)
- 3.15 基于OHCI的USB主机 —— 中断寄存器初始化
- 基于OHCI的USB主机 —— 前言
- 基于OHCI的USB主机 —— 背景介绍
- 基于OHCI的USB主机 —— 总体构架
- 基于OHCI的USB主机 —— 寄存器(初始化)
- 基于OHCI的USB主机 —— 寄存器(传输)
- 基于OHCI的USB主机 —— 寄存器(复位)
- 基于OHCI的USB主机 —— 寄存器(其它)
- 1.1基于OHCI的USB主机 —— 前言
- 基于OHCI的USB主机 —— 目录
- 1.2基于OHCI的USB主机 —— 背景介绍
- 1.3 基于OHCI的USB主机 —— 总体构架
- 基于OHCI的USB主机 —— 总体构架
- 基于OHCI的USB主机 —— OHCI(传输描述符)
- 3.15 基于OHCI的USB主机 —— 中断寄存器初始化
- MongoDB的安装
- hdu1394Minimum Inversion Number(线段树,求出逆序数)
- 关于引用库的问题,Actionbarsherlock和SlidingMenu
- php中session过期时间设置
- 3.16 基于OHCI的USB主机 —— 中断向量处理
- STL中map按值排序
- Qt中路径问题一般解决办法
- UIWebview
- 3.17 基于OHCI的USB主机 —— 中断处理程序
- keytool生成证书
- 110505 A multiplication game
- 修改mini2440的软MAC地址
- extjs form submit upload 返回下载download 没有回调