用uboot烧写uboot

 

第一阶段 还可以这样

有多少种方式把uboot写到flash ?

1 可以用JTAG烧进flash,需要一只JTAG,连到板子上的JTAG口,PC上装个JLINK或H-JTAG,装什么视乎用的是什么JTAG芯片吧。然后需要与CPU和flash型号对应的配置文件。OK,可以烧写了。

2 从SD卡启动,SD卡上有uboot,启动到uboot命令行,再进行烧写。uboot当然是支持CPU和flash。

3 flash里本来有uboot,启动后,通过串口控制台发送新的uboot,写到flash里。


弄块新板子,需要调试一个新的uboot,适用1方法。2、3方法都需要已有uboot,适合uboot已经做好,就不用连接JTAG,更新方便。


今天遇到一种情况,123方法都不行。板子是已经写好uboot,但是不小心擦掉了,不是本部设计的,没有H-JTAG,没有配置文件,且板子设计缺陷不能从SD卡启动,123全不灵。同事有绝招:

1)用J-link连接板子跟PC,板子的调试串口跟PC连接

2)然后用J-link commander把uboot的前8K写到arm内置的ram里,内置ram只有32K,只能写uboot的一部分。用linux的dd命令截取uboot的前8K。内置ram起始地址就是0。(用到的命令loadbin)

3)执行uboot,外置的sram就会初始化可用;外置的sram一般挂在0x30000000. (用到的命令setpc, g)

4)然后再用commander把整个uboot加载到外置sram(用到的命令loadbin)

5)再执行uboot,进入uboot命令行。(用到的命令setpc, g)

6)然后再重新加载整个uboot到sram(防止前次加载的被意外修改),用nand write写到flash里。(用到的命令nand write) 这个是uboot命令,之前全是J-Link Commmander的命令

注:
H-JTAG跟J-Link功能差不多接口不一样。
J-Link通信的速度太慢可能不行,设快一点就OK。奇怪的事情天天有。


uboot前8K是什么?可能首要的是初始化外置SRAM,所以只烧前8K就有奇效。


 

第二阶段 原来是这样

nand驱动移植过程中,因为ECC搞错,误伤了很多好块。看懂了一点nand驱动代码以后,非常手欠,写了一段代码,擦除指定的块,并验证。结果字节地址没有处理当页地址用了,把第0个块给擦了,杯具了。哈哈,幸亏还有后手,可以用之前神奇的方法再重烧一遍uboot。烧一天,没成功!!

开始看uboot代码。以下是uboot启动时的log 

OK

U-Boot 1.3.4 (Nov  8 2011 - 23:28:39) for SMDK2416


CPU:   S3C2416@400MHz
       Fclk = 800MHz, Hclk = 133MHz, Pclk = 66MHz
Board: SMDK2416 DDR2
DRAM:    64 MB
Flash:   1 MB
NAND:    MLC(Auto).
****************************************
**    Urbetter sd/nand boot v0.10 
**    ShenZhen Urbetter Technology    
**    Http://www.Urbetter.com         
****************************************
2048 MB 
In:      serial
Out:     serial
Err:     serial
Hit any key to stop autoboot:  0 


 原以为前8K代码包括初始化DRAM。看了uboot代码,应该是初始化好,DRAM: 64 MB就会打印出来。之前只是打印了OK,离DRAM还早呢,之前属于瞎猫碰死耗子?

找到一份"Uboot中start.S源码指令级的详尽解释",对我这样的新手很有帮助。理解了uboot启动最初过程,上电自动开始运行,初始化好栈,初始化好RAM,就会调用C语言函数搬运uboot本身到指定的地址TEXT_BASE,再跳到TEXT_BASE运行。汇编代码很大部分是与位置无关的,靠相对PC的偏移量跳转,但是搬运uboot本身后到TEXT_BASE的跳转,是位置相关的。我用的三星板子,TEXT_BASE为33e00000,这个值是写死在代码中,跳转时取出。还有相关的一系列写死的值,如栈的位置等。所以在之前神奇的方法之中,使用loadbin命令时,必须要把uboot拷到33e00000这个位置执行才行

 

又直接试了一下,loadbin到33e00000,把前8k什么的都省了,uboot也可以运行起来。

 

 

 

 

你可能感兴趣的:(hardware)