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

📄 2410slib.s

📁 三星ARM2410的看门狗与中断结合实验
💻 S
字号:
;=====================================================================
; File Name : 2410slib.s
; Function  : S3C2410  (Assembly)
; Version   : 0.0
; History
;   0.0 : Programming start (February 26,2002) -> SOP
;=====================================================================

	GET option.inc
	GET 2410addr.inc

;Interrupt, FIQ/IRQ disable
NOINT   EQU     0xc0    ;1100 0000

;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
   GBLL    THUMBCODE
   [ {CONFIG} = 16 
THUMBCODE SETL  {TRUE}
        CODE32
   |   
THUMBCODE SETL  {FALSE}
   ]

   MACRO
       MOV_PC_LR
       [ THUMBCODE
           bx lr
       |
           mov pc,lr
       ]
   MEND

   AREA |C$$code|, CODE, READONLY
;==============
; CPSR I,F bit
;==============
;int SET_IF(void);
;The return value is current CPSR.
    EXPORT  SET_IF
SET_IF
    ;This function works only if the processor is in previliged mode.
   mrs  r0,cpsr
   mov  r1,r0
   orr  r1,r1,#NOINT
   msr  cpsr_cxsf,r1             
   MOV_PC_LR

;void WR_IF(int cpsrValue);
   EXPORT WR_IF
WR_IF   
    ;This function works only if the processor is in previliged mode.
   msr  cpsr_cxsf,r0             
   MOV_PC_LR


;void CLR_IF(void);
   EXPORT  CLR_IF
CLR_IF
    ;This function works only if the processor is in previliged mode.
   mrs  r0,cpsr
   bic  r0,r0,#NOINT
   msr  cpsr_cxsf,r0             
   MOV_PC_LR

;====================================
; MMU Cache/TLB/etc on/off functions
;====================================
R1_I    EQU     (1<<12)
R1_C    EQU     (1<<2)
R1_A    EQU     (1<<1)
R1_M    EQU     (1)
R1_iA   EQU     (1<<31)
R1_nF   EQU     (1<<30)

;void MMU_EnableICache(void)
   EXPORT MMU_EnableICache
MMU_EnableICache        
   mrc  p15,0,r0,c1,c0,0
   orr  r0,r0,#R1_I
   mcr  p15,0,r0,c1,c0,0
   MOV_PC_LR

;void MMU_DisableICache(void)
   EXPORT MMU_DisableICache
MMU_DisableICache       
   mrc  p15,0,r0,c1,c0,0
   bic  r0,r0,#R1_I
   mcr  p15,0,r0,c1,c0,0
   MOV_PC_LR

;void MMU_EnableDCache(void)
   EXPORT MMU_EnableDCache
MMU_EnableDCache        
   mrc  p15,0,r0,c1,c0,0
   orr  r0,r0,#R1_C
   mcr  p15,0,r0,c1,c0,0
   MOV_PC_LR

;void MMU_DisableDCache(void)
   EXPORT MMU_DisableDCache
MMU_DisableDCache       
   mrc  p15,0,r0,c1,c0,0
   bic  r0,r0,#R1_C
   mcr  p15,0,r0,c1,c0,0
   MOV_PC_LR

;void MMU_EnableAlignFault(void)
   EXPORT MMU_EnableAlignFault 
MMU_EnableAlignFault
   mrc  p15,0,r0,c1,c0,0
   orr  r0,r0,#R1_A
   mcr  p15,0,r0,c1,c0,0
   MOV_PC_LR

;void MMU_DisableAlignFault(void)
   EXPORT MMU_DisableAlignFault
MMU_DisableAlignFault
   mrc  p15,0,r0,c1,c0,0
   bic  r0,r0,#R1_A
   mcr  p15,0,r0,c1,c0,0
   MOV_PC_LR

;void MMU_EnableMMU(void)
   EXPORT MMU_EnableMMU
MMU_EnableMMU
   mrc  p15,0,r0,c1,c0,0
   orr  r0,r0,#R1_M
   mcr  p15,0,r0,c1,c0,0
   MOV_PC_LR

;void MMU_DisableMMU(void)
   EXPORT MMU_DisableMMU
MMU_DisableMMU
   mrc  p15,0,r0,c1,c0,0
   bic  r0,r0,#R1_M
   mcr  p15,0,r0,c1,c0,0
   MOV_PC_LR

;void MMU_SetFastBusMode(void)
; FCLK:HCLK= 1:1
  EXPORT MMU_SetFastBusMode
MMU_SetFastBusMode
   mrc  p15,0,r0,c1,c0,0
   bic  r0,r0,#R1_iA:OR:R1_nF
   mcr  p15,0,r0,c1,c0,0
   MOV_PC_LR

;void MMU_SetAsyncBusMode(void) 
; FCLK:HCLK= 1:2
   EXPORT MMU_SetAsyncBusMode
MMU_SetAsyncBusMode
   mrc  p15,0,r0,c1,c0,0
   orr  r0,r0,#R1_nF:OR:R1_iA
   mcr  p15,0,r0,c1,c0,0
   MOV_PC_LR

;=========================
; Set TTBase
;=========================
;void MMU_SetTTBase(int base)
   EXPORT MMU_SetTTBase
MMU_SetTTBase
   ;ro=TTBase
   mcr  p15,0,r0,c2,c0,0
   MOV_PC_LR

;=========================
; Set Domain
;=========================
;void MMU_SetDomain(int domain)
   EXPORT MMU_SetDomain
MMU_SetDomain
   ;ro=domain
   mcr  p15,0,r0,c3,c0,0
   MOV_PC_LR

;=========================
; ICache/DCache functions
;=========================
;void MMU_InvalidateIDCache(void)
   EXPORT MMU_InvalidateIDCache
MMU_InvalidateIDCache
   mcr  p15,0,r0,c7,c7,0
   MOV_PC_LR

;void MMU_InvalidateICache(void)
   EXPORT MMU_InvalidateICache
MMU_InvalidateICache
   mcr  p15,0,r0,c7,c5,0
   MOV_PC_LR

;void MMU_InvalidateICacheMVA(U32 mva)
   EXPORT MMU_InvalidateICacheMVA
MMU_InvalidateICacheMVA 
   ;r0=mva
   mcr  p15,0,r0,c7,c5,1
   MOV_PC_LR
        
;void MMU_PrefetchICacheMVA(U32 mva)
   EXPORT MMU_PrefetchICacheMVA
MMU_PrefetchICacheMVA
   ;r0=mva
   mcr  p15,0,r0,c7,c13,1
   MOV_PC_LR

;void MMU_InvalidateDCache(void)
   EXPORT MMU_InvalidateDCache
MMU_InvalidateDCache
   mcr  p15,0,r0,c7,c6,0
   MOV_PC_LR

;void MMU_InvalidateDCacheMVA(U32 mva)
   EXPORT MMU_InvalidateDCacheMVA
MMU_InvalidateDCacheMVA
   ;r0=mva
   mcr  p15,0,r0,c7,c6,1
   MOV_PC_LR

;void MMU_CleanDCacheMVA(U32 mva)
   EXPORT MMU_CleanDCacheMVA
MMU_CleanDCacheMVA
   ;r0=mva
   mcr  p15,0,r0,c7,c10,1
   MOV_PC_LR

;void MMU_CleanInvalidateDCacheMVA(U32 mva)
   EXPORT MMU_CleanInvalidateDCacheMVA
MMU_CleanInvalidateDCacheMVA
   ;r0=mva
   mcr  p15,0,r0,c7,c14,1
   MOV_PC_LR

;void MMU_CleanDCacheIndex(U32 index)
   EXPORT MMU_CleanDCacheIndex
MMU_CleanDCacheIndex
   ;r0=index 
   mcr  p15,0,r0,c7,c10,2
   MOV_PC_LR

;void MMU_CleanInvalidateDCacheIndex(U32 index) 
   EXPORT MMU_CleanInvalidateDCacheIndex
MMU_CleanInvalidateDCacheIndex  
   ;r0=index
   mcr  p15,0,r0,c7,c14,2
   MOV_PC_LR

;void MMU_WaitForInterrupt(void)
   EXPORT MMU_WaitForInterrupt 
MMU_WaitForInterrupt    
   mcr  p15,0,r0,c7,c0,4
   MOV_PC_LR

;===============
; TLB functions
;===============
;voic MMU_InvalidateTLB(void)
   EXPORT MMU_InvalidateTLB
MMU_InvalidateTLB       
   mcr  p15,0,r0,c8,c7,0
   MOV_PC_LR

;void MMU_InvalidateITLB(void)
   EXPORT MMU_InvalidateITLB
MMU_InvalidateITLB      
   mcr  p15,0,r0,c8,c5,0
   MOV_PC_LR

;void MMU_InvalidateITLBMVA(U32 mva)
   EXPORT MMU_InvalidateITLBMVA
MMU_InvalidateITLBMVA
   ;ro=mva
   mcr  p15,0,r0,c8,c5,1
   MOV_PC_LR

;void MMU_InvalidateDTLB(void)
   EXPORT MMU_InvalidateDTLB
MMU_InvalidateDTLB
   mcr p15,0,r0,c8,c6,0
   MOV_PC_LR

;void MMU_InvalidateDTLBMVA(U32 mva)
   EXPORT MMU_InvalidateDTLBMVA 
MMU_InvalidateDTLBMVA
        ;r0=mva
   mcr p15,0,r0,c8,c6,1
   MOV_PC_LR

;=================
; Cache lock down
;=================
;void MMU_SetDCacheLockdownBase(U32 base)
   EXPORT MMU_SetDCacheLockdownBase 
MMU_SetDCacheLockdownBase
   ;r0= victim & lockdown base
   mcr  p15,0,r0,c9,c0,0
   MOV_PC_LR
        
;void MMU_SetICacheLockdownBase(U32 base)
   EXPORT MMU_SetICacheLockdownBase
MMU_SetICacheLockdownBase
   ;r0= victim & lockdown base
   mcr  p15,0,r0,c9,c0,1
   MOV_PC_LR

;=================
; TLB lock down
;=================
;void MMU_SetDTLBLockdown(U32 baseVictim)
   EXPORT MMU_SetDTLBLockdown
MMU_SetDTLBLockdown
   ;r0= baseVictim
   mcr  p15,0,r0,c10,c0,0
   MOV_PC_LR
        
;void MMU_SetITLBLockdown(U32 baseVictim)
   EXPORT MMU_SetITLBLockdown
MMU_SetITLBLockdown
   ;r0= baseVictim
   mcr  p15,0,r0,c10,c0,1
   MOV_PC_LR

;============
; Process ID
;============
;void MMU_SetProcessId(U32 pid)
   EXPORT MMU_SetProcessId
MMU_SetProcessId        
   ;r0= pid
   mcr  p15,0,r0,c13,c0,0
   MOV_PC_LR
        
;//---------------------------------------------------------------------------
;// Function: Enter PowerDown Mode
;//---------------------------------------------------------------------------
;// EnterPWDN is a function call by 2410lib.h
;// void EnterPWDN( int CLKCON )

	EXPORT EnterPWDN
EnterPWDN
	
	;// Notice:
	;// 1. SDRAM should be in self-refresh mode.
	;// 2. All interrupt should be maksked for SDRAM/DRAM self-refresh.
	;// 3. LCD controller should be disabled for SDRAM/DRAM self-refresh.
	;// 4. The I-cache may have to be turned on.
	
	MOV	R2, R0				;// R2 = rCLKCON
	TST	R0, #0x8			;// If POWEROFF Mode then jump to ENTER_POWER_OFF
	BNE	ENTER_POWER_OFF
	
ENTER_STOP
	LDR	R0, =REFRESH
	LDR	R1, [R0]			;// R3 = rREFRESH
	MOV	R1, R3
	ORR	R1, R1, #( 1<<22 )
	STR	R1, [R0]			;// Enable SDRAM self-refresh

	;// Wait until self-refresh is issued. may not be needed
	MOV	R1, #16
0
	SUBS	R1, R1, #1
	BNE %B0

	LDR	R0,	=CLKCON			;// Enter STOP mode.
	STR	R2,	[R0]

	MOV	R1, #32
0
	SUBS	R1, R1, #1		;// 1) Wait until the STOP mode is in effect.
	BNE		%B0				;// 2) Or wait here until the CPU&Peripherals will be turned-off
							;//   Entering POWER_OFF mode, only the reset by wake-up is available.

	LDR	R0, =REFRESH		;// Exit from SDRAM self refresh mode.
	STR	R3, [R0]
	
	MOV	PC,	LR

ENTER_POWER_OFF
	
	;// Notice: rGSTATUS3 should have the return address after wake-up from POWER_OFF mode.
	
	;// Enable SDRAM self-refresh
	LDR	R0, =REFRESH
	LDR	R1, [R0]
	ORR	R1, R1, #( 1<<22 )
	STR	R1, [R0]
	
	;// Wait until self-refresh is issued,which may not be needed.
	MOV	R1, #16
0
	SUBS	R1, R1, #1
	BNE	%B0
	
	LDR	R1, =MISCCR
	LDR	R0, [R1]
	ORR	R0, R0, #( 7 << 17 )	;// Make sure that SCLK0:SCLK->0, SCLK1:SCLK->0, SCKE=L during boot-up
	STR	R0, [R1]
	
	LDR	R0, =CLKCON
	STR	R2, [R0]
	
	B	.						;// CPU will die here.
	
   END

⌨️ 快捷键说明

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