;=====================================================================
; File Name : 2440slib.s
; Function : S3C2440 (Assembly)
; Date : March 09, 2002
; Revision : Programming start (February 26,2002) -> SOP
; Revision : 03.11.2003 ver 0.0 Attatched for 2440
;=====================================================================
;Interrupt, FIQ/IRQ disable
NOINT EQU 0xc0 ; 1100 0000
;EQU相当于C语言中定义常量;这样在程序中遇到NOINT就相当
;于十六进制数0xc0,即对CPSR的FIQ/IRQ的中断进行控制。
;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
GBLL THUMBCODE
[ {CONFIG} = 16
THUMBCODE SETL {TRUE}
CODE32
|
THUMBCODE SETL {FALSE}
]
;这段指令判断是否是THUMBCODE指令集,是的话就要用
;ADS的tasm.exe进行编译。首先用GBLL定义了全局逻辑
;变量HUMBCODE,默认值为0。“[]"相当于C语言中的{},
;| 相当于else
MACRO
MOV_PC_LR
[ THUMBCODE
bx lr
|
mov pc,lr
]
MEND
;函数返回宏定义
AREA |C$$code|, CODE, READONLY
;定义了代码段,此代码段是外部的可以被C程序调用的关于
;寄存器和存储管理单元(MMU)操作函数。
EXPORT EnterCritical
;用内存单元r0存储CPSR
EnterCritical
mrs r1, cpsr
str r1, [r0]
orr r1, r1, #NOINT
msr cpsr_cxsf, r1
MOV_PC_LR
;restore cpsr, r0 = address to restore cpsr
EXPORT ExitCritical
;把当前SPSR的内容保存到寄存器r0中。
ExitCritical
ldr r1, [r0]
msr cpsr_cxsf, r1
MOV_PC_LR
msr cpsr_cxsf,r1
;这里的cxsf表示从低到高分别占用的4个8bit的数据域
;指令中有时还有出现cpsr_cf, cpsr_all, cpsr_c等,这里:
c 指CPSR中的control field ( PSR[7:0])
f 指flag field (PSR[31:24])
x 指 extend field (PSR[15:8])
s 指status field ( PSR[23:16])
;其中cpsr的位表示为:
31 30 29 28 --- 7 6 - 4 3 2 1 0
N Z C V I F M4 M3 M2 M1 M0
;==============
; CPSR I,F bit
;==============
;int SET_IF(void);
;The return value is current CPSR.
;设置CPSR的I位(IRQ)和F位(FIQ),禁止I和F中断,
;并返回当前的CPSR_CXSF
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);
;写值到CPSR
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);
;把中断位清零,即允许IRQ中断和FIQ中断
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
;输出端口的读操作,即把r(端口值)的低16位的数据读到内
;存单元r1中。r1的高16位为0
EXPORT outportw
outportw strh r0, [r1]
MOV_PC_LR
;写端口操作,即把内存单元r0的半字数据读取到r0(端口值)中,
;r0的高16位为0
EXPORT inportw
inportw l drh r0, [r0]
MOV_PC_LR
;====================================
MMU Cache/TLB/etc on/off functions 即MMU的缓存,快表等的允许和禁止操作。
在ARM的嵌入式应用中,存储系统是通过协处理器CP15完成的。CP15包含16个32位的寄存器,其编号是0到15。对CP15协处理器的操作使用mcr和mrc两条协处理器指令,这两条指令的记法是从后往前看:mcr是把r(CPU核寄存器)中的数据传送到c(协处理器寄存器)中,mrc则是把c(协处理器寄存器)中的数据传送到r(CPU核寄存器)中。对CP15协处理器的所有操作都是通过CPU寄存器和CP15寄存器之间交换数据来完成的。
寄存器C0,C1。C0的基本作用是ID编码;C1的基本作用是控制位(可读可写)。
C1的第12位:I(bit[12])。当数据和地址是分开的时,本控制位禁止使能指令cache;其中0 是禁止指令cache ,1是使能指令cache;如果系统中使用统一的指令cache和数据cache或者系统中不含cache,读取时该位返回0,写入时忽略该位。当系统中的指令cache不能禁止时,读取时该位返回1,写入时忽略该位。
C1的第2位:C (bit[2])。当数据和地址是分开的时,本控制位禁止使能数据cache;如果系统中使用统一的指令cache和数据cache时,该控制位禁止使能整个cache。其中0 是禁止cache ,1是使能cache;如果系统中不含cache,读取时该位返回0,写入时忽略该位。当系统中的cache不能禁止时,读取时该位返回1,写入时忽略该位。
C1的第1位:A (bit)。对于可以选择是否支持内存访问时地址对齐检查的那些系统,本位禁止使能地址对齐检查功能;0是禁止地址对齐检查功能,1是使能地址对齐检查功能;对于内存访问时地址对齐检查功能不可选择的那些系统,读取该位时根据系统是否支持地址对齐检查功能返回0或者1,写入时忽略该位。
C1的第0位:M(bit[0])。禁止使能MMU或者PU;其中0是禁止地址对齐检查功能,1是使能地址对齐检查功能;如果系统中没有MMU及PU,读取时该位返回0,写入时忽略该位。
C1的30位设置快速总线模式
C1的31位设置异步模式
==================================== ;
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) 使能指令Cache
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)禁止指令Cache
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)当地址Cache数据Cache分开
;时,使能数据Cache;当地址Cache数据Cache统一时,使能
;整个Cache。
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) 当地址Cache数据Cache分开
;时,禁止数据Cache;当地址Cache数据Cache统一时,禁止
;整个Cache。
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) 使能MMU
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) 禁止MMU
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
;C2:地址转换表基地址
;=========================
;void MMU_SetTTBase(int base) 写地址转化表基地址到C2
EXPORT MMU_SetTTBase
MMU_SetTTBase
;ro=TTBase
mcr p15,0,r0,c2,c0,0
MOV_PC_LR
;=========================
; Set Domain
;域访问控制位。
;=========================
;void MMU_SetDomain(int domain) 写控制位到C3
EXPORT MMU_SetDomain
MMU_SetDomain
;ro=domain
mcr p15,0,r0,c3,c0,0
MOV_PC_LR
;=========================
; ICache/DCache functions
;C7控制指令和数据缓存和写缓冲区。它是一个只写的寄存器。使用MRC指令读取该寄存器,将产生不可预知效果。
指令具体格式如下:
MCR P15,0,<Rd>,<C7>,<CRm>,<opcode_2>
<CRm>,<opcode_2>的不同的组合决定指令执行的不同的操作。完成操作将产生的数据写到Rd,然后写到C7。
;=========================
;void MMU_InvalidateIDCache(void) 使无效整个统一的cache
;或者使无效整个数据cache和指令cache
EXPORT MMU_InvalidateIDCache
MMU_InvalidateIDCache
mcr p15,0,r0,c7,c7,0
MOV_PC_LR
;void MMU_InvalidateICache(void) 使无效整个指令cache
EXPORT MMU_InvalidateICache
MMU_InvalidateICache
mcr p15,0,r0,c7,c5,0
MOV_PC_LR
;void MMU_InvalidateICacheMVA(U32 mva)使无效指令cache的
;某块mva,并把数据(虚拟地址)写到C7
EXPORT MMU_InvalidateICacheMVA
MMU_InvalidateICacheMVA
;r0=mva
mcr p15,0,r0,c7,c5,1
MOV_PC_LR
;void MMU_PrefetchICacheMVA(U32 mva)预取指令cache中的
;某块mva,并把数据(虚拟地址)写到C7
EXPORT MMU_PrefetchICacheMVA
MMU_PrefetchICacheMVA
;r0=mva
mcr p15,0,r0,c7,c13,1
MOV_PC_LR
;void MMU_InvalidateDCache(void)使无效整个数据cache
EXPORT MMU_InvalidateDCache
MMU_InvalidateDCache
mcr p15,0,r0,c7,c6,0
MOV_PC_LR
;void MMU_InvalidateDCacheMVA(U32 mva) 使无效数据cache
;的某块mva,并把数据(虚拟地址)写到C7
EXPORT MMU_InvalidateDCacheMVA
MMU_InvalidateDCacheMVA
;r0=mva
mcr p15,0,r0,c7,c6,1
MOV_PC_LR
;void MMU_CleanDCacheMVA(U32 mva)清空数据cache中的某块mva,并把数据(虚拟地址)写到C7
EXPORT MMU_CleanDCacheMVA
MMU_CleanDCacheMVA
;r0=mva
mcr p15,0,r0,c7,c10,1
MOV_PC_LR
;void MMU_CleanInvalidateDCacheMVA(U32 mva) 清空并;
无效数据cache中的某块mva,并把数据(虚拟地址)写到C7
EXPORT MMU_CleanInvalidateDCacheMVA
MMU_CleanInvalidateDCacheMVA
;r0=mva
mcr p15,0,r0,c7,c14,1
MOV_PC_LR
;void MMU_CleanDCacheIndex(U32 index)清空数据cache中的
;某块index,并把组号 组内序号写到C7中。
EXPORT MMU_CleanDCacheIndex
MMU_CleanDCacheIndex
;r0=index
mcr p15,0,r0,c7,c10,2
MOV_PC_LR
;void MMU_CleanInvalidateDCacheIndex(U32 index) 清空并无
;效数据cache中的某块index,并把组号 组内序号写到C7中。
EXPORT MMU_CleanInvalidateDCacheIndex
MMU_CleanInvalidateDCacheIndex
;r0=index
mcr p15,0,r0,c7,c14,2
MOV_PC_LR
;void MMU_WaitForInterrupt(void)等待中断激活,使ARM进入
;节能状态,停止执行等待中断激活。当异常中断IRQ或FIQ
;发生后,该MCR指令进入IRQ或FIQ中
;断处理程序;执行。
EXPORT MMU_WaitForInterrupt
MMU_WaitForInterrupt
mcr p15,0,r0,c7,c0,4
MOV_PC_LR
;===============
; TLB functions快表TLB功能(C8)
;C8控制控制清楚TLB的相关操作的。它是一个只写的寄存器。使用MRC指令读取该寄存器,将产生不可预知效果。
指令具体格式如下:
MCR P15,0,<Rd>,<C8>,<CRm>,<opcode_2>
<CRm>,<opcode_2>的不同的组合决定指令执行的不同的操作。完成操作将产生的数据写到Rd,然后写到C8。
;===============
;voic MMU_InvalidateTLB(void) 使无效整个统一的cache
;或者使无效整个数据cache和指令cache
EXPORT MMU_InvalidateTLB
MMU_InvalidateTLB
mcr p15,0,r0,c8,c7,0
MOV_PC_LR
;void MMU_InvalidateITLB(void) 使无效整个指令cache
EXPORT MMU_InvalidateITLB
MMU_InvalidateITLB
mcr p15,0,r0,c8,c5,0
MOV_PC_LR
;void MMU_InvalidateITLBMVA(U32 mva) 使无效指令cache的
;单个地址变换条目mva,并把虚拟地址返回到C8
EXPORT MMU_InvalidateITLBMVA
MMU_InvalidateITLBMVA
;ro=mva
mcr p15,0,r0,c8,c5,1
MOV_PC_LR
;void MMU_InvalidateDTLB(void) 使无效整个数据cache
EXPORT MMU_InvalidateDTLB
MMU_InvalidateDTLB
mcr p15,0,r0,c8,c6,0
MOV_PC_LR
;void MMU_InvalidateDTLBMVA(U32 mva) 使无效数据cache的
;单个地址变换条目mva,并把虚拟地址返回到C8
EXPORT MMU_InvalidateDTLBMVA
MMU_InvalidateDTLBMVA
;r0=mva
mcr p15,0,r0,c8,c6,1
MOV_PC_LR
;=================
; Cache lock down缓存内容锁定(C9)cache内容锁定,就是
;将一些关键代码和数据预取到cache后,设置一定的属性,
;使发生cache块替换时,这些关键代码和数据所在的块不会
;被替换。
指令具体格式如下:
MCR P15,0,<Rd>,<C9>,<CRm>,<opcode_2>
MRC P15,0,<Rd>,<C9>,<CRm>,<opcode_2>
当系统中包含独立的数据cache和指令cache时,对应于数据cache和指令cache分别有一个独立的cache内容锁定寄存器。
<opcode_2>=1 选择指令cache的内容锁定寄存器
<opcode_2>=0 选择数据cache的内容锁定寄存器
当系统中使用统一的数据cache和指令cache时,操作数<opcode_2>应为0。
;=================
;void MMU_SetDCacheLockdownBase(U32 base) 锁数据cache
EXPORT MMU_SetDCacheLockdownBase
MMU_SetDCacheLockdownBase
;r0= victim & lockdown base
mcr p15,0,r0,c9,c0,0
MOV_PC_LR
;void MMU_SetICacheLockdownBase(U32 base) 锁指令cache
EXPORT MMU_SetICacheLockdownBase
MMU_SetICacheLockdownBase
;r0= victim & lockdown base
mcr p15,0,r0,c9,c0,1
MOV_PC_LR
;=================
; TLB lock down快表内容锁存(C10)具体操作同cache锁存。
;=================
;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 获得进程标识符(C13)
;============
;void MMU_SetProcessId(U32 pid)
EXPORT MMU_SetProcessId
MMU_SetProcessId
;r0= pid
mcr p15,0,r0,c13,c0,0
MOV_PC_LR