分享

u-boot移植 (2011-11-21 21:26)

 定慧图书馆 2012-01-23
3.u-boot移植 (2011-11-21 21:26)
标签u-boot  skyeye  分类: skyeye
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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多