2410slib.s 文件解读(2440 test )

;=====================================================================­

; 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­

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值