;/****************************************Copyright (c)*************************************************** ;** Guangzhou ZHIYUAN electronics Co.,LTD. ;** ;** http://www.embedtools.com ;** ;**--------------File Info------------------------------------------------------------------------------- ;** File name: vicControl.s ;** Last modified Date: 2008-12-12 ;** Last Version: 1.0 ;** Descriptions: Provide VIC_Control ;**------------------------------------------------------------------------------------------------------ ;** Created by: LinEnqiang ;** Created date: 2008-12-12 ;** Version: 1.0 ;** Descriptions: The original version ;** ;**------------------------------------------------------------------------------------------------------ ;** Modified by: ;** Modified date: ;** Version: ;** Descriptions: ;********************************************************************************************************/ INCLUDE LPC3200.INC ; Include the head file 引入头文件 ;/******************************************************************************************************** ; The imported labels ; 引入的外部标号在这声明 ;********************************************************************************************************/ ;/******************************************************************************************************** ; The emported labels ; 给外部使用的标号在这声明 ;********************************************************************************************************/ EXPORT vicControl EXPORT __GulVicEntry EXPORT vicInit ;/******************************************************************************************************** ; 宏定义 ;********************************************************************************************************/ NoInt EQU 0x80 NoFIQ EQU 0x40 SVC32Mode EQU 0x13 SYS32Mode EQU 0x1f IRQ32Mode EQU 0x12 VIC_STACK_LEGTH EQU 0x60 ; VIC中断服务向量表堆栈大小 ;/******************************************************************************************************** ; 代码开始 ;********************************************************************************************************/ CODE32 AREA |RUNFIRST|, CODE, READONLY ;/******************************************************************************************************** ;** Function name: vicInit ;** Descriptions: VIC管理初始化 ;** input parameters: none ;** output parameters: none ;** Returned value: none ;** Created by: LinEnqiang ;** Created Date: 2008-12-12 ;**------------------------------------------------------------------------------------------------------- ;** Modified by: ;** Modified date: ;**------------------------------------------------------------------------------------------------------- ;********************************************************************************************************/ vicInit LDR R2, =MIC_ER MOV R3, #3 ORR R3, R3, R3, LSL #30 STR R3, [R2] BIC R3, R3,#3 LDR R2, =MIC_ITR STR R3, [R2] MOV R3, #0 LDR R2, =MIC_APR STR R3, [R2] LDR R2, =MIC_ATR STR R3, [R2] MVN R1, R3 ; R1 = 0xffffffff LDR R2, =MIC_RSR STR R1, [R2] LDR R2, =SIC1_ER STR R3, [R2] LDR R2, =SIC1_ITR STR R3, [R2] LDR R2, =SIC1_APR STR R3, [R2] LDR R2, =SIC1_ATR STR R3, [R2] LDR R2, =SIC1_RSR STR R1, [R2] LDR R2, =SIC2_ER STR R3, [R2] LDR R2, =SIC2_ITR STR R3, [R2] LDR R2, =SIC2_APR STR R3, [R2] LDR R2, =SIC2_ATR STR R3, [R2] LDR R2, =SIC2_RSR STR R1, [R2] MOV R1, #0 MOV R2, #0 MOV R3, #0 LDR R0, =__GulVicEntry STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} STMIA R0!, {R1, R2, R3} LDR R1, =vicIrqDefFunc STMIA R0!, {R1} BX LR ;/******************************************************************************************************** ;** Function name: vicInit ;** Descriptions: VIC管理初始化 ;** input parameters: none ;** output parameters: none ;** Returned value: none ;** Created by: LinEnqiang ;** Created Date: 2008-12-12 ;**------------------------------------------------------------------------------------------------------- ;** Modified by: ;** Modified date: ;**------------------------------------------------------------------------------------------------------- ;********************************************************************************************************/ vicIrqDefFunc BX LR LTORG ;/******************************************************************************************************** ;** Function name: vicControl ;** Descriptions: 软件中断,用于提供VIC管理服务 ;** input parameters: 依功能而定 ;** output parameters: 依功能而定 ;** Returned value: 依功能而定 ;** Created by: LinEnqiang ;** Created Date: 2008/04/30 ;**------------------------------------------------------------------------------------------------------- ;** Modified by: ;** Modified date: ;**------------------------------------------------------------------------------------------------------- ;********************************************************************************************************/ vicControl SUB R0, R0, #0x100 CMP R0, #7 LDRLO PC, [PC, R0, LSL #2] MOVS PC, LR SwiFunctionAdd DCD vicIrqFuncSet ;0 DCD vicIrqFuncClr ;1 DCD vicIrqEnable ;2 DCD vicIrqDisable ;3 DCD vicIrqStatusGet ;4 DCD vicFiqSet ;5 DCD vicFiqClr ;6 ;/********************************************************************************************************* ;** Function name: vicIrqFuncSet ;** Descriptions: 设置所选外设的中断优先级、中断服务函数地址,并使能中断 ;** input parameters: uiChannel: 外设对应的中断通道号 ;** uiPri: 中断优先级 ;** uiFuncAddr: 中断服务函数地址 ;** output parameters: none ;** Returned value: 1: 成功 ;** 0: 失败 ;*********************************************************************************************************/ vicIrqFuncSet CMP R3, #0 ;if (处理函数 ==0) return FALSE; MOVEQ R0, #0 MOVEQS PC, LR CMP R2, #4 ;if (触发类型 >=4) return FALSE MOVCS R0, #0 MOVCSS PC, LR CMP R1, #32 * 3 ;if (通道号 >= 32 * 3) return FALSE; MOVCS R0, #0 MOVCSS PC, LR LDR R0, =__GulVicEntry ;if (已经加载) return FALSE; LDR R0, [R0, R1, lsl #2] CMP R0, #0 MOVNE R0, #0 MOVNES PC, LR LDR R0, =__GulVicEntry STR R3, [R0, R1, lsl #2] SUBS R3, R1, #32 * 2 LDRCS R0, =SIC2_BASE_ADDR CMPCS R1, #32 * 2 BCS vicIrqFunct_1 SUBS R3, R1, #32 * 1 LDRCS R0, =SIC1_BASE_ADDR CMPCS R1, #32 * 1 LDRLO R0, =MIC_BASE_ADDR MOVLO R3, R1 vicIrqFunct_1 MOV R1, #1 MOV R1, R1, lsl R3 LDR R3, [R0, #0x0c] ;APR BIC R3, R3, R1 TST R2, #1 ORRNE R3, R3, R1 STR R3, [R0, #0x0c] LDR R3, [R0, #0x10] ;ATR BIC R3, R3, R1 TST R2, #2 ORREQ R3, R3, R1 STR R3, [R0, #0x10] LDR R3, [R0, #0x14] ;ITR BIC R3, R3, R1 STR R3, [R0, #0x14] LDR R3, [R0] ;ER ORR R3, R3, R1 STR R3, [R0] MOV R0, #1 MOVS PC, LR LTORG ;/********************************************************************************************************* ;** Function name: vicIrqFuncClr ;** Descriptions: 清除所选外设的IRQ资源 ;** input parameters: uiChannel: 外设对应的中断通道号 ;** output parameters: none ;** Returned value: 1: 成功 ;** 0: 失败 ;*********************************************************************************************************/ vicIrqFuncClr CMP R1, #32 * 3 ;if (通道号 >= 32 * 3) return FALSE; MOVCS R0, #0 MOVCSS PC, LR SUBS R2, R1, #32 * 2 LDRCS R0, =SIC2_BASE_ADDR CMPCS R1, #32 * 2 BCS vicIrqFunct_1 SUBS R2, R1, #32 * 1 LDRCS R0, =SIC1_BASE_ADDR CMPCS R1, #32 * 1 LDRLO R0, =MIC_BASE_ADDR MOVLO R2, R1 MOV R3, #1 ;if (FIQ) return FALSE; MOV R2, R3, lsl R2 LDR R3, [R0, #0x14] ANDS R3, R3, R2 MOVNE R0, #0 MOVNES PC, LR LDR R3, [R0] BIC R3, R3, R2 STR R3, [R0] MOV R3, #0 LDR R0, =__GulVicEntry STR R3, [R0, R1, lsl #2] MOV R0, #1 MOVS PC, LR LTORG ;/********************************************************************************************************* ;** Function name: vicIrqEnable ;** Descriptions: 使能相应外设的中断 ;** input parameters: uiChannel: 外设对应的中断通道号 ;** output parameters: none ;** Returned value: 1: 成功 ;** 0: 失败 ;*********************************************************************************************************/ vicIrqEnable CMP R1, #32 * 3 ;if (通道号 >= 32 * 3) return FALSE; MOVCS R0, #0 MOVCSS PC, LR LDR R0, =__GulVicEntry ;if (未加载) return FALSE; LDR R3, [R0, R1, lsl #2] CMP R3, #0 MOVNE R0, #0 MOVNES PC, LR SUBS R2, R1, #32 * 2 LDRCS R0, =SIC2_BASE_ADDR CMPCS R1, #32 * 2 BCS vicIrqFunct_1 SUBS R2, R1, #32 * 1 LDRCS R0, =SIC1_BASE_ADDR CMPCS R1, #32 * 1 LDRLO R0, =MIC_BASE_ADDR MOVLO R2, R1 LDR R3, [R0] ORR R3, R3, R2 STR R3, [R0] MOV R0, #1 MOVS PC, LR LTORG ;/********************************************************************************************************* ;** Function name: vicIrqDisable ;** Descriptions: 禁止相应外设的中断 ;** input parameters: uiChannel: 外设对应的中断通道号 ;** output parameters: none ;** Returned value: 1: 成功 ;** 0: 失败 ;*********************************************************************************************************/ vicIrqDisable CMP R1, #32 * 3 ;if (通道号 >= 32 * 3) return FALSE; MOVCS R0, #0 MOVCSS PC, LR LDR R0, =__GulVicEntry ;if (未加载) return FALSE; LDR R3, [R0, R1, lsl #2] CMP R3, #0 MOVNE R0, #0 MOVNES PC, LR SUBS R2, R1, #32 * 2 LDRCS R0, =SIC2_BASE_ADDR CMPCS R1, #32 * 2 BCS vicIrqFunct_1 SUBS R2, R1, #32 * 1 LDRCS R0, =SIC1_BASE_ADDR CMPCS R1, #32 * 1 LDRLO R0, =MIC_BASE_ADDR MOVLO R2, R1 LDR R3, [R0] BIC R3, R3, R2 STR R3, [R0] MOV R0, #1 MOVS PC, LR LTORG ;/********************************************************************************************************* ;** Function name: vicIrqStatusGet ;** Descriptions: 获取所选外设的中断通道号、优先级、中断服务函数地址及中断使能状态 ;** input parameters: uiChannel: 外设对应的中断通道号 ;** output parameters: pvicInfo: 配置信息 ;** Returned value: 1: 成功 ;** 0: 失败 ;*********************************************************************************************************/ vicIrqStatusGet CMP R1, #32 * 3 ;if (通道号 >= 32 * 3) return FALSE; MOVCS R0, #0 MOVCSS PC, LR STMIA R2!, {R1} ;通道号 MOV R0, #0 STMIA R2!, {R0} ;优先级 LDR R0, =__GulVicEntry ;处理函数 LDR R3, [R0, R1, lsl #2] STMIA R2!, {R3} SUBS R3, R1, #32 * 2 LDRCS R0, =SIC2_BASE_ADDR CMPCS R1, #32 * 2 BCS vicIrqStatusGet_1 SUBS R3, R1, #32 * 1 LDRCS R0, =SIC1_BASE_ADDR CMPCS R1, #32 * 1 LDRLO R0, =MIC_BASE_ADDR MOVLO R3, R1 vicIrqStatusGet_1 MOV R1, #1 MOV R1, R1, lsl R3 LDR R3, [R0, #0x14] ANDS R3, R3, R1 MOVEQ R3, #2 MOVNE R3, #4 LDR R0, [R0] ANDS R0, R0, R1 ORRNE R3, R3, #1 STMIA R2!, {R3} MOV R0, #1 MOVS PC, LR LTORG ;/********************************************************************************************************* ;** Function name: vicFiqSet ;** Descriptions: 设置并使能所选中断通道号为FIQ中断 ;** input parameters: uiChannel: 外设对应的中断通道号 ;** output parameters: none ;** Returned value: 1: 成功 ;** 0: 失败 ;*********************************************************************************************************/ vicFiqSet CMP R3, #0 ;if (处理函数 ==0) return FALSE; MOVEQ R0, #0 MOVEQS PC, LR CMP R2, #4 ;if (触发类型 >=4) return FALSE MOVCS R0, #0 MOVCSS PC, LR CMP R1, #32 * 3 ;if (通道号 >= 32 * 3) return FALSE; MOVCS R0, #0 MOVCSS PC, LR LDR R0, =__GulVicEntry ;if (已经加载) return FALSE; LDR R0, [R0, R1, lsl #2] CMP R0, #0 MOVNE R0, #0 MOVNES PC, LR LDR R0, =__GulVicEntry STR R3, [R0, R1, lsl #2] SUBS R3, R1, #32 * 2 LDRCS R0, =SIC2_BASE_ADDR CMPCS R1, #32 * 2 BCS vicFiqSet_1 SUBS R3, R1, #32 * 1 LDRCS R0, =SIC1_BASE_ADDR CMPCS R1, #32 * 1 LDRLO R0, =MIC_BASE_ADDR MOVLO R3, R1 vicFiqSet_1 MOV R1, #1 MOV R1, R1, lsl R3 LDR R3, [R0, #0x0c] ;APR BIC R3, R3, R1 TST R2, #1 ORRNE R3, R3, R1 STR R3, [R0, #0x0c] LDR R3, [R0, #0x10] ;ATR BIC R3, R3, R1 TST R2, #2 ORRNE R3, R3, R1 STR R3, [R0, #0x10] LDR R3, [R0, #0x14] ;ITR ORR R3, R3, R1 STR R3, [R0, #0x14] LDR R3, [R0] ;ER ORR R3, R3, R1 STR R3, [R0] MOV R0, #1 MOVS PC, LR LTORG ;/********************************************************************************************************* ;** Function name: vicFiqClr ;** Descriptions: 清除所选中断通道号的FIQ中断 ;** input parameters: uiChannel: 外设对应的中断通道号 ;** output parameters: none ;** Returned value: 1: 成功 ;** 0: 失败 ;*********************************************************************************************************/ vicFiqClr CMP R1, #32 * 3 ;if (通道号 >= 32 * 3) return FALSE; MOVCS R0, #0 MOVCSS PC, LR SUBS R2, R1, #32 * 2 LDRCS R0, =SIC2_BASE_ADDR CMPCS R1, #32 * 2 BCS vicIrqFunct_1 SUBS R2, R1, #32 * 1 LDRCS R0, =SIC1_BASE_ADDR CMPCS R1, #32 * 1 LDRLO R0, =MIC_BASE_ADDR MOVLO R2, R1 MOV R3, #1 ;if (IRQ) return FALSE; MOV R2, R3, lsl R2 LDR R3, [R0, #0x14] ANDS R3, R3, R2 MOVEQ R0, #0 MOVEQS PC, LR LDR R3, [R0] AND R3, R3, R2 STR R3, [R0] MOV R3, #0 LDR R0, =__GulVicEntry STR R3, [R0, R1, lsl #2] MOV R0, #1 MOVS PC, LR LTORG ;/******************************************************************************************************** ; 变量定义 ;********************************************************************************************************/ AREA vicAddr, DATA, ALIGN = 2 __GulVicEntry SPACE 32 * 3 * 4 + 4 END ;/******************************************************************************************************** ; End Of File ;********************************************************************************************************/