U-Boot在内核为Cortex-A8的飞思卡尔处理器i.MX53上的移植

U-Boot在内核为Cortex-A8的飞思卡尔处理器i.MX53上的移植
本文章介绍了如何在于i.MX53处理器的目标板上,引导、运行和编译B-Boot程序。

一、概括
U-Boot是一个支持多平台开发、串行口引导,且开源的Boot-loader实用程序,其支持引导和管理boot镜像文件,如Linux等系统。U-Boot具备以下特征:
  1. 支持网络下载模式:TFTP、BOOTP、DHCP、NFS。
  2. 串行口下载:S-record、Binary(通过Kermit方式)。
  3. Flash管理:copy,erase,protect,cramfs, jffs2
  4. 存储器应用管理:copy, dump. crc, check, mtest
  5. 大容量存储设备:USB
  6. 磁盘启动方式:raw block, ext2, fat, reiserfs
  7. 交互接口方式:支持多种脚本操作方式
二、镜像文件安装指导
1.将U-Boot烧入MMC
为将U-Boot烧入MMC/SD卡的话,请参考以下步骤:
  • 将MMC/SD卡插入目标板
  • 通过ATK工具,将U-Boot二进制文件烧入地址为0的空间(MX53目标板采用MFG下载)
2.从MMC启动U-Boot
如果U-Boot的二进制文件已经烧入MMC/SD卡的话,则将目标板切换至MMC启动模式下,重新上电,此时将会在串行口的超级终端看到相关的启动提示文字。

3.从MMC快速启动U-Boot
要想快速启动U-Boot的话,则必须确保MMC为eMMC4.3或者eMMC4.4,其相关操作步骤如下:
  • 首先,确保卡片支持快速启动模式
  • 将U-Boot镜像文件烧入eMMC的引导区
    比如:
    • 将普通的SD卡插入slot1,并将eMMC4.3/4.4卡插入slot3
    • 从slot1的SD卡启动
    • 将U-Boot.bin写入eMMC卡的引导区

    指令:
    U-Boot> mmc dev 0
    mmc0 is current device
    U-Boot> mmc read ${loadaddr} 0 0x200
    MMC read: dev # 0, block # 0,count 512 ...
    512 blocks read: OK> mmc dev 1 1
    mmc1(part 1) is current device
    U-Boot> mmc write ${loadaddr} 0 0x200
    MMC read: dev # 1, block # 0,count 512 ...
    512 blocks write: OK
  • 获取eMMC总线宽度
    通过命令“mmcinfo <dev>“获取总线宽度:
    U-Boot> mmcinfo 1
    Device: FSL_ESDHC
    Manufacturer ID: 3
    OEM: 5344
    Name: SD04G
    Tran Speed: 25000000
    Rd Block Len: 512
    SD version 2.0
    High Capacity: Yes
    Capacity: 3965190144
    Bus Width: 4-bit
  • 通过开关设置为eMMC快速启动模式和相应的位宽
  • 重启目标板
4.将U-Boot写入SATA硬盘
以下步骤将介绍如何将U-Boot写入SATA硬盘
  • 首先从MMC启动U-Boot
  • 从MMC读取u-boot.bin:
    U-Boot> mmc dev 0
    U-Boot> mmc read ${loadaddr} 0 0x200
    MMC read: dev # 0, block # 0, count 512 ... 512 blocks read: OK
  • 写入SATA硬盘:
    U-Boot> sata write ${loadaddr} 0 0x200
  • 设置目标板为SATA启动模式
  • 复位目标板,查看超级终端输出情况
5.将U-Boot写入SPI-NOR Flash
  • 首先将目标板从mmc boot或者nand boot方式下启动
  • 将u-boot.bin 上传至tftp根目录下
  • 将U-Boot镜像文件引导至Ram:
    U-Boot> setenv serverip 10.193.100.158
    U-Boot> setenv ethaddr 00:04:9F:00:EA:D7
    U-Boot> setenv ipaddr 10.193.102.93
    U-Boot> tftpboot ${loadaddr} u-boot.bin
  • 将u-boot.bin烧入SPI-NOR的0地址下
    初始化SPI-NOR:
    U-Boot> sf probe 1
    在写之前先擦除SPI-NOR:
    U-Boot> sf erase 0 0x40000
    Erase is built in program.

    将数据写入SPI-NOR:
    U-Boot> sf write ${loadaddr} 0 0x40000
    Writing SPI NOR flash 0x0 [0x40000 bytes] <- ram 0xXXXXXXXX
    ..........SUCCESS
6.从NFS文件系统启动系统
在默认模式下,U-Boot将被配置为以NFS的方式启动系统,在启动之前,需要做出相关的配置。
在U-Boot启动出现提示“ Hit any key to stop autoboot:  0 ”倒计时时,敲入任何键,中断启动,进入U-Boot命令模式。

设置"boot arguments":
U-Boot > setenv bootargs 'console=ttyAM0,115200n8'
设置"boot command":
U-Boot > setenv bootcmd 'run bootcmd_net'
设置"NFS boot arguments":
U-Boot > setenv bootargs_nfs ‘setenv bootargs ${bootargs} root=/dev/nfs
ip=dhcp nfsroot=${serverip}:${nfsroot}Setup net boot command:
U-Boot > setenv bootcmd_net 'run bootargs_nfs; dhcp; bootm'

设置"tftp server IP":
U-Boot> setenv serverip 10.193.100.158
设置"mac address":
U-Boot> setenv ethaddr 00:04:9F:00:EA:D7
设置"IP address":
U-Boot> setenv ipaddr 10.193.102.93
设置内核名字:
U-Boot> setenv kernel uImage
设置rootfs路径:
U-Boot> setenv nfsroot /data/rootfs_home/rootfs
保持配置信息:
U-Boot> saveenv
注意:
为避免IP地址冲突,可以通过命令"dhcp"进行查询,以确保有效的IP地址。

7.从Nand启动内核
  • 将内核和rootfs烧入Nand
    方法一:通过ATK工具,请将内核镜像文件烧入地址0x300000下,将rootfs镜像文件烧入0x800000下。
    方法二:通过串行口将镜像文件下载到Ram,然后在U-Boot下使用Nand命令将镜像文件烧入Nand。
    方法三:通过tftpboot命令将内核下载到Ram,然后在U-Boot下使用Nand命令将镜像文件烧入Nand。
  • 配置环境
    设置配置信息:
    U-Boot> setenv bootargs_nand 'setenv bootargs ${bootargs} root=/dev/mtdblock2
    ip=dhcp rootfstype=jffs2'
    U-Boot> setenv bootcmd_nand 'run bootargs_base bootargs_nand;nand read
    ${loadaddr} 0x300000 0x200000;bootm'
    U-Boot> setenv
    U-Boot> saveenv
    U-Boot> setenv bootcmd 'run bootcmd_nand'

    重启目标板。
8.从MMC启动内核
  • 格式化MMC卡

    第一步,将MMC卡插入Linux主机,此MMC卡将会是/dev/mmcblkx,e.g /dev/mmcblk0,可以通过命令dmesg获得更详细的信息。
    擦除SD卡:
    export DISK=/dev/sdb
    sudo parted --script ${DISK} mklabel msdos

    第二步,通过命令fdisk将MMC卡格式化为2个分区:
    root@freescale ~$ fdisk /dev/mmcblk0
    举例,在lucid用户下操作USB读卡器下的SD卡:
    lucid@ubuntu ~$ sudo fdisk /dev/sdb

    第三步,在fdisk环境下,输入"p",获得磁盘cylinder相关信息:
    Command (m for help): p
    Disk /dev/mmcblk0: 3965 MB, 3965190144 bytes
    4 heads, 16 sectors/track, 121008 cylinders
    Units = cylinders of 64 * 512 = 32768 bytes

    可知cylinder尺寸为:32768Bytes = 0x8000.

    第四步,计算首要分区起始的cylinder,通常,引导分区内容由3部分组成,分别为MBR、u-boot.bin和uImage,MBR为512 Bytes,u-boot.bin为180KB,uImage为2MB。因此,我们可以将MMC卡的头4MBytes作为引导区,其首要分区的起始cylinder为:0x400000 / 0x8000 = 128.

    第五步,计算首要分区末尾的cylinder,将文件"rootfs.ext2.gz"解压,然后查看"ext2 rootfs"大小,约为380MB,因此我们将首要分区然后设置为500MB,其结尾cylinder为:(500 * 0x100000) / 0x80000 = 16000.

    第六步,创建首要分区
    输入"n"以创建一个分区:
    Command (m for help): n
    Command action
    e extended
    p primary partition (1-4)

    输入"p"以创建一个首要分区
    输入"1"作为首要分区的编号:
    Partition number (1-4): 1
    输入"96"作为首要cylinder:
    First cylinder (1-121008, default 1): 96
    输入"16000"作为末尾cylinder:
    Last cylinder or +size or +sizeM or +sizeK (96-121008, default 121008): 16000

    第七步,创建第二分区
    输入"n"以创建一个分区:
    Command (m for help): n
    Command action
    e extended
    p primary partition (1-4)

    输入"p"以创建一个首要分区
    输入"2"作为第二分区的编号:
    Partition number (1-4): 2
    输入"16001"作为首要cylinder:
    First cylinder (1-121008, default 1): 16001
    敲入“回车”,以默认的cylinder作为末尾cylinder:
    ast cylinder or +size or +sizeM or +sizeK (16001-121008, default 121008): Using
    default value 121008


    第八步,确认并写入分区信息
    输入"p"以显示分区信息:
    Command (m for help): p
    Disk /dev/mmcblk0: 3965 MB, 3965190144 bytes
    4 heads, 16 sectors/track, 121008 cylinders
    Units = cylinders of 64 * 512 = 32768 bytes
    Device Boot Start End Blocks Id System
    /dev/mmcblk0p1 96 16000 508960 83 Linux
    /dev/mmcblk0p2 16001 121008 3360256 83 Linux

    如果分区信息正确的话,则敲入“w",将分区信息写入MBR:
    Command (m for help): w
    The partition table has been altered!
    Calling mmcblk0: ioctl() to re-read partition ta p1ble
    p2


    分别格式化成fat 和ext3 的方式,然后把kernel 和rootfs 放入相应的分区。
    sudo mkfs.vfat -F 32 /dev/sdb1 
    sudo mkfs.ext3 /dev/sdb2

  • 将u-boot.bin,kernel和rootfs烧入MMC卡
    第一步,保存MBR
    root@freescale /$ dd if=/dev/mmcblk0 of=./mbr.bin bs=512 count=1
    在lucid用户下操作USB读卡器下的SD卡:
    lucid@ubuntu ~$ sudo dd if=/dev/sdb of=./mbr.bin bs=512 count=1
    备注:另外一种方式可以跳过此步骤,你可以通过定制u-boot.bin文件,以禁止镜像文件里的flash header,然后在第二步操作里面,将u-boot.bin烧入地址0x400。

    第二步,将u-boot.bin,kernel,rootfs烧入MMC卡
    通过工具ATK,将u-boot.bin烧入地址0x0,将uImage烧入0x100000,将rootfs烧入0x400000。
    或者通过tftp的方式下载,其命令为:
    tftpboot <ram_address> <image_name>
    cp.b <ram_address> <card_offset> <len>


    直接在Ubuntu命令下烧写U-Boot.bin:
    lucid@ubuntu ~$ sudo dd if=./u-boot-aml.bin of=/dev/sdb bs=1 count=442 
    lucid@ubuntu ~$ sudo dd if=./u-boot-aml.bin of=/dev/sdb bs=512 skip=1 seek=1


    第三步,恢复MBR
    root@freescale /$ dd if=./mbr.bin of=/dev/mmcblk0
    在lucid用户下操作USB读卡器下的SD卡:
    lucid@ubuntu ~$ sudo dd if=./mbr.bin of=/dev/sdb

  • 配置环境
    U-Boot> setenv bootargs_mmc 'setenv bootargs ${bootargs} root=/dev/mmcblk0p1
    ip=dhcp rootfstype=ext2'
    U-Boot> setenv bootcmd_mmc 'run bootargs_base bootargs_mmc;mmc dev 0;mmc read
    ${loadaddr} 0x800 0x1000;bootm'
    U-Boot> setenv bootcmd ‘run bootcmd_mmc’
    U-Boot> saveenv

    重启目标板。
三、配置U-Boot
对于U-Boot的默认配置,其超级终端上的串行口通讯参数为:115,200-8-N-1。
系统通讯参数也可以通过命令setenv来重新设置,下面举例介绍如何为目标板配置IP地址。
U-Boot> setenv serverip 10.193.100.158
U-Boot> setenv ethaddr 00:04:9F:00:EA:D7
U-Boot> setenv ipaddr 10.193.102.93
U-Boot> setenv kernel uImage
U-Boot> setenv nfsroot /data/rootfs_home/rootfs
U-Boot> saveenv
Saving Environment to SPI Flash...
Erasing SPI flash...Erase is built in program.
Writing to SPI flash...Writing SPI NOR flash 0x100000 [0x20000 bytes] <- ram
0x975e06e8
......SUCCESS
done
U-Boot>

上面所有相关的参数都必须正确的设置,以便正常使用网络,有些参数值U-Boot上使用不到,但是在某些系统中将会用到。
设置好后的参数通过下面显示:
U-Boot> printenv
bootdelay=3
baudrate=115200
loadaddr=0x90800000
netdev=eth0
ethprime=FEC0
U-Boot_addr=0xa0000000
U-Boot=u-boot.bin
bootargs_base=setenv bootargs console=ttymxc0,115200
bootargs_nfs=setenv bootargs ${bootargs} root=/dev/nfs ip=dhcp
nfsroot=${serverip}:${nfsroot},v3,tcp

bootcmd=run bootcmd_net
bootcmd_net=run bootargs_base bootargs_nfs; tftpboot ${loadaddr} ${kernel};
bootm
prg_U-Boot=tftpboot ${loadaddr} ${U-Boot}; protect off ${U-Boot_addr}
0xa003ffff; erase ${U-Boot_addr} 0xa003ffff; cp.b ${loadaddr} ${U-Boot_addr}
${filesize}; setenv filesize; saveenv
ethact=FEC0
ethaddr=00:04:9F:00:EA:D7

bootargs=console=ttymxc0,115200 root=/dev/nfs ip=dhcp nfsroot=:/opt/eldk/
arm,v3,tcp
ipaddr=10.193.102.93
serverip=10.193.100.158
nfsroot=/data/rootfs_home/rootfs
kernel=uImage.r450
stdin=serial
stdout=serial
stderr=serial
Environment size: 830/131068 bytes
Boot>


四、使用U-Boot
OS镜像文件在U-Boot环境下可以通过串行口或者以太网下载下去,下载后的镜像文件可以直接解压到SDRAM上执行,亦或者存储到Flash上,以便以后使用。
  • 串行口下载
    如果想通过串行口下载镜像文件的话,那么通讯终端必须支持y moderm协议,如果Windows下的超级终端,同时在U-Boot下输入命令:loady
    执行命令后,U-Boot等待接收数据,这时,通过操作“Transfer -> Send File -> Ymodem (under Protocol) ->Send...”来下载镜像文件。
  • 以太网下载
    注意TFTP不是一个可靠的协议,在网络繁忙的时候,可能会导致下载失败,且没有任何错误的提示,在下载的时候务必要确保下载后正确的字节数。注意有些目标板没有对MAC地址进行设置的。
    以太网下载文件步骤:
    第一步,对TFTP服务进行相关配置
    setenv ethaddr <board_mac_addr>
    setenv serverip <Server_IP_Addr>
    setenv ipaddr <Board_IP_Addr>


    第二步,对服务器进行配置,并且将镜像文件复制到相应的目录下

    第三步,测试网络情况
    ping <TFTP server IP address>

    第四步,下载和执行镜像文件
    tftpboot ${loadaddr} <file name>
    bootm



五、编译U-Boot
这里有两种方式进行对U-Boot的编译,从Ltib进行编译,或者是对源码直接进行编译。

1.从ltib对U-Boot进行编译
  • 获取Ltib
    git clone git://git.am.freescale.net/git/ltib.git
    git checkout --track -b branch-imx-sdk origin/branch-imx-sdk
  • 从Ltib获取U-Boot源码
    首先换到目录Ltib下,
    获取U-Boot源码:
    ./ltib -m prep -p u-boot
  • 从Ltib编译U-Boot
    ./ltib -m scbuild -p u-boot
  • 从Ltib安装U-Boot
    ./ltib -m scdeploy -p u-boot
    编译好后的代码位于:ltib/rootfs/boot

2.从源码对U-Boot进行编译
在Windows下可以通过工具Cygwin对U-Boot进行编译,也可以直接在Linux下编译。下面是编译U-Boot需要的相关文件:
u-boot-2009.08.tar.bz2(pkgs/)
tc-fsl-x86lnxarmeabi-nptl-4.1.2-3.i386.rpm(included)
u-boot-v2009.08-imx_10.05.02.tar.bz2(pkgs/)


下面介绍如何在Linux搭建编译环境
  • 设置Linux下编译环境
    首先,确保pkgs/下的文件u-boot-2009.08.tar.bz2u-boot-v2009.08-imx_10.05.02.tar.bz2
    在Linux以root的身份登陆,安装tc-fsl-x86lnx-armeabi-nptl-4.1.2-3.i386.rpm
  • 生成U-Boot镜像文件
    相关工具配置完毕后,请遵照以下指令生成U-Boot镜像文件
    第一步,从源码文件里u-boot-2009.08.tar.bz2解压到工作目录下
    $ tar jxvf u-boot-2009.08.tar.bz2

    第二步,切换到子目录u-boot-2009.08,并将补丁u-boot-v2009.08-imx_09.12.00.tar.bz2打上,命令如下:
    $ cd u-boot-2009.08
    $ tar jxvf u-boot-v2009.08-imx_10.05.02.tar.bz2
    $ ./patches/patch-U-Boot.sh

    务必确保正确打上补丁

    第三步,编译U-Boot,以下命令可以在任何的目录情况下执行,建议在源码目录下创建一全新目录。
    针对i.MX53 START board目标板的执行命令为:
    make CROSS_COMPILE=/opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-none-linux-gnueabimx53_loco_config
    make CROSS_COMPILE=/opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-none-linux-gnueabi-

    这时,将会生成u-boot.bin镜像文件,此镜像文件可以在SDRAM或者Flash上执行。
  • 为MMC启动定制U-Boot镜像文件
    切换至子文件夹u-boot-2009.08,编译文件include/configs/mx25_3stack_config.h
    第一步,去掉Nand配置,注释掉相关代码
    /* #define CONFIG_CMD_NAND */
    /* #define CONFIG_MXC_NAND */


    第二步,使能MMC配置,去掉相关注释
    /*
    * MMC Configs
    * */
    #ifdef CONFIG_CMD_MMC
    #define CONFIG_MMC 1
    #define CONFIG_GENERIC_MMC
    #define CONFIG_IMX_MMC
    #define CONFIG_DOS_PARTITION1
    #define CONFIG_CMD_FAT1
    #endif
六、U-Boot相关命令
针对飞思卡尔的相关目标板系列,下面介绍常用的相关命令。
  1. Run
    按照环境变量'var'来运行相关命令:
    run [env_variable]
  2. Net命令
    使用BOOTP/TFTP协议启动镜像文件:
    bootp [loadAddress] [[hostIPaddr:]bootfilename]
    使用TFTP协议启动镜像文件:
    tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
    使用DHCP/TFTP协议启动镜像文件:
    dhcp [loadAddress] [[hostIPaddr:]bootfilename]
    使用RARP/TFTP协议启动镜像文件:
    rarpboot [loadAddress] [[hostIPaddr:]bootfilename]
  3. Boot命令
    从存储器执行应用程序:
    bootm [addr [arg ...]]
    使用TFTP协议启动镜像文件:
    tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
    使用DHCP/TFTP协议启动镜像文件:
    dhcp [loadAddress] [[hostIPaddr:]bootfilename]
    使用RARP/TFTP协议启动镜像文件:
    rarpboot [loadAddress] [[hostIPaddr:]bootfilename]
  4. 环境配置命令
    设置和保持环境配置:
    setenv [env_var] [val]
    saveenv
  5. SPI-NOR命令
    初始化SPI-NOR Flash:
    sf probe
    从SPI-NOR读取数据:
    sf read <dest_addr> <src_offset> <length>
    擦除SPI-NOR:
    sf erase <src_offset> <length>
    写入SPI-NOR:
    sf write <dest_addr> <src_offset> <length>
  6. MMC命令
    操作一,显示和设置当前MMC设备[分区]:
    mmc dev [dev_no] [partition_no]
    举例,
    • 显示当前MMC设备:
      U-Boot > mmc dev
      mmc0 is current device
    • 将MMC设备切换至设备1:
      U-Boot > mmc dev 1
      Mmc1(part 0) is current device
    • 切换至MMC设备1,分区1:
      U-Boot > mmc dev 1 1
      Mmc1(part 1) is current device


    操作二,从MMC读取数据:
    Mmc read <addr> <blk> <cnt>
    举例,
    • 从设备0[当前为设备0]读取数据:
      U-Boot > mmc read 0x70100000 0 0x200
      MMC read: dev # 0, block # 0, count 512 ... 512 blocks read: OK
    • 从设备1[当前为设备0]读取数据:
      U-Boot > mmc dev 1
      Mmc1(part 0) is current device
      U-Boot > mmc read 0x70100000 0 0x200
      MMC read: dev # 1, block # 0, count 512 ... 512 blocks read: OK

    操作三,写数据到MMC:
    Mmc write <addr> <blk> <cnt>
    举例,
    • 写数据到设备0[当前为设备0]:
      U-Boot > mmc write 0x70100000 0 0x200
      MMC write: dev # 0, block # 0, count 512 ... 512 blocks write: OK
    • 写数据到设备1[当前为设备0]:
      U-Boot > mmc dev 1
      Mmc1(part 0) is current device
      U-Boot > mmc write 0x70100000 0 0x200
      MMC read: dev # 1, block # 0, count 512 ... 512 blocks read: OK

    操作四,从MMC卡显示和设置Boot分区:
    Mmc bootpart [dev] [part]
    举例,
    • 显示分区:
      U-Boot > mmc bootpart
      Card doesn't support boot partition feature
      U-Boot > mmc bootpart 1
      Device 1: boot partition 1 is for boot
    • 设置Boot分区:
      U-Boot > mmc bootpart 1 1
      Device 1: boot partition 1 is for boot
      U-Boot > mmc bootpart 1 0
      Switch boot partition to partition #0, OK
      Device 1: boot partition 0 is for boot

    操作五,在当前MMC设备列出可用的分区:
    Mmc list
    举例,
    U-Boot > mmc list
    FSL_ESDHC: 0
    FSL_ESDHC: 1


    操作六,擦除数据:
    Mmc erase <blk> <cnt>
    举例,
    • 在当前的设备blk offset 0擦除0x200 Blocks:
      U-Boot > mmc erase 0x0 0x200
      MMC erase: dev # 1, block # 0, count 512 ...
      Caution! Your devices Erase group is 0x400
      The erase range would be change to 0x0~0x3ff
      512 blocks erase: OK

    操作七,Rescan设备:
    Mmc rescan
    举例,
    U-Boot > mmc rescan
    U-Boot > mmc list
    FSL_ESDHC: 0
    FSL_ESDHC: 1

  7. FAT命令
  8. EXT2命令
  9. PATA命令
  10. SATA命令
  11. I2C命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值