📄 sysinit.c
字号:
#include "board.h"#include "utils.h"#include "bios.h"static inline void reset_registers(void);/* * Caculate system registers */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 |= (system_table->rom_table[i].width) << (i * 2); for (i = 0; i < 4; i++) sys_regs.extdbwth |= (system_table->dram_table[i].width) << (i * 2 + 12); for (i = 0; i < 4; i++) sys_regs.extdbwth |= (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].flag & ~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].flag & ~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->dram_table[0].refresh; 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].flag & 0xffff) | ((system_table->ext_table[1].flag & 0xffff) << 16); outl(r, EXTACON0); r = (system_table->ext_table[2].flag & 0xffff) | ((system_table->ext_table[3].flag & 0xffff) << 16); outl(r, EXTACON1); outl(system_table->iop.iopmod, IOPMOD); outl(system_table->iop.iopcon, IOPCON); outl(system_table->iop.iopdata, IOPDATA); reset_registers(); return 0;}/* * This function exists for supporting soft-reset * of S3C4510B. However, some readonly registers * perhaps don't contail "reset values" after this * function, so it is still possiable that you have * some dirty registers after a soft-reset. So make * sure your application can handl these registers. * * These registers are noted by double slash below. */static inline void reset_registers(void) { /* Ethernet */ outl(0, BDMATXCON); outl(0, BDMARXCON); outl(0xffffffff, BDMATXPTR); outl(0xffffffff, BDMARXPTR); outl(0, BDMASTAT); outl(0, MACON); outl(0, CAMCON); outl(0, MACTXCON); outl(0, MACTXSTAT); outl(0, MACRXCON); outl(0, MACRXSTAT); outl(0, STADATA); outl(0x00006000, STACON); outl(0, CAMEN); outl(0, EMISSCNT);// outl(0, EPZCNT);// outl(0, ERMPZCNT); // outl(0, ETXSTAT); /* HDLC channel A */ outl(0, HMODE_A); outl(0, HCON_A); outl(0, HSTAT_A); outl(0, HINTEN_A);// outl(0, HRXFIFO_A); outl(0, HBRGTC_A); outl(0, HPRMB_A); outl(0, HSAR0_A); outl(0, HSAR1_A); outl(0, HSAR2_A); outl(0, HSAR3_A); outl(0, HMASK_A); outl(0xffffffff, DMATXPTR_A); outl(0xffffffff, DMARXPTR_A); outl(0, HMFLR_A); outl(0, HRBSR_A); /* HDLC channel B */ outl(0, HMODE_B); outl(0, HCON_B); outl(0, HSTAT_B); outl(0, HINTEN_B);// outl(0, HRXFIFO_B); outl(0, HBRGTC_B); outl(0, HPRMB_B); outl(0, HSAR0_B); outl(0, HSAR1_B); outl(0, HSAR2_B); outl(0, HSAR3_B); outl(0, HMASK_B); outl(0xffffffff, DMATXPTR_B); outl(0xffffffff, DMARXPTR_B); outl(0, HMFLR_B); outl(0, HRBSR_B); /* Interrupt Controller */ outl(0, INTMOD); outl(0, INTPND); outl(0x003fffff, INTMSK); outl(0x03020100, INTPRI0); outl(0x07060504, INTPRI1); outl(0x0b0a0908, INTPRI2); outl(0x0f0e0d0c, INTPRI3); outl(0x13121110, INTPRI4); outl(0x00000014, INTPRI5);// outl(0x00000054, INTOFFSET);// outl(0x00000054, INTOSET_FIQ);// outl(0x00000054, INTOSET_IRQ); /* I2C Bus */ outl(0, IICCON); outl(0, IICPS); outl(0, IICCOUNT); /* GDMA */ outl(0, GDMACON0); outl(0, GDMACON1); /* Timers */ outl(0, TMOD); outl(0, TDATA0); outl(0, TDATA1); outl(0xffffffff, TCNT0); outl(0xffffffff, TCNT1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -