嵌入式的几种固件烧录方式
1. 名词说明
1.1 什么是固件
固件,也成为firmware。下面引用百度的定义:
固件(firmware)一般存储于设备中的电可擦除只读存储器EEPROM(Electrically Erasable Programmable ROM)或FLASH芯片中,一般可由用户通过特定的刷新程序进行升级的程序。一般来说,担任着一个数码产品最基础、最底层工作的软件才可以称之为固件,比如计算机主板上的基本输入/输出系统BIOS(Basic Input/output System),在以前其实更多的专业人士叫它固件。
我的理解为:固件其实就是放在存储介质上的数据,当嵌入式板子启动时,能够从特定的位置找到这些文件,使得板子能够跑起来,这些文件就是固件。那么在嵌入式linux系统中,经常用到的文件如下:
- uboot:如uboot.bin
- kernel:如uImage
- rootfs:如system.yaffs2文件
嵌入式板子上电后,会去特定的位置寻找uboot,uboot初始化内存,初始化串口,设置linux启动参数以后,会将内核从flash中加载到内存。然后内核会去挂载根文件系统并启动init。所以上面所说的三种文件可以理解为固件。
1.2 什么是烧录?
烧录的意思是将一些嵌入式启动所必须的硬件下载到嵌入式的储存设备中,这可能是norflash, 有可能是nandflash,也有可能是SD卡。当这些固件烧录到储存器中,板子下次启动的时候,直接从这些储存器中找到这些文件,嵌入式系统就能够直接跑起来。
2. 烧录哪几个固件
2.1. 开发过程中固件的烧写
2.1.1 只烧录uboot,其他的固件不用烧录?
答案是可以的 。当我们只烧录uboot后,进入uboot模式下,我们可以通过uboot模式下的命令来加载kernel和rootfs。在uboot模式下,我们使用tftp mem_addr kernel_file来加载内核,然后通过nfs来加载rootfs。这样做的前提是你的PC机提供tftp和nfs服务,并且你的开发板需要和PC机在同一网络下。这样做有一个缺点,每次板子上电时都需要去敲命令来加载内核以及nfs。
2.1.2 烧录uboot和内核,rootfs以nfs的形式挂载到PC机上
在开发过程中经常用到的是这种方案。只烧录uboot和kernel,在板子启动时,内核会通过nfs去PC机上寻找文件系统。这种方式有的时候可能会导致系统起来比较慢,可能是因为网络状况不好,这样可能会影响你的体验。
2.1.3 烧录uboot、kernel、rootfs
在常见的烧录方式是将这三个文件全部烧录到板子里,且内核需要支持nfs协议。板子能够从自己的存储器中将系统启动起来而不需要依赖网络。板子启动后,可以利用mount命令,将某一目录挂载到PC机上。当应用程序更新后,只需要将可执行文件拷贝到nfs目录下,板子就可以进行调试了。之前做个某创的FreeRtos项目,调试非常的麻烦,每次程序更新后就需要烧录系统,烧录一次需要5分钟,把脾气都磨没了。linux的调试还是很人性化的。
2.2. 产品发布后的固件升级方式
产品发布后升级固件一般有下面两种方式
-
对于Nand Flash或者Nor Flash,通过MTD的工具,即mtd-util中的nandwrite等,操作/dev/mtdN将新的固件写入进去
-
对于SD/MMC,通过操作/dev/mmc设备,将新的固件写入进去
这个部分等后面会专门讲到mtd升级固件的方法。
3. 将固件烧录到存储介质张得方式
3.1 通过uboot烧录(两步到位)
有这么几种情形可以使用uboot进行烧录
-
内核损坏
-
文件系统加载不了
-
存储介质的uboot损坏
就一句话:只要你的uboot起来,你就可以用这种方式来烧录系统。uboot起来就可以通过存储器起来,也可以通过SD卡起来。比如你之前的存储在inand里面的uboot被擦除了,那么此时你的系统是铁定跑步起来的,那么怎么办呢?你可以通过制作一张SD 卡,卡里面放油可以运行的uboot,将嵌入式板子的启动方式打到外部的SD卡启动,那么此时只要你的SD里的uboot启动了,你就可以通过uboot下的工具将内核镜像和文件系统烧录到存储器中。比如使用工具fastboot。(当然你也可以只用一步到位的方式进行烧录)
3.2 通过USB烧录(一步到位)
在工厂量产的环境下,使用USB烧录是做有效也是最简洁的方式。将三个镜像文件准备好,使用特定的烧录工具,将三个文件直接烧录到存储器中。如君正的clone工具。
注释:
linux启动和烧录的区别:linux启动是指linux以哪种方式启动,如从norflash中启动,从inand中启动,从SD卡启动等,可以理解为从哪个地方启动表明uboot放在哪个存储器中。这个是启动而已,但是并不代表启动就一定能够成功。有可能启动到uboot阶段,发现kernel被破坏了。系统起不起来。这个时候就需要重现烧录系统。而l烧录是指将这些固件下载到嵌入式的存储器中。这个两个概念。但是在linux启动uboot后,我们可以通过uboot的命令来烧录系统。