Template:How to create a bootable SD card
History | |||
---|---|---|---|
Version | Issue Date | Notes | |
X.Y.Z | Month Year | TBD | |
[TBD_link X.Y.Z] | Month Year | TBD |
How to create a bootable SD cardEdit
The procedure described here was tested with a physical machine. In case of a virtual machine such as the MVM, it might not work properly. Also, it is worth remembering that USB controller of the MVM is disabled by default. See also this section. |
This article shows how to create a bootable microSD for the [[DESK-{{{kit-code}}}-L/General/Release_Notes_(DESK-{{{kit-code}}}-L)|DESK-{{{kit-code}}}-L Release Notes] kit by using a simple bash script.
Note: Starting from this release the support for the SPL has been introduced in Uboot. Previous versions of this script will no longer produce a fully functional and bootable microSD card.
The procedure has been tested on a Linux PC running Ubuntu LTS (>=TBD) distribution with
- a 16 GB microSD card [1]
- the binary files delivered along with the DESK{{{kit-code}}}-L 1.x.x.
The resulting card is partitioned as depicted here.
The script - named mksd.sh
- can be realized with the following code:
#!/bin/bash if [[ -z $1 || -z $2 || -z $3 || -z $4 || -z $5 ]] then echo "$0 Usage:" echo " $0 <device> <u-boot.img> <SPL> <binaries directory> <rootfs tar.bz2>" echo " Example: $0 /dev/sdc u-boot.img SPL binaries/ rootfs.tar.bz2" exit fi if [ "$(whoami)" != "root" ] then echo "you must be root to run this script!" exit fi if ! [[ -b $1 ]] then echo "$1 is not a valid block device!" exit fi if ! [[ -e $2 ]] then echo "Incorrect u-boot.img location!" exit fi if ! [[ -e $3 ]] then echo "Incorrect SPL location!" exit fi if ! [[ -d $4 ]] then echo "Incorrect Binaries location!" exit fi if ! [[ -f $5 ]] then echo "Incorrect rootfs location!" exit fi DRIVE=$1 if [[ "$DRIVE" == *"mmcblk"* ]] then echo "You're using a mmc device, I need to fix partition names" PART="p" else PART="" fi UBOOT=$2 SPL=$3 BINARIES=$4 RFS=$5 echo "All data on "$DRIVE" now will be destroyed! Continue? [y/n]" read ans if ! [ $ans == 'y' ] then exit fi echo "[Partitioning $1...]" dd if=/dev/zero of=$DRIVE bs=1024 count=1024 SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'` echo DISK SIZE - $SIZE bytes CYLINDERS=`echo $SIZE/255/63/512 | bc` # check if we're running an old (e.g. 2.20.x) or new (e.g. 2.24.x) sfdisk sfdisk --help | grep -- -H if [ "$?" -eq "0" ] then { echo 40,1380,0x0c,* echo 1420,,83,- } | sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE else { echo 16M,8176M,0x0c,* echo 8192M,,83,- } | sfdisk $DRIVE fi partprobe echo "[Making filesystems...]" mkfs.vfat -F 32 -n BOOT "$DRIVE$PART"1 #> /dev/null mkfs.ext3 -F -L ROOTFS "$DRIVE$PART"2 #> /dev/null echo "[Copying files...]" binaries_dir=${BINARIES%/} mount "$DRIVE$PART"1 /mnt cp -av --no-preserve=ownership $binaries_dir/* /mnt/ umount "$DRIVE$PART"1 echo "[Extracting rfs (this may take a while...)]" mount "$DRIVE$PART"2 /mnt tar jxf $RFS -C /mnt > /dev/null chmod 755 /mnt umount "$DRIVE$PART"2 echo "[Programming SPL]" dd if=$SPL of=$DRIVE bs=512 seek=2 conv=fsync echo "[Programming u-boot.img]" dd if=$UBOOT of=$DRIVE bs=1k seek=69 conv=fsync echo "[Done]"
Here is an example that shows how to use this script. Let's assume that the binary files were downloaded in the desk
subdirectory of the working directory. Before invoking the script, the following files has to be renamed in order to make them compatible with the default U-Boot environment variables:
- bootscript:
boot.scr
- Linux kernel:
uImage
- Device tree blob:
carrier.dtb
.
This is the list of the binary files that will be used by the script:
dvdk@vagrant:~/desk-{{{kit}}}$ ls -la ... TBD directory listing ...
You can now run the script, by passing the following parameters:
- Device file of the microSD card (
/dev/sdc
in the example) - U-Boot image
- SPL
- Path of the directory containing the bootscript file, the Linux kernel image, and the device tree blob files
- Archive of the target's root file system (compressed as
.tar.bz2
file).
dvdk@vagrant:~/desk-{{{kit}}}$ ./mksd.sh /dev/sd<x> <u-boot.img> <SPL> <binaries_dir>/ <rfs_filename> ... ... TBD ... ...
[1] In case you have a different size, you'll need to change the sfdisk
parameters accordingly.
bootscrEdit
Once you got the new binaries compiled from your modified sources, they have to be installed on first SD partition preserving the original file names used into boot.scr u-boot bootscript.
Here below there is an example on how to create a boot.scr
file from the bootscript.txt for booting from SD card:
TBD: bootscript.txt dump
echo 'bootscript generated with command "mkimage -A ARM -T script -C none -n AXEL-Lite-DESK-SBCX -d bootscript.txt boot.scr"' setenv desk_release 'desk-mx6-l-1.0.0' if test 0x${cb_configid#} = 0x00000012; then if test ${cpu} = 6DL; then setenv fdtfile ${desk_release}_imx6dl-sbcx-cb0012.dtb else setenv fdtfile ${desk_release}_imx6q-sbcx-cb0012.dtb fi elif test 0x${cb_configid#} = 0x00000013; then if test ${cpu} = 6DL; then setenv fdtfile ${desk_release}_imx6dl-sbcx-cb0013.dtb else setenv fdtfile ${desk_release}_imx6q-sbcx-cb0013.dtb fi elif test 0x${cb_configid#} = 0xffffffff; then if test ${cpu} = 6DL; then setenv fdtfile ${desk_release}_imx6dl-desk-l-2.0.0.dtb else setenv fdtfile ${desk_release}_imx6q-desk-l-2.0.0.dtb fi else echo Invalid CB! Autoreset ... sleep 30 reset fi setenv bootfile ${desk_release}_uImage setenv mmc_loadk 'fatload mmc ${mmcdev}:1 ${loadaddr} ${bootfile}' setenv mmc_loadfdt 'fatload mmc ${mmcdev}:1 ${fdtaddr} ${fdtfile}' echo Booting AxelLite-DESK-SBCX via mmcboot with ${fdtfile} as device tree run mmcboot echo mmcboot FAILURE
and compile it using:
mkimage -A ARM -T script -C none -n AXEL-Lite-DESK-SBCX -d bootscript.txt boot.scr
Then copy the boot.scr into the <binaries_dir>
directories used by the script to create the SD card.
[[Category:{{{nome-som}}}]]