📄 cpu.c
字号:
#include "cpu.h"#include "types.h"#include "mmu.h"/* * 读控制寄存器 */u32 read_control_register(){ u32 reg; asm volatile( "mrc p15,0,r0,c1,c0,0 \n\t" "str r0,%0 \n\t" : :"m"(reg) :"r0" ); reg&=~(0x7FFF)<<15; reg&=~(0x3)<<10; reg|=0xf<<3; return reg;}/* * 写控制寄存器 */void write_control_register(u32 value){ asm volatile( "ldr r0,%0 \n\t" "mcr p15,0,r0,c1,c0,0 \n\t" : :"m"(value) :"r0" );}void set_ctrl_bit(u32* reg_data,u8 offset,u8 bit){ *reg_data&=~(0x1)<<offset; *reg_data|=bit<<offset;}void load_page_directory(u32 page_directory_addr){ asm volatile( "ldr r0,%0\n\t" "mcr p15,0,r0,c2,c0,0\n\t" : :"m"(page_directory_addr) :"r0" );}/* * 使ICache和DCache无效 */void invalidate_IDCache(){ asm volatile( "ldr r0,=0x00000000 \n\t" "mcr p15,0,r0,c7,c7,0 \n\t" : : :"r0" );}/* * 使I TLB和 D TLB无效 */void invalidate_TLBs(){ asm volatile( "ldr r0,=0x00000000 \n\t" "mcr p15,0,r0,c8,c7,0 \n\t" : : :"r0" ); }/* * 读domain控制寄存器 */u32 read_domain(){ u32 reg=0; asm volatile( "mrc p15,0,r0,c3,c0,0 \n\t" "str r0,%0 \n\t" : :"m"(reg) :"r0" ); return reg;}/* * 写domain控制寄存器 */void write_domain(u32 value){ asm volatile( "ldr r0,%0 \n\t" "mcr p15,0,r0,c3,c0,0 \n\t" : :"m"(value) :"r0" );}void setup_domain(u32 value){ write_domain(value);}void arm920_init(void){ unsigned int ctrl_reg=read_control_register(); /* * Domain Access Control Register * * d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 01 * * domain 0: client (01) * domain 1: mamager (11) */ setup_domain(0x0000000D); load_page_directory(DIRECTORY_BASE); set_ctrl_bit(&ctrl_reg,V,1); set_ctrl_bit(&ctrl_reg,I,1);//开启ICache set_ctrl_bit(&ctrl_reg,S,0); set_ctrl_bit(&ctrl_reg,R,0); set_ctrl_bit(&ctrl_reg,B,0); set_ctrl_bit(&ctrl_reg,C,1);//开启DCache set_ctrl_bit(&ctrl_reg,A,0);//Fault checking disabled set_ctrl_bit(&ctrl_reg,M,1);//开启MMU write_control_register(ctrl_reg);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -