dfgfg sdfsdf fdggg dfg sddsf 

u-boot在s3c2410開發板上移植過程
1)u-boot版本1.1.3,gcc version 3.3.3 (DENX ELDK 3.1.1 3.3.3-9)2)在Makefile中加入bks2410_config : unconfig @./mkconfig $(@:_config=) arm arm920t bks2410 NULL s3c24x0我把我的板子起名叫bks2410,可以依自己的喜好修改3)建立board/bks2410目錄,拷貝board/smdk2410下的文件到board/bks2410目錄,將smdk2410.c更名為bks2410.c4)cp include/configs/smdk2410.h include/configs/bks2410.h5)將arm-linux-gcc的目錄加入到PATH環境變量中,我的是目錄/opt/eldk/usr/bin:/opt/eldk/bin6)測試編譯能否成功:make bks2410_configmake all ARCH=arm生成u-boot.bin就OK了7)依照你自己開發板的內存地址分配情況修改board/bks2410/memsetup.S文件,我的程序:#include <config.h>#include <version.h>#define BWSCON 0x48000000/* BWSCON */#define DW8    (0x0)#define DW16    (0x1)#define DW32    (0x2)#define WAIT    (0x1<<2)#define UBLB    (0x1<<3)#define B1_BWSCON    (DW32)#define B2_BWSCON    (DW16)#define B3_BWSCON    (DW16 + WAIT + UBLB)#define B4_BWSCON    (DW16)#define B5_BWSCON    (DW16)#define B6_BWSCON    (DW32)#define B7_BWSCON    (DW32)/* BANK0CON */#if 0#define B0_Tacs    0x0 /*  0clk */#define B0_Tcos    0x0 /*  0clk */#define B0_Tacc    0x7 /* 14clk */#define B0_Tcoh    0x0 /*  0clk */#define B0_Tah    0x0 /*  0clk */#define B0_Tacp    0x0#define B0_PMC    0x0 /* normal */#endif#define B0_Tacs    0x3 /*  0clk */#define B0_Tcos    0x3 /*  0clk */#define B0_Tacc    0x7 /* 14clk */#define B0_Tcoh    0x3 /*  0clk */#define B0_Tah    0x3 /*  0clk */#define B0_Tacp    0x1#define B0_PMC    0x0 /* normal *//* BANK1CON */#if 0#define B1_Tacs    0x0 /*  0clk */#define B1_Tcos    0x0 /*  0clk */#define B1_Tacc    0x7 /* 14clk */#define B1_Tcoh    0x0 /*  0clk */#define B1_Tah    0x0 /*  0clk */#define B1_Tacp    0x0#define B1_PMC    0x0#endif#define B1_Tacs    0x3 /*  0clk */#define B1_Tcos    0x3 /*  0clk */#define B1_Tacc    0x7 /* 14clk */#define B1_Tcoh    0x3 /*  0clk */#define B1_Tah    0x3 /*  0clk */#define B1_Tacp    0x3#define B1_PMC    0x0#define B2_Tacs    0x0#define B2_Tcos    0x0#define B2_Tacc    0x7#define B2_Tcoh    0x0#define B2_Tah    0x0#define B2_Tacp    0x0#define B2_PMC    0x0#if 0#define B3_Tacs    0x0 /*  0clk */#define B3_Tcos    0x3 /*  4clk */#define B3_Tacc    0x7 /* 14clk */#define B3_Tcoh    0x1 /*  1clk */#define B3_Tah    0x0 /*  0clk */#define B3_Tacp    0x3     /*  6clk */#define B3_PMC    0x0 /* normal */#endif#define B3_Tacs    0x0 /*  0clk */#define B3_Tcos    0x0 /*  4clk */#define B3_Tacc    0x7 /* 14clk */#define B3_Tcoh    0x0 /*  1clk */#define B3_Tah    0x0 /*  0clk */#define B3_Tacp    0x0     /*  6clk */#define B3_PMC    0x0 /* normal */#define B4_Tacs    0x0 /*  0clk */#define B4_Tcos    0x0 /*  0clk */#define B4_Tacc    0x7 /* 14clk */#define B4_Tcoh    0x0 /*  0clk */#define B4_Tah    0x0 /*  0clk */#define B4_Tacp    0x0#define B4_PMC    0x0 /* normal */#define B5_Tacs    0x0 /*  0clk */#define B5_Tcos    0x0 /*  0clk */#define B5_Tacc    0x7 /* 14clk */#define B5_Tcoh    0x0 /*  0clk */#define B5_Tah    0x0 /*  0clk */#define B5_Tacp    0x0#define B5_PMC    0x0 /* normal */#define B6_MT    0x3 /* SDRAM */#define B6_Trcd     0x1#define B6_SCAN    0x1 /* 9bit */#define B7_MT    0x3 /* SDRAM */#define B7_Trcd    0x1 /* 3clk */#define B7_SCAN    0x1 /* 9bit *//* REFRESH parameter */#define REFEN    0x1 /* Refresh enable */#define TREFMD    0x0 /* CBR(CAS before RAS)/Auto refresh */#define Trp    0x0 /* 2clk */#define Trc    0x3 /* 7clk */#define Tchr    0x2 /* 3clk */#define REFCNT    1113 /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) *//**************************************/_TEXT_BASE: .word TEXT_BASE.globl memsetupmemsetup: /* memory control configuration */ /* make r0 relative the current location so that it */ /* reads SMRDATA out of FLASH rather than memory ! */ adr     r0, SMRDATA /*ldr r1, _TEXT_BASE*/ /*sub r0, r0, r1*/ ldr r1, =BWSCON /* Bus Width Status Controller */ add     r2, r0, #13*40: ldr     r3, [r0], #4 str     r3, [r1], #4 cmp     r2, r0 bne     0b /* everything is fine now */ mov pc, lr .ltorg/* the literal pools origin */SMRDATA:    .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))    .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))    .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))    .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))    .word 0x1f7c/*((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))*/    .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))    .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)    .word 0x31    .word 0x30    .word 0x30   8)在board/bks2410加入NAND Flash讀函數,建立nand_read.c,加入如下內容(copy from vivi):#include <config.h>#define __REGb(x) (*(volatile unsigned char *)(x))#define __REGi(x) (*(volatile unsigned int *)(x))#define NF_BASE  0x4e000000#define NFCONF  __REGi(NF_BASE + 0x0)#define NFCMD  __REGb(NF_BASE + 0x4)#define NFADDR  __REGb(NF_BASE + 0x8)#define NFDATA  __REGb(NF_BASE + 0xc)#define NFSTAT  __REGb(NF_BASE + 0x10)#define BUSY 1inline void wait_idle(void) {    int i;    while(!(NFSTAT & BUSY))      for(i=0; i<10; i++);}#define NAND_SECTOR_SIZE 512#define NAND_BLOCK_MASK  (NAND_SECTOR_SIZE - 1)/* low level nand read function */intnand_read_ll(unsigned char *buf, unsigned long start_addr, int size){    int i, j;    if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {        return -1; /* invalid alignment */    }    /* chip Enable */    NFCONF &= ~0x800;    for(i=0; i<10; i++);    for(i=start_addr; i < (start_addr + size);) {      /* READ0 */      NFCMD = 0;      /* Write Address */      NFADDR = i & 0xff;      NFADDR = (i >> 9) & 0xff;      NFADDR = (i >> 17) & 0xff;      NFADDR = (i >> 25) & 0xff;      wait_idle();      for(j=0; j < NAND_SECTOR_SIZE; j++, i++) { *buf = (NFDATA & 0xff); buf++;      }    }    /* chip Disable */    NFCONF |= 0x800; /* chip disable */    return 0;}9)修改board/bks2410/Makefile為OBJS := bks2410.o flash.o nand_read.o10)修改cpu/arm920t/start.S文件在ldr pc, _start_armboot之前加入:#ifdef CONFIG_S3C2410_NAND_BOOT  bl    copy_myself   @ jump to ram  ldr   r1, =on_the_ram  add  pc, r1, #0  nop  nop  1:    b     1b          @ infinite loop on_the_ram:#endif在_start_armboot: .word start_armboot之後加入:#ifdef CONFIG_S3C2410_NAND_BOOTcopy_myself:  mov r10, lr@ reset NAND  mov r1, #NAND_CTL_BASE  ldr   r2, =0xf830           @ initial value  str   r2, [r1, #oNFCONF]  ldr   r2, [r1, #oNFCONF]  bic  r2, r2, #0x800              @ enable chip  str   r2, [r1, #oNFCONF]  mov r2, #0xff         @ RESET command  strb r2, [r1, #oNFCMD]  mov r3, #0                   @ wait1:add  r3, r3, #0x1  cmp r3, #0xa  blt   1b2:ldr   r2, [r1, #oNFSTAT]      @ wait ready  tst    r2, #0x1  beq  2b  ldr   r2, [r1, #oNFCONF]  orr  r2, r2, #0x800              @ disable chip  str   r2, [r1, #oNFCONF]@ get read to call C functions (for nand_read())  ldr   sp, DW_STACK_START       @ setup stack pointer  mov fp, #0                    @ no previous frame, so fp=0@ copy vivi to RAM  ldr   r0, =UBOOT_RAM_BASE  mov     r1, #0x0  mov r2, #0x20000  bl    nand_read_ll  tst    r0, #0x0  beq  ok_nand_read#ifdef CONFIG_DEBUG_LL  bad_nand_read:  ldr   r0, STR_FAIL  ldr   r1, SerBase  bl    PrintWord1:b     1b          @ infinite loop  #endifok_nand_read:#ifdef CONFIG_DEBUG_LL  ldr   r0, STR_OK  ldr   r1, SerBase  bl    PrintWord#endif@ verify  mov r0, #0  ldr   r1, =UBOOT_RAM_BASE  mov r2, #0x400     @ 4 bytes * 1024 = 4K-bytesgo_next:  ldr   r3, [r0], #4  ldr   r4, [r1], #4  teq   r3, r4  bne  notmatch  subs r2, r2, #4  beq  done_nand_read  bne  go_nextnotmatch:#ifdef CONFIG_DEBUG_LL  sub  r0, r0, #4  ldr   r1, SerBase  bl    PrintHexWord  ldr   r0, STR_FAIL  ldr   r1, SerBase  bl    PrintWord#endif1:b     1bdone_nand_read:#ifdef CONFIG_DEBUG_LL  ldr   r0, STR_OK  ldr   r1, SerBase  bl    PrintWord#endif  mov pc, r10@ clear memory@ r0: start address@ r1: length  mem_clear:  mov r2, #0  mov r3, r2  mov r4, r2  mov r5, r2  mov r6, r2  mov r7, r2  mov r8, r2  mov r9, r2clear_loop:  stmia      r0!, {r2-r9}  subs r1, r1, #(8 * 4)  bne  clear_loop  mov pc, lr#endif @ CONFIG_S3C2410_NAND_BOOT在文件的最後加入:   .align     2DW_STACK_START: .word      STACK_BASE+STACK_SIZE-411)修改include/configs/bks2410.h文件,添加如下內容:/* * Nandflash Boot */#define CONFIG_S3C2410_NAND_BOOT 1#define STACK_BASE    0x33f00000#define STACK_SIZE    0x8000#define UBOOT_RAM_BASE    0x33f80000/* NAND Flash Controller */#define NAND_CTL_BASE            0x4E000000#define bINT_CTL(Nb)        __REG(INT_CTL_BASE + (Nb))/* Offset */#define oNFCONF               0x00#define oNFCMD                0x04#define oNFADDR               0x08#define oNFDATA               0x0c#define oNFSTAT               0x10#define oNFECC                0x1412)重新編譯u-bootmake all ARCH=arm13)通過jtag將u-boot燒寫到flash中就可以從NAND flash啟動了我的u-boot啟動信息:U-Boot 1.1.3 (May  6 2006 - 18:13:59)U-Boot code: 33F80000 -> 33F967C4  BSS: -> 33F9AAACRAM Configuration:Bank #0: 30000000 64 MBFlash: 512 kB*** Warning - bad CRC, using default environmentIn:    serialOut:   serialErr:   serialBKS2410 #


.msgcontent .wsharing ul li { text-indent: 0; }



分享

Facebook
Plurk
YAHOO!



 

1234567890
arrow
arrow
    全站熱搜

    nmlwpnlt 發表在 痞客邦 留言(0) 人氣()