您的位置:首页 > 其它

嵌入式开发中固件的烧录方式

2013-02-20 19:36 176 查看

3.1.2. 将kernel,rootfs,uboot等烧写到存储介质上的方式

SidebarPrev | Up | Next

3.1.2.2. 两步到位:先写到内存,再用uboot的命令写到存储介质上

3.1.2.2.1. 如何把文件或数据下载到内存中
3.1.2.2.1.1. USB3.1.2.2.1.2. RS2323.1.2.2.1.3. NIC/network3.1.2.2.1.4. SD/MMC3.1.2.2.1.5. JTAG == debug tool
3.1.2.2.2. 如何把内存中的数据,写入到对应存储设备上
3.1.2.2.2.1. Nand Flash3.1.2.2.2.2. Nor Flash3.1.2.2.2.3. USB3.1.2.2.2.4. SD/MMC

3.1.2.2.1. 如何把文件或数据下载到内存中

3.1.2.2.1.1. USB3.1.2.2.1.2. RS2323.1.2.2.1.3. NIC/network3.1.2.2.1.4. SD/MMC3.1.2.2.1.5. JTAG == debug tool

下表简单总结了,如何将数据通过硬件接口+相关软件,下载到Uboot中的方式:

Table 3.2. 将文件下载到Uboot中的方式

开发板上的硬件接口软件协议相关软件或Uboot中的命令说明
USBUSB Host – USB Mass Storage
Fatls usb 0
fatload usb addr file

USB cable

Board has USB Host

USB Slave/DeviceDNWUSB cable

Board has USB Slave

RS232Kermit/Ymodemloadb/loadyRS232 Cable
NICTftptftp filenetwork interface card

Server has tftp service

NFSNFSnetwork interface card

Server has NFS service

Network cable

switch

SD/MMCSD/MMC
Fatls mmc 0
Fatload mmc 0 addr file

JTAGJTAGIDE toolHardware debug tool

IDE support Load file into Memory

下面,对每一种方式进行详细的阐述:

3.1.2.2.1.1. USB

1. USB Host = USB Mass Storage = U Disk2. USB Slave = USB Device

关于USB Host和USB Device,上面已经名词解释过了,此处不再赘述。

现在很多开发板上,都有USB的Host和USB的Device的接口。所以,对应着,可以实现,外接U盘到开发板上,或者将开发板作为U盘连到PC上,然后操作U盘,把文件拷贝到U盘里,实现对应的把文件数据传输到开发板上这一功能。

1. USB Host = USB Mass Storage = U Disk

目标
把插在开发板上的U盘中的文件,拷贝Uboot的内存中

前提

硬件

开发板上有USB Host芯片和接口
以我这里的TQ2440的板子为例,用的CPU是三星的S3C2440,其中包含了一个OHCI的USB Host主控制器。

板子上也有USB Host接口。

自己有U盘

软件

Uboot中已经实现了USB Host Controller的驱动
如果Uboot中没有你的板子上的USB Host Controller的驱动的话,需要自己移植,甚至从头实现的话,这个工作量和难度,还是不小的。

以此处的S3C2440的驱动为例,此处已经把新的版本的Uboot中的相关代码,移植到了TQ2440的1.1.6的uboot中,实现了对应的S3C2440的OHCI的驱动。

相关过程和源码,参考:[2]

U盘的文件系统是FAT格式的
如果你的U盘是NTFS等其他格式,那么要重新格式化为FAT16/FAT32格式。

当然,如果是其他的文件系统,比如ext2等,也是可以的,下面对应的命令就是ext2lsext2load了。

如何操作
在Uboot中使用对应命令来操作U盘:

usb rescan
去初始化usb host。关于usb 子系统更多的相关的命令,可以通过

help usb

看到更多的帮助信息。

fatls usb 0
将你U盘的FAT文件系统中的文件列出来,以确保USB现在可以正常工作,和知道你当前U盘里面有哪些文件,此时应该可以看到你所要拷贝的文件,如果你是把文件放在根目录的话。(一般都是把u-boot.bin等文件,放到U盘根目录的)

fatload usb 0 mem_addr file_name
去将U盘中的文件file_name载入到内存中mem_addr的位置。

2. USB Slave = USB Device

目标
将PC端的文件,通过USB线,传输到作为USB Device端的开发板上的Uboot的内存中

前提

硬件

板子上有对应的USB Device功能的controller和对应的USB Device接口

软件

PC端已经安装了对应的USB相关驱动
PC端需要有对应的DNW软件
Uboot中实现了对应的命令
以TQ2440为例,其中已经有了usb slave 相关功能和命令

如何操作
具体的操作,相对比较麻烦,此处只列出主要步骤:

去Uboot端执行对应的usb slave命令
以等待PC主机端传输文件

去PC端用DNW去传输文件
USB Port -> Transmit -> 选择要传输的文件

然后对应的文件就可以传输到对应的Uboot中的内存中去了。

更多的细节,如何操作,请参看TQ2440的手册:[3]

在此,免费为天嵌的TQ2440宣传一句,其资料和相关文档,做的是蛮不错的,东西很全,很详细,尤其适合初学者。

3.1.2.2.1.2. RS232

1. Kermit2. Ymodem

RS232的连接方式,是最常见的。

即,开发板上有串口接口,然后接了根RS232线,连到PC端,然后PC端用一个串口终端程序,连接开发板,比如常见的Windows XP系统自带的超级终端Hyper Terminal,功能强大的SecureCRT,以及Putty等等,都是不错的串口工具。

其中关于如何在Win7下面使用超级终端(Hyper Terminal),不了解的可以去参考:[11]

1. Kermit

Kermit是一种协议,广泛使用的协议,用来传输文件和数据的协议,很早之前就有了此协议,所以现在很多地方都已实现和支持此协议。

关于Kermit和Ymodem的详情,去看我转的帖子:[4]

而关于Kermit,XModem,Ymodem和Zmodem之间的区别和联系,可以去看:[5]

目标
通过Kermit协议,将文件通过RS232接口传送到Uboot的内存中

前提

硬件

开发板中有RS232接口,并且已连接到PC端

软件

Uboot中已经实现kermit协议的loadb命令
这个,一般的uboot中都已实现。

此处说一个诡异的事情,之前遇到过,即使help中没有看到loadb的命令,但是实际也是支持loadb的,估计是uboot开发者,把此命令注释掉了,但是实际kermit协议用途太广泛,而uboot本身程序中早已经实现了,所以loadb还是已经在uboot中的了。

如何操作

在uboot中,输入loadb
在PC端使用串口程序去传送文件
以windows XP下的串口工具超级终端为例:

选择Transfer ⇒ Send File ⇒ Protocol选择Kermit,FileName选择你所要传送的文件->点击确定即可。然后就是慢慢传送文件了。

至于文件数据传输后,放在uboot的内存中的哪个位置,是由你uboot中的环境变量loadaddr决定,我这里的是loadaddr=0x800000。

当然,你也可以在执行loady的时候,后面加上你要的地址,比如:

loadb 0x1000000

Kermit协议,数据传输速度比较慢,我这里传输了个8MB的文件,大概要40分钟左右的。

2. Ymodem

关于Ymodem协议,是从之前的Xmodem协议演化出来的,之后还有Zmodem。

简单的说就是,一个数据包大小为1KB的数据传输协议。

更多的解释,参见上面已经提到的[5]

目标
通过Ymodem协议,将文件通过RS232接口传送到Uboot的内存中

前提

硬件

开发板中有RS232接口,并且已连接到PC端

软件

Uboot中已经实现Ymodem协议的loady命令

如何操作

在uboot中,输入loady
在PC端使用串口程序去传送文件

以windows XP下的串口工具超级终端为例:

选择Transfer ⇒ Send File ⇒ Protocol选择Ymodem,FileName选择你所要传送的文件->点击确定即可。然后就是慢慢传送文件了。

示例
Bootldr> loady
## Ready for binary (ymodem) download to 0x00800000 at 115200 bps...
CCCxyzModem - CRC mode, 2(SOH)/8192(STX)/0(CAN) packets, 5 retries
## Total Size      = 0x00800000 = 8388608 Bytes


3.1.2.2.1.3. NIC/network

1. tftp2. NFS

多数开发板上,也都带有网卡接口,然后通过网线,连接到一个路由或者交换机上,另外一个PC也连接到此路由或交换机上,然后通过网线,将PC上的文件数据,传输到板子上。

1. tftp

目标
将文件通过tftp方式,从PC端,下载到Uboot的内存中

前提

硬件

硬件板子上有网卡
板子通过网线连到路由或交换机上,PC也连到该路由或交换机上,共处同一个网段

软件

PC端设置好tftp服务
关于PC端安装了tftp服务(TFTP service),详情可以参考:[6]

安装好tftp服务后,把对应的u-boot.bin等文件,放到tftp的根目录下
Uboot中,首先肯定是已经实现了网卡驱动,以及添加了对应的tftp命令
此两个前提,一般开发板都已经具有此条件

如何操作
在Uboot中,执行命令

tftp mem_addr file_name
就可以将文件file_name传送到Uboot的内存地址mem_addr中了。

示例
EmbedSky> tftp 0x30010000 u-boot.bin
dm9000 i/o: 0x20000300, id: 0x90000a46
MAC: 0a:1b:2c:3d:4e:5f
TFTP from server 192.168.1.101; our IP address is 192.168.1.120
Filename 'u-boot.bin'.
Load address: 0x30010000
Loading: T ###############
done
Bytes transferred = 207396 (32a24 hex)


2. NFS

目标
将文件通过NFS命令,从PC端,通过网络,传送到Uboot的内存中去

前提

硬件

硬件板子上有网卡
板子通过网线连到路由或交换机上,PC也连到该路由或交换机上,共处同一个网段

软件

PC端设置好NFS服务
Uboot中实现了网卡驱动和nfs命令
Uboot中设置好了ip地址,ip掩码mask,网关gateway

如何操作
Uboot中执行:

nfs mem_addr IP:path/file
示例
nfs 0x30008000 192.168.0.3:/home/nfs/uImage


3.1.2.2.1.4. SD/MMC

1. tftp

1. tftp

目标
将文件从SD/MMC卡中,拷贝到Uboot的内存中

前提

硬件

开发板有SD/MMC的controller,有对应的SD/MMC插槽
自己有SD或MMC卡

软件

Uboot中实现了对应的SD/MMC驱动及对应的命令
关于uboot中,把新版本的mmc驱动,移植到旧的上,可以参考:[7]

SD/MMC卡是FAT文件系统
当然,如果是其他的文件系统,比如ext2等,也是可以的,下面对应的命令就是ext2lsext2load了。

如何操作

mmcinit或mmc rescan
即初始化mmc,旧版本的uboot的是mmcinit,新版本的uboot是mmc rescan

fatls mmc 0
将mmc卡中的文件列出来,确保mmc卡工作正常和知道里面有哪些文件

fatload mmc 0 mem_addr file_name
将mmc卡中的file_name文件拷贝到内存mem_addr处。

示例
EmbedSky> mmcinit
mmc: Probing for SDHC ...
mmc: SD 2.0 or later card found
trying to detect SD Card...
Manufacturer: 0x02, OEM "TM"
Product name: "SA04G", revision 0.5
Serial number: 2621440179
Manufacturing date: 7/2010
CRC: 0x73, b0 = 1
READ_BL_LEN=15, C_SIZE_MULT=0, C_SIZE=365
size = 0
SD Card detected RCA: 0x1234 type: SDHC
EmbedSky> md 30000000
30000000: 00000000 00000000 00000000 00000000 ................
30000010: 00000000 00000000 00000000 00000000 ................
。。。
300000f0: 00000000 00000000 00000000 00000000 ................
EmbedSky> fatls mmc 0
512 nikon001.dsc
misc/
dcim/
194 error.html

2 file(s), 2 dir(s)

EmbedSky> help fatload
fatload <interface> <dev[:part]> <addr> <filename> [bytes]
- load binary file 'filename' from 'dev' on 'interface'
to address 'addr' from dos filesystem

EmbedSky> fatload mmc 0 30000000 error.html
reading error.html

194 bytes read
EmbedSky> md 30000000
30000000: 4d54483c 423c3e4c 3e59444f 6e6f7257 <HTML><BODY>Wron
30000010: 50492067 7263733c 3e747069 646e6977 g IP<script>wind
。。。
300000f0: 00000000 00000000 00000000 00000000 ................
EmbedSky>

上述md(memory display)命令,只是为了显示内存中的内容,用以表示,拷贝文件前后内存中数据的变化。

3.1.2.2.1.5. JTAG == debug tool

1. tftp

1. tftp

目标
在开发板运行程序的情况下,比如Uboot中,通过debug工具,将文件下载到Uboot的内存中

前提

硬件

开发板上有JTAG等debug接口,连接上对应的Jlink等硬件

软件

对应的debug 工具支持载入文件到内存的功能
一般debug工具,都是IDE集成开发环境,对应的IDE里面会有对应的功能。

比如ARM的RVDS,里面就有对应的load file到memory的功能。

如何操作
在IDE工具中,找到对应的功能选项,然后把文件load载入到开发板的内存中,即可。

3.1.2.2.2. 如何把内存中的数据,写入到对应存储设备上

3.1.2.2.2.1. Nand Flash3.1.2.2.2.2. Nor Flash3.1.2.2.2.3. USB3.1.2.2.2.4. SD/MMC

前面的操作,是把数据从外部传输到Uboot的内存中,接下来,就要把对应的数据,写入到对应的存储介质中去。

常见的存储介质以及Uboot中相关的命令,分类如下:

Table 3.3. 如何把Uboot的内存中数据写入到存储设备上

存储介质Uboot中相关命令说明
Nand Flashnand erase

nand write

先擦除才能再写入数据
Nor Flasherase

cp.b

先擦除才能再写入数据
USBusb write
SD/MMCmmc write
下面分别介绍,在Uboot中,对于每种存储设备,如何用相关的命令,把数据写入到对应存储设备中。

3.1.2.2.2.1. Nand Flash

目标
把Uboot中内存中数据,写入到Nand Flash中去

前提

软件

Uboot中,已经实现了nand erase和nand write命令了

如何操作

nand erase
需要先用nand的erase命令,去擦出对应的区域

nand write
然后再用nand write,把内存中的数据,写入到nand 中。

3.1.2.2.2.2. Nor Flash

关于Nor Flash,需要额外说明一些事情。

本身Flash这个名词,在存储领域方面,包括了Nand Flash和Nor Flash。

而由于Nor Flash出现最早,应用很广泛,所以Uboot中,对于单独说Flash这个词,是指的是Nor Flash。

所以,会有对应的命令:

flinfo = Flash Info = Nor Flash Info

而又由于Nor Flash的很多操作,很像SDRAM等设备,可以直接读,(写操作需要特定的命令),但是可以把Nor Flash的操作,兼容统一到cp拷贝这个命令中去。

所以,很多时候,你会发现,好像没有单独的Nor Flash的读写的命令,其实是包含在了cp这个命令中了。

另外,对于cp命令本身,其有三种方式:

cp.b单位为b=byte=字节的方式,去拷贝数据
cp.w单位为w=word=字的方式,去拷贝数据
cp.l单位为l=long=长整型的方式,去拷贝数据

不过,对于eeprom,也有单独的一套eeprom的命令的,比如eeprom write,用于将数据写入到eeprom中去。

目标
把Uboot中内存中数据,写入到Nor Flash中去

前提

软件

Uboot中,已经实现了Nor flash 相关的命令了,包括erase和cp命令支持了Nor Flash了

如何操作
在Uboot中,执行下列命令:

protect off
只有在你当前需要重新写入新数据的Nor Flash的Block是已经被写保护的情况下,才需要此步骤去解除锁定。

一般情况下,都不需要此步骤的。

erase
去擦出Nor Flash中的数据

cp或eeprom write
将内存中的数据,写入到Nor Flash中。

3.1.2.2.2.3. USB

目标
将Uboot中的内存中的数据,写入到USB设备中

前提

软件

Uboot中已经实现了对应的usb write命令

如何操作
在Uboot中,执行下列命令:

usb write
将对应的内存中的数据,写入到Usb设备中。

3.1.2.2.2.4. SD/MMC

目标
将Uboot中的内存中的数据,写入到SD/MMC设备中。

前提

软件

Uboot中已经实现了对应的mmc write命令

如何操作
在Uboot中,执行下列命令:

mmc write
将对应的内存中的数据,写入到SD/MMC设备中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐