uboot

经过前两天的调试,现在将u-boot直接load到sdram中运行, 可以从串口读出如下信息:

U-Boot 2009.08-rc1 (Sep 26 2009 – 15:37:11)

DRAM:  64 MB
Flash: 512 kB
*** Warning – bad CRC, using default environment

UPTECH2410 #

显示的信息中存在一个 bad CRC的警告信息,这是由于在启动时,uboot会从flash中读取环境变量的信息,通常执行save或saveenv后,下次启动就不会出现此警告了.但是现在我的板子的nand flash还没有配置驱动程序.因此我们首先要将nand falsh 初始化。

nand flash 等大多数设备的初始化工作都是在uboot启动的第二阶段完成的,第二阶段的主函数是lib_arm/board.c,于是首先进入

board.c,然后顺着函数的调用过程找到drivers/mtd/nand/下的相关文件和函数,总结如下的初始化过程:

1 lib_arm/board.c 中的nand_init()首先调用drivers/mtd/nand/下的nand.c中的nand_init 函数

2 nand_init()调用本文件中的nand_init_chip()对nand进行初始化

3 nand_init_chip()调用board_nand_init(),board_nand_init()根据各个开发板的选择相应的函数.

4 nand_init_chip()接着调用nand_base.c中的nand_scan()

5 最后回到nand_init()函数,完成nand驱动的初始化过程.

根据上面的思路,首先在lib_arm/board.c中找到nand_init()函数部分:

#if defined(CONFIG_CMD_NAND)
        puts ("NAND:  ");
        nand_init();            /* go init the NAND */
#endif

因此我们首先要增加配置项:在include/configs/uptech2410.h中增加

#define CONFIG_CMD_NAND 1

重新编译uboot,报如下错误

stack-protector   -o nand.o nand.c -c
nand.c:34: error: ‘CONFIG_SYS_MAX_NAND_DEVICE’ undeclared here (not in a function)
nand.c:37: error: ‘CONFIG_SYS_NAND_BASE’ undeclared here (not in a function)
make[1]: *** [nand.o] Error 1
make[1]: Leaving directory `/home/bingc/work/myuboot/drivers/mtd/nand’
make: *** [drivers/mtd/nand/libnand.a] Error 2

显然,CONFIG_SYS_MAX_NAND_DEVICE 和CONFIG_SYS_NAND_BASE 没有声明,在uptech2410.h中 #define CONFIG_CMD_NAND 1 的下面继续增加两个宏定义.

#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE 0×4E000000

继续编译,出现如下错误信息:

drivers/mtd/nand/libnand.a(nand.o): In function `nand_init_chip’:
/home/bingc/work/myuboot/drivers/mtd/nand/nand.c:53: undefined reference to `board_nand_init’

这是在nand_init_chip函数中调用board_nand_init时没有找到函数的实现造成的.利用ctags工具,找到很多和开发板相关的board_nand_init()的实现,如atmel_nand.c、divinci_nand.c,s3c2410_nand.c等文件中都有定义,但是通过上面的编译过程都没有生成这些文件的.o文件.起初我在nand.c中添加#include<s3c2410.h>,结果可想而知了,相信大家不会犯这样的错误……

正确的做法自然是查看该目录下的Makefile文件,分析里面的依赖关系:libnand.a->LIB->OBJS->COBJS,看到如下内容:

COBJS-$(CONFIG_NAND_ATMEL) += atmel_nand.o
COBJS-$(CONFIG_DRIVER_NAND_BFIN) += bfin_nand.o
COBJS-$(CONFIG_NAND_DAVINCI) += davinci_nand.o
COBJS-$(CONFIG_NAND_FSL_ELBC) += fsl_elbc_nand.o
COBJS-$(CONFIG_NAND_FSL_UPM) += fsl_upm.o
COBJS-$(CONFIG_NAND_KIRKWOOD) += kirkwood_nand.o
COBJS-$(CONFIG_NAND_MPC5121_NFC) += mpc5121_nfc.o
COBJS-$(CONFIG_NAND_NDFC) += ndfc.o
COBJS-$(CONFIG_NAND_NOMADIK) += nomadik.o
COBJS-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o
COBJS-$(CONFIG_NAND_S3C64XX) += s3c64xx.o
COBJS-$(CONFIG_NAND_OMAP_GPMC) += omap_gpmc.o
COBJS-$(CONFIG_NAND_PLAT) += nand_plat.o

从这里我们应该清楚了,我们要得到s3c2410_nand.o,就需要定义CONFIG_NAND_S3C2410这个宏.于是在/include/configs

/uptech2410.h中添加:

#define CONFIG_NAND_S3C2410 1

继续编译通过,然后同过AXD+JTAG下载到sdram中运行,串口正常输出:

U-Boot 2009.08-rc1 (Sep 28 2009 – 16:29:33)

DRAM:  64 MB
Flash: 512 kB
NAND:  64 MB
*** Warning – bad CRC, using default environment

UPTECH2410 #

UPTECH2410 # nand info

Device 0: NAND 64MiB 3,3V 8-bit, sector size 16 KiB
UPTECH2410 # nand read
nand – NAND sub-system

Usage:
nand info – show available NAND devices
nand device [dev] – show or set current device
nand read – addr off|partition size
nand write – addr off|partition size
    read/write ’size’ bytes starting at offset ‘off’
    to/from memory address ‘addr’, skipping bad blocks.
nand erase [clean] [off size] – erase ’size’ bytes from
    offset ‘off’ (entire device if not specified)
nand bad – show bad blocks
nand dump[.oob] off – dump page
nand scrub – really clean NAND erasing bad blocks (UNSAFE)
nand markbad off [...] – mark bad block(s) at offset (UNSAFE)
nand biterr off – make a bit error at offset (UNSAFE)
UPTECH2410 #

至此,nand驱动装完成,按理可以对nand flash进行读写操作,于是保存环境变量

UPTECH2410 # saveenv
Saving Environment to Flash…
Un-Protected 1 sectors
Erasing Flash…Erasing sector 10 … ok.
Erased 1 sectors
Writing to Flash… Flash not Erased
Protected 1 sectors
UPTECH2410 #

“写保护”,于是help,找到protect off 命令

UPTECH2410 # protect off all
Un-Protect Flash Bank # 1

UPTECH2410 # protect off bank 2
Only FLASH Banks # 1 … # 1 supported

一时还真不知道咋办了,于是将整个nand flash earse后再保存,发现在0×00b000000有坏块,查看

#define CONFIG_ENV_SIZE         0×10000 /* Total Size of Environment Sector */
#define CONFIG_ENV_OFFSET       0X40000

保存的环境变量也不会在那位置,于是在网上搜索,都没有看到想要的。为什么只有bank #1 才支持取消保护属性,是不是调用了上面的flash 512Kb 那个,查看common目录下的Makefile

COBJS-y += env_common.o
COBJS-$(CONFIG_ENV_IS_IN_DATAFLASH) += env_dataflash.o
COBJS-$(CONFIG_ENV_IS_IN_EEPROM) += env_eeprom.o
COBJS-$(CONFIG_ENV_IS_EMBEDDED) += env_embedded.o
COBJS-$(CONFIG_ENV_IS_IN_EEPROM) += env_embedded.o
COBJS-$(CONFIG_ENV_IS_IN_FLASH) += env_embedded.o
COBJS-$(CONFIG_ENV_IS_IN_NVRAM) += env_embedded.o
COBJS-$(CONFIG_ENV_IS_IN_FLASH) += env_flash.o
COBJS-$(CONFIG_ENV_IS_IN_MG_DISK) += env_mgdisk.o
COBJS-$(CONFIG_ENV_IS_IN_NAND) += env_nand.o
COBJS-$(CONFIG_ENV_IS_IN_NVRAM) += env_nvram.o
COBJS-$(CONFIG_ENV_IS_IN_ONENAND) += env_onenand.o
COBJS-$(CONFIG_ENV_IS_IN_SPI_FLASH) += env_sf.o
COBJS-$(CONFIG_ENV_IS_NOWHERE) += env_nowhere.o

然后推到common目录,发现有env_flash.o,但没有找到env_nand.o,查看include/configs/uptech2410.h,看到下面的宏:

#define CONFIG_ENV_IS_IN_FLASH  1
#define CONFIG_ENV_SIZE         0×10000 /* Total Size of Environment Sector */
#define CONFIG_ENV_OFFSET       0X40000

结合前面common目录下的Makefile,于是把#define CONFIG_ENV_IS_IN_FLASH  1改为#define CONFIG_ENV_IS_IN_NAND 1

继续load到SDRAM中运行,这次可以保存环境变量信息了:

U-Boot 2009.08-rc1 (Sep 29 2009 – 10:04:24)

DRAM:  64 MB
Flash: 512 kB
NAND:  64 MB
*** Warning – bad CRC or NAND, using default environment

UPTECH2410 # save
Saving Environment to NAND…
Erasing Nand…
Erasing at 0×4c000 –   0% complete.
Writing to Nand… done
UPTECH2410 #

reset 后,再加载到SDRAM中运行:

U-Boot 2009.08-rc1 (Sep 29 2009 – 10:04:24)

DRAM:  64 MB
Flash: 512 kB
NAND:  64 MB
UPTECH2410 #

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值