一年前,学习使用u-boot时候用它的Yaffs功能烧写一个96M的Yaffs镜像,结果在tftp到内存中一半卡死。细分析原因是内存一共64M,你要把一个96M的镜像下载到内存中去。那不得撑死。网上找不到答案,就觉得是自己发现一个大的bug,但是又不会移植。就向当时用的u-boot的原创Tekkmannaja发邮件求助。他很仔细的答复了,并指出了解决了解决方案。我一边激动一边无奈。激动的是大牛回信了,无奈的是我根本就没有移植成功过u-boot,看他的说的头头是道。可我还是无从下手。当时就这样放到那了。
时隔一年,再来看这个问题,再翻开他回的邮件,这次看感觉清晰一点了。这次再不做出来点啥。可真是说不过去了。主要是tftp接收到数据后,如果地址是flash中的就烧到flash中去。这样就没有大小限制了。除非镜像比flash还大,那谁都没有办法。
主要看的是net/tftp.c中的CONFIG_SYS_DIRECT_FLASH_TFTP宏之间的内容。仔细看看了,在板级配置文件中加上这个宏之后,这个宏里边的内容执行不执行就靠地址来地址范围来判断的。那就加上这个宏直接下载到0地址处看会怎么样。测试的三次终于可以,这个只是测试烧写到NorFlash,重点是NandFlash。还要更改CONFIG_SYS_DIRECT_FLASH_TFTP宏之间的内容为NandFlash写入。
SMDK2440 # tftp 0 6Ubootnand.bin
dm9000 i/o: 0x20000000, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 00:01:02:03:04:05
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.229; our IP address is 192.168.1.230
Filename '6Ubootnand.bin'.
Load address: 0x0
Loading: T #Can't write to protected Flash sectors
SMDK2440 # protect off all
Un-Protect Flash Bank # 1
SMDK2440 # tftp 0 6Ubootnand.bin
dm9000 i/o: 0x20000000, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 00:01:02:03:04:05
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.229; our IP address is 192.168.1.230
Filename '6Ubootnand.bin'.
Load address: 0x0
Loading: T #Flash not Erased
T SMDK2440 # erase 0 3ffff
Erasing sector 0 ... ok.
Erasing sector 1 ... ok.
Erasing sector 2 ... ok.
Erasing sector 3 ... ok.
Erasing sector 4 ... ok.
Erasing sector 5 ... ok.
Erasing sector 6 ... ok.
Erased 7 sectors
SMDK2440 # tftp 0 6Ubootnand.bin
dm9000 i/o: 0x20000000, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 00:01:02:03:04:05
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.229; our IP address is 192.168.1.230
Filename '6Ubootnand.bin'.
Load address: 0x0
Loading: T #T ######T ###
done
Bytes transferred = 146292 (23b74 hex)
SMDK2440 # OKstage_on: going to jump o start_armboot....
U-Boot 2009.11 ( 3月 11 2013 - 10:13:31)
DRAM: 64 MB
Flash: 2 MB
NAND: 256 MiB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: dm9000
Hit any key to stop autoboot: 0
SMDK2440 #
后记:NandFlash中主要根文件系统需要这样烧写,其它都不需要。这样的话,这里还要改成nand.yaffs中里边的烧写函数了。有点复杂,但是这次一定要做出来。以下是u-boot里边对这个宏的解释。
- CONFIG_SYS_DIRECT_FLASH_TFTP:
Enable TFTP transfers directly to flash memory;
without this option such a download has to be
performed in two steps: (1) download to RAM, and (2)
copy from RAM to flash.
The two-step approach is usually more reliable, since
you can check if the download worked before you erase
the flash, but in some situations (when system RAM is
too limited to allow for a temporary copy of the
downloaded image) this option may be very useful.