今天解决了困扰我好几个月的问题了。这个问题本来应该在过年前就解决的,但是那个时候死活就是没招。
其实问题很简单:将u-boot下载到内存中,再使用cp命令将u-boot从内存复制到Nor Flash零地址处,之后就可以从新的u-boot启动了。网上说得很轻松,然而实际解决起来却不然。因为,我的Nor Flash是64Mbit的,即8MB。解决封装问题很轻松——开发板上的地址线预留出来了,可以扩大容量。使用并口下载的问题也解决了——到H-JTAG官方论坛上下载对应的配置文件。
不过,需要修改的代码却很多。这次移植跟网上的文章不同。我们是使用board目录下dave下面的两个flash.c文件合并到一起,再将Nor Flash的对应配置添加上去的。这个是在boss指导下进行的(我们在玩不同的板子,他的是2410)。
出错的现象很诡异:从内存复制到内存中,字节顺序没有发生变化,但从内存中复制到Flash中,字节顺序就反过来了,比如正确的数据是12 00 00 ea,但是复制到Flash中,却变成了ea 00 00 12(u-boot映像文件开头的4个字节)。我百思不得其解。难道是大端小端的问题?但又觉得不可能。
这次修改的地方有两处:
1、
再次认真学习datasheet,将操作命令序列对照一次,主要是地址及对应的数据,比如第一个Bus写周期的地址是555H,数据为AAH等等。结果还真找到错误来,原来将Block擦除和Sector擦除的地址反过来了。
2、
将这个文件中所有CONFIG_B2改成自己的配置宏定义。
这样总算解决了。
以前还有一个疑问,宏CONFIG_SYS_FLASH_ADDR0的定义为0x5555,这个第一个写周期(1st Bus Write Cycle)的地址,但是手册里的却是555H,我想了很久也没想通。今天再研究了一下,原来,手册里对这个地址的解释是:
Address format A10-A0(Hex).
Addresses A11-A21 can be VILor VIH, but no other value, for Command seqence for SST39VF640xB.
原来,地址格式是A10-A0而已,其它可以为高、低电平。这样,0x5555与555H在低11位来看是完全一样的。这样写可能是凑够一个字(32bit),利于代码而已。真正原理层次的东西,还没研究,也不想再研究了。这里的VIL和VIH分别为输入低电平和输入高电平,在我来看,就是0和1,即代码中的二进制。或者,在我们的角度来看没有数值上的区别吧,等作了试验才能知道结论。
另外,我也看了SST39VF6402的手册,里面的地址跟原来代码中的是一样的。可见,SST39VF6402与SST39VF6402B是不同的芯片——看Device ID也可以知道。
今天还有个好消息,开发板的64MB Nand Flash换成了128MB的了。这样,Nor Flash和Nand Flash都扩大容量了,我也白赚了一笔了。哈哈!
另外,过年前依据东山大哥在百问网公开的代码来做一下USB下载,结果不成功。由于版本差别太大了,许多函数、结构体都发生了很大的变化,改起来问题多多。不得不放弃,或者是暂时的,或者以后都不搞了。
2011-3-2 木草山人记