3.u-boot移植
(2011-11-21 21:26)
u-boot移植参考: u-boot-1.1.4: http:///projects/u-boot http:///apps/trac/skyeye/wiki/u-boot cross-2.95.3: http://ftp.arm./pub/armlinux/toolchain/cross-2.95.3.tar.bz2 S3C2410A: http://html./html-pdf/84872/SAMSUNG/S3C2410A/247/1/S3C2410A.html K9F1208U0B: http://html./html-pdf/94372/SAMSUNG/K9F1208U0B/249/1/K9F1208U0B.html 0. 环境 工具链: 解压cross-2.95.3.tar.bz2到目录/usr/local/arm. skyeye.conf: 1 # skyeye config file for S3C2410X 2 arch: arm 3 cpu: arm920t 4 mach: s3c2410x 5 6 # physical memory 7 mem_bank: map=M, type=RW, addr=0x00000000, size=0x000200000, file=./u-boot.bin, boot=yes 8 mem_bank: map=M, type=RW, addr=0x30000000, size=0x04000000 9 #mem_bank: map=M, type=RW, addr=0x30000000, size=0x00200000 10 #mem_bank: map=M, type=RW, addr=0x30200000, size=0x03E00000, file=./vmlinux 11 12 # all peripherals I/O mapping area 13 mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000 14 15 # net 16 mem_bank: map=I, type=RW, addr=0x19000300, size=0x00000020 17 net: type=cs8900a, base=0x19000300, size=0x20, int=9, mac=08:00:3E:26:0A:5B, ethmod=tuntap, hostip=192.168.0.1 18 19 # nandflash 20 nandflash: type=s3c2410x, name=K9F1208U0B, dump=./nand.dump 21 22 # uart 23 uart: mod=term 24 25 # lcd 26 lcd: type=s3c2410x, mod=gtk 27 28 # Dynamic Binary Code Translation 29 #dbct: state=on 30 31 # address for loading elf file 32 #load_addr: base=0x30000000, mask=0xFFFFFF 33 # root file system 34 #load_file: filename=./initrd.img, initrd_start=0x30800000 1. NOR Flash 启动 进入u-boot目录: # vim Makefile 添加, 24 CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux- 找到, 1508 smdk2410_config : unconfig 1509 @./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 后面添加, 1511 fs2410_config : unconfig 1512 @./mkconfig $(@:_config=) arm arm920t fs2410 NULL s3c24x0 拷贝board相关文件: # cp include/configs/smdk2410.h include/configs/fs2410.h # cp -rf board/smdk2410 board/fs2410 # mv board/fs2410/smdk2410.c board/fs2410/fs2410.c 修改, # vim board/fs2410/Makefile 28 OBJS := smdk2410.o flash.o ==> 28 OBJS := fs2410.o flash.o # vim include/configs/fs2410.h 112 #define CFG_PROMPT "SMDK2410 # " /* Monitor Command Prompt */ ==> 112 #define CFG_PROMPT "FS2410 # " /* Monitor Command Prompt */ 编译: # make fs2410_config # make 错误: make[1]: *** No rule to make target `hello_world.srec', needed by `all'. Stop. make[1]: Leaving directory `/home/zfy/u-boot-1.1.4/examples' 修改: # vim examples/Makefile 126 %.srec: % 127 $(OBJCOPY) -O srec $< $@ 2>/dev/null 128 129 %.bin: % 130 $(OBJCOPY) -O binary $< $@ 2>/dev/null ==> 126 %.srec: %.o 127 $(OBJCOPY) -O srec $< $@ 2>/dev/null 128 129 %.bin: %.o 130 $(OBJCOPY) -O binary $< $@ 2>/dev/null # make 安装tftpd: # apt-get install tftpd # mkdir /srv/tftp 添加ping命令: # vim include/configs/fs2410.h 78 #define CONFIG_COMMANDS \ 79 (CONFIG_CMD_DFL | \ 80 CFG_CMD_CACHE | \ 81 /*CFG_CMD_NAND |*/ \ 82 /*CFG_CMD_EEPROM |*/ \ 83 /*CFG_CMD_I2C |*/ \ 84 /*CFG_CMD_USB |*/ \ 85 CFG_CMD_REGINFO | \ 86 CFG_CMD_DATE | \ 87 CFG_CMD_ELF) ==> 78 #define CONFIG_COMMANDS \ 79 (CONFIG_CMD_DFL | \ 80 CFG_CMD_CACHE | \ 81 /*CFG_CMD_NAND |*/ \ 82 /*CFG_CMD_EEPROM |*/ \ 83 /*CFG_CMD_I2C |*/ \ 84 /*CFG_CMD_USB |*/ \ 85 CFG_CMD_REGINFO | \ 86 CFG_CMD_DATE | \ 87 CFG_CMD_ELF | \ 88 CFG_CMD_PING) 修改网络设置: #vim include/configs/fs2410.h 96 #define CONFIG_NETMASK 255.255.255.0 97 #define CONFIG_IPADDR 10.0.0.110 98 #define CONFIG_SERVERIP 10.0.0.1 ==> 96 #define CONFIG_NETMASK 255.255.255.0 97 #define CONFIG_IPADDR 192.168.0.110 98 #define CONFIG_SERVERIP 192.168.0.1 编译: # make 测试: # mknandflashdump u-boot.bin nand.dump 0 # skyeye (skyeye) start (skyeye) run 2. Nand Flash 支持 添加CFG_CMD_NAND命令: # vim include/configs/fs2410.h 78 #define CONFIG_COMMANDS \ 79 (CONFIG_CMD_DFL | \ 80 CFG_CMD_CACHE | \ 81 /*CFG_CMD_NAND |*/ \ 82 /*CFG_CMD_EEPROM |*/ \ 83 /*CFG_CMD_I2C |*/ \ 84 /*CFG_CMD_USB |*/ \ 85 CFG_CMD_REGINFO | \ 86 CFG_CMD_DATE | \ 87 CFG_CMD_ELF | \ 88 CFG_CMD_PING) ==> 78 #define CONFIG_COMMANDS \ 79 (CONFIG_CMD_DFL | \ 80 CFG_CMD_CACHE | \ 81 CFG_CMD_NAND | \ 82 /*CFG_CMD_EEPROM |*/ \ 83 /*CFG_CMD_I2C |*/ \ 84 /*CFG_CMD_USB |*/ \ 85 CFG_CMD_REGINFO | \ 86 CFG_CMD_DATE | \ 87 CFG_CMD_ELF | \ 88 CFG_CMD_PING) 编译: # make 错误: cmd_nand.c: In function `do_nand': cmd_nand.c:117: `CFG_MAX_NAND_DEVICE' undeclared (first use in this function) cmd_nand.c:117: (Each undeclared identifier is reported only once cmd_nand.c:117: for each function it appears in.) cmd_nand.c:118: `NAND_ChipID_UNKNOWN' undeclared (first use in this function) cmd_nand.c: In function `do_nandboot': cmd_nand.c:332: `CFG_MAX_NAND_DEVICE' undeclared (first use in this function) cmd_nand.c:333: `NAND_ChipID_UNKNOWN' undeclared (first use in this function) cmd_nand.c:344: `SECTORSIZE' undeclared (first use in this function) ... ... ... ... make[1]: *** [cmd_nand.o] Error 1 make[1]: Leaving directory `/home/zfy/u-boot-1.1.4/common' make: *** [common/libcommon.a] Error 2 添加board/fs2410/fsnand.h: 1 #ifndef _FSNAND_H_ 2 #define _FSNAND_H_ 3 4 #define CFG_MAX_NAND_DEVICE 1 5 #define SECTORSIZE 512 6 #define ADDR_COLUMN 1 7 #define ADDR_PAGE 2 8 #define ADDR_COLUMN_PAGE 3 9 #define NAND_ChipID_UNKNOWN 0x00 10 #define NAND_MAX_FLOORS 1 11 #define NAND_MAX_CHIPS 1 12 13 #define rNFCONF (*(volatile unsigned *)0x4E000000) 14 #define rNFCMD (*(volatile unsigned *)0x4E000004) 15 #define rNFADDR (*(volatile unsigned *)0x4E000008) 16 #define rNFDATA (*(volatile unsigned *)0x4E00000C) 17 #define rNFSTAT (*(volatile unsigned *)0x4E000010) 18 #define rNFECC (*(volatile unsigned *)0x4E000014) 19 20 #define NAND_WAIT_READY(nand) {while(!(rNFSTAT&(1<<0)));} 21 #define WRITE_NAND_COMMAND(d, adr) (rNFCMD = (d)) 22 #define WRITE_NAND_ADDRESS(d, adr) (rNFADDR = (d)) 23 #define WRITE_NAND(d, adr) (rNFDATA = (d)) 24 #define READ_NAND(adr) (rNFDATA) 25 #define NAND_DISABLE_CE(nand) (rNFCONF |= 0x800) 26 #define NAND_ENABLE_CE(nand) (rNFCONF &= ~0x800) 27 #define NAND_CTL_CLRALE(nandptr) 28 #define NAND_CTL_SETALE(nandptr) 29 #define NAND_CTL_CLRCLE(nandptr) 30 #define NAND_CTL_SETCLE(nandptr) 31 32 #endif 修改board/fs2410/fs2410.c,添加: 29 #include <s3c2410.h> 30 #include "fsnand.h" 128 extern unsigned long nand_probe(unsigned long physadr); 129 void nand_init(void) 130 { 131 S3C2410_NAND * const nand = S3C2410_GetBase_NAND(); 132 rNFCONF = (1<<15)|(1<<12)|(1<<11)|(7<<8)|(7<<4)|(7<<0); 133 printf("%4lu MB\n", nand_probe((ulong)nand) >> 20); 134 } 修改common/cmd_nand.c,添加: 15 #include <watchdog.h> 16 #include "../board/fs2410/fsnand.h" 参考:http://forum./thread-182694-1-1.html?tid=182694&extra=page%3D1&page=1 注释: # vim common/cmd_nand.c 813 // NanD_Command (nand, NAND_CMD_READ0); 编译: # make 测试: 3. NAND Flash 启动 修改cpu/arm920t/start.S: 163 #ifndef CONFIG_SKIP_RELOCATE_UBOOT 164 relocate: /* relocate U-Boot to RAM */ 165 adr r0, _start /* r0 <- current position of code */ 166 ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ 167 cmp r0, r1 /* don't reloc during debug */ 168 beq stack_setup 169 170 ldr r2, _armboot_start 171 ldr r3, _bss_start 172 sub r2, r3, r2 /* r2 <- size of armboot */ 173 add r2, r0, r2 /* r2 <- source end address */ 174 175 copy_loop: 176 ldmia r0!, {r3-r10} /* copy from source address [r0] */ 177 stmia r1!, {r3-r10} /* copy to target address [r1] */ 178 cmp r0, r2 /* until source end addreee [r2] */ 179 ble copy_loop 180 #endif /* CONFIG_SKIP_RELOCATE_UBOOT */ ==> 163 #ifndef CONFIG_SKIP_RELOCATE_UBOOT 164 #if 0 165 relocate: /* relocate U-Boot to RAM */ 166 adr r0, _start /* r0 <- current position of code */ 167 ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ 168 cmp r0, r1 /* don't reloc during debug */ 169 beq stack_setup 170 171 ldr r2, _armboot_start 172 ldr r3, _bss_start 173 sub r2, r3, r2 /* r2 <- size of armboot */ 174 add r2, r0, r2 /* r2 <- source end address */ 175 176 copy_loop: 177 ldmia r0!, {r3-r10} /* copy from source address [r0] */ 178 stmia r1!, {r3-r10} /* copy to target address [r1] */ 179 cmp r0, r2 /* until source end addreee [r2] */ 180 ble copy_loop 181 #else 182 relocate: 183 ldr sp, =0x33f08000 /* setup stack pointer */ 184 mov fp, #0 /* no previous frame, so fp=0 */ 185 bl nand_relocate 186 #endif 187 #endif /* CONFIG_SKIP_RELOCATE_UBOOT */ 修改board/fs2410/fs2410.c,增加: 135 136 void read_page(unsigned int addr, unsigned char* buf) 137 { 138 unsigned int i; 139 140 NAND_ENABLE_CE(0); 141 142 WRITE_NAND_COMMAND(0, 0); 143 WRITE_NAND_ADDRESS(0, 0); 144 WRITE_NAND_ADDRESS((addr>>9)&0xff, 0); 145 WRITE_NAND_ADDRESS((addr>>17)&0xff, 0); 146 WRITE_NAND_ADDRESS((addr>>25)&0xff, 0); 147 148 for (i = 0; i < 10; i ++); //wait tWB(100ns) 149 NAND_WAIT_READY(0); 150 151 for (i = 0; i < 512; i ++) 152 buf[i] = READ_NAND(0); 153 } 154 155 void nand_relocate(void) 156 { 157 unsigned int nfconf; 158 unsigned int nfsrc = 0; 159 unsigned char* memdest = (unsigned char*)0x33F80000; 160 unsigned int i; 161 162 nfconf = rNFCONF; 163 rNFCONF = (1<<15)|(1<<12)|(1<<11)|(7<<8)|(7<<4)|(7<<0); 164 165 for (i = 0; i < 256; i ++) { 166 read_page(nfsrc, memdest); 167 nfsrc += 512; 168 memdest += 512; 169 } 170 171 rNFCONF = nfconf; 172 } 编译: # make 测试: # mknandflashdump u-boot.bin nand.dump 0 # skyeye (skyeye) start (skyeye) run |
|