zoukankan      html  css  js  c++  java
  • 常用u-boot命令详解(全) 分类: arm-linux-Ubuntu 2013-07-22 16:28 217人阅读 评论(0) 收藏

    U-boot发展到现在,他的命令行模式已经非常接近Linux下的shell了,命令行模式模式下支持“Tab”键的命令补全和命令的历史记录功能。而且如果你输入的命令的前几个字符和别的命令不重复,那么你就只需要打这几个字符即可,比如我想看这个U-boot的版本号,命令就是“ version”,但是在所有的命令中没有其他任何一个的命令是由“v”开头的,所以只需要输入“v”即可。

    [u-boot@MINI2440]# version

    U-Boot 2009.11 ( 4月 04 2010 - 12:09:25)
    [u-boot@MINI2440]# v

    U-Boot 2009.11 ( 4月 04 2010 - 12:09:25)
    [u-boot@MINI2440]# base
    Base Address: 0x00000000
    [u-boot@MINI2440]# ba
    Base Address: 0x00000000


        由于U-boot支持的命令实在太多,一个一个细讲不现实,也没有必要。所以下面我挑一些烧写和引导常用命令介绍一下,其他的命令大家就举一反三,或者“help”吧!
    (1)获取帮助
    命令:help 或 ?
    功能:查看当前U-boot版本中支持的所有命令。

    [u-boot@MINI2440]# help
    ? - alias for 'help'
    askenv - get environment variables from stdin
    base - print or set address offset
    bdinfo - print Board Info structure
    bmp - manipulate BMP image data
    boot - boot default, i.e., run 'bootcmd'
    bootd - boot default, i.e., run 'bootcmd'
    bootelf - Boot from an ELF image in memory
    bootm - boot application image from memory
    bootp - boot image via network using BOOTP/TFTP protocol
    bootvx - Boot vxWorks from an ELF image
    cmp - memory compare
    coninfo - print console devices and information
    cp - memory copy
    crc32 - checksum calculation
    date - get/set/reset date & time
    dcache - enable or disable data cache
    dhcp - boot image via network using DHCP/TFTP protocol
    echo - echo args to console
    editenv - edit environment variable
    eeprom - EEPROM sub-system
    erase - erase FLASH memory
    exit - exit script
    fatinfo - print information about filesystem
    fatload - load binary file from a dos filesystem
    fatls - list files in a directory (default /)
    flinfo - print FLASH memory information
    fsinfo - print information about filesystems
    fsload - load binary file from a filesystem image
    go - start application at address 'addr'
    help - print online help
    i2c - I2C sub-system
    icache - enable or disable instruction cache
    iminfo - print header information for application image
    imls - list all images found in flash
    imxtract- extract a part of a multi-image
    itest - return true/false on integer compare
    loadb - load binary file over serial line (kermit mode)
    loads - load S-Record file over serial line
    loadx - load binary file over serial line (xmodem mode)
    loady - load binary file over serial line (ymodem mode)
    loop - infinite loop on address range
    ls - list files in a directory (default /)
    md - memory display
    mm - memory modify (auto-incrementing address)
    mmc - MMC sub-system
    mtest - simple RAM read/write test
    mw - memory write (fill)
    nand - NAND sub-system
    nboot - boot from NAND device
    nfs - boot image via network using NFS protocol
    nm - memory modify (constant address)
    ping - send ICMP ECHO_REQUEST to network host
    printenv- print environment variables
    protect - enable or disable FLASH write protection
    rarpboot- boot image via network using RARP/TFTP protocol
    reginfo - print register information
    reset - Perform RESET of the CPU
    run - run commands in an environment variable
    saveenv - save environment variables to persistent storage
    setenv - set environment variables
    showvar - print local hushshell variables
    sleep - delay execution for some time
    source - run script from memory
    test - minimal test like /bin/sh
    tftpboot- boot image via network using TFTP protocol
    unzip - unzip a memory region
    usb - USB sub-system
    usbboot - boot from USB device
    version - print monitor version

    如果你想获取某条命令的更详细的帮助,可以使用:
    help <你想要查的指令>
    或者 ? <你想要查的指令> ,
    甚至 h <你想要查的指令缩写>

    以bmp指令为例:

    [u-boot@MINI2440]# help bmp
    bmp - manipulate BMP image data

    Usage:
    bmp info <imageAddr> - display image info
    bmp display <imageAddr> [x y] - display image at x,y
    [u-boot@MINI2440]# ? bmp
    bmp - manipulate BMP image data

    Usage:
    bmp info <imageAddr> - display image info
    bmp display <imageAddr> [x y] - display image at x,y
    [u-boot@MINI2440]# h bm
    bmp - manipulate BMP image data

    Usage:
    bmp info <imageAddr> - display image info
    bmp display <imageAddr> [x y] - display image at x,y


    (2)环境变量(environment variables,简称ENV)与相关指令
    和shell类似,U-Boot也有环境变量。一些U-boot默认的环境变量如下:


       

       

    bootdelay 执行自动启动(bootcmd中的命令)的等候秒数
    baudrate 串口控制台的波特率
    netmask 以太网的网络掩码
    ethaddr 以太网的MAC地址
    bootfile 默认的下载文件名
    bootargs 传递给Linux内核的启动参数
    bootcmd 自动启动时执行命令
    serverip TFTP服务器端的IP地址
    ipaddr 本地的IP地址
    stdin 标准输入设备,一般是串口
    stdout 标准输出,一般是串口,也可是LCDVGA
    stderr 标准出错,一般是串口,也可是LCDVGA

    要看到你的板上的ENV值可使用printenv命令,例如我的板子:
      
    [u-boot@MINI2440]# printenv
    bootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.0.1:/home/tekkaman/working/nfs/rootfs ip=192.168.0.2:192.168.0.1::255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M
    bootcmd=nfs 0x30008000 192.168.0.1:/home/tekkaman/working/nfs/zImage.img;bootm
    bootdelay=1
    baudrate=115200
    ethaddr=08:08:11:18:12:27
    ipaddr=192.168.0.2
    serverip=192.168.0.1
    gatewayip=192.168.0.1
    netmask=255.255.255.0
    tekkaman=bmp d 70000
    stdin=serial
    stdout=serial
    stderr=serial
    ethact=dm9000

    Environment size: 470/131068 bytes



          你会发现有些有的ENV我没有,还有一个“tekkaman”的ENV。原因是如果你没有设置这个环境变量就不会打印出,你也可以自己定义ENV,并在命令中使用${ENV}来调用它。同时你也可以删除这个ENV。设置ENV的命令是setenv,格式为:
    setenv name value

    第1个参数是环境变量的名称。
    第2个参数是要设置的值,如果没有第2个参数,表示删除这个环境变量。

    例如:我先将”tekkaman”参数删除,再设置,最后在一个命令串中调用。
    [u-boot@MINI2440]# printenv tekkaman
    tekkaman=bmp d 70000
    [u-boot@MINI2440]# setenv tekkaman
    [u-boot@MINI2440]# printenv tekkaman
    ## Error: "tekkaman" not defined
    [u-boot@MINI2440]# setenv tekkaman echo "I am Tekkaman Ninja!"
    [u-boot@MINI2440]# printenv tekkaman
    tekkaman=echo I am Tekkaman 
    [u-boot@MINI2440]# echo I Love Linux ;${tekkaman}
    I Love Linux
    I am Tekkaman 

    当你设置了ENV,它只保存在内存中,如果你要它保存在存放ENV的固态存储器中,请使用:saveenv。

    [u-boot@MINI2440]# saveenv
    Saving Environment to NAND...
    Erasing Nand...
    Erasing at 0x6000000000002 -- 0% complete.
    Writing to Nand... done

    如果在启动的时候会看到U-boot打印出:“Warning - bad CRC, using default environment”,说明U-boot没有在存放ENV的固态存储器中找到有效的ENV,只好使用你在编译的时候定义的默认ENV。如果U-boot存放ENV的固态存储器的驱动是OK的,那么只要运行 saveenv就可以把默认ENV写入固态存储器,下次启动就不会有这个警告了。
           ENV可以放在许多固体存储器中,对于mini2440来说Nor Flash、Nand Flash或EEPROM都可以,就看你如何配置了(include/configs下的配置文件)。例如:
          Nor Flash
    #define CONFIG_ENV_IS_IN_FLASH 1
    #define CONFIG_ENV_OFFSET 0X40000
    #define CONFIG_ENV_SIZE            0x20000    /* Total Size of Environment Sector */
    Nand Flash: 
    #define CONFIG_ENV_IS_IN_NAND 1
    #define CONFIG_ENV_OFFSET 0X40000
    #define CONFIG_ENV_SIZE            0x20000    /* Total Size of Environment Sector */

    EEPROM:
    #define CONFIG_ENV_IS_IN_EEPROM 1 /* use EEPROM for environment vars */
    #define CONFIG_ENV_OFFSET 0x000 /* environment starts at offset 0 */
    #define CONFIG_ENV_SIZE     0x400 /* 1KB */


    CONFIG_ENV_OFFSET是在整个存储器中的偏移地址;
    CONFIG_ENV_SIZE是指其使用的大小。
    注意 CONFIG_ENV_OFFSET和 CONFIG_ENV_SIZE 的设置,不要覆盖了其他分区。
    四、U-boot的使用(二)

    命令:
    loadb   - load binary file over serial line (kermit mode)
    loadx   - load binary file over serial line (xmodem mode)
    loady   - load binary file over serial line (ymodem mode)


    功能:以不同的协议从串口获取文件.。
    格式基本都为:
    load? [ off ] [ baud ]
    第1个参数是下载到SDRAM的地址,如果不填,就是用默认配置:CONFIG_SYS_LOAD_ADDR
    第2个参数是波特率,一般不填,用默认的115200.


        在windows下的超级终端可以用这些协议发送文件,但是在ubuntu下基本只能用kermit协议。一下使用C-kermit来发送一个文件到mini2440。

    [u-boot@MINI2440]# loadb
    ## Ready for binary (kermit) download to 0x30008000 at 115200 bps...


        上面已经启动了U-boot的kermit传输协议,这时按下 Ctrl + , 再按 c, 切换到C-kermit的命令行模式,输入命令:send  <文件路径>,回车。

    [u-boot@MINI2440]# loadb
    ## Ready for binary (kermit) download to 0x30008000 at 115200 bps...

    (Back at MAGI-Linux)
    ----------------------------------------------------
    C-Kermit 8.0.211, 10 Apr 2004, for Linux
    Copyright (C) 1985, 2004,
      Trustees of Columbia University in the City of New York.
    Type ? or HELP for help.
    (/home/tekkaman/桌面/) C-Kermit>send/home/tekkaman/development/share/zImage.img

    C-kermit就开始传送,并且显示一个传送界面,并动态显示传送进度。
    C-Kermit 8.0.211, 10 Apr 2004, MAGI-Linux

       Current Directory: /home/tekkaman/&#65533;&#65533;~L&#65533;~]&#65533;
    Communication Device: /dev/ttyUSB0
    Communication Speed: 115200
                  Parity: none
             RTT/Timeout: 01 / 02
                 SENDING: /home/tekkaman/development/share/zImage.img => zImage.img
               File Type: BINARY
               File Size: 2277540
            Percent Done: 19 
    /////////-

                              ...10...20...30...40...50...60...70...80...90..100
    Estimated Time Left: 00:03:35
      Transfer Rate, CPS: 8536
            Window Slots: 1 of 1
             Packet Type: D
            Packet Count: 557
           Packet Length: 1000
             Error Count: 0
              Last Error:
            Last Message:

    X to cancel file, Z to cancel group, <CR> to resend last packet,
    E to send Error packet, ^C to quit immediately, ^L to refresh screen.

    传送完毕后,输入c ,回到U-boot的串口界面。
    [u-boot@MINI2440]# loadb
    ## Ready for binary (kermit) download to 0x30008000 at 115200 bps...

    (Back at MAGI-Linux)
    ----------------------------------------------------
    C-Kermit 8.0.211, 10 Apr 2004, for Linux
    Copyright (C) 1985, 2004,
      Trustees of Columbia University in the City of New York.
    Type ? or HELP for help.
    (/home/tekkaman/桌面/) C-Kermit>send/home/tekkaman/development/share/zImage.img
    (/home/tekkaman/桌面/) C-Kermit>c
    Connecting to /dev/ttyUSB0, speed 115200
    Escape character: Ctrl- (ASCII 28, FS): enabled
    Type the escape character followed by C to get back,
    or followed by ? to see other options.
    ----------------------------------------------------
    ## Total Size = 0x0022c0a4 = 2277540 Bytes
    ## Start Addr = 0x30008000

    (4)网络命令

        只要你的网卡驱动没问题,那么你就可以通过网络来传输文件到开发板,这可比串口快多了。你可以直接用交叉网线连接开发板和电脑,也可以用普通直连网线连接路由器,再连到电脑,不过记得配置好网络,关闭防火墙哦。
       先测试网络是否通了,现在开发板使用ping 命令,看看是否可以ping通电脑:

    [u-boot@MINI2440]# ping 192.168.1.100 
    dm9000 i/o: 0x20000300, id: 0x90000a46
    DM9000: running in 16 bit mode
    MAC: 08:08:11:18:12:27
    operating at 100M full duplex mode
    Using dm9000 device
    host 192.168.1.100 is alive

    如果出现:
    [u-boot@MINI2440]# ping 192.168.1.100
    dm9000 i/o: 0x20000300, id: 0x90000a46
    DM9000: running in 16 bit mode
    MAC: 08:08:11:18:12:27
    operating at 100M full duplex mode
    Using dm9000 device
    ping failed; host 192.168.1.100 is not alive

    这样无法ping通的事,可能是:
    1、U-boot网卡驱动有问题
    2、U-boot网络协议延时配置有问题
    3、网络参数配置问题,比如IP等,Host和Target都有可能有问题。Host最好关闭IPv6。
    实在找不到原因,用Wireshark抓包看看。
    如果网络畅通,下面就可以使用下面的命令从tftp目录或者nfs目录下载文件到SDRAM了。
    命令:
    dhcp    - boot image via network using DHCP/TFTP protocol
    rarpboot- boot image via network using RARP/TFTP protocol
    nfs     - boot image via network using NFS protocol
    tftpboot- boot image via network using TFTP protocol
    bootp   - boot image via network using BOOTP/TFTP protocol
    这几个命令的格式都是:<指令> [目的SDRAM地址] [[主机IP:]文件名]
    注意:
    要使用dhcp、rarpboot或 bootp 等功能要路由器或Host的支持。
    如果没有输入[目的SDRAM地址],系统就是用编译时定义的CONFIG_SYS_LOAD_ADDR作为目的SDRAM地址
    如果tftpboot和nfs命令没有定义[主机IP:],则使用ENV中的serverip
    其它命令必需定义[主机IP:],否则会使用提供动态IP服务的主机IP作为[主机IP:]。
    使用范例:
    [u-boot@MINI2440]# nfs 0x30008000192.168.1.100:/home/tekkaman/development/share/u-boot.bin
    dm9000 i/o: 0x20000300, id: 0x90000a46
    DM9000: running in 16 bit mode
    MAC: 08:08:11:18:12:27
    operating at 100M full duplex mode
    Using dm9000 device
    File transfer via NFS from server 192.168.1.100; our IP address is 192.168.1.101
    Filename '/home/tekkaman/development/share/u-boot.bin'.
    Load address: 0x30008000
    Loading: ###################################################
    done
    Bytes transferred = 256220 (3e8dc hex)
    [u-boot@MINI2440]# tftp u-boot.bin
    dm9000 i/o: 0x20000300, id: 0x90000a46
    DM9000: running in 16 bit mode
    MAC: 08:08:11:18:12:27
    operating at 100M full duplex mode
    Using dm9000 device
    TFTP from server 192.168.1.100; our IP address is 192.168.1.101
    Filename 'u-boot.bin'.
    Load address: 0x30008000
    Loading: T ##################
    done
    Bytes transferred = 256220 (3e8dc hex)
    [u-boot@MINI2440]# dhcp 192.168.1.100:u-boot.bin
    dm9000 i/o: 0x20000300, id: 0x90000a46
    DM9000: running in 16 bit mode
    MAC: 08:08:11:18:12:27
    operating at 100M full duplex mode
    BOOTP broadcast 1
    BOOTP broadcast 2
    DHCP client bound to address 192.168.1.101
    Using dm9000 device
    TFTP from server 192.168.1.100; our IP address is 192.168.1.101
    Filename 'u-boot.bin'.
    Load address: 0x30008000
    Loading: ##################
    done
    Bytes transferred = 256220 (3e8dc hex)
    [u-boot@MINI2440]# bootp 192.168.1.100:u-boot.bin
    dm9000 i/o: 0x20000300, id: 0x90000a46
    DM9000: running in 16 bit mode
    MAC: 08:08:11:18:12:27
    operating at 100M full duplex mode
    BOOTP broadcast 1
    BOOTP broadcast 2
    DHCP client bound to address 192.168.1.101
    Using dm9000 device
    TFTP from server 192.168.1.100; our IP address is 192.168.1.101
    Filename 'u-boot.bin'.
    Load address: 0x30008000
    Loading: ##################
    done
    Bytes transferred = 256220 (3e8dc hex)
    [u-boot@MINI2440]# rarpboot 192.168.1.100:u-boot.bin

    我的路由器没有开rarp协议,所以rarpboot 无法使用,要使用dhcp或 bootp 也是要路由或Host支持的。 

    (5)Nand Flash操作指令

    常用的Nand Flash指令如下:

    指令

    功能

    nand info 显示可使用的Nand Flash
    nand device [dev] 显示或设定当前使用的Nand Flash
    nand read
    addr off
    size
    Nand Flash读取命令,从Nand off 偏移地址处读取size 字节的数据到SDRAM addr地址。
    nand write
    addr off
    size
    Nand Flash烧写命令,将SDRAM addr地址处的size 字节的数据烧写到Nand off 偏移地址。
    nand write[.yaffs[1]]
    addr off size
    烧写yaffs 映像专用的命令,.yaffs1 for 512+16 NAND
    nand erase [clean] [off size] Nand Flash檫除命令,擦除Nand Flash off 偏移地址处的size 字节的数据
    nand bad 显示Nand Flash的坏块
    nand dump[.oob] off 显示Nand Flash中的数据(16进制)
    nand scrub 彻底擦除整块Nand Flash中的数据,包括OOB。可以擦除软件坏块标志。
    nand markbad off 标示 Nand off 偏移地址处的块为坏块

    使用范例:
      
    [u-boot@MINI2440]# nand info

    Device 0: NAND 128MiB 3,3V 8-bit, sector size 128 KiB
    [u-boot@MINI2440]# nand device 0
    Device 0: NAND 128MiB 3,3V 8-bit... is now current device
    [u-boot@MINI2440]# nand read 0x30008000 0x60000 200000

    NAND read: device 0 offset 0x60000, size 0x200000
    2097152 bytes read: OK
    [u-boot@MINI2440]# nand bad

    Device 0 bad blocks:
      030a0000
      030c0000
      030e0000
      07ee0000
    [u-boot@MINI2440]# nand markbad 0x500000
    block 0x00500000 successfully marked as bad
    [u-boot@MINI2440]# nand bad 

    Device 0 bad blocks:
      00500000
      030a0000
      030c0000
      030e0000
      07ee0000
    [u-boot@MINI2440]# nand scrub

    NAND scrub: device 0 whole chip
    Warning: scrub option will erase all factory set bad 
             There is no reliable way to recover them.
             Use this command only for testing purposes if you
             are sure of what you are 

    Really scrub this NAND flash? <y/N>
    Erasing at 0x2f4000008000000 -- 0% complete.
    NAND 128MiB 3,3V 8-bit: MTD Erase failure: -5

    NAND 128MiB 3,3V 8-bit: MTD Erase failure: -5

    NAND 128MiB 3,3V 8-bit: MTD Erase failure: -5
    Erasing at 0x7ea000008000000 -- 0% complete.
    NAND 128MiB 3,3V 8-bit: MTD Erase failure: -5
    Erasing at 0x7fe000008000000 -- 0% complete.
    OK
    [u-boot@MINI2440]# nand bad

    Device 0 bad blocks:
      030a0000
      030c0000
      030e0000
      07ee0000
    [u-boot@MINI2440]# nand dump 0x8000
    Page 00008000 dump:
        ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
             ()
    OOB:
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
    [u-boot@MINI2440]# tftp u-boot.bin
    dm9000 i/o: 0x20000300, id: 0x90000a46
    DM9000: running in 16 bit mode
    MAC: 08:08:11:18:12:27
    operating at 100M full duplex mode
    Using dm9000 device
    TFTP from server 192.168.1.100; our IP address is 192.168.1.101
    Filename 'u-boot.bin'.
    Load address: 0x30008000
    Loading: T ##################
    done
    Bytes transferred = 256220 (3e8dc hex)
    [u-boot@MINI2440]# nand write 0x30008000 0 40000

    NAND write: device 0 offset 0x0, size 0x40000
    Writing at 0x2000000020000 -- 100% is complete. 262144 bytes written: OK
    [u-boot@MINI2440]# nand dump 0x8000
    Page 00008000 dump:
        00 00 53 e1 01 00 00 2a 15 40 e0 e3 19 00 00 ea
             ()
        60 30 97 e5 03 00 54 e1 f6 ff ff ba 00 40 a0 e3
    OOB:
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
        65 a9 6b f3 ff 33 fc 30
        f3 33 cf 33 0f f0 ff 00
        cc 0f 59 55 57 96 a5 5b


        nboot 指令也是一条Nand Flash 读取指令,它是将Nand Flash 的 offset 偏移地址的内核映像读取到SDRAM的loadAddr位置。它会自动读取到内核映像(使用mkimage处理过的)的结束,所以不用给出读取大小。
    格式:nboot  loadAddr  dev  offset
    使用范例:
    [u-boot@MINI2440]# tftp 192.168.1.100:zImage.img
    dm9000 i/o: 0x20000300, id: 0x90000a46
    DM9000: running in 16 bit mode
    MAC: 08:08:11:18:12:27
    operating at 100M full duplex mode
    Using dm9000 device
    TFTP from server 192.168.1.100; our IP address is 192.168.1.101
    Filename 'zImage.img'.
    Load address: 0x30008000
    Loading: T #################################################################
         #################################################################
         ##########################
    done
    Bytes transferred = 2277540 (22c0a4 hex)
    [u-boot@MINI2440]# nand erase 0x100000 300000

    NAND erase: device 0 offset 0x100000, size 0x300000
    Erasing at 0x3e000001800000 -- 0% complete.
    OK
    [u-boot@MINI2440]# nand write 0x30008000 0x100000 300000

    NAND write: device 0 offset 0x100000, size 0x300000
    Writing at 0x3e000000020000 -- 100% is complete. 3145728 bytes written: OK
    [u-boot@MINI2440]# nand device 0
    Device 0: NAND 128MiB 3,3V 8-bit... is now current device
    [u-boot@MINI2440]# nboot 30008000 0 0x100000

    Loading from NAND 128MiB 3,3V 8-bit, offset 0x100000
       Image Name: tekkaman
       Created: 2010-03-29 12:59:51 UTC
       Image Type: ARM Linux Kernel Image (uncompressed)
       Data Size: 2277476 Bytes = 2.2 MB
       Load Address: 30008000
       Entry Point: 30008040

    [u-boot@MINI2440]# bootm 30008000
    ## Booting kernel from Legacy Image at 30008000 ...
       Image Name: tekkaman
       Created: 2010-03-29 12:59:51 UTC
       Image Type: ARM Linux Kernel Image (uncompressed)
       Data Size: 2277476 Bytes = 2.2 MB
       Load Address: 30008000
       Entry Point: 30008040
       Verifying Checksum ... OK
       XIP Kernel Image ... OK
    OK

    Starting kernel ...

    Uncompressing Linux... done, booting the kernel.
    Linux version 2.6.33.(tekkaman@MAGI-Linux) (gcc version 4.3.2(crosstool-NG-1.6.1-tekkaman) ) #5 Mon Mar 29 20:58:50 CST 2010
    CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
    CPU: VIVT data cache, VIVT instruction cache
    Machine: MINI2440
    (略)


    四、U-boot的使用(三)

    (6) 内存/寄存器操作指令

    nm      修改内存值 (指定地址)    
    格式: nm [.b, .w, .l] address


    mm     修改内存值(地址自动加一)
    格式:  mm [.b, .w, .l] address


    md       显示内存值
    格式:  md [.b, .w, .l] address [# of objects]


    mw     用指定的数据填充内存
    格式:  mw [.b, .w, .l] address value [count]


    cp      内存的拷贝(包括内存与Nor Flash间的数据拷贝)
    格式:cp [.b, .w, .l] source target count


    上面是查看和修改内存值的指令,可以查看和修改SDRAM和寄存器值。
    [.b, .w, .l]代表了查看和修改形式:bit、word、long
    使用范例:


    [u-boot@MINI2440]# md.b 0x30008000 20
    30008000: cc 33 fe 33 cc b3 4c 33 ac 33 de 33 5c 13 cc 33 .3.3..L3.3.3..3
    30008010: cc 32 cc 31 dc 33 cf 33 cc 33 4e 33 8f 13 cc 33 .2.1.3.3.3N3...3
    [u-boot@MINI2440]# md.w 0x30008000 20
    30008000: 33cc 33fe b3cc 334c 33ac 33de 135c 33cc .3.3..L3.3.3..3
    30008010: 32cc 31cc 33dc 33cf 33cc 334e 138f 33cc .2.1.3.3.3N3...3
    30008020: 338c 33cd 33cc 7bcc 3bcc 33cc 135e 734c .3.3.3.{.;.3^.Ls
    30008030: 7bdc 37cc 31dc 33c4 038c 33e8 77cc 13cc .{.7.1.3...3.w..
    [u-boot@MINI2440]# md.l 0x30008000 20
    30008000: 33fe33cc 334cb3cc 33de33ac 33cc135c .3.3..L3.3.3..3
    30008010: 31cc32cc 33cf33dc 334e33cc 33cc138f .2.1.3.3.3N3...3
    30008020: 33cd338c 7bcc33cc 33cc3bcc 734c135e .3.3.3.{.;.3^.Ls
    30008030: 37cc7bdc 33c431dc 33e8038c 13cc77cc .{.7.1.3...3.w..
    30008040: 234c77ce 33dc339c 33ec3ece f3cc36ec .wL#.3.3.>.3.6..
    30008050: 37dc33cc 73cc3f5c 17dd314c 33cc62e8 .3.7?.sL1...b.3
    30008060: b6cc33dc 33c233cc 33cc32cc 33cc3f68 .3...3.3.2.3h?.3
    30008070: 73cc31cc b3cc33cc 33cc37c9 33df13cc .1.s.3...7.3...3
    [u-boot@MINI2440]# nm 0x30008000
    30008000: 33fe33cc ? 12345678
    30008000: 12345678 ? 34567890
    30008000: 34567890 ? q
    [u-boot@MINI2440]# nm.b 0x30008000
    30008000: 90 ? 11
    30008000: 11 ? 12
    30008000: 12 ? q
    [u-boot@MINI2440]# mm 0x30008000
    30008000: 34567812 ? 54321123
    30008004: 334cb3cc ? 12345678
    30008008: 33de33ac ? 21234543
    3000800c: 33cc135c ? q
    [u-boot@MINI2440]# md.b 0x30008000 20
    30008000: 23 11 32 54 78 56 34 12 43 45 23 21 5c 13 cc 33 #.2TxV4.CE#!..3
    30008010: cc 32 cc 31 dc 33 cf 33 cc 33 4e 33 8f 13 cc 33 .2.1.3.3.3N3...3
    [u-boot@MINI2440]# mw.b 0x30008000 aa 10
    [u-boot@MINI2440]# mw.b 0x30008010 55 10
    [u-boot@MINI2440]# md.b 0x30008000 20
    30008000: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................
    30008010: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 UUUUUUUUUUUUUUUU
    [u-boot@MINI2440]# cp.b 0x30008000 0x30008010 10
    [u-boot@MINI2440]# md.b 0x30008000 20
    30008000: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................
    30008010: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................


    你可以试着修改LED相连的GPIO寄存器的数据寄存器值,可以控制LED的点亮!
    先熄灭后点亮LED1的范例:(这个实验要结合芯片数据手册和mini2440的原理图来理解)
    [u-boot@MINI2440]# md 0x56000014 1
    56000014: 00000600 ....
    [u-boot@MINI2440]# nm.w 0x56000014 
    56000014: 0600 ? 620 (熄灭)
    56000014: 0620 ? 600 (点亮)


    (7) Nor Flash指令

    Nor Flash 的命令经常用于烧写数据到Nor Flash 。

    flinfo  打印Flash存储器的信息,并列出所有Sector。
    flinfo  N 单独打Flash存储器N Block的信息。(在有多块Nor Flash时使用)

    使用范例:
    [u-boot@MINI2440]# flinfo

    Bank # 1: SST: 1x SST39VF1601 (2MB)
      Size: 2 MB in 32 Sectors
      Sector Start Addresses:
        00000000 (RO) 00010000 (RO) 00020000 (RO) 00030000 (RO) 00040000
        00050000 00060000 (RO) 00070000 (RO) 00080000 00090000
        000A0000 000B0000 000C0000 000D0000 000E0000
        000F0000 00100000 00110000 00120000 00130000
        00140000 00150000 00160000 00170000 00180000
        00190000 001A0000 001B0000 001C0000 001D0000
    001E0000 001F0000
    [u-boot@MINI2440]# flinfo 1

    Bank # 1: SST: 1x SST39VF1601 (2MB)
      Size: 2 MB in 32 Sectors
      Sector Start Addresses:
        00000000 (RO) 00010000 (RO) 00020000 (RO) 00030000 (RO) 00040000
        00050000 00060000 (RO) 00070000 (RO) 00080000 00090000
        000A0000 000B0000 000C0000 000D0000 000E0000
        000F0000 00100000 00110000 00120000 00130000
        00140000 00150000 00160000 00170000 00180000
        00190000 001A0000 001B0000 001C0000 001D0000
        001E0000 001F0000
    [u-boot@MINI2440]# flinfo 2
    Only FLASH Banks # 1 ... # 1 supported


    后面带有(RO)的说明这个Sector已经写保护了。

    因为Nor Flash的读取接口和SDRAM是一样的,所以Nor Flash的读取也是使用md命令。范例如下:
    [u-boot@MINI2440]# md.b 0x0 20
    00000000: 12 00 00 ea 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 ................
    00000010: 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 ................
    [u-boot@MINI2440]# md 0x0 20
    00000000: ea000012 e59ff014 e59ff014 e59ff014 ................
    00000010: e59ff014 e59ff014 e59ff014 e59ff014 ................
    00000020: 33f80260 33f802c0 33f80320 33f80380 `..3.....3...3
    00000030: 33f803e0 33f80440 33f804a0 deadbeef ...3@..3...3....
    00000040: 33f80000 33f80000 33fbe8dc 3400374c ...3...3...3L7.4
    00000050: e10f0000 e3c0001f e38000d3 e129f000 ..............).
    00000060: e3a00453 e3a01000 e5801000 e3e01000 S...............
    00000070: e59f0488 e5801000 e59f1484 e59f0484 ................



        但由于Nor Flash的烧写时序和SDRAM的写入不同,烧写Nor  Flash 不能使用mm等命令,只能使用cp命令从内存拷贝到Nor Flash,而且烧写之前必须解除保护并擦除!命令如下:

    protect :对Flash 写保护的操作,可以使能和解除写保护。
    格式:
    protect on/off start end 
    protect on/off start +end 
    protect on/off N:SF[-SL] 
    protect on/off bank N 
    protect on/off all 


    第1 个参数on 代表使能写保护;off 代表解除写保护。
    第2 、3 参数是指定Flash 写保护操作范围


    start end是照起始地址和结束地址定义范围,start是擦除块的起始地址;end 是擦除末尾块的结束地址。
    例如:擦除Sector 2和Sector 3区域命令为erase 20000 3ffff 。 

    start +end是照起始地址和操作字节数定义范围,这种方式最常用。start是擦除块的起始地址;end 是擦除的字节数。
    例如:擦除Sector 2和Sector 3区域命令为erase 20000  +20000

    N:SF[-SL]是按照组和扇区,N 表示Flash 的Block号,SF 表示擦除起始Sector号,SL 表示擦除结束Sector号。
    例如:擦除Block1 的Sector 2和Sector 3区域命令为erase 1:2-3。

    bank N是擦除整个Block,擦除Block号为N 的整个Flash。

    all是擦除全部Flash。

    注意:Nor Flash擦除的最小单位是Sector,也就是0x10000字节,如果你定义的大小不满1 Sector或超过Sector的边界,那么被定义到的Sector会被全部擦除。
    erase  :擦除Flash的命令
    格式:
    erase start end 
    erase start +end 
    erase N:SF[-SL] 
    erase bank N 
    erase all 
    参数是指定Flash 擦除操作范围,跟写保护的方式相同。


    以下的范例将mini2440的Nor Flash的Sector 16写保护,再解除保护,擦除数据,最后将起始的20字节拷贝到Sector 16。

    [u-boot@MINI2440]# flinfo 1

    Bank # 1: SST: 1x SST39VF1601 (2MB)
      Size: 2 MB in 32 Sectors
      Sector Start Addresses:
        00000000 (RO) 00010000 (RO) 00020000 (RO) 00030000 (RO) 00040000
        00050000 00060000 (RO) 00070000 (RO) 00080000 00090000
        000A0000 000B0000 000C0000 000D0000 000E0000
        000F0000 00100000 00110000 00120000 00130000
        00140000 00150000 00160000 00170000 00180000
        00190000 001A0000 001B0000 001C0000 001D0000
    001E0000 001F0000
    [u-boot@MINI2440]# protect on 1:16-16
    Protect Flash Sectors 16-16 in Bank # 1
    [u-boot@MINI2440]# flinfo 1

    Bank # 1: SST: 1x SST39VF1601 (2MB)
      Size: 2 MB in 32 Sectors
      Sector Start Addresses:
        00000000 (RO) 00010000 (RO) 00020000 (RO) 00030000 (RO) 00040000
        00050000 00060000 (RO) 00070000 (RO) 00080000 00090000
        000A0000 000B0000 000C0000 000D0000 000E0000
        000F0000 00100000 (RO) 00110000 00120000 00130000
        00140000 00150000 00160000 00170000 00180000
        00190000 001A0000 001B0000 001C0000 001D0000
        001E0000 001F0000
    [u-boot@MINI2440]# protect off 0x100000 0x10ffff
    Un-Protect Flash Sectors 16-16 in Bank # 1
    [u-boot@MINI2440]# flinfo 1

    Bank # 1: SST: 1x SST39VF1601 (2MB)
      Size: 2 MB in 32 Sectors
      Sector Start Addresses:
        00000000 (RO) 00010000 (RO) 00020000 (RO) 00030000 (RO) 00040000
        00050000 00060000 (RO) 00070000 (RO) 00080000 00090000
        000A0000 000B0000 000C0000 000D0000 000E0000
        000F0000 00100000 00110000 00120000 00130000
        00140000 00150000 00160000 00170000 00180000
        00190000 001A0000 001B0000 001C0000 001D0000
        001E0000 001F0000
    [u-boot@MINI2440]# erase 0x100000 +20
    Erasing sector 16 ... ok.
    Erased 1 sectors
    [u-boot@MINI2440]# cp.b 0x0 0x100000 0x20
    Copy to Flash... done
    [u-boot@MINI2440]# md.b 100000 20
    00100000: 12 00 00 ea 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 ................
    00100010: 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 ................

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    python3 使用 lxml 库解析 HTML
    套接字
    使用 socket_server 创建一个简单的服务器和客户端
    创建一个超级简单的UDP服务器 / 客户端
    创建一个超级简单TCP交互的服务器/客户端
    python3 stock send() 函数报错: TypeError: a bytes-like object is required, not 'str'
    python3 stock recv OSError: [WinError 10038] 在一个非套接字上尝试了一个操作
    python 之闭包
    任导航(认道行rendaohang)上线啦!~
    Pr Pro CC 2019 添加的时间码不同步/不一样/比实际时间短或长问题排查
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706948.html
Copyright © 2011-2022 走看看