- 论坛徽章:
- 0
|
[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 |
|