This document was written and tested with the software/hardware combination described in the history table above. However, it contains general concepts that can be adapted on any DAVE Embedded Systems' Linux platform.
{{ImportantMessage|text=The following programming examples are intended for <b>laboratory usage</b> or for ''preliminary deployment strategy''.<br><br>A complete deployment strategy has to be carefully identifiyed taking into account the overall arguments like: boot speed, safe boot, recovery mechanisms, watchdog supervisor, etc.}} We'll explain how to program and configure an [[:Category:SDVX |SDVX]] to boot in standalone mode, without the need of a system microSD card or an NFS server, with two threee options:* booting with NOR and NAND internal storage** in this configuration the primary boot images will be fetched fomr NOR flash storage, while the root file system will be fetched from NAND flash
* booting with NAND only
** In in this configuration the whole system will boot without the need of a NOR flash storage, all images and the root file system will be fetched from NAND flash.* booting with microSD eMMC only** In in this configuration the whole system will boot without the need of a NOR flash /NAND flashes storage, all images and the root file system will be fetched from NAND eMMC flash.
== Storing root file system into NAND flash (only Lite) Program boot images ...==This is a common step for both booting options.
* Boot the system via SD or NFS as described inhthe e [[SDV04 Embedded Linux Kit (SDVX)#Quick_start_guide{{ImportantMessage|Quick start guide]]* By default, text=Select the NAND is already partitioned to allow booting from NANDproper <code>u-only (see next section) andboot</code>, thus, some partitions are reserved for U-boot <code>kernel</code> and kernel images. Here we won't modify this default configuration. The [[Memory Tecnology Device (MTD)|MTD]] partitions can be dumped with <code>/proc/mtddevice tree</code> (binary images according to the partition's name should be self-explanatory)Axel Lite or Axel ULite SOM used}}
== Storing boot images ...==
==... into NOR flash ==
===Uu-Boot===Update to the latest u-boot version allows usage of u-boot environment variables available. <pre class="board-terminal">=> run loadUsing FEC deviceTFTP from server 192.168.0.13; our IP address is 192.168.0.89Filename 'sdvx/u-boot/sdvx-1.0.0_mx6dl_sfczg_spi_u-boot.imx'.Load address: 0x12000000Loading: ################################################################# ################################################################# ## 1.4 MiB/sdoneBytes transferred = 671788 (a402c hex)=> run spi_updateSF: Detected S25FL256S with page size 64 KiB, total 32 MiB=></pre> ===Linux kernel image and device tree=== We assume that the following environment variables are present in u-boot: <pre>loadk=tftpboot ${loadaddr} ${serverip}:${bootfile}loadfdt=tftpboot ${fdtaddr} ${serverip}:${fdtfile}spi_updatek=sf erase 200000 800000; sf write ${loadaddr} 200000 ${filesize}spi_updatefdt=sf erase 180000 80000; sf write ${fdtaddr} 180000 ${filesize}spi_loadk=sf read ${loadaddr} 200000 800000spi_loadfdt=sf read ${fdtaddr} 180000 80000spi_nand=sf probe; run spi_loadk spi_loadfdt nandargs addcons addmisc; if run configid_fixupfdt; then bootm ${loadaddr} - ${fdtaddr}; fi</pre> * Update the <code>bootfile</code> and <code>fdtfile</code> environment variables to fit the filename as found inside the TFTP server.* Program kernel and device tree on NOR flash with the following U-Boot command <pre class="board-terminal">sf probe; run loadk spi_updatek loadfdt spi_updatefdt</pre> E.g.: <pre class="board-terminal">=> sf probe; run loadk spi_updatek loadfdt spi_updatefdtSF: Detected S25FL256S with page size 64 KiB, total 32 MiBUsing FEC deviceTFTP from server 192.168.0.13; our IP address is 192.168.0.98Filename 'sdvx/linux/sdvx-1.0.0_lite_uImage'.Load address: 0x12000000Loading: ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ############################################# 1.6 MiB/sdoneBytes transferred = 6437016 (623898 hex)Using FEC deviceTFTP from server 192.168.0.13; our IP address is 192.168.0.89Filename 'sdvx/linux/sdvx-1.0.0_lite_imx6dl-sfczg-cb0043.dtb'.Load address: 0x18000000Loading: ######### 1.2 MiB/sdoneBytes transferred = 42547 (a633 hex)=></pre> Reboot the system and configure U-Boot to apply the new configuration <pre class="board-terminal">=> setenv bootcmd run spi_nand=> saveenv</pre>
== ... into NAND flash ==
===Uu-Boot===u-boot on NAND flash must be programmed using NXP <code>kobs-ng</code> utility: this tool is required for writing the correct u-boot image on NAND storing all information needed by bootrom to identify the NAND as a boot device. Here below an example:* boot the system via SD on NFS* uses a rfs with <b>kobs-ng</b> utility available on it (e.g. DAVE's rfs provided with XELK)* copy the related u-boot imx image file on nfs /home/root (for example)* execute kobs-ng passing the parameters for flashing u-boot on NAND <pre class="board-terminal">root@imx6qxelk:~# kobs-ng -x -v -w sdvx-1.0.0_mx6dl_sfczg_nand_u-boot.imxMTD CONFIG: chip_0_device_path = "/dev/mtd0" chip_1_device_path = "(null)" search_exponent = 2 data_setup_time = 80 data_hold_time = 60 address_setup_time = 25 data_sample_time = 6 row_address_size = 3 column_address_size = 2 read_command_code1 = 0 read_command_code2 = 48 boot_stream_major_version = 1 boot_stream_minor_version = 0 boot_stream_sub_version = 0 ncb_version = 3 boot_stream_1_address = 0 boot_stream_2_address = 0 -- We add the 1k-padding to the uboot..tmp_kobs_ng: verifying using key '00000000000000000000000000000000'.tmp_kobs_ng: is a valid bootstream for key '00000000000000000000000000000000'mtd: use new bch layout raw access modemtd: opening: "/dev/mtd0"NFC geometry : ECC Strength : 2 Page Size in Bytes : 2071 Metadata size : 10 ECC Chunk Size in byte : 512 ECC Chunk count : 4 Block Mark Byte Offset : 2028 Block Mark Bit Offset : 2====================================================mtd: opened '/dev/mtd0' - '(null)'mtd: max_boot_stream_size_in_bytes = 3670016mtd: boot_stream_size_in_bytes = 672812mtd: boot_stream_size_in_pages = 329mtd: #1 0x00100000 - 0x00480000 (0x001a442c)mtd: #2 0x00480000 - 0x00800000 (0x0052442c)FCB m_u32Checksum = 0x00000000 m_u32FingerPrint = 0x20424346 m_u32Version = 0x01000000 m_NANDTiming.m_u8DataSetup = 80 m_NANDTiming.m_u8DataHold = 60 m_NANDTiming.m_u8AddressSetup = 25 m_NANDTiming.m_u8DSAMPLE_TIME = 6 m_u32PageDataSize = 2048 m_u32TotalPageSize = 2112 m_u32SectorsPerBlock = 64 m_u32NumberOfNANDs = 0 m_u32TotalInternalDie = 0 m_u32CellType = 0 m_u32EccBlockNEccType = 1 m_u32EccBlock0Size = 512 m_u32EccBlockNSize = 512 m_u32EccBlock0EccType = 1 m_u32MetadataBytes = 10 m_u32NumEccBlocksPerPage = 3 m_u32EccBlockNEccLevelSDK = 0 m_u32EccBlock0SizeSDK = 0 m_u32EccBlockNSizeSDK = 0 m_u32EccBlock0EccLevelSDK = 0 m_u32NumEccBlocksPerPageSDK = 0 m_u32MetadataBytesSDK = 0 m_u32EraseThreshold = 0 m_u32Firmware1_startingPage = 512 m_u32Firmware2_startingPage = 2304 m_u32PagesInFirmware1 = 329 m_u32PagesInFirmware2 = 329 m_u32DBBTSearchAreaStartAddress = 256 m_u32BadBlockMarkerByte = 2028 m_u32BadBlockMarkerStartBit = 2 m_u32BBMarkerPhysicalOffset = 2048 m_u32BCHType = 0 m_NANDTMTiming.m_u32TMTiming2_ReadLatency = 0 m_NANDTMTiming.m_u32TMTiming2_PreambleDelay = 0 m_NANDTMTiming.m_u32TMTiming2_CEDelay = 0 m_NANDTMTiming.m_u32TMTiming2_PostambleDelay = 0 m_NANDTMTiming.m_u32TMTiming2_CmdAddPause = 0 m_NANDTMTiming.m_u32TMTiming2_DataPause = 0 m_NANDTMTiming.m_u32TMSpeed = 0 m_NANDTMTiming.m_u32TMTiming1_BusyTimeout = 0 m_u32DISBBM = 0 m_u32BBMarkerPhysicalOffsetInSpareData = 0DBBT m_u32Checksum = 0x00000000 m_u32FingerPrint = 0x54424244 m_u32Version = 0x01000000 m_u32DBBTNumOfPages = 0Firmware: image #0 @ 0x100000 size 0xa4800 - available 0x380000Firmware: image #1 @ 0x480000 size 0xa4800 - available 0x380000-------------- Start to write the [ FCB ] -----mtd: erasing @0:0x0-0x20000mtd: Writing FCB0 [ @0:0x0 ] (840) *mtd: erasing @0:0x20000-0x40000mtd: Writing FCB1 [ @0:0x20000 ] (840) *mtd: erasing @0:0x40000-0x60000mtd: Writing FCB2 [ @0:0x40000 ] (840) *mtd: erasing @0:0x60000-0x80000mtd: Writing FCB3 [ @0:0x60000 ] (840) *mtd_commit_bcb(FCB): status 0 -------------- Start to write the [ DBBT ] -----mtd: erasing @0:0x80000-0xa0000mtd: Writing DBBT0 [ @0:0x80000 ] (800) *mtd: erasing @0:0xa0000-0xc0000mtd: Writing DBBT1 [ @0:0xa0000 ] (800) *mtd: erasing @0:0xc0000-0xe0000mtd: Writing DBBT2 [ @0:0xc0000 ] (800) *mtd: erasing @0:0xe0000-0x100000mtd: Writing DBBT3 [ @0:0xe0000 ] (800) *mtd_commit_bcb(DBBT): status 0 ---------- Start to write the [ .tmp_kobs_ng ]----mtd: Writting .tmp_kobs_ng: #0 @0: 0x00100000 - 0x001a4800mtd: erasing @0:0x100000-0x120000mtd: erasing @0:0x120000-0x140000mtd: erasing @0:0x140000-0x160000mtd: erasing @0:0x160000-0x180000mtd: erasing @0:0x180000-0x1a0000mtd: erasing @0:0x1a0000-0x1c0000mtd: The last page is not full : 1068mtd: We write one page for save guard. *mtd: Writting .tmp_kobs_ng: #1 @0: 0x00480000 - 0x00524800mtd: erasing @0:0x480000-0x4a0000mtd: erasing @0:0x4a0000-0x4c0000mtd: erasing @0:0x4c0000-0x4e0000mtd: erasing @0:0x4e0000-0x500000mtd: erasing @0:0x500000-0x520000mtd: erasing @0:0x520000-0x540000mtd: The last page is not full : 1068mtd: We write one page for save guard. *root@imx6qxelk:~#</pre> ===Linux kernel image and device tree=== We assume that the following environment variables are present in u-boot: <pre>nand_updatek=nand erase.part nand-kernel; nand write ${loadaddr} nand-kernel ${filesize}nand_updatefdt=nand erase.part nand-fdt; nand write ${fdtaddr} nand-fdt ${filesize}nand_loadk=nand read ${loadaddr} nand-kernelnand_loadfdt=nand read ${fdtaddr} nand-fdtnand_nand=run nand_loadk nand_loadfdt nandargs addcons addmisc; if run configid_fixupfdt; then bootm ${loadaddr} - ${fdtaddr}; fi</pre> * Update the <code>bootfile</code> and <code>fdtfile</code> environment variables to fit the filename as found inside the TFTP server.* Program kernel and device tree on NAND flash with the following U-Boot command <pre class="board-terminal">run loadk nand_updatek loadfdt nand_updatefdt</pre> E.g.: <pre class="board-terminal">U-Boot > run loadk nand_updatek loadfdt nand_updatefdtUsing FEC deviceTFTP from server 192.168.0.13; our IP address is 192.168.0.98Filename 'sdvx/linux/sdvx-1.0.0_lite_uImage'.Load address: 0x12000000Loading: ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ####################### 1.4 MiB/sdoneBytes transferred = 6437016 (623898 hex) NAND erase.part: device 0 offset 0xc00000, size 0x800000Erasing at 0x13e0000 -- 100% complete.OK NAND write: device 0 offset 0xc00000, size 0x623898 6437016 bytes written: OKUsing FEC deviceTFTP from server 192.168.0.13; our IP address is 192.168.0.89Filename 'sdvx/linux/sdvx-1.0.0_lite_imx6dl-sfczg-cb0043.dtb'.Load address: 0x18000000Loading: ######### 525.4 KiB/sdoneBytes transferred = 42547 (a633 hex) NAND erase.part: device 0 offset 0xa00000, size 0x100000Erasing at 0xae0000 -- 100% complete.OK NAND write: device 0 offset 0xa00000, size 0xa633 42547 bytes written: OK=></pre> Reboot the system and configure U-Boot to apply the new configuration <pre class="board-terminal">=> setenv bootcmd run nand_nand=> saveenv</pre>
== ... into eMMC ==
We assume that ===u-Boot===Update to the following latest u-boot version allows usage of u-boot environment variables are present in available. <pre>mmc_update=mmc dev; setexpr blocks ${filesize} / 0x200; setexpr blocks ${blocks} + 1; mmc write ${loadaddr} 2 ${blocks}</pre> Load u-bootbinary form a <code>tftp</code> server: <pre class="mwboard-collapsible mwterminal">=> run loadUsing FEC deviceTFTP from server 192.168.0.13; our IP address is 192.168.0.89Filename 'sdvx/u-boot/sdvx-1.0.0_mx6dl_sfczg_u-boot.imx'.Load address: 0x12000000Loading: ################################################################# ################################################################# ## 1.5 MiB/sdoneBytes transferred = 671788 (a402c hex)=> run mmc_updateswitch to partitions #0, OKmmc2(part 0) is current device (eMMC) MMC write: dev # 2, block # 2, count 1313 ... 1313 blocks written: OK=></pre> Load u-collapsedboot binary form an <code>SD</code> card: <pre class="board-terminal">mmc_loadfdtHit ENTER within 1 seconds to stop autoboot=> fatload mmc 0:1 ${fdtaddrloadaddr} imx6ulsdvx-1.0.1_mx6dlaxel_u-boot.imxreading sdvx-1.0.1_mx6dlaxel_u-lynxboot.imx671788 bytes read in 50 ms (12.8 MiB/s)=> mmc dev 2switch to partitions #0, OKmmc2(part 0) is current device (eMMC)=> run mmc_updateswitch to partitions #0, OKmmc2(part 0) is current device (eMMC) MMC write: dev # 2, block # 2, count 1313 .dtb.. 1313 blocks written: OK=></pre> ===kernel image and device tree=== We assume that the following environment variables are present in u-boot: <pre>mmc_loadk=fatload mmc 0${mmcdev}:1 ${loadaddr} uImage${bootfile}mmc_loadfdt=fatload mmc ${mmcdev}:1 ${fdtaddr} ${fdtfile}
mmc_updatemmcboot=setexpr blocks ${filesize} / 0x200run mmcargs addcons addmisc; if run mmc_loadk; then if run mmc_loadfdt; setexpr blocks ${blocks} + 1then if run configid_fixupfdt; mmc write then bootm ${loadaddr} 2 - ${blocksfdtaddr}; fi; fi; fi</pre> Using an SD card or an eMMC device assumes that <code>bootfile</code>, <code>fdtfile</code> and <code>splashfile</code> are stored into fist MMC device partition. Then, u-boot uses the previous listed commands for reading the binary images and starting the linux bootstrap from the ''MMC part 2'' (which is reserved for the root-file system storage). The following u-boot environment variables are present for this purposes:<pre>
mmcargs=setenv bootargs root=${mmcroot}
mmcroot=/dev/mmcblk2p2 rootwait rw
</pre>
=== boot vars ===
The following environment variables should be configured for u-boot properly reading the boot files from the first SD card partition, e.g.
then save the environment and reboot the system to apply the new configuration:
<pre class="board-terminal">
=> saveenv
Saving Environment to MMC...
Writing to MMC(2)... done
=> reset
</pre>
== Program root file system into NAND flash ==
* Boot the system via SD or NFS as described in the e [[SDV04 Embedded Linux Kit (SDVX)#Quick_start_guide|Quick start guide]]
* By default, the NAND is already partitioned to allow booting from NAND-only (see next section) and, thus, some partitions are reserved for u-boot and kernel images. Here we won't modify this default configuration. The [[Memory Tecnology Device (MTD)|MTD]] partitions can be dumped with <code>/proc/mtd</code> (the partition's name should be self-explanatory)
<pre class="workstation-terminal">
root@sdvx-lite:~# cat /proc/mtd
dev: size erasesize name
mtd0: 00800000 00020000 "nand-uboot"
mtd1: 00100000 00020000 "nand-env1"
mtd2: 00100000 00020000 "nand-env2"
mtd3: 00100000 00020000 "nand-fdt"
mtd4: 00100000 00020000 "nand-spare"
mtd5: 00800000 00020000 "nand-kernel"
mtd6: 00600000 00020000 "nand-splash"
mtd7: 3e600000 00020000 "nand-ubi"
root@sdvx-lite:~#
</pre>
{{ImportantMessage|text=Please note that MTD partition index may change depending of flash device availability, flash device size, u-boot environment variables or kernel device driver load order. Always take care of looking inside <code>/proc/mtd</code> to match your specific layout}}
* Format and initialize ''nand-ubi'' partition, which in our case is <code>mtd7</code>, using [[Memory Tecnology Device (MTD)#UBI|UBI]] with:
<pre>
ubiformat /dev/mtd7
ubiattach -m 7
ubimkvol /dev/ubi0 -N rootfs -m
</pre>
E.g.
<pre class="board-terminal">
root@sdvx-lite:~# ubiformat /dev/mtd7
ubiformat: mtd7 (nand), size 1048576000 bytes (1000.0 MiB), 8000 eraseblocks of 131072 bytes (128.0 KiB), min. I/O size 2048 bytes
[ 1810.480976] UBIFS: reserved for root: 4952683 bytes (4836 KiB)
[ 1810.487210] UBIFS: media format: w4/r0 (latest is w4/r0), UUID 99D0F3C6-5955-4B30-9E2D-72202281BD30, small LPT model
</pre>
* you can now extract the root file system into that directory
<pre>
tar xvjf sdvx-1.0.1_image-devel-sdvx-lite.tar.bz2 -C /mnt/nand
</pre>
* finally, you need to cleanly umount and detach the MTD partition
<pre>
umount /mnt/nand/
ubidetach -m 7
</pre>
* Update the <code>bootfile</code> and <code>fdtfile</code> environment variables to fit the filename as found inside the TFTP serverE.g.* Program kernel and device tree on the MMC with the following U-Boot command
<pre class="board-terminal">
root@sdvx-lite:~# umount /mnt/nand/
[ 2446.743091] UBIFS: un-mount UBI device 0, volume 0