免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 998 | 回复: 0
打印 上一主题 下一主题

最具体的u-boot移植到QT2410E开发板的过程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-30 15:46 |只看该作者 |倒序浏览
[color="#000000"]U-Boot[color="#000000"]能够支持多种体系结构的处理器,支持的开发板也越来越多。以S3C2410处理器的开发板为例,我们可以基于SMDK2410移植。
开始移植之前,需要先分析一下U-Boot已经支持的开发板,比较出硬件配置最接近的开发板。选择的原则是,首先处理器相同,其次处理器体系结构相同,然后是以太网接口等外围接口。推荐使用官方FTP下载UBOOT源码。
http://www.icdev.com.cn/batch.viewlink.php?itemid=1694
[color="#000000"]移植U-Boot的基本步骤如下:
[color="#000000"]1创建开发板目录
[color="#000000"](1) 在board目录下创建自己的工作目录,将smdk2410目录下的内容全部拷贝到qt2410e目录下。
[color="#000000"](2) cd u-boot-1.2.0/board
[color="#000000"](3) mkdir qt2410e
[color="#000000"](4) cd qt2410e
[color="#000000"](5) cp  ../smdk2410/* .
[color="#000000"](6) mv smdk2410.c qt2410e.c
[color="#000000"](7) vi Makefile并把COBJS更改为:COBJS := qt2410e.o flash.o nand_read.o
[color="#000000"](8) cd ../..
[color="#000000"](9) cp include/configs/smdk2410.h include/configs/qt2410e.h
[color="#000000"](10) vi Makefile顶层Makefile中1924行填加如下两行:
[color="#000000"]qt2410e_config    :    unconfig
[color="#000000"]        @$(MKCONFIG) $(@:_config=) arm arm920t qt2410e null s3c24x0
[color="#000000"]2添加nand_read_ll读写函数
[color="#000000"]start.S文件中需要使用的nand_read_ll读写函数,用来将uboot拷贝到内存里去。在/board/qt2410e目录下需要添加nand_read.c文件,主要实现了nand_read_ll读写函数。
[color="#000000"](1) cd board/qt2410e
[color="#000000"](2) vi nand_read.c创建此文件
[color="#000000"](3) 阅读并分析nand_read_ll函数,将其添加到nand_read.c中,代码如下:
[color="#000000"](1) #include
[color="#000000"](2)
[color="#000000"](3) #define __REGb(x)    (*(volatile unsigned char *)(x))
[color="#000000"](4) #define __REGi(x)    (*(volatile unsigned int *)(x))
[color="#000000"](5) #define NF_BASE        0x4e000000
[color="#000000"](6) #define NFCONF        __REGi(NF_BASE + 0x0)
[color="#000000"](7) #define NFCMD         __REGb(NF_BASE + 0x4)
[color="#000000"](8) #define NFADDR        __REGb(NF_BASE + 0x8)
[color="#000000"](9) #define NFDATA        __REGb(NF_BASE + 0xc)
[color="#000000"](10) #define NFSTAT        __REGb(NF_BASE + 0x10)
[color="#000000"](11)
[color="#000000"](12) #define BUSY 1
[color="#000000"](13) inline void wait_idle(void) {
[color="#000000"](14)     int i;
[color="#000000"](15)
[color="#000000"](16)     while(!(NFSTAT & BUSY))
[color="#000000"](17)       for(i=0; i
[color="#000000"](18) }
[color="#000000"](19)
[color="#000000"](20) #define NAND_SECTOR_SIZE    512
[color="#000000"](21) #define NAND_BLOCK_MASK        (NAND_SECTOR_SIZE - 1)
[color="#000000"](22)
[color="#000000"](23)
[color="#000000"](24) int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
[color="#000000"](25) {
[color="#000000"](26)     int i, j;
[color="#000000"](27)
[color="#000000"](28)     if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
[color="#000000"](29)         return -1;   
[color="#000000"](30) }
[color="#000000"](31)
[color="#000000"](32)   
[color="#000000"](33)     NFCONF &= ~0x800;
[color="#000000"](34)     for(i=0; i
[color="#000000"](35)
[color="#000000"](36)     for(i=start_addr; i
[color="#000000"](37)      
[color="#000000"](38)       NFCMD = 0;
[color="#000000"](39)
[color="#000000"](40)      
[color="#000000"](41)       NFADDR = i & 0xff;
[color="#000000"](42)       NFADDR = (i >> 9) & 0xff;   
[color="#000000"](43)       NFADDR = (i >> 17) & 0xff;
[color="#000000"](44)       NFADDR = (i >> 25) & 0xff;
[color="#000000"](45)
[color="#000000"](46)       wait_idle();
[color="#000000"](47)
[color="#000000"](48)       for(j=0; j
[color="#000000"](49)     *buf = (NFDATA & 0xff);
[color="#000000"](50)     buf++;
[color="#000000"](51)       }
[color="#000000"](52)     }
[color="#000000"](53)     NFCONF |= 0x800;   
[color="#000000"](54)     return 0;
[color="#000000"](55) }
[color="#000000"]3 [color="#000000"]修改start.S
[color="#000000"](1) vi ../../cpu/arm920t/start.S
[color="#000000"](2) 在vi编辑器的命令模式下输入如下命令找到选择FLASH启动部分代码,命令如下:
[color="#000000"](3) /RELOCATE
[color="#000000"](4) 这时将看到如下代码为NOR的重定向代码:
[color="#000000"]#ifndef CONFIG_SKIP_RELOCATE_UBOOT
[color="#000000"]relocate:                /* relocate U-Boot to RAM        */
[color="#000000"]    adr    r0, _start        /* r0
[color="#000000"]    ldr    r1, _TEXT_BASE        /* test if we run from flash or RAM */
[color="#000000"]    cmp     r0, r1                 /* don't reloc during debug         */
[color="#000000"]    beq     stack_setup
[color="#000000"]    ldr    r2, _armboot_start
[color="#000000"]    ldr    r3, _bss_start
[color="#000000"]    sub    r2, r3, r2        /* r2
[color="#000000"]    add    r2, r0, r2        /* r2
[color="#000000"]copy_loop:
[color="#000000"]    ldmia    r0!, {r3-r10}        /* copy from source address [r0]    */
[color="#000000"]    stmia    r1!, {r3-r10}        /* copy to   target address [r1]    */
[color="#000000"]    cmp    r0, r2            /* until source end addreee [r2]    */
[color="#000000"]    ble    copy_loop
[color="#000000"]#endif    /* CONFIG_SKIP_RELOCATE_UBOOT */
[color="#000000"](5) 可以将上述代码注释掉或删除,或者直接不予以理会,我们这里将光标移至#ifndef CONFIG_SKIP_RELOCATE_UBOOT行并执行18dd命令直接将其删除。
[color="#000000"](6) 删除部分将替换为NAND FLASH的初始化代码,并由此代码最终调用nand_read.c的函数。代码如下:
[color="#000000"]#ifdef CONFIG_S3C2410_NAND_BOOT   
[color="#000000"]@ reset NAND
[color="#000000"]  mov r1, #NAND_CTL_BASE
[color="#000000"]  ldr   r2, =0xf830           @ initial value
[color="#000000"]  str   r2, [r1, #oNFCONF]
[color="#000000"]  ldr   r2, [r1, #oNFCONF]
[color="#000000"]  bic  r2, r2, #0x800              @ enable chip
[color="#000000"]  str   r2, [r1, #oNFCONF]
[color="#000000"]  mov r2, #0xff         @ RESET command
[color="#000000"]  strb r2, [r1, #oNFCMD]
[color="#000000"]  mov r3, #0                   @ wait
[color="#000000"]nand1:  
[color="#000000"]  add  r3, r3, #0x1
[color="#000000"]  cmp r3, #0xa
[color="#000000"]  blt   nand1
[color="#000000"]nand2:
[color="#000000"]  ldr   r2, [r1, #oNFSTAT]      @ wait ready
[color="#000000"]  tst    r2, #0x1
[color="#000000"]  beq  nand2
[color="#000000"]  ldr   r2, [r1, #oNFCONF]
[color="#000000"]  orr  r2, r2, #0x800              @ disable chip
[color="#000000"]  str   r2, [r1, #oNFCONF]
ldr   r2, [r1, #oNFCONF]
  bic  r2, r2, #0x800              @ enable chip
[color="#000000"]  str   r2, [r1, #oNFCONF]
[color="#000000"]  mov r2, #0xff         @ RESET command
[color="#000000"]  strb r2, [r1, #oNFCMD]
[color="#000000"]  mov r3, #0                   @ wait
[color="#000000"]nand1:  
[color="#000000"]  add  r3, r3, #0x1
[color="#000000"]  cmp r3, #0xa
[color="#000000"]  blt   nand1
[color="#000000"]nand2:
[color="#000000"]  ldr   r2, [r1, #oNFSTAT]      @ wait ready
[color="#000000"]  tst    r2, #0x1
[color="#000000"]  beq  nand2
[color="#000000"]  ldr   r2, [r1, #oNFCONF]
[color="#000000"]  orr  r2, r2, #0x800              @ disable chip
[color="#000000"]  str   r2, [r1, #oNFCONF]
[color="#000000"]@ get read to call C functions (for nand_read())
[color="#000000"]  ldr   sp, DW_STACK_START       @ setup stack pointer
[color="#000000"]  mov fp, #0                    @ no previous frame, so fp=0
[color="#000000"]@ copy U-Boot to RAM
[color="#000000"]  ldr   r0, =TEXT_BASE
[color="#000000"]  mov     r1, #0x0
[color="#000000"]  mov r2, #0x20000
[color="#000000"]  bl    nand_read_ll 这个函数在nand_read.c中实现
[color="#000000"]  tst    r0, #0x0
[color="#000000"]  beq  ok_nand_read
[color="#000000"]bad_nand_read:
[color="#000000"]loop2:    b     loop2          @ infinite loop
[color="#000000"]ok_nand_read:
[color="#000000"]@ verify
[color="#000000"]  mov r0, #0
[color="#000000"]  ldr   r1, =TEXT_BASE
[color="#000000"]  mov r2, #0x400     @ 4 bytes * 1024 = 4K-bytes,这句话的意思在start.S中已注释。
[color="#000000"]go_next:
[color="#000000"]  ldr   r3, [r0], #4
[color="#000000"]  ldr   r4, [r1], #4
[color="#000000"]  teq   r3, r4
[color="#000000"]  bne  notmatch
[color="#000000"]  subs r2, r2, #4
[color="#000000"]  beq  stack_setup
[color="#000000"]  bne  go_next
[color="#000000"]notmatch:
[color="#000000"]loop3:     b     loop3         @ infinite loop
[color="#000000"]#endif @ CONFIG_S3C2410_NAND_BOOT
[color="#000000"]注:实现比较简单,同学要仔细推敲NAND工作原理,如看不懂,老师会在同学完成实验后给予讲解。其中@为注释部分,可不必写入。
[color="#000000"](1) 用命令行模式找到_start_armboot:    .word start_armboot后加入:
[color="#000000"]   .align     2(前面用TAB键空出)
[color="#000000"]DW_STACK_START:  .word  STACK_BASE+STACK_SIZE-4
[color="#000000"]4 添加头文件信息
[color="#000000"]在include/configs/qt2410e.h头文件中添加nandflash的初始化信息:
[color="#000000"](1) 找到#define CFG_ENV_IS_IN_FLASH 1并将其用//注释掉。
[color="#000000"]//#define CFG_ENV_IS_IN_FLASH 1
[color="#000000"](2) 后面添加如下宏定义:
[color="#000000"]#define CFG_ENV_IS_IN_NAND 1
[color="#000000"]#define CFG_ENV_OFFSET 0x020000
[color="#000000"]#define CFG_NAND_BASE 0x4E000000
[color="#000000"]#define CMD_SAVEENV
[color="#000000"]#define CFG_NAND_LEGACY
[color="#000000"]#define CFG_MONITOR_BASE PHYS_SDRAM_1
[color="#000000"]#if (CONFIG_COMMANDS & CFG_CMD_NAND)
[color="#000000"]#define CFG_NAND_BASE 0x4E000000
[color="#000000"]/* NandFlash控制器在SFR区起始寄存器地址 */
[color="#000000"]#define CFG_MAX_NAND_DEVICE 1
[color="#000000"]/* 支持的最在Nand Flash数据 */
[color="#000000"]#define SECTORSIZE 512
[color="#000000"]/* 1页的大小 */
[color="#000000"]#define NAND_SECTOR_SIZE SECTORSIZE
[color="#000000"]#define NAND_BLOCK_MASK 511
[color="#000000"]/* 页掩码 */
[color="#000000"]#define ADDR_COLUMN 1
[color="#000000"]/* 一个字节的Column地址 */
[color="#000000"]#define ADDR_PAGE 3
[color="#000000"]/* 3字节的页块地址!!!!!*/
[color="#000000"]#define ADDR_COLUMN_PAGE 4
[color="#000000"]/* 总共4字节的页块地址!!!!! */
[color="#000000"]#define NAND_ChipID_UNKNOWN 0x00
[color="#000000"]/* 未知芯片的ID号 */
[color="#000000"]#define NAND_MAX_FLOORS 1
[color="#000000"]#define NAND_MAX_CHIPS 1
[color="#000000"]/* Nand Flash命令层底层接口函数 */
[color="#000000"]#define WRITE_NAND_COMMAND(d, adr) {rNFCMD = d;}
[color="#000000"]#define WRITE_NAND_ADDRESS(d, adr) {rNFADDR = d;}
[color="#000000"]#define WRITE_NAND(d, adr) {rNFDATA = d;}
[color="#000000"]#define READ_NAND(adr) (rNFDATA)
[color="#000000"]#define NAND_WAIT_READY(nand) {while(!(rNFSTAT&(1
[color="#000000"]#define NAND_DISABLE_CE(nand) {rNFCONF |= (1
[color="#000000"]#define NAND_ENABLE_CE(nand) {rNFCONF &= ~(1
[color="#000000"]/* the following functions are NOP's because S3C24X0 handles this in hardware 一定要加上 */
[color="#000000"]#define NAND_CTL_CLRALE(nandptr)
[color="#000000"]#define NAND_CTL_SETALE(nandptr)
[color="#000000"]#define NAND_CTL_CLRCLE(nandptr)
[color="#000000"]#define NAND_CTL_SETCLE(nandptr)
[color="#000000"]/* 允许Nand Flash写校验 */
[color="#000000"]#define CONFIG_MTD_NAND_VERIFY_WRITE 1
[color="#000000"]/*
[color="#000000"]* Nandflash Boot
[color="#000000"]*/
[color="#000000"]#define CONFIG_S3C2410_NAND_BOOT 1
[color="#000000"]#define STACK_BASE 0x33f00000
[color="#000000"]#define STACK_SIZE 0x8000
[color="#000000"]#define UBOOT_RAM_BASE 0x33f80000
[color="#000000"]/* NAND Flash Controller */
[color="#000000"]#define NAND_CTL_BASE 0x4E000000
[color="#000000"]#define bINT_CTL(Nb) __REG(INT_CTL_BASE + (Nb))
[color="#000000"]/* Offset */
[color="#000000"]#define oNFCONF 0x00
[color="#000000"]#define oNFCMD 0x04
[color="#000000"]#define oNFADDR 0x08
[color="#000000"]#define oNFDATA 0x0c
[color="#000000"]#define oNFSTAT 0x10
[color="#000000"]#define oNFECC 0x14
[color="#000000"]#define rNFCONF (*(volatile unsigned int *)0x4e000000)

[color="#000000"]#define rNFCMD (*(volatile unsigned char *)0x4e000004)
[color="#000000"]#define rNFADDR (*(volatile unsigned char *)0x4e000008)
[color="#000000"]#define rNFDATA (*(volatile unsigned char *)0x4e00000c)
[color="#000000"]#define rNFSTAT (*(volatile unsigned int *)0x4e000010)
[color="#000000"]#define rNFECC (*(volatile unsigned int *)0x4e000014)
[color="#000000"]#define rNFECC0 (*(volatile unsigned char *)0x4e000014)
[color="#000000"]#define rNFECC1 (*(volatile unsigned char *)0x4e000015)
[color="#000000"]#define rNFECC2 (*(volatile unsigned char *)0x4e000016)
[color="#000000"]#endif /* CONFIG_COMMANDS & CFG_CMD_NAND*/
[color="#000000"](1) 85行后添加CFG_CMD_ENV | \和CFG_CMD_NAND | \
[color="#000000"]5 修改qt2410e.c文件
[color="#000000"]u-boot运行至第二阶段进入start_armboot()函数。其中nand_init()函数是对nand flash的最初初始化函数。Nand_init()函数在两个文件中实现。其调用与CFG_NAND_LEGACY宏有关,如果没有定义这个宏,系统调用 drivers/nnd/nand.c中的nand_init();否则调用board/smdk2410/smdk2410.c中的nand_init()函数。这里我选择第二种方式。
[color="#000000"]在/board/qt2410e/qt2410e.c文件的末尾添加对Nand Flash 的初始化函数:
[color="#000000"]#if (CONFIG_COMMANDS & CFG_CMD_NAND)[color="#000000"]
[color="#000000"]typedef enum {[color="#000000"]
[color="#000000"]NFCE_LOW,[color="#000000"]
[color="#000000"]NFCE_HIGH[color="#000000"]
[color="#000000"]} NFCE_STATE;
[color="#000000"]static inline void NF_Conf(u16 conf)[color="#000000"]
[color="#000000"]{[color="#000000"]
[color="#000000"]S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
[color="#000000"]nand->NFCONF = conf;[color="#000000"]
[color="#000000"]}
[color="#000000"]static inline void NF_Cmd(u8 cmd)[color="#000000"]
[color="#000000"]{[color="#000000"]
[color="#000000"]S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
[color="#000000"]nand->NFCMD = cmd;[color="#000000"]
[color="#000000"]}
[color="#000000"]static inline void NF_CmdW(u8 cmd)[color="#000000"]
[color="#000000"]{[color="#000000"]
[color="#000000"]NF_Cmd(cmd);[color="#000000"]
[color="#000000"]udelay(1);[color="#000000"]
[color="#000000"]}
[color="#000000"]static inline void NF_Addr(u8 addr)[color="#000000"]
[color="#000000"]{[color="#000000"]
[color="#000000"]S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
[color="#000000"]nand->NFADDR = addr;[color="#000000"]
[color="#000000"]}
[color="#000000"]static inline void NF_SetCE(NFCE_STATE s)[color="#000000"]
[color="#000000"]{[color="#000000"]
[color="#000000"]S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
[color="#000000"]switch (s) {[color="#000000"]
[color="#000000"]case NFCE_LOW:[color="#000000"]
[color="#000000"]nand->NFCONF &= ~(1[color="#000000"]
[color="#000000"]break;
[color="#000000"]case NFCE_HIGH:[color="#000000"]
[color="#000000"]nand->NFCONF |= (1[color="#000000"]
[color="#000000"]break;[color="#000000"]
[color="#000000"]}[color="#000000"]
[color="#000000"]}
[color="#000000"]static inline void NF_WaitRB(void)[color="#000000"]
[color="#000000"]{[color="#000000"]
[color="#000000"]S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
[color="#000000"]while (!(nand->NFSTAT & (1[color="#000000"]
[color="#000000"]}
[color="#000000"]static inline void NF_Write(u8 data)[color="#000000"]
[color="#000000"]{[color="#000000"]
[color="#000000"]S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
[color="#000000"]nand->NFDATA = data;[color="#000000"]
[color="#000000"]}
[color="#000000"]static inline u8 NF_Read(void)[color="#000000"]
[color="#000000"]{[color="#000000"]
[color="#000000"]S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
[color="#000000"]return(nand->NFDATA);[color="#000000"]
[color="#000000"]}
[color="#000000"]static inline void NF_Init_ECC(void)[color="#000000"]
[color="#000000"]{[color="#000000"]
[color="#000000"]S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
[color="#000000"]nand->NFCONF |= (1[color="#000000"]
[color="#000000"]}
[color="#000000"]static inline u32 NF_Read_ECC(void)[color="#000000"]
[color="#000000"]{[color="#000000"]
[color="#000000"]S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
[color="#000000"]return(nand->NFECC);[color="#000000"]
[color="#000000"]}
[color="#000000"]#endif
[color="#000000"]/*
[color="#000000"]* NAND flash initialization.[color="#000000"]
[color="#000000"]*/[color="#000000"]
[color="#000000"]#if (CONFIG_COMMANDS & CFG_CMD_NAND)[color="#000000"]
[color="#000000"]extern ulong nand_probe(ulong physadr);
[color="#000000"]
[color="#000000"]static inline void NF_Reset(void)[color="#000000"]
[color="#000000"]{[color="#000000"]
[color="#000000"]int i;
[color="#000000"]NF_SetCE(NFCE_LOW);[color="#000000"]
[color="#000000"]NF_Cmd(0xFF); /* reset command */[color="#000000"]
[color="#000000"]for(i = 0; i [color="#000000"]
[color="#000000"]NF_WaitRB(); /* wait 200~500us; */[color="#000000"]
[color="#000000"]NF_SetCE(NFCE_HIGH);[color="#000000"]
[color="#000000"]}
[color="#000000"]
[color="#000000"]static inline void NF_Init(void)[color="#000000"]
[color="#000000"]{[color="#000000"]
[color="#000000"]#if 0 /* a little bit too optimistic */[color="#000000"]
[color="#000000"]#define TACLS 0[color="#000000"]
[color="#000000"]#define TWRPH0 3[color="#000000"]
[color="#000000"]#define TWRPH1 0[color="#000000"]
[color="#000000"]#else[color="#000000"]
[color="#000000"]#define TACLS 0[color="#000000"]
[color="#000000"]#define TWRPH0 4[color="#000000"]
[color="#000000"]#define TWRPH1 2[color="#000000"]
[color="#000000"]#endif
[color="#000000"]NF_Conf((1[color="#000000"]
[color="#000000"]/*nand->NFCONF = (1[color="#000000"]
[color="#000000"]/* 1 1 1 1, 1 xxx, r xxx, r xxx */[color="#000000"]
[color="#000000"]/* En 512B 4step ECCR nFCE=H tACLS tWRPH0 tWRPH1 */
[color="#000000"]NF_Reset();[color="#000000"]
[color="#000000"]}
[color="#000000"]void[color="#000000"]
[color="#000000"]nand_init(void)[color="#000000"]
[color="#000000"]{[color="#000000"]
[color="#000000"]S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
[color="#000000"]NF_Init();[color="#000000"]
[color="#000000"]#ifdef DEBUG[color="#000000"]
[color="#000000"]printf("NAND flash probing at 0x%.8lX\n", (ulong)nand);[color="#000000"]
[color="#000000"]#endif[color="#000000"]
[color="#000000"]printf ("%4lu MB\n", nand_probe((ulong)nand) >> 20);[color="#000000"]
[color="#000000"]}[color="#000000"]
[color="#000000"]#endif
[color="#000000"]6 修改common/env_nand.c文件
[color="#000000"](1) 59行int nand_legacy_rw (struct nand_chip* nand, int cmd,
[color="#000000"]        size_t start, size_t len,
[color="#000000"]        size_t * retlen, u_char * buf);
[color="#000000"]后添加:
[color="#000000"]extern struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];[color="#000000"]
[color="#000000"]extern int nand_legacy_erase(struct nand_chip *nand, size_t ofs, size_t len, int clean);[color="#000000"]

[color="#000000"]并将下面的extern nand_info_t nand_info[];改为
[color="#000000"]extern nand_info_t nand_info[CFG_MAX_NAND_DEVICE];
[color="#000000"](2) 搜索saveenv找到(190行左右第二个saveenv函数):
[color="#000000"]#else /* ! CFG_ENV_OFFSET_REDUND */[color="#000000"]
[color="#000000"]int saveenv(void)
[color="#000000"]将saveenv函数中puts ("Erasing Nand...");后的if (nand_erase(&nand_info[0], CFG_ENV_OFFSET, CFG_ENV_SIZE))注释并添加
[color="#000000"]//if (nand_erase(&nand_info[0], CFG_ENV_OFFSET, CFG_ENV_SIZE))
[color="#000000"]if (nand_legacy_erase(nand_dev_desc + 0, CFG_ENV_OFFSET, CFG_ENV_SIZE, 0))[color="#000000"]

[color="#000000"]将saveenv函数中total = CFG_ENV_SIZE; 后的//ret = nand_write(&nand_info[0], CFG_ENV_OFFSET, &total, (u_char*)env_ptr);注释并添加:
[color="#000000"]ret = nand_legacy_rw(nand_dev_desc + 0,0x00 | 0x02, CFG_ENV_OFFSET, CFG_ENV_SIZE,&total, (u_char*)env_ptr);
[color="#000000"](3) 搜索env_relocate_spec找到第二个env_relocate_spec函数(270行左右):
[color="#000000"]找到函数中total = CFG_ENV_SIZE;
[color="#000000"]    将后面的ret = nand_read(&nand_info[0], CFG_ENV_OFFSET, &total, (u_char*)env_ptr);注释并添加:
[color="#000000"]    ret = nand_legacy_rw(nand_dev_desc + 0, 0x01 | 0x02, CFG_ENV_OFFSET, CFG_ENV_SIZE, &total, (u_char*)env_ptr);
[color="#000000"]7 编译uboot
[color="#000000"](1) make distclean
[color="#000000"](2) make qt2410e_config
[color="#000000"](3) make all ARCH=arm
[color="#000000"]将生成u-boot.bin镜像,可将其下载到板子运行。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/81653/showart_2013421.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP