当需要批量烧写镜像时,可以制作一张可用于自动烧录的SD卡,先从SD卡启动,SD卡烧录步骤结束后,从nand启动即可。以下是制作可用于自动烧录的SD卡步骤。

制作MX6的SD卡

制作mx6的sd卡有两种方法: 

第一种方法是直接操作sd卡设备,先对sdcard分区操作, 然后再往sdcard的第一个分区前的位置写入barebox, 接着把所有的镜像文件复制到sdcard第一个分区上.

第二种方法是使用脚本生成可用于烧录的sdcard镜像, 然后把该镜像写入sdcard.

直接操作sd卡

1、linux 主机插入SD卡,查找SD卡设备

sudo fdisk -l

出现以下信息

Disk /dev/sdb: 7.3 GiB, 7820279808 bytes, 15273984 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x94e98953

Device     Boot Start      End  Sectors  Size Id Type
/dev/sdb1         128 15273983 15273856  7.3G  c W95 FAT32 (LBA)

此时SD卡是/dev/sdb, 有一个分区。

以下操作中的/dev/[sdb*] 需要对应更改为linux下的sdcard设备

2、sdcard的分区1的开始地址必须大于等于8192B,  此时可使用sfdisk工具对sdcard进行重新分区.

sudo sfdisk --force -u S /dev/sdb << EOF
> start=8192, Id=c
> EOF

执行sfdisk命令后的log如下:

This disk is currently in use - repartitioning is probably a bad idea.
Umount all file systems, and swapoff all swap partitions on this disk.
Use the --no-reread flag to suppress this check.

Disk /dev/sdb: 7.3 GiB, 7820279808 bytes, 15273984 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x53e2198c

Old situation:

Device     Boot Start      End  Sectors  Size Id Type
/dev/sdb1         128 15273983 15273856  7.3G  c W95 FAT32 (LBA)

>>> Created a new DOS disklabel with disk identifier 0xaeb5f164.
/dev/sdb1: Created a new partition 1 of type 'W95 FAT32 (LBA)' and of size 7.3 GiB.
Partition #1 contains a vfat signature.
/dev/sdb2: Done.

New situation:
Disklabel type: dos
Disk identifier: 0xaeb5f164

Device     Boot Start      End  Sectors  Size Id Type
/dev/sdb1        8192 15273983 15265792  7.3G  c W95 FAT32 (LBA)

The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy
The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).
Syncing disks.

此时, 需要先重新插拔sd卡, 从fdisk信息中可看出sd卡已经重新分区

sudo fdisk -l


Disk /dev/sdb: 7.3 GiB, 7820279808 bytes, 15273984 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xaeb5f164

Device     Boot Start      End  Sectors  Size Id Type
/dev/sdb1        8192 15273983 15265792  7.3G  c W95 FAT32 (LBA)

然后, 需要格式化sdcard的分区1

sudo mkfs.fat /dev/sdb1

3、将barebox烧入到第一个分区的前面8MB空间,通过这个步骤后开发板从SD卡启动后能进入barebox

sudo dd if=barebox.bin of=/dev/sdb bs=512 skip=2 seek=2 conv=fsync

4、在Linux挂载SD卡第一个分区,将barebox、内核、设备树、文件系统复制到SD卡第一个分区下

sudo mount /dev/sdb1 /mnt/sd            (/mnt/sd 自定义挂载目录点)
sudo cp barebox.bin /mnt/sd
sudo cp zImage-phyboard-mira-imx6-3.bin /mnt/sd
sudo cp zImage-imx6q-phytec-mira-rdk-nand.dtb /mnt/sd
sudo cp phytec-qt5demo-image-phyboard-mira-imx6-3.ubifs /mnt/sd
sudo umount /dev/sdb1

5、Linux取消挂载SD卡,拔出SD卡。

经过这个步骤后,SD卡已经有烧录了barebox,第一个分区的文件系统有了制作image的四个文件。

使用sdcard镜像文件

1、使用以下脚本生成可用于自动烧录的sdcard文件

mk_img.sh
#!/bin/bash

export BASE_DIR=/mnt/work/home/nzhang/image/autoflash-mx6/images   # 修改镜像对应目录

rm -f x.1.img ${DEST}

if [ `expr 0 + 0${1}` -le 0 ]; then
        echo "usage $0: <sd_size in gb>"
        exit 1;
fi

DEST="autoflash.img"                    #自动烧写镜像名称
DEST_SIZE=`expr ${1} \* 900 \* 1024`

BAREBOX_FLASH=${BASE_DIR}/barebox-flash.bin						# 带烧写环境的barebox, 写入sdcard
BAREBOX=${BASE_DIR}/barebox.bin									# 写入nand的barebox, 不带烧写环境
OFTREE=${BASE_DIR}/zImage-imx6q-phytec-mira-ff-rdk-nand.dtb     # 修改对应设备树镜像名字
ZIMAGE=${BASE_DIR}/zImage-phyboard-mira-imx6-3.bin              # 修改对应内核镜像名字
ROOTFS=${BASE_DIR}/phytec-qt5demo-image-phyboard-mira-imx6-3.ubifs      # 修改对应文件系统名字

IMAGE_ROOTFS_ALIGNMENT="4096"

# ensure everything is available
[ ! -e ${ZIMAGE}   ] && echo zImage: ${ZIMAGE} is missing && exit 1
[ ! -e ${ROOTFS}  ] && echo rootfs: ${SYS_IMG} is missing && exit 1
[ ! -e ${BAREBOX} ] && echo barebox: ${BAREBOX} is missing && exit 1
#[ ! -e ${BARE_ENV} ] && echo bare_env: ${BARE_ENV} is missing && exit 1
[ ! -e ${OFTREE}   ] && echo oftree: ${OFTREE} is missing && exit 1

# Initialize sdcard image file
dd if=/dev/zero of=${DEST} bs=1024 count=0 seek=${DEST_SIZE}

sfdisk --force -u S ${DEST} << EOF
  1 : start=8192, Id=c
EOF

# burn barebox
dd if=${BAREBOX_FLASH} of=${DEST} conv=notrunc,fsync bs=512 skip=2 seek=2

# Create a vfat image with boot image files
BOOT_BLOCKS=$(LC_ALL=C parted -s ${DEST} unit b print | awk '/ 1 / { print substr($4, 1, length($4 -1)) / 512 /2 }')
mkfs.vfat -n "IMAGE" -S 512 -C x.1.img $BOOT_BLOCKS
mcopy -i x.1.img -s ${ZIMAGE} ::
mcopy -i x.1.img -s ${OFTREE} ::
mcopy -i x.1.img -s ${BAREBOX} ::
mcopy -i x.1.img -s ${ROOTFS} ::

# Burn Partitions
dd if=x.1.img of=${DEST} conv=notrunc,fsync seek=8192 bs=512

带烧写环境的barebox-flash.bin 可参考以下章节的设置SD卡barebox的环境得到.

chmod +x ./mk_img.sh
./mk_img 1

2、将脚本生成的镜像文件写入sdcard设备中

sudo dd if=autoflash.img of=/dev/sdb bs=1M conv=fsync

制作AM335X 的SD卡

使用SD卡的格式化工具进行格式化:HP USB Disk Storage Format Tool v2.0.6 Portable.exe

注意:使用其他格式化工具可能导致无法启动SD卡。

格式化完成后,将AM335X的·镜像文件MLO、barebox、oftree、kernel、文件系统镜像复制到SD卡即可。

设置SD卡barebox的环境

1、将经过以上步骤的SD卡插入开发板,开发板设置从SD卡启动,在开机前3秒按下ENTER键进入barebox

2、barebox的/env/init下的脚本会在开机执行,在此目录下新建开机烧写nand脚本,

edit /env/init/updatenand

MX6 updatenand脚本内容如下

#!/bin/sh

barebox_update -t nand /mnt/mmc/barebox.bin -y
erase /dev/nand0.barebox-environment.bb
ubiformat /dev/nand0.root -y
ubiattach /dev/nand0.root
ubimkvol -t static /dev/nand0.root.ubi kernel 8M
ubimkvol -t static /dev/nand0.root.ubi oftree 1M
ubimkvol -t dynamic /dev/nand0.root.ubi root 0
ubiupdatevol /dev/nand0.root.ubi.kernel /mnt/mmc/zImage-phyboard-mira-imx6-3.bin
ubiupdatevol /dev/nand0.root.ubi.oftree /mnt/mmc/zImage-imx6q-phytec-mira-rdk-nand.dtb
cp -v /mnt/mmc/phytec-qt5demo-image-phyboard-mira-imx6-3.ubifs /dev/nand0.root.ubi.root

mx6的这个环境配置是在barebox源码的defaultenv/defaultenv-2-base/init/目录下, 可把烧写脚本放在这个目录下, 然后重新编译barebox得到一个带有自动烧写环境的barebox.

AM335X updatenand脚本内容如下

#!/bin/sh

mkdir /mnt/mmc
mount /dev/mmc0.0 /mnt/mmc

barebox_update -t MLO.nand /mnt/mmc/MLO -y
barebox_update -t nand /mnt/mmc/barebox.bin -y
erase /dev/nand0.bareboxenv.bb

ubiformat /dev/nand0.root -y
ubiattach /dev/nand0.root
ubimkvol -t static /dev/nand0.root.ubi kernel 8M
ubimkvol -t static /dev/nand0.root.ubi oftree 1M
ubimkvol -t dynamic /dev/nand0.root.ubi root 0
ubiupdatevol /dev/nand0.root.ubi.kernel /mnt/mmc/zImage-phycore-am335x-1.bin
ubiupdatevol /dev/nand0.root.ubi.oftree /mnt/mmc/zImage-am335x-phycore-rdk.dtb
cp -v /mnt/mmc/phytec-qt5demo-image-phycore-am335x-1.ubifs /dev/nand0.root.ubi.root

如果需要制作多张用于am335x自动烧录的sdcard时, 可将第一张配置好的barebox环境即barebox.env文件复制到其他自动烧录的sdcard上, 其他的自动烧录卡就不需要再进barebox配置环境了.

3、保存barebox环境

saveenv

经过以上步骤,开机自动烧录的SD卡制作已经完成,批量烧写时可将这将SD卡插入开发板,然后设置从SD卡启动,SD卡启动后自动将image烧进nand,然后从nand启动即可。


测试

1、将制作好的SD卡插进开发板,设置从SD卡启动

2、能看到以下信息,表示SD卡烧录nand完成,

running /env/bin/init...
Image Metadata:
  build: #1 Fri Aug 11 02:53:34 CST 2017
  release: 2016.11.0-i.MX6-PD16.1.0
  parameter: memsize=1024
imx-bbu-nand-fcb: Firmware @ page 1152, size 269 pages has crc32: 0xa22b85c3
imx-bbu-nand-fcb: Firmware @ page 256, size 269 pages has crc32: 0xa22b85c3
imx-bbu-nand-fcb: Primary firmware is on pages 1152-1421, valid, clean
imx-bbu-nand-fcb: secondary firmware is on pages 256-525, valid, clean
imx-bbu-nand-fcb: ROM uses slot 1
imx-bbu-nand-fcb: updating slot 0
imx-bbu-nand-fcb: writing firmware 0 to block 4 (ofs 0x00080000)
imx-bbu-nand-fcb: Writing FCB/DBBT on block 0
imx-bbu-nand-fcb: Writing FCB/DBBT on block 1
imx-bbu-nand-fcb: Writing FCB/DBBT on block 2
imx-bbu-nand-fcb: Writing FCB/DBBT on block 3
imx-bbu-nand-fcb: updating slot 1
imx-bbu-nand-fcb: writing firmware 1 to block 18 (ofs 0x00240000)
update succeeded
ubiformat: nand0.root (nand), size 1068498944 bytes (1019 MiB), 8152 eraseblocks of 131072 bytes (128 KiB), min. I/O size 2048 bytes
libscan: scanning eraseblock 8151 -- 100 % complete
ubiformat: 8148 eraseblocks have valid erase counter, mean value is 38
ubiformat: 4 bad eraseblocks found, numbers: 8148, 8149, 8150, 8151
ubiformat: formatting eraseblock 8151 -- 100 % complete
ubi0: scanning is finished
ubi0: registering /dev/nand0.root.ubi
ubi0: attached mtd0 (name "nand0.root", size 1019 MiB) to ubi0
ubi0: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes
ubi0: min./max. I/O unit sizes: 2048/2048, sub-page size 2048
ubi0: VID header offset: 2048 (aligned 2048), data offset: 4096
ubi0: good PEBs: 8148, bad PEBs: 4, corrupted PEBs: 0
ubi0: user volume: 0, internal volumes: 1, max. volumes count: 128
ubi0: max/mean erase counter: 64/39, WL threshold: 4096, image sequence number: 27071
ubi0: available PEBs: 7986, total reserved PEBs: 162, PEBs reserved for bad PEB handling: 156
ubi0: registering kernel as /dev/nand0.root.ubi.kernel
ubi0: registering oftree as /dev/nand0.root.ubi.oftree
ubi0: registering root as /dev/nand0.root.ubi.root
        [#################################################################]

3、取出SD卡,开发板设置从nand启动,nand已经烧录了完整镜像。

  • No labels