Open main menu

DAVE Developer's Wiki β

DESK-MX6UL-L/Development/How to create a bootable microSD card

< DESK-MX6UL-L
History
Issue Date Notes

2021/07/20

First DESK-MX6UL-L release

2022/03/16

DESK-MX6UL-L 3.0.0 release
2023/05/05 DESK-MX6UL-L 4.0.0 release



Contents

How to create a bootable SD cardEdit

The procedure described here was tested with a virtual machine such as the MVM. The USB controller of the MVM should be enabled by default. If you are using Linux-based distribution and are having trouble detecting a USB device in virtual machine, please make sure your user belongs to the vboxusers group.


This article shows how to create a bootable microSD for the DESK-MX6UL-L Release Notes kit by using a simple bash script.
Note: Note: Starting from DESK-MX6UL-L 1.0.1 release the support for the SPL has been introduced in U-Boot. Previous versions of this script will no longer produce a fully functional and bootable microSD card.

The procedure has been tested on a MVM released with DESK-MX6UL-L 4.0.1 release with

  • a 32 GB microSD card [1]
  • a USB SD card reader
  • the binary files delivered along with the DESK-MX6UL-L 4.0.0

The resulting card is partitioned as depicted here below:

  • bootable partition (mmcblk0p1, vfat) containing:
    • binary images (U-Boot and kernel images)
  • root file system partition (mmcblk0p2, ext3)
    • root file system binaries and init scripts

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

# wait for the VM to recognize the uSD
sleep 60

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. We use here files delivered with DESK-MX6UL-L 4.0.0 release. 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
  • splash image: splash_image.bmp
  • Linux kernel: desk-mx6ul-l-4.0.0_uImage
  • Device tree blob: desk-mx6ul-l-4.0.0_imx6ul-axelulite-cb003a.dtb.

In the case of you don't have some file on MVM, please download it from mirro.dave.eu.

We will copy them into ~/desk-mx-l/desk directory. Needed binary files can be found on MVM in the following location:

dvdk@vagrant:~$ ll /tftpboot/desk-mx6ul-l/
total 11352
-rw-r--r-- 1 dvdk root   32964 Mar 31 11:01 desk-mx6ul-l-4.0.0-imx6ul-axelulite-cb003a.dtb
-rw-r--r-- 1 dvdk root   32002 Mar 31 11:01 desk-mx6ul-l-4.0.0-imx6ul-axelulite-cb006c.dtb
-rw-r--r-- 1 dvdk root   33028 Mar 31 11:01 desk-mx6ul-l-4.0.0-imx6ul-lynx-som0013-cb002f.dtb
-rw-r--r-- 1 dvdk root 8017976 Mar 31 11:01 desk-mx6ul-l-4.0.0-uImage
-rw-r--r-- 1 dvdk root   35840 Mar 31 10:59 desk-mx6ul-l-4.0.0-mx6uldesk_axelulite_SPL
-rw-r--r-- 1 dvdk root   48128 Mar 31 10:59 desk-mx6ul-l-4.0.0-mx6uldesk_axelulite_spi_SPL
-rw-r--r-- 1 dvdk root  552184 Mar 31 11:00 desk-mx6ul-l-4.0.0-mx6uldesk_axelulite_spi_u-boot.img
-rw-r--r-- 1 dvdk root  551704 Mar 31 10:59 desk-mx6ul-l-4.0.0-mx6uldesk_axelulite_u-boot.img
-rw-r--r-- 1 dvdk root   35840 Mar 31 10:59 desk-mx6ul-l-4.0.0-mx6uldesk_lynx_SPL
-rw-r--r-- 1 dvdk root   48128 Mar 31 10:59 desk-mx6ul-l-4.0.0-mx6uldesk_lynx_spi_SPL
-rw-r--r-- 1 dvdk root  517248 Mar 31 10:59 desk-mx6ul-l-4.0.0-mx6uldesk_lynx_spi_u-boot.img
-rw-r--r-- 1 dvdk root  516776 Mar 31 10:59 desk-mx6ul-l-4.0.0-mx6uldesk_lynx_u-boot.img
-rw-r--r-- 1 dvdk root 1152054 Mar 31 10:59 splash_image.bmp
dvdk@vagrant:~$ mkdir -p ~/desk-mx-l/desk
dvdk@vagrant:~$ cp /tftpboot/desk-mx6ul-l/desk-mx6ul-l-4.0.0_uImage ~/desk-mx-l/desk/desk-mx6ul-l-4.0.0_uImage
dvdk@vagrant:~$ cp /tftpboot/desk-mx6ul-l/desk-mx6ul-l-4.0.0_imx6ul-axelulite-cb003a.dtb ~/desk-mx-l/desk/desk-mx6ul-l-4.0.0_imx6ul-axelulite-cb003a.dtb
dvdk@vagrant:~$ cp /tftpboot/desk-mx6ul-l/splash_image.bmp ~/desk-mx-l/desk/
dvdk@vagrant:~$ cp ~/desk-mx-l/boot.scr ~/desk-mx-l/desk/boot.scr
dvdk@vagrant:~$ cp ~/desk-mx-l/rfs/desk-mx6ul-l-4.0.0_modules.tar.gz ~/desk-mx-l/desk/

You can now run the script, by passing the following parameters:

  • Device file of the microSD card (/dev/sdb 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-mx-l$ sudo umount /dev/sdb*
dvdk@vagrant:~/desk-mx-l$ sudo ./desk-mx6ul-l-4.0.1_mksd.sh /dev/sdb /tftpboot/desk-mx6ul-l/desk-mx6ul-l-4.0.0_mx6uldesk_axelulite_u-boot.img /tftpboot/desk-mx6ul-l/desk-mx6ul-l-4.0.0_mx6uldesk_axelulite_SPL ~/desk-mx-l/desk ./rfs/desk-mx6ul-l-4.0.1_dave-image-devel-desk-mx6ul.tar.bz2 
All data on /dev/sdb now will be destroyed! Continue? [y/n]
y               
[Partitioning /dev/sdb...]
1024+0 records in                                                                                        
1024+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.262305 s, 4.0 MB/s
DISK SIZE - 31002198016 bytes
Checking that no-one is using this disk right now ... OK

Disk /dev/sdb: 28.89 GiB, 31002198016 bytes, 60551168 sectors
Disk model: Transcend       
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

>>> Created a new DOS disklabel with disk identifier 0x937180d6.
/dev/sdb1: Created a new partition 1 of type 'W95 FAT32 (LBA)' and of size 8 GiB.
/dev/sdb2: Created a new partition 2 of type 'Linux' and of size 20.9 GiB.
/dev/sdb3: Done.

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

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sdb1  *       32768 16777215 16744448    8G  c W95 FAT32 (LBA)
/dev/sdb2       16777216 60551167 43773952 20.9G 83 Linux

The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
[Making filesystems...]
mkfs.fat 4.1 (2017-01-24)
mke2fs 1.45.5 (07-Jan-2020)
/dev/sdb2 contains a ext3 file system labelled 'ROOTFS'
        created on Mon Apr  3 10:19:52 2023
Creating filesystem with 5471744 4k blocks and 1368064 inodes
Filesystem UUID: a0208180-9d1c-47e8-a8e0-c92a63a7059a
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

[Copying files...]
'/home/dvdk/desk-mx-l/desk/boot.scr' -> '/mnt/boot.scr'
'/home/dvdk/desk-mx-l/desk/desk-mx6ul-l-4.0.0_imx6ul-axelulite-cb003a.dtb' -> '/mnt/desk-mx6ul-l-4.0.0_imx6ul-axelulite-cb003a.dtb'
'/home/dvdk/desk-mx-l/desk/desk-mx6ul-l-4.0.0_uImage' -> '/mnt/desk-mx6ul-l-4.0.0_uImage'
'/home/dvdk/desk-mx-l/desk/splash_image.bmp' -> '/mnt/splash_image.bmp'
[Extracting rfs (this may take a while...)]
[Programming SPL]
70+0 records in
70+0 records out
35840 bytes (36 kB, 35 KiB) copied, 0.0120358 s, 3.0 MB/s
[Programming u-boot.img]
538+1 records in
538+1 records out
551704 bytes (552 kB, 539 KiB) copied, 0.164175 s, 3.4 MB/s
[Done]

[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:

echo 'bootscript generated with command "mkimage -A ARM -T script -C none -n DESK-MX6UL -d bootscript.txt boot.scr"'

setenv desk_release 'desk-mx6ul-l-4.0.0'

if test 0x${som_configid#} = 0x00000013 && test 0x${cb_configid#} = 0x0000002f;
then
    setenv fdtfile ${desk_release}_imx6ul-lynx-som0013-cb002f.dtb
elif test 0x${cb_configid#} = 0x0000003a
then
	setenv fdtfile ${desk_release}_imx6ul-axelulite-cb003a.dtb
elif test 0x${cb_configid#} = 0x0000006c
then
	setenv fdtfile ${desk_release}_imx6ul-axelulite-cb006c.dtb
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 DESK-MX6UL via mmcboot with ${fdtfile} as device tree

run mmcboot

echo mmcboot FAILURE

and compile it using:

mkimage -A ARM -T script -C none -n DESK-MX6UL -d bootscript.txt boot.scr

Then copy the boot.scr into the <binaries_dir> directories used by the script to create the SD card.

Install ModuleEdit

To install kernel modules, follow the steps below.

root@desk-mx6ul-axelulite:~# sudo mount /dev/mmcblk0p1 /media                     
root@desk-mx6ul-axelulite:~# tar xvzf /media/desk-mx6ul-l-4.0.0_modules.tar.gz -C /

After installation, run the following command to verify that the installation was successful:

root@desk-mx6ul-axelulite:~# ls -l /lib/modules/$(uname -r)
total 300
lrwxrwxrwx 1 541 502     65 Apr  3  2023 build -> /home/jenkins/workspace/workspace/DESK-MX6UL-L-4.x.x_Linux-kernel
drwxr-xr-x 6 541 502   4096 Apr  3  2023 kernel
-rw-r--r-- 1 541 502   2718 Apr  3  2023 modules.alias
-rw-r--r-- 1 541 502   4768 Apr  3  2023 modules.alias.bin
-rw-r--r-- 1 541 502  14878 Apr  3  2023 modules.builtin
-rw-r--r-- 1 541 502  34704 Apr  3  2023 modules.builtin.alias.bin
-rw-r--r-- 1 541 502  17778 Apr  3  2023 modules.builtin.bin
-rw-r--r-- 1 541 502 105373 Apr  3  2023 modules.builtin.modinfo
-rw-r--r-- 1 541 502  10689 Apr  3  2023 modules.dep
-rw-r--r-- 1 541 502  21666 Apr  3  2023 modules.dep.bin
-rw-r--r-- 1 541 502      0 Apr  3  2023 modules.devname
-rw-r--r-- 1 541 502   8657 Apr  3  2023 modules.order
-rw-r--r-- 1 541 502     85 Apr  3  2023 modules.softdep
-rw-r--r-- 1 541 502  16970 Apr  3  2023 modules.symbols
-rw-r--r-- 1 541 502  23964 Apr  3  2023 modules.symbols.bin
lrwxrwxrwx 1 541 502     65 Apr  3  2023 source -> /home/jenkins/workspace/workspace/DESK-MX6UL-L-4.x.x_Linux-kernel