CP15協處理器


 

關於 CP15 協處理器和其相關寄存器的詳細內容請參考下面兩份文檔:《ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf》第 1469 頁“B3.17 Oranization of the CP15 registers in a VMSA implementation”。《Cortex-A7 Technical ReferenceManua.pdf》第55 頁“Capter 4 System Control”。CP15 協處理器一般用於存儲系統管理,但是在中斷中也會使用到,CP15 協處理器一共有16 32 位寄存器。CP15 協處理器的訪問通過如下指令完成:

MRC: CP15 協處理器中的寄存器數據讀到 ARM 寄存器中。

MCR: ARM 寄存器的數據寫入到 CP15 協處理器寄存器中。

MRC 就是讀 CP15 寄存器,MCR 就是寫 CP15 寄存器,MCR 指令格式如下:

MCR{cond} p15, <opc1>, <Rt>, <CRn>, <CRm>, <opc2>

cond:指令執行的條件碼,如果忽略的話就表示無條件執行。

opc1:協處理器要執行的操作碼。

RtARM 源寄存器,要寫入到 CP15 寄存器的數據就保存在此寄存器中。

CRn CP15 協處理器的目標寄存器。

CRm: :協處理器中附加的目標寄存器或者源操作數寄存器,如果不需要附加信息就將

CRm 設置為 C0,否則結果不可預測。

opc2 :可選的協處理器特定操作碼,當不需要的時候要設置為 0

MRC 的指令格式和 MCR 一樣,只不過在 MRC 指令中 Rt 就是目標寄存器,也就是從

CP15 指定寄存器讀出來的數據會保存在 Rt 中。而 CRn 就是源寄存器,也就是要讀取的寫處理器寄存器。假如我們要將 CP15 C0 寄存器的值讀取到 R0 寄存器中,那么就可以使用如下命令:

MRC p15, 0, r0, c0, c0, 0

CP15 協處理器有 16 32 位寄存器,c0~c15,只介紹c0c1c12 c15 這四個寄存器,其他的寄存器大家參考上面的兩個文檔即可。

1 c0  寄存器

CP15 協處理器有 16 32 位寄存器,c0~c15,在使用 MRC 或者 MCR 指令訪問這 16

寄存器的時候,指令中的 CRnopc1CRm opc2 通過不同的搭配,其得到的寄存器含義是不同的。比如 c0 在不同的搭配情況下含義如圖所示:

在上圖中當 MRC/MCR 指令中的 CRn=c0opc1=0CRm=c0opc2=0 的時候就表示此時的 c0 就是 MIDR 寄存器,也就是主 ID 寄存器,這個也是 c0 的基本作用。對於 Cortex-A7內核來說,c0 作為 MDIR 寄存器的時候其含義如圖所示:

在上圖中各位所代表的含義如下:

bit31:24:廠商編號,0X41ARM

bit23:20:內核架構的主版本號,ARM 內核版本一般使用 rnpn 來表示,比如 r0p1,其中 r0 后面的 0 就是內核架構主版本號。

bit19:16:架構代碼,0XFARMv7 架構。

bit15:4:內核版本號,0XC07Cortex-A7 MPCore 內核。

bit3:0:內核架構的次版本號,rnpn 中的 pn,比如 r0p1 p1 后面的 1 就是次版本號。

2 c1  寄存器

c1 寄存器同樣通過不同的配置,其代表的含義也不同,如圖所示:

 

在上圖中當 MRC/MCR 指令中的 CRn=c1opc1=0CRm=c0opc2=0 的時候就表示此時的 c1 就是 SCTLR 寄存器,也就是系統控制寄存器,這個是 c1 的基本作用。SCTLR 寄存器主要是完成控制功能的,比如使能或者禁止 MMUI/D Cache 等,c1 作為 SCTLR 寄存器的時候其含義如圖所示:

bit13V , 中斷向量表基地址選擇位,為 0 的話中斷向量表基地址為 0X00000000,軟件可以使用 VBAR 來重映射此基地址,也就是中斷向量表重定位。為 1 的話中斷向量表基地址為0XFFFF0000,此基地址不能被重映射。

bit12II Cache 使能位,為 0 的話關閉 I Cache,為 1 的話使能 I Cache

bit11Z,分支預測使能位,如果開啟 MMU 的話,此位也會使能。

bit10SWSWP SWPB 使能位,當為 0 的話關閉 SWP SWPB 指令,當為 1 的時候就使能 SWP SWPB 指令。

bit9:3:未使用,保留。

bit2CD Cache 和緩存一致性使能位,為 0 的時候禁止 D Cache 和緩存一致性,為 1

使能。

bit1A,內存對齊檢查使能位,為 0 的時候關閉內存對齊檢查,為 1 的時候使能內存對齊檢查。

bit0MMMU 使能位,為 0 的時候禁止 MMU,為 1 的時候使能 MMU

如果要讀寫 SCTLR 的話,就可以使用如下命令:

MRC p15, 0, <Rt>, c1, c0, 0 ;讀取 SCTLR 寄存器,數據保存到 Rt 中。

MCR p15, 0, <Rt>, c1, c0, 0 ;Rt 中的數據寫到 SCTLR(c1)寄存器中。

3 c12  寄存器

c12 寄存器通過不同的配置,其代表的含義也不同,如圖所示:

在上圖中當 MRC/MCR 指令中的 CRn=c12opc1=0CRm=c0opc2=0 的時候就表示此時 c12 VBAR 寄存器,也就是向量表基地址寄存器。設置中斷向量表偏移的時候就需要將新的中斷向量表基地址寫入 VBAR 中,假如代碼鏈接的起始地址為0X87800000,而中斷向量表肯定要放到最前面,也就是 0X87800000 這個地址處。所以需要設置 VBAR 0X87800000,設置命令如下:

ldr r0, =0X87800000  ; r0=0X87800000

MCR p15, 0, r0, c12, c0, 0  ;r0 里面的數據寫入到 c12 中,即 c12=0X87800000

c15  寄存器

c15 寄存器也可以通過不同的配置得到不同的含義,參考文檔《Cortex-A7 Technical ReferenceManua.pdf》第 68 頁“4.2.16 c15 registers”,其配置如圖 17.1.4.5 所示:

 

在圖 17.1.4.5 中,我們需要 c15 作為 CBAR 寄存器,因為 GIC 的基地址就保存在 CBAR中,我們可以通過如下命令獲取到 GIC 基地址:

MRC p15, 4, r1, c15, c0, 0 ; 獲取 GIC 基礎地址,基地址保存在 r1 中。

獲取到 GIC 基地址以后就可以設置 GIC 相關寄存器了,比如我們可以讀取當前中斷 ID,當前中斷 ID 保存在 GICC_IAR 中,寄存器 GICC_IAR 屬於 CPU 接口端寄存器,寄存器地址相對於 CPU 接口端起始地址的偏移為 0XC,因此獲取當前中斷 ID 的代碼如下:

MRC p15, 4, r1, c15, c0, 0 ;獲取 GIC 基地址

ADD r1, r1, #0X2000  ;GIC 基地址加 0X2000 得到 CPU 接口端寄存器起始地址

LDR r0, [r1, #0XC] ;讀取 CPU 接口端起始地址+0XC 處的寄存器值,也就是寄存器;GIC_IAR 的值

關於 CP15 協處理器就講解到這里,簡單總結一下,通過 c0 寄存器可以獲取到處理器內核信息;通過 c1 寄存器可以使能或禁止 MMUI/D Cache 等;通過 c12 寄存器可以設置中斷向量偏移;通過 c15 寄存器可以獲取 GIC 基地址。關於 CP15 的其他寄存器,查閱本文前面列舉的 2 ARM 官方資料。

 

 注:原文出自 【正點原子】I.MX6U嵌入式Linux驅動開發指南V1.3

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM