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 + -
显示快捷键?