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

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

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

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

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

USB cable

Board has USB Host

USB Slave/DeviceDNW

USB cable

Board has USB Slave

RS232Kermit/Ymodemloadb/loadyRS232 Cable
NICTftptftp file

network interface card

Server has tftp service

NFSNFS

network interface card

Server has NFS service

Network cable

switch

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

Hardware debug tool

IDE support Load file into Memory



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

3.1.2.2.1.1. USB

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

现在很多开发板上,都有USB的Host和USB的Device的接口。

所以,对应着,可以实现,外接U盘到开发板上,或者将开发板作为U盘连到PC上

然后操作U盘,把文件拷贝到U盘里,实现对应的把文件数据传输到开发板上这一功能。

1. USB Host = USB Mass Storage = U Disk

  1. 目标

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

  2. 前提
    • 硬件
      • 开发板上有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的驱动。

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

      • U盘的文件系统是FAT格式的

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

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

  3. 如何操作

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

    1. usb rescan

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

      help usb

      看到更多的帮助信息。

    2. fatls usb 0

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

    3. fatload usb 0 mem_addr file_name

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

2. USB Slave = USB Device

  1. 目标

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

  2. 前提
    • 硬件
      • 板子上有对应的USB Device功能的controller和对应的USB Device接口
    • 软件
      • PC端已经安装了对应的USB相关驱动
      • PC端需要有对应的DNW软件
      • Uboot中实现了对应的命令

        以TQ2440为例,其中已经有了usb slave 相关功能和命令

  3. 如何操作

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

    1. 去Uboot端执行对应的usb slave命令

      以等待PC主机端传输文件

    2. 去PC端用DNW去传输文件

      USB Port -> Transmit -> 选择要传输的文件

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

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

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

3.1.2.2.1.2. RS232

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

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

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

1. Kermit

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

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

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

  1. 目标

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

  2. 前提
    • 硬件
      • 开发板中有RS232接口,并且已连接到PC端
    • 软件
      • Uboot中已经实现kermit协议的loadb命令

        这个,一般的uboot中都已实现。

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

  3. 如何操作
    1. 在uboot中,输入loadb
    2. 在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的数据传输协议。

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

  1. 目标

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

  2. 前提
    • 硬件
      • 开发板中有RS232接口,并且已连接到PC端
    • 软件
      • Uboot中已经实现Ymodem协议的loady命令
  3. 如何操作
    1. 在uboot中,输入loady
    2. 在PC端使用串口程序去传送文件

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

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

  4. 示例
    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

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

1. tftp

  1. 目标

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

  2. 前提
    • 硬件
      • 硬件板子上有网卡
      • 板子通过网线连到路由或交换机上,PC也连到该路由或交换机上,共处同一个网段
    • 软件
      • PC端设置好tftp服务

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

      • 安装好tftp服务后,把对应的u-boot.bin等文件,放到tftp的根目录下
      • Uboot中,首先肯定是已经实现了网卡驱动,以及添加了对应的tftp命令

        此两个前提,一般开发板都已经具有此条件

  3. 如何操作

    在Uboot中,执行命令

    tftp mem_addr file_name

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

  4. 示例
    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

  1. 目标

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

  2. 前提
    • 硬件
      • 硬件板子上有网卡
      • 板子通过网线连到路由或交换机上,PC也连到该路由或交换机上,共处同一个网段
    • 软件
      • PC端设置好NFS服务
      • Uboot中实现了网卡驱动和nfs命令
      • Uboot中设置好了ip地址,ip掩码mask,网关gateway
  3. 如何操作

    Uboot中执行:

    nfs mem_addr IP:path/file
  4. 示例
    nfs 0x30008000 192.168.0.3:/home/nfs/uImage
                                    
3.1.2.2.1.4. SD/MMC

1. tftp

  1. 目标

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

  2. 前提
    • 硬件
      • 开发板有SD/MMC的controller,有对应的SD/MMC插槽
      • 自己有SD或MMC卡
    • 软件
      • Uboot中实现了对应的SD/MMC驱动及对应的命令

        关于uboot中,把新版本的mmc驱动,移植到旧的上,可以参考:[8]

      • SD/MMC卡是FAT文件系统

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

  3. 如何操作
    1. mmcinitmmc rescan

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

    2. fatls mmc 0

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

    3. fatload mmc 0 mem_addr file_name

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

  4. 示例
    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. 目标

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

  2. 前提
    • 硬件
      • 开发板上有JTAG等debug接口,连接上对应的Jlink等硬件
    • 软件
      • 对应的debug 工具支持载入文件到内存的功能

        一般debug工具,都是IDE集成开发环境,对应的IDE里面会有对应的功能。

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

  3. 如何操作

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

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

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

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

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

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

nand erase

nand write

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

erase

cp.b

先擦除才能再写入数据
USBusb write 
SD/MMCmmc write 


下面分别介绍,在Uboot中,对于每种存储设备,如何用相关的命令,把数据写入到对应存储设备中。

3.1.2.2.2.1. Nand Flash
  1. 目标

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

  2. 前提
    • 软件
      • Uboot中,已经实现了nand erasenand write命令了
  3. 如何操作
    • 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中去。

  1. 目标

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

  2. 前提
    • 软件
      • Uboot中,已经实现了Nor flash 相关的命令了,包括erase和cp命令支持了Nor Flash了
  3. 如何操作

    在Uboot中,执行下列命令:

    • protect off

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

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

    • erase

      去擦出Nor Flash中的数据

    • cpeeprom write

      将内存中的数据,写入到Nor Flash中。

3.1.2.2.2.3. USB
  1. 目标

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

  2. 前提
    • 软件
      • Uboot中已经实现了对应的usb write命令
  3. 如何操作

    在Uboot中,执行下列命令:

    • usb write

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

3.1.2.2.2.4. SD/MMC
  1. 目标

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

  2. 前提
    • 软件
      • Uboot中已经实现了对应的mmc write命令
  3. 如何操作

    在Uboot中,执行下列命令:

    • mmc write

      将对应的内存中的数据,写入到SD/MMC设备中。