main.c
来自「ADS下的bios工程」· C语言 代码 · 共 130 行
C
130 行
#include <bios/s3c2410x.h>#include <bios/stdio.h>#include <bios/config.h>#include <asm/setup.h>#define TAG_PHYS_ADDR 0x30000100int nand_page_read(int, int, int, unsigned char *);extern struct tag_s3c2410 bios_tags;//void copy_tag_to_phys_ram(void *);char dbgin(void){ while (!(CSR_READ(UTRSTAT1) & 0x1)) ; return (unsigned char)(CSR_READ(URXH1));}void dbgc(char ch){ while (!(CSR_READ(UTRSTAT1) & 0x4)) ; CSR_WRITE(UTXH1, ch); if (ch == '\n') { while (!(CSR_READ(UTRSTAT1) & 0x4)) ; CSR_WRITE(UTXH1, '\r'); }}void dbgs(unsigned char *ptr){ while (*ptr) dbgc(*ptr++);}void start_boot(int size, unsigned char *start){ unsigned int block, page, i; unsigned int *load_addr; unsigned char *buf, nand_id, manu_id; //copy_tag_to_phys_ram(TAG_PHYS_ADDR); //dbgs("I am here\n"); load_addr = (unsigned int *)0x30200000; block = 2; page = 0; buf = (unsigned char *)0x30200000; CSR_WRITE(NFCONF, 0xe060); for (i = 0; i < 0x100; i ++) ; CSR_WRITE(NFCMD, 0x90); /* Sequential Raw Read command : 0x00 */ for (i = 0; i < 0x100; i ++) ; CSR_WRITE(NFADDR, 0x00); //for(i=0; i<0x100; i++); /* Twb(max) : 100ns */ while (!(CSR_READ(NFSTAT) & 0x1)); /* Tr(max) : 7us */ manu_id = CSRB_READ(NFDATA) & 0xff; if (manu_id == 0xec) dbgs("Samsung\n"); while (!(CSR_READ(NFSTAT) & 0x1)); nand_id = CSRB_READ(NFDATA) & 0xff; dbgs("NAND ID: "); dbgc(nand_id); dbgc('\n'); dbgs("NAND Flash booting...\n"); for (i = (112 * 1024); i > 0; i -= 512, page ++, buf += 512) { if (page == 32) { block ++; page = 0; } nand_page_read(block, page, 0, buf); } ((void (*)(int,int))load_addr)(size, (int)load_addr);}int nand_page_read(int block, int page, int column, unsigned char *Buffer){ //unsigned char ecc0, ecc1, ecc2; //unsigned char Spare[16]; int i; page &= 0x1f; block = (block << 5) + page; /* Read Page : 0x0 */ //CSR_WRITE(NFCONF, CSR_READ(NFCONF) | (1 << 12)); /* Initialize ECC */ //CSR_WRITE(NFCONF, CSR_READ(NFCONF) & ~(1 << 11)); for (i = 0; i < 0x100; i ++) ; CSR_WRITE(NFCMD, 0x00); /* Sequential Raw Read command : 0x00 */ for (i = 0; i < 0x100; i ++) ; CSR_WRITE(NFADDR, 0x00); /* Column Address(A0~A7) : 0x00 */ CSR_WRITE(NFADDR, block & 0xFF); /* Column Address(A9~A16) */ CSR_WRITE(NFADDR, (block >> 8) & 0xFF); /* Column Address(A17~A24) */ CSR_WRITE(NFADDR, (block >> 16) & 0xFF); /* Column Address(A25~A26) */ for (i = 0; i < 0x100; i ++) ; /* Twb(max) : 100ns */ while (!(CSR_READ(NFSTAT) & 0x1)) ; /* Tr(max) : 7us */ for (i = 0; i < 512; i ++) *(Buffer + i) = CSRB_READ(NFDATA); //ecc0 = CSRB_READ(NFECC0); //ecc1 = CSRB_READ(NFECC1); //ecc2 = CSRB_READ(NFECC2); //for (i = 0; i < 16; i ++) // Spare[i] = CSRB_READ(NFDATA); //for (i = 0; i < 0x100; i ++) // ; //CSR_WRITE(NFCONF, CSR_READ(NFCONF) | (1 << 11)); //if(ecc0 == Spare[0] && ecc1 == Spare[1] && ecc2 == Spare[2]) { // return 1; //} else { // dbgs("[ECC ERROR(RD)\n"); // return 0; //}}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?