前言
一般嵌入式 会用 flash 作为 uboot 的容器
所以烧写uboot 就是将 uboot 的二进制程序写入 flash
而烧写flash 需要 flash 驱动,所以烧写成功,肯定存在flash驱动.
- 除了本篇文章,还可以参考 MCU的下载方式
1/在裸板上烧写uboot
大多都是利用了板端的jtag接口(不包括hitool和烧写器),利用 将PC端的 软件将 uboot文件传递给jtag接口,然后板端将得到的数据直接烧写到flash中.
这个过程中 其实是分步骤的一般是
1.将flash驱动及烧写算法通过jtag接口写入内存
2.将数据写入内存
3.执行算法将内存中的数据写入flash.
- 通过jlink套件(利用jtag接口)
套件包括软件(jlink软件和jflash软件)和硬件(jlink)
1/硬件联通
2/jlink软件
//testwspeed
//speed 115200
3/jflash软件
//配置 .jflash 文件
//connect program
- 注意: 需要jlink套件 支持该soc,即有相应的 .jflash 文件,或者自己编写这个文件.
-
烧写器(直接和flash芯片交互)
烧写器大多需要将芯片吹下来放到烧写器上烧写,浪费时间和生命.但有些烧写器支持不用吹下来的烧写.
这个过程中 其实是分步骤的一般是 1.烧写器启动 2.将数据写入烧写器内存 3. 烧写器调用驱动(烧写器固件中)将内存中的数据写入flash.
所以要烧写器固件支持烧写改款flash
-
芯片厂商提供的软件
这个过程中 其实是分步骤的一般是 1.芯片从bootrom启动(芯片中固化了bootrom,只要是芯片出厂就会固化,注意,不是uboot) 2.等待上位机的连接 3.连接成功 4.上位机通过接口(看芯片厂商提供什么接口)发送数据到内存. 5.bootrom调用bootrom 中的驱动将内存中的数据写入flash
所以这个方式也需要芯片厂商提供的 bootrom 支持 什么 flash.肯定要支持接口驱动程序(例如串口)
烧写方式还有另一种可能 1.芯片从bootrom启动(芯片中固化了bootrom,只要是芯片出厂就会固化,注意,不是uboot) 2.等待上位机的连接 3.连接成功 4.上位机通过接口(看芯片厂商提供什么接口)发送数据(一般是uboot)到内存. 5.交付控制权给uboot,uboot启动 6.uboot 开始自己烧写自己(目前启动的uboot)到flash
这种方式不需要芯片厂商提供的 bootrom flash.但肯定要支持接口驱动程序(例如串口),另外uboot 肯定要支持该 flash
海思厂商
- hitool(通过串口)
hitool是海思提供的一个工具,用来通过串口实现和海思的芯片交互
海思的芯片里面有一个bootrom
1/可以通过boot_sel、bootrom、NFBOOT_PIN 管脚配置从bootrom启动
2/启动之后,会对串口进行检测,如果有数据发来,会接收数据并写到sram,根据数据初始化sdram,然后初始化内存,并重定位uboot,然后从内存启动
3/主机发送flash烧写命令给从内存启动的uboot
4/uboot将内存中的数据烧写到flash
注意:
1/boot_sel、bootrom、NFBOOT_PIN配置从bootrom启动
2/uboot支持所对应的ddr,因为要烧写到sdram里面,所以肯定要初始化
3/串口一定保证能正常使用
4/uboot必须支持flash,因为要烧写uboot到flash
jz2440提供的工具
(通过jtag)
- oflash软件 和 硬件openjtag
- oflash 是基于s3c2440的jz2440做的通过jtag接口烧写软件的软件
- 要配套openjtag
2/通过uboot烧写uboot
烧写方式一般是 1.芯片从uboot启动 2.uboot 通过接口接收数据放入内存(接口可以是串口,网络,usb) 3. uboot 调用uboot 自身的 flash驱动 写flash
- 串口
loady
- 网络
tftp
nfs
- usb接口
- dnw
- dnw是三星推出的一个工具,通过usb传输文件的一个工具
- 使用三星提供的一个uboot启动,并设置其uboot等待usb接口来的数据
- 用dnw工具将uboot.bin从pc机上传送给板端的USB接口.
- 板端接收usb接口的数据并放入内存,直至接收完成.
- uboot将内存中的uboot.bin烧入flash
3/通过文件系统烧写uboot
flash 一般有分区 uboot bootargs kernelImage rootfs ,此时需要调用 linux内核的flash 驱动程序将 uboot 分区 擦除,并写入另一个uboot. 如果linux 能挂载文件系统成功,即能启动成功,肯定有该 flash 的驱动程序.但是如果 写 一个新的 flash 就不好说了.
在linux的shell中烧写uboot/kernel
mtd write命令是自定义的烧写flash命令。
1/
//烧写uboot ,/dev/mtd0 是bootloader 的特定分区
mtd write u-boot.bin /dev/mtd0
2/
//烧写kernel, mtd1 是kernel的特定分区
mtd write vmlinux.elf /dev/mtd1
3/
//重启
reboot