S3C2440裸机驱动--2440slib.s

//=================================================================== // File Name : 2440slib.h // Function : TQ2440 // Version : 1.0 //=================================================================== #ifndef __2440slib_h__ #define __2440slib_h__ #ifdef __cplusplus extern "C" { #endif int SET_IF(void); //设置CPSR的I位(IRQ)和F位(FIQ),禁止I和F中断,并返回当前的CPSR_CXSF void WR_IF(int cpsrValue); //写值到CPSR void CLR_IF(void); //;把中断位清零,即允许IRQ中断和FIQ中断 void EnterCritical(U32 *pSave); //!用内存单元r0存储CPSR void ExitCritical(U32 *pSave); //!把当前SPSR的内容保存到寄存器r0中 void MMU_EnableICache(void); //使能指令Cache void MMU_DisableICache(void); //禁止指令Cache void MMU_EnableDCache(void); //当地址Cache数据Cache分开时,使能数据Cache; //当地址Cache数据Cache统一时,使能整个Cache; void MMU_DisableDCache(void); // 当地址Cache数据Cache分开时,禁止数据Cache; //当地址Cache数据Cache统一时,禁止整个Cache void MMU_EnableAlignFault(void); //使能地址对齐检查功能 void MMU_DisableAlignFault(void); //禁止地址对齐检查功能 void MMU_EnableMMU(void); //使能MMU void MMU_DisableMMU(void); //禁止MMU void MMU_SetTTBase(U32 base); //写地址转化表基地址(页表基地址)到C2 //MMU将整个存储空间分成16个域(domain),每个域具有相同的访问属性 //C3用于设置域的属性 void MMU_SetDomain(U32 domain); //设置域属性 void MMU_SetFastBusMode(void); //GCLK=HCLK 快速总线模式 void MMU_SetAsyncBusMode(void); //GCLK=FCLK @(FCLK>=HCLK) 异步总线模式 void MMU_InvalidateIDCache(void); //使无效整个统一的cache,或者使无效整个数据cache和指令cache void MMU_InvalidateICache(void); //使无效整个指令cache void MMU_InvalidateICacheMVA(U32 mva); //使无效指令cache的某块mva,并把数据(虚拟地址)写到C7 void MMU_PrefetchICacheMVA(U32 mva); //预取指令cache中的某块mva,并把数据(虚拟地址)写到C7 void MMU_InvalidateDCache(void); //使无效整个数据cache- void MMU_InvalidateDCacheMVA(U32 mva); //使无效数据cache的某块mva,并把数据(虚拟地址)写到C7 void MMU_CleanDCacheMVA(U32 mva); //清空数据cache中的某块mva,并把数据(虚拟地址)写到C7 void MMU_CleanInvalidateDCacheMVA(U32 mva); //清空并无效数据Cache中的某块mva,并把数据(虚拟地址)写到C7 void MMU_CleanDCacheIndex(U32 index); //清空数据cache中的某块Index,并把组号组内序号写到C7中 void MMU_CleanInvalidateDCacheIndex(U32 index); //清空并无效数据cache中的某块index,并把组号组内序号写到C7中 //等待中断激活,使ARM进入节能状态,停止执行等待中断激活。 //当异常中断IRQ或FIQ发生后,该MCR指令进入IRQ或FIQ中断处理程序执行。 void MMU_WaitForInterrupt(void); //快表操作 void MMU_InvalidateTLB(void); //使无效整个统一的cache或者使无效整个数据cache和指令cache void MMU_InvalidateITLB(void); //使无效整个指令cache- void MMU_InvalidateITLBMVA(U32 mva); //使无效指令cache的单个地址变换条目mva,并把虚拟地址返回到C8 void MMU_InvalidateDTLB(void); //使无效整个数据cache- void MMU_InvalidateDTLBMVA(U32 mva); // 使无效数据cache的单个地址变换条目mva,并把虚拟地址返回到C8 void MMU_SetDCacheLockdownBase(U32 base); //锁数据cache void MMU_SetICacheLockdownBase(U32 base); //锁指令cache void MMU_SetDTLBLockdown(U32 baseVictim); // 锁数据快表 void MMU_SetITLBLockdown(U32 baseVictim); // 锁指令快表 void MMU_SetProcessId(U32 pid); // 获得进程标识符 #ifdef __cplusplus } #endif #endif //__2440slib_h__ ;===================================================================== ; File Name : 2440slib.s ; Function : TQ2440 (Assembly) ; Revision : 1.0 ;===================================================================== ;Interrupt, FIQ/IRQ disable NOINT EQU 0xc0 ; 1100 0000 //1100 0000=CPSR[6]-FIQ中断禁止位,CPSR[7]-IRQ中断禁止位 ;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used. GBLL THUMBCODE ;//定义一个全局逻辑变量THUMBCODE [ {CONFIG} = 16 ;//if(CONFIG == 16) { THUMBCODE SETL {TRUE} ;// THUMBCODE = TRUE; CODE32 ;//} | ;//else { THUMBCODE SETL {FALSE} ;// THUMBCODE = FALSE;给逻辑变量赋值 ] ;//} MACRO ;//定义宏 MOV_PC_LR ;//宏名 [ THUMBCODE ;//if(THUMBCODE) { bx lr ;// bx = lr;跳转到Thumbcode模式 | ;//} else { mov pc,lr ;// pc = lr; ] ;//} MEND ;//宏定义结束 PRESERVE8 AREA |C$code|, CODE, READONLY ;//定义一个代码段,名为C$code,只读 EXPORT EnterCritical ;//声明一个符号,可以被其它文件引用,符号的名称为 EnterCritical ;//EnterCritical,相当于下面一段程序为EnterCritical函数 mrs r1, cpsr ;//mrs用于将程序状态寄存器的内容传送到通用寄存器中.即r1<-cprs str r1, [r0] ;//r1的值存储到[r0]上 orr r1, r1, #NOINT ;//逻辑位"或".r1=r1 or NOINT(0x0c) msr cpsr_cxsf, r1 ;//msr用于将操作数的内容传送到程序状态寄存器的特定域中.cpsr_cxsf<-r1 MOV_PC_LR ;//执行上面的宏 ;restore cpsr, r0 = address to restore cpsr EXPORT ExitCritical ;//声明一个ExitCritical符号,可以被其它文件引用 ExitCritical ;//相当于ExitCritical函数 ldr r1, [r0] ;//r1<-[r0] msr cpsr_cxsf, r1 ;//cpsr_cxsg<-r1 MOV_PC_LR ;//执行上面的宏 ;这里的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. EXPORT SET_IF SET_IF ;//相当于函数SET_IF ;This function works only if the processor is in previliged mode. mrs r0,cpsr ;//r0<-cpsr mov r1,r0 ;//r1 = r0 orr r1,r1,#NOINT ;//r1=r1 or NOINT(0x0c) msr cpsr_cxsf,r1 ;//cpsr_cxsf<-r1 MOV_PC_LR ;//执行上面的宏 ;//置位IRQ和FIQ控制位,禁止中断 ;void WR_IF(int cpsrValue); EXPORT WR_IF ;//声明一个WR_IF符号,可以被其它文件引用 WR_IF ;//相当于函数WR_IF ;This function works only if the processor is in previliged mode. msr cpsr_cxsf,r0 ;//cpsr_cxsf<-r0 MOV_PC_LR ;//执行上面的宏 ;//清零IRQ和FIQ控制位,使能中断 ;void CLR_IF(void); EXPORT CLR_IF ;//声明一个CLR_IF符号,可以被其它文件引用 CLR_IF ;//相当于函数CLR_IF ;This function works only if the processor is in previliged mode. mrs r0,cpsr ;//r0<-cpsr bic r0,r0,#NOINT ;//位清0.r0=r0 and (not NOINT) msr cpsr_cxsf,r0 ;//cpsr_cxsf<-r0 MOV_PC_LR ;//执行上面的宏 EXPORT outportw outportw strh r0, [r1] ;//半字.r1[15:0]<-r0[15:0] MOV_PC_LR EXPORT inportw inportw ldrh r0, [r0] ;//半字. MOV_PC_LR ;==================================== ; MMU Cache/TLB/etc on/off functions ;==================================== R1_I EQU (1<<12) ;//Cache分开时,1 使能指令Cache,0 禁止使能Cache R1_C EQU (1<<2) ;//禁止/使能数据Cache或整个Cache,1使能 不含Cache返回0,不能禁止Cache返回1 R1_A EQU (1<<1) ;//是否支持内存访问时地址对齐检查系统,1使能 R1_M EQU (1) ;//禁止/使能MMU 1使能 R1_iA EQU (1<<31) ;//R1_iA = 0b100 0000 0000 0000 0000 0000 0000 0000 R1_nF EQU (1<<30) ;//R1_nF = 0b10 0000 0000 0000 0000 0000 0000 0000 ;========================================================== ;//MCR指令将ARM处理器的寄存器中的数据传送到协处理器寄存器中 ;//MRC指令将协处理器的寄存器中的数值传送到ARM处理器的寄存器中 ;========================================================== ;//禁止/使能指令cache ;void MMU_EnableICache(void) EXPORT MMU_EnableICache MMU_EnableICache mrc p15,0,r0,c1,c0,0 ;//将arm下寄存器r0传送给协处理器寄存器c1 orr r0,r0,#R1_I ;//r0= r0 or R1_I mcr p15,0,r0,c1,c0,0 ;//将协处理器寄存器c1传送给arm下寄存器r0 MOV_PC_LR ;R1_I EQU (1<<12) ;R1_C EQU (1<<2) ;R1_A EQU (1<<1) ;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 ;禁止数据cache或禁止整个cache,具体查看数据cache和指令cache是否分离 ;其中mrc是协处理器命令。用于读取协处理器中的寄存器的数据到ARM处理器的寄存器里面。 ;mrc p15,0,r0,c1,c0,0 这句话的意思应该是读协处理器中的寄存器到ARM处理器的r0里面 ; bic r0,r0,#R1_C 其中有如下定义R1_C EQU (1<<2) ;则此句话是将MMU寄存器中的第2位清零,用于禁止数据cache ;mcr p15,0,r0,c1,c0,0写回到协处理器MMU寄存器 ;MOV_PC_LR 程序返回 ;void MMU_DisableDCache(void) EXPORT MMU_DisableDCache MMU_DisableDCache mrc p15,0,r0,c1,c0,0;CP15协处理器寄存器到ARM寄存器r0 bic r0,r0,#R1_C mcr p15,0,r0,c1,c0,0;ARM寄存器r0到协处理器CP15寄存器中 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 ;=============================================================================== ;//使能/禁止MMU ;//注意:使能/禁止MMU时 ;//1、在使能MMU之前,要在内存中建立好页表,同时CP15中的各相关寄存器必须完成初始化。 ;//2、如果使用的不是平板存储模式(物理地址和虚拟地址相等),在禁止/使能MMU时虚拟地 ;//址和物理地址的对应关系会发生改变,这时应该清楚Cache中的当前地址变换条目。 ;//3、如果完成禁止/使能MMU的代码的物理地址和虚拟地址不相同,则禁止/使能MMU时将造成 ;//很大麻烦,因此强烈完成禁止/使能MMU的代码的物理地址和虚拟地址最好相同。 ;=============================================================================== ;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 ;================================================================================ ;//C2用于保存页表的在内存中的基地址 ;//页表中每一行对应一个虚地址页对应的实地址页的地址、该位的方位权限和该页的缓冲特性 ;//通常把部分页表放在页表缓冲器TLB(translation lookaside buffer)中,换页表时,TLB要清空,因为。。。。 ;//C8控制清空TLB ;//C10用于控制TLB中内容的锁定 ;==================================================================================================== ; 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快表TLB功能(C8)- ;C8控制控制清楚TLB的相关操作的。它是一个只写的寄存器。使用MRC指令读取该寄存器,将产生不可预知效果。 ;指令具体格式如下: ;MCR P15,0,<Rd>,<C8>,<CRm>,<opcode_2> ;<CRm>,<opcode_2>的不同的组合决定指令执行的不同的操作。完成操作将产生的数据写到Rd,然后写到C8。 ;=================================================================================================== ;=============== ; 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 END 参考连接: http://blog.163.com/anotherplace@126/blog/static/12826854420099611462382/ http://hi.baidu.com/yeshiliang1987/blog/item/0e8b028e9f9066f6503d9277.html

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值