📄 sysinit.c
字号:
#include "board.h"#include "utils.h"#include "bios.h"/* * Caculate system registers */static unsigned long get_width_bits(unsigned long width){ unsigned long bits; switch (width) { case 8: bits = 1; break; case 16: bits = 2; break; case 32: bits = 3; break; default: bits = 0; } return bits;}int sys_init(struct system_table_struct *system_table, unsigned long rom_base, unsigned dram_base){ struct sys_regs_struct sys_regs; unsigned long base; unsigned long r; int i; sys_regs.extdbwth = 0; for (i = 0; i < 6; i++) sys_regs.extdbwth |= get_width_bits(system_table->rom_table[i].width) << (i * 2); for (i = 0; i < 4; i++) sys_regs.extdbwth |= get_width_bits(system_table->dram_table[i].width) << (i * 2 + 12); for (i = 0; i < 4; i++) sys_regs.extdbwth |= get_width_bits(system_table->ext_table[i].width) << (i * 2 + 20); base = rom_base; for (i = 0; i < 6; i++) { sys_regs.romcon[i] = (system_table->rom_table[i].flags & ~0x3ffffc00) | (((base + system_table->rom_table[i].size) & 0x03ff0000) << 4) | ((base & 0x03ff0000) >> 6); base += system_table->rom_table[i].size; } base = dram_base; for (i = 0; i < 4; i++) { sys_regs.dramcon[i] = (system_table->dram_table[i].flags & ~0x3ffffc00) | (((base + system_table->dram_table[i].size) & 0x03ff0000) << 4) | ((base & 0x03ff0000) >> 6); base += system_table->dram_table[i].size; } sys_regs.refextcon = ((system_table->ext_base & 0x03ff0000) >> 16) | 0xce298000; outl(sys_regs.extdbwth, EXTDBWTH); outl(sys_regs.romcon[0], ROMCON0); outl(sys_regs.romcon[1], ROMCON1); outl(sys_regs.romcon[2], ROMCON2); outl(sys_regs.romcon[3], ROMCON3); outl(sys_regs.romcon[4], ROMCON4); outl(sys_regs.romcon[5], ROMCON5); outl(sys_regs.dramcon[0], DRAMCON0); outl(sys_regs.dramcon[1], DRAMCON1); outl(sys_regs.dramcon[2], DRAMCON2); outl(sys_regs.dramcon[3], DRAMCON3); outl(sys_regs.refextcon, REFEXTCON); r = (system_table->ext_table[0].flags & 0xffff) | ((system_table->ext_table[1].flags & 0xffff) << 16); outl(r, EXTACON0); r = (system_table->ext_table[2].flags & 0xffff) | ((system_table->ext_table[3].flags & 0xffff) << 16); outl(r, EXTACON1); outl(system_table->iop.iopmod, IOPMOD); outl(system_table->iop.iopcon, IOPCON); outl(system_table->iop.iopdata, IOPDATA); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -