S3C2440學(xué)習(xí)筆記五(2440slib.s源程序的分析)
補充一點是,CP15可以理解為MMU,它主要的工作是地址映射,也就是給CPU提供地址。SDRAM一般為32M或64M,但是對于32位的CPU,可以管理4G的空間。那么就把這個4G的空間分成4096份,每一份1M,那么32位地址變成一個組合,14位+18位。
本文引用地址:http://m.butianyuan.cn/article/201611/316993.htm;=====================================================================
; File Name : 2440slib.s
; Function : GT2440 (Assembly)
; Revision : 1.0
;=====================================================================
;Interrupt, FIQ/IRQ disable禁止中斷FIQ/IRQ
NOINT EQU 0xc0 ; 1100 0000---->CPSR
;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進(jìn)行編譯。首先用GBLL定義了全局邏輯
;變量HUMBCODE,默認(rèn)值為0。“[]"相當(dāng)于C語言中的{},
;| 相當(dāng)于else?
MACRO
MOV_PC_LR
[ THUMBCODE
bx lr
|
mov pc,lr
]
MEND
;函數(shù)返回宏定義
AREA |C$$code|, CODE, READONLY
;定義了代碼段,此代碼段是外部的可以被C程序調(diào)用的關(guān)于?
;寄存器和存儲管理單元(MMU)操作函數(shù)。?
EXPORT EnterCritical
;用內(nèi)存單元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
ExitCritical
ldr r1, [r0]
msr cpsr_cxsf, r1
MOV_PC_LR
;這里的cxsf表示從低到高分別占用的4個8bit的數(shù)據(jù)域?
;指令中有時還有出現(xiàn)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 M4M3M2 M1 M0
;==============
; CPSR I,F bit設(shè)置CPSR的I位(IRQ)和F位(FIQ)
;置位CPSR_IR,即禁止IRQ中斷和FIQ中斷
;==============
;int SET_IF(void);
;The return value is current CPSR.
EXPORT SET_IF
SET_IF;僅在特權(quán)模式下可用此程序。
;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;僅在特權(quán)模式下可用此程序。
;This function works only if the processor is in previliged mode.
msr cpsr_cxsf,r0
MOV_PC_LR
;void CLR_IF(void);清CPSR_IR,即允許IRQ中斷和FIQ中斷
EXPORT CLR_IF
CLR_IF;僅在特權(quán)模式下可用此程序。
;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
EXPORT outportw
outportw strh r0, [r1]
MOV_PC_LR
EXPORT inportw
inportw ldrh r0, [r0]
MOV_PC_LR
請原諒這里不是原創(chuàng),只因還在努力學(xué)習(xí)!
在ARM的嵌入式應(yīng)用中,存儲系統(tǒng)是通過協(xié)處理器CP15完成的。CP15包含16個32位的寄存器,其編號是0-15。對于CP15協(xié)處理器的操作使用mcr和mrc兩條協(xié)處理器指令,這兩條指令的記法是從后往錢看:mcr是把r(CPU核寄存器)中的數(shù)據(jù)傳送到c(協(xié)處理器寄存器)中,mrc則是把c(協(xié)處理器寄存器)中的數(shù)據(jù)傳送到r(CPU核寄存器)中。對CP15協(xié)處理器的所有操作都是通過CPU寄存器和CP15寄存器之間交換數(shù)據(jù)完成的。
寄存器C0,C1。C0的基本作用是ID編碼;C1的基本作用是控制位(可讀可寫)。
C1的第12位:I(bit[12])。當(dāng)數(shù)據(jù)和地址處于分開時,該控制位禁止使能指令cache;其中0是禁止指令cache,1是使能指令cache;如果系統(tǒng)中使能統(tǒng)一的指令cache和數(shù)據(jù)cache或者系統(tǒng)中不含cache,讀取時該位返回0,寫入時忽略該位。當(dāng)系統(tǒng)中的指令cache不禁止時,讀取該位時返回1,寫入時忽略該位。當(dāng)系統(tǒng)中的指令cache不禁止時,讀取時該位返回1,寫入時忽略該位。
C1的第2位:C(bit[2])。當(dāng)數(shù)據(jù)和地址處于分開時,本控制位禁止使能數(shù)據(jù)cache;如果系統(tǒng)中使用統(tǒng)一的指令cache和數(shù)據(jù)cache時,該控制位禁止使能整個cache。其中0是禁止cache,1是使能cache;如果系統(tǒng)中不含cache,讀取時該位返回0,寫入時忽略該位。當(dāng)系統(tǒng)中的cache不能禁止時,讀取時該位返回1,寫入時忽略該位。
C1的第1位:A(bit)。對于可以選擇是否支持內(nèi)存訪問時地址對齊檢查的那些系統(tǒng),本位禁止使能地址對齊檢查功能;0是禁止地址對齊檢查功能,1是使能對齊檢查功能;對齊內(nèi)存訪問時地址對齊檢查功能不可選擇的那些系統(tǒng),讀取該位時根據(jù)系統(tǒng)是否支持地址功能對齊檢查功能返回0或者1,寫入時忽略該位。
C1的第0位:M(bit[0])。禁止使能MMU或者PU;其中0是禁止地址對齊檢查功能,1是使能地址對齊檢查功能;如果系統(tǒng)中沒有MMU及PU,讀取時該位返回0,寫入時忽略該位。
C1的30位設(shè)置快速總線模式
C1的30位設(shè)置快速總線模式
C2的31位模式異步模式
;====================================
; MMU Cache/TLB/etc on/off functions MMU的緩存,快表等的允許和禁止操作
;====================================
R1_I EQU (1<<12) ;其實匯編也不想想象中那么匯,有事可以看到C的身影
R1_C EQU (1<<2) ;其實C就是構(gòu)建在這些匯編之上,一看二看三看有種雜交的感覺
R1_A EQU (1<<1)
R1_M EQU (1)
R1_iA EQU (1<<31)
R1_nF EQU (1<<30)
;使能命令Cache
;void MMU_EnableICache(void)
;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)禁止命令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
;使能數(shù)據(jù)Cache
;void MMU_EnableDCache(void); 當(dāng)?shù)刂稢ache和數(shù)據(jù)Cache分開時,使能數(shù)據(jù)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); 當(dāng)?shù)刂稢ache和數(shù)據(jù)Cache分開時,禁止數(shù)據(jù)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) ;設(shè)置快速總線模式
; 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) ; 設(shè)置異步模式
; 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:地址轉(zhuǎn)換表基地址
;=========================
;void MMU_SetTTBase(int base)
EXPORT MMU_SetTTBase
MMU_SetTTBase
;ro=TTBase
mcr p15,0,r0,c2,c0,0
MOV_PC_LR
;=========================
; Set Domain 域訪問控制位
;=========================
;寫控制位到C3
;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
C7控制指令和數(shù)據(jù)緩存和寫緩沖區(qū)
它是一個只寫的寄存器。使用MRC指令讀取該寄存器,將產(chǎn)生不可預(yù)知效果。
指令具體格式如下:
MCR P15,0,,,,
;=========================
;使無效整個統(tǒng)一的cache
;void MMU_InvalidateIDCache(void)
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,并把數(shù)據(jù)(虛擬地址)寫到C7
EXPORT MMU_InvalidateICacheMVA
MMU_InvalidateICacheMVA
;r0=mva
mcr p15,0,r0,c7,c5,1
MOV_PC_LR
;void MMU_PrefetchICacheMVA(U32 mva) ;預(yù)取指令cache中的某塊mva,并把數(shù)據(jù)(虛擬地址)寫到C7
EXPORT MMU_PrefetchICacheMVA
MMU_PrefetchICacheMVA
;r0=mva
mcr p15,0,r0,c7,c13,1
MOV_PC_LR
;void MMU_InvalidateDCache(void) ; 使無效整個數(shù)據(jù)cache
EXPORT MMU_InvalidateDCache
MMU_InvalidateDCache
mcr p15,0,r0,c7,c6,0
MOV_PC_LR
;void MMU_InvalidateDCacheMVA(U32 mva) ; 使無效數(shù)據(jù)cache的某塊mva,并把數(shù)據(jù)(虛擬地址)寫到C7
EXPORT MMU_InvalidateDCacheMVA
MMU_InvalidateDCacheMVA
;r0=mva
mcr p15,0,r0,c7,c6,1
MOV_PC_LR
;void MMU_CleanDCacheMVA(U32 mva) ; 清空數(shù)據(jù)cache中的某塊mva,并把數(shù)據(jù)(虛擬地址)寫到C7
EXPORT MMU_CleanDCacheMVA
MMU_CleanDCacheMVA
;r0=mva
mcr p15,0,r0,c7,c10,1
MOV_PC_LR
;void MMU_CleanInvalidateDCacheMVA(U32 mva) ; 清空無效數(shù)據(jù)cache中的某塊mva,并把數(shù)據(jù)(虛擬地址)寫到C7
EXPORT MMU_CleanInvalidateDCacheMVA
MMU_CleanInvalidateDCacheMVA
;r0=mva
mcr p15,0,r0,c7,c14,1
MOV_PC_LR
;void MMU_CleanDCacheIndex(U32 index) ; 清空數(shù)據(jù)cache中的某塊Index,并把組號 組內(nèi)序號寫到C7中
EXPORT MMU_CleanDCacheIndex
MMU_CleanDCacheIndex
;r0=index
mcr p15,0,r0,c7,c10,2
MOV_PC_LR
;void MMU_CleanInvalidateDCacheIndex(U32 index) ; 清空將無效數(shù)據(jù)cache中的某塊Index,并把組號 組內(nèi)序號寫到C7中
EXPORT MMU_CleanInvalidateDCacheIndex
MMU_CleanInvalidateDCacheIndex
;r0=index
mcr p15,0,r0,c7,c14,2
MOV_PC_LR
;void MMU_WaitForInterrupt(void) ; 等待中斷激活,使ARM進(jìn)入節(jié)能狀態(tài),停止執(zhí)行等待中斷激活。
;當(dāng)異常中斷IRQ或FIQ發(fā)生后,該MCR指令進(jìn)入IRQ或FIQ中斷處理程序執(zhí)行。
EXPORT MMU_WaitForInterrupt
MMU_WaitForInterrupt
mcr p15,0,r0,c7,c0,4
MOV_PC_LR
;===============
; TLB functions 快表TLB功能(C8)
; C8控制控制清楚TLB的相關(guān)操作。它是一個只寫的寄存器。使用MRC指令讀取該寄存器,將產(chǎn)生不可預(yù)知的效果。
;指令具體格式如下:
;MCR P15,0,,,,
;,的不同的組合決定指令執(zhí)行的不同操作。完成操作將產(chǎn)生的數(shù)據(jù)寫到Rd,然后寫到C8
;===============
;使無效整個統(tǒng)一的cache;或者使無效整個數(shù)據(jù)cache和指令cache
;voic MMU_InvalidateTLB(void)
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 ;調(diào)用標(biāo)記
mcr p15,0,r0,c8,c5,0
MOV_PC_LR ;調(diào)用返回
;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) ; 使無效整個數(shù)據(jù)cache
EXPORT MMU_InvalidateDTLB
MMU_InvalidateDTLB
mcr p15,0,r0,c8,c6,0
MOV_PC_LR
;void MMU_InvalidateDTLBMVA(U32 mva) ; 使無效數(shù)據(jù)cache的單個地址變換條目mva,并把虛擬地址返回到C8
EXPORT MMU_InvalidateDTLBMVA
MMU_InvalidateDTLBMVA
;r0=mva
mcr p15,0,r0,c8,c6,1
MOV_PC_LR
;=================
; Cache lock down 緩存內(nèi)容鎖定(C9)
; Cache內(nèi)容鎖定,就是將一些關(guān)鍵代碼和數(shù)據(jù)預(yù)取到cache后,設(shè)置一定的屬性,使發(fā)生cache塊替換時,
;這些關(guān)鍵代碼和數(shù)據(jù)所在的塊不會被替換。指令具體格式如下:
;MCR P15,0,,,,
;MCR P15, 0, ,,,
;當(dāng)系統(tǒng)中包含獨立的數(shù)據(jù)cache和指令cache時,對應(yīng)于數(shù)據(jù)cache和指令cache分別有一個獨立的cache內(nèi)容鎖定寄存器。
;=1 選擇指令cache的內(nèi)容鎖定寄存器
;=0 選擇數(shù)據(jù)cache的內(nèi)容鎖定寄存器
;當(dāng)系統(tǒng)中使用統(tǒng)一的數(shù)據(jù)cache和指令cache時,操作數(shù)應(yīng)為0
;=================鎖數(shù)據(jù)cache
;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) ; 鎖指令cache
EXPORT MMU_SetICacheLockdownBase
MMU_SetICacheLockdownBase
;r0= victim & lockdown base
mcr p15,0,r0,c9,c0,1
MOV_PC_LR
;=================
; TLB lock down 快表內(nèi)容鎖存(C10) ; 具體操作同cache鎖存
;=================鎖數(shù)據(jù)快表
;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 獲得進(jìn)程標(biāo)識符(C13)
;============獲得進(jìn)程標(biāo)識符
;void MMU_SetProcessId(U32 pid)
EXPORT MMU_SetProcessId
MMU_SetProcessId
;r0= pid
mcr p15,0,r0,c13,c0,0
MOV_PC_LR
END
這個東東和CP15密切相關(guān),是一個啟動代碼,等我下次回來再分析一遍
評論