uboot就是在内核运行前的一段小程序,用来初始化硬件设备,建立内存空间映射图。从而将系统的软硬件带到合适的状态,主要功能就是为了启动内核,它将内核从flash中拷贝到ddr中,然后跳转到内核入口中,交由内核控制权,uboot严重依赖硬件,因此一个通用的uboot不太可能。
flash一般是依次存储 bootloader,boot启动参数,kernel,文件系统。
bootloader启动过程可分单阶段和多阶段。
多阶段能实现更复杂的功能,可分stage1 和stage2;stage1完成初始化硬件,为stage2准备内存空间。
将stage2复制到内存中,设置堆栈然后跳转到stage2中。主要由汇编实现。start.s函数
stage2初始化本阶段要使用的硬件设备,检测内存映射,将kernel和根文件系统映像拷贝到内存中,为内核设置启动参数。调用内核。主要由c语音实现。

先学习下编程器固件里面的内容:
编程器固件中包含uboot、fw和art。
uboot就像电脑的bios,是底层的管理系统;
fw就像电脑的操作系统,实现路由器的各种功能;
art就像电脑的无线驱动程序,是无线校验码;
uboot的长度为128KB(0x20000);art为64KB(0x10000);fw有2M(特别注意:一些路由器原厂固件是2M的!!)、4M和8M的区别,2M的为2048K(0x1c0000),4M的为3840K(0x3c0000),8M的为7936KB(0x7c0000)。在刷机之前要对要刷入flash的uboot、fw、art的文件长度用ultraedit或winhex进行校验。尤其是uboot,如果大小不对,千万不要尝试刷入,那是一定会变砖的。

uboot、fw和art在flash中的位置如下:
4M的FLASH:flash地址从0x000000~0x3FFFFF
ttl访问flash的地址从0x9F000000~0x9F3FFFFF


flash起始地址

TTL起始地址

flash终止地址

TTL终止地址

uboot

0X000000

0X9F000000

0X01FFFF

0X9F01FFFF

fw

0X020000

0X9F020000

0X3DFFFF

0X9F3DFFFF

art

0X3F0000

0X9F3F0000

0X3FFFFF

0X9F3FFFFF



b1b51828bcd126fff7050b41?pn=1&x=0&y=0&ra



8M的FLASH:flash地址从0x000000~0x7FFFFF
ttl访问flash的地址从0x9F000000~0x9F7FFFFF


flash起始地址

TTL起始地址

flash终止地址

TTL终止地址

uboot

0X000000

0X9F000000

0X01FFFF

0X9F01FFFF

fw

0X020000

0X9F020000

0X7DFFFF

0X9F7DFFFF

art

0X7F0000

0X9F7F0000

0X7FFFFF

0X9F7FFFFF



b1b51828bcd126fff7050b41?pn=1&x=0&y=145&


准备工作
1、从PCB版上上引出TTL线,一般有三根:TX RX和GND,对应主板上的标记,应该是TP-IN,TP-OUT,主板上焊点较大、覆盖面积较广的一般就是GND,有USB的,外壳连接的就是GND,可以从这些地方引出。
2、USB-TTL板或串口TTL板,装好驱动,在设备管理器中查出该设备占用的COM端口号,并将其属性设置中的速率改为115200
3、电脑IP设置192.168.1.2,网关255.255.255.0,掩码192.168.1.1,网线连接路由器LAN口和电脑网线接口。
4、需要的软件PUTTY。连接好TTL,打开PUTTY,点串口,端口改为上部查出的COM端口号,速率选择115200,点确定。如果接上路由器电源以后不出码,请交换ttl的Tx和Rx两线;如果出乱码,请查COM端口的速率是不是都是115200。
5、需要的软件tftp32。将固件放到tftp32同一目录,打开ftfp32,一般默认的server interface就已经是你的网卡IP地址(对于路由器uboot的远端地址不是192.168.1.2的,请按照5楼hhhjjj159 所说的,在TTL中断系统启动以后,输入setenv ipaddr 192.168.1.1;setenv serverip 192.168.1.*(电脑IP地址)命令)。
TTL刷固件的命令
了解以上地址信息以后,就可以利用以上信息在不拆FLASH的情况下利用TTL向FLASH写入编程器固件或者其中的某一部分。

在插上路由器电源,屏幕开始出码的时候,迅速点击T、P、L三个字母,会中断系统的启动,光标停在提示符下,这时就可以输入刷固件的命令了。
命令如下:

2M的:


刷编程器固件:
tftp 0x80000000 full.bin
erase 0x9f000000 +0x200000
cp.b 0x80000000 0x9f000000 0x200000
刷uboot:
tftp 0x80000000 uboot.bin
erase 0x9f000000 +0x20000
cp.b 0x80000000 0x9f000000 0x20000
刷fw:
tftp 0x80000000 fw.bin
erase 0x9f020000 +0x1c0000
cp.b 0x80000000 0x9f020000 0x1c0000
刷art:
tftp 0x80000000 art.bin
erase 0x9f1f0000 +0x10000
cp.b 0x80000000 0x9f1f0000 0x10000



4M的:


刷编程器固件:
tftp 0x80000000 full.bin
erase 0x9f000000 +0x400000
cp.b 0x80000000 0x9f000000 0x400000
刷uboot:
tftp 0x80000000 uboot.bin
erase 0x9f000000 +0x20000
cp.b 0x80000000 0x9f000000 0x20000
刷fw:
tftp 0x80000000 fw.bin
erase 0x9f020000 +0x3c0000
cp.b 0x80000000 0x9f020000 0x3c0000
刷art:
tftp 0x80000000 art.bin
erase 0x9f3f0000 +0x10000
cp.b 0x80000000 0x9f3f0000 0x10000



8M的:


刷编程器固件:
tftp 0x80000000 full.bin
erase 0x9f000000 +0x800000
cp.b 0x80000000 0x9f000000 0x800000
刷uboot:
tftp 0x80000000 uboot.bin
erase 0x9f000000 +0x20000
cp.b 0x80000000 0x9f000000 0x20000
刷fw:
tftp 0x80000000 fw.bin
erase 0x9f020000 +0x7c0000
cp.b 0x80000000 0x9f020000 0x7c0000
刷art:
tftp 0x80000000 art.bin
erase 0x9f7f0000 +0x10000
cp.b 0x80000000 0x9f7f0000 0x10000




在自己路由器实验过了,如有错误,请批评指正!谢谢!





1.命令行刷系统

固件传至/tmp

  1. cd /tmp

  2. cat /proc/mtd

  3. dev: size erasesize name

  4. mtd0: 00020000 00010000 “u-boot”

  5. mtd1: 000e01c4 00010000 “kernel”

  6. mtd2: 002efe3c 00010000 “rootfs”

  7. mtd3: 00060000 00010000 “rootfs_data”

  8. mtd4: 00010000 00010000 “art”

  9. mtd5: 003d0000 00010000 “firmware”

从上面的命令可以得知,mtd5是 firmare

#使用mtd更新系统

  1. mtd -r write factory.bin firmware

#使用sysupgrade更新系统,推荐。

  1. sysupgrade factory.bin

2.ttl刷新编程器固件、fw、uboot、art

4M的:

刷编程器固件:

  1. tftp 0x80000000 full.bin

  2. erase 0x9f000000 +0x400000

  3. cp.b 0x80000000 0x9f000000 0x400000

刷uboot:

  1. tftp 0x80000000 uboot.bin

  2. erase 0x9f000000 +0x20000

  3. cp.b 0x80000000 0x9f000000 0x20000

刷fw:

  1. tftp 0x80000000 fw.bin

  2. erase 0x9f020000 +0x3c0000

  3. cp.b 0x80000000 0x9f020000 0x3c0000

刷art:

  1. tftp 0x80000000 art.bin

  2. erase 0x9f3f0000 +0x10000

  3. cp.b 0x80000000 0x9f3f0000 0x10000

8M的:

刷编程器固件:

  1. tftp 0x80000000 full.bin

  2. erase 0x9f000000 +0x800000

  3. cp.b 0x80000000 0x9f000000 0x800000

刷uboot:

  1. tftp 0x80000000 uboot.bin

  2. erase 0x9f000000 +0x20000

  3. cp.b 0x80000000 0x9f000000 0x20000

刷fw:

  1. tftp 0x80000000 fw.bin

  2. erase 0x9f020000 +0x7c0000

  3. cp.b 0x80000000 0x9f020000 0x7c0000

刷art:

  1. tftp 0x80000000 art.bin

  2. erase 0x9f7f0000 +0x10000

  3. cp.b 0x80000000 0x9f7f0000 0x10000








u-boot系统启动流程 大多数bootloader都分为stage1stage2两部分,u-boot也不例外。


依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。



  1Stage1 start.S代码结构 u-bootstage1代码通常放在start.S文件中,他用汇编语言写成,其主要代码部分如下



(1) 定义入口。: 


该工作通过修改连接器脚本来完成。


2)设置异常向量(Exception Vector)。 


3)设置CPU的速度、时钟频率及终端控制寄存器。 


4)初始化内存控制器。 


5)将ROM中的程序复制到RAM中。 


6)初始化堆栈。 


7)转到RAM中执行,该工作可使用指令ldr pc来完成。



2Stage2


 C语言代码部分 lib_arm/board.c中的start arm bootC语言开始的函数也是整个启动代码中C语言的主函数,同时还是整个u-bootarmboot)的主函数,该函数只要完成如下操作: 


1)调用一系列的初始化函数。 


2)初始化Flash设备。 


3)初始化系统内存分配函数。 


4)如果目标系统拥有NAND设备,则初始化NAND设备。 


5)如果目标系统有显示设备,则初始化该类设备。 


6)初始化相关网络设备,填写IPMAC地址等。 


7)进去命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。