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