{{ImportantMessage|text=For the sake of simplicity, this document does not address the reliability of the partitioning schemes described. This matter is beyond the scope of this document and should take into account several factors such as the intrinsic reliability of NOR/NAND flashes, the estimated usage in terms of read/write operations, etc. For more information related to this subject, please contact [mailto:support-bora@dave.eu the technical support].}}
== History ==
|March 2019
|Added use case #2
|-
|2.0.1
|March 2019
|Added warning about realiability<br>
Added images of case #1's partitioning scheme
|-
|{{oldid|9151|2.0.2}}
|June 2019
|Fixed definition of <code>nandboot2</code> variable<br>
Fixed dump related to the download of the bitstream file
|-
|3.0.0
|Jan 2020
|Update for BELK/BXELK 4.1.0
|}
<section begin=BELK/>== Introduction Standalone boot==This document shows some examples related to configuring Bora/BoraX /BoraLite for standalone operativity.
We'll explain how to program and configure a [[Category:BoraXBORA Xpress SOM|BoraXBORA Xpress]] -based system to boot in standalone mode, without the need of a system microSD card or an NFS server. Only the flash memories available on the SoM itself will be used to store persistently all the software required.
The examples here documented are valid for [[BORA SOM|BORA]] and for [[BORA Lite SOM|BORA Lite]] as well.
{{ImportantMessage|text=It is worth remembering that the examples shown in this article don't make use of any image script. This technique is used by the bootable microSD card delivered along with the kit, instead. For more details, please refer to [[Working_with_the_Yocto_build_system#bootscript|this section]].}} ===Use case #1=======Introduction====
This configuration makes use of one of the most common partitioning schemes, that is:
*The NOR flash acts as boot memory; as such, it contains
**bootrom header and FSBL (or header+U-Boot SPL)
**U-Boot
**U-Boot redundant environment
**Even though these images are not strictly required to boot the system, the NOR flash also contains:***The Linux kernel image***The Linux Device Tree Blob (DTB)***The bitstream file for the Programmable Logic (PL).*The NAND flash contains the a partition devoted to a read/write UBIFS root filesystem (read/write). The resulting flash memory layout is illustrated in the following pictures. [[File:BELK-NOR-flash-partitioning-case1.png|thumb|center|600px|NOR flash partitioning scheme]] [[File:BELK-NAND-flash-partitioning-case1.png|thumb|center|600px|NAND flash partitioning scheme]]
*Once started, the Linux kernel mount the root filesystem from a NAND partition.
=====Testbed=====
This configuration was tested with the following testbed:
==== Program the root filesystem in NAND flash ====
This is a common step for both booting options.
* Boot the system via SD or NFS as described into the [[System_boot_and_recovery_via_microSD_card_(BORA_SOM/BELK-L/Development/BXELK)How_to_create_a_bootable_microSD_card|System boot and recovery via microSD card]] and [[Booting_the_system_via_NFS_(BORA_SOM/BELK-L/General/BXELK)Booting_from_NFS|Booting the system via NFS]]
* By default, the NAND is already partitioned to allow booting from NAND-only (see next section) and, thus, some partitions are reserved for FSBL, 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)
In this case, the NOR flash is only used to store U-Boot and its environment. All the other images are stored onto the NAND flash. Specifically, the NAND flash has four partitions that are used to store respectively:
*The <code>uImage</code> binary image, which, in turn, consists of the Linux kernel and a [http://www.linuxfromscratch.org/blfs/view/svn/postlfs/initramfs.html <code>initramfs</code> image].**By the way, this is the default format used for the root filesystem generated by as per [[/BELK-TN-006:_Using_PetaLinux_to_Build_BELK/BXELK_Software_Components|PetaLinux]]'s default configuration.
**This partition is associated with the device file <code>/dev/mtd0</code>
*The PL bitstream
*The Device Tree Blob
**This partition is associated with the device file <code>/dev/mtd2</code>
*An auxiliary read/write filesystem used by the user-space applications for several purposes such as data logging.**This partition is associated with the device file <code>/dev/mtd3</code>.
The resulting bootstrap sequence is like the following:
#U-Boot is retrieved from the NOR flash and copied into the SDRAM memory
#U-boot, in turn, reads from the NAND memory the <code>uImage</code>, the bitstream, the DTB, and copies them into the SDRAM memory
#U-Boot starts the Linux kernel
#Finally, the Linux kernel mounts the root filesystem (<code>initramfs</code>) from the SDRAM memory and starts user-space applications and deamonsdaemons. It is worth remembering that <code>mtd0</code>,<code>mtd1</code>, and <code>mtd2</code> are used as raw partitions while <code>mtd3</code> is associated with a block device in order to mount a filesystem, specifically ''UBIFS''. To handle such filesystem, the Linux kernel must be built with the UBI/UBIFS support enabled and the root filesystem must include the <code>mtd-utils-ubifs</code> package (see the following image).
To setup this configuration, several operations need to be carried out[[File:PetaLinux-mtd-utils-ubifs. They are detailed in png|thumb|center|600px|Selecting the following sections. It is assumed that the SOM can boot from the NOR flash. If not, please see [[Restoring_U<code>mtd-utils-Boot_on_SPI_NOR_flash_(BELKubifs</BXELK)|this pagecode> package in PataLinux root filesystem configuration]].
To setup the desired standalone configuration, several operations need to be carried out. They are detailed in the following sections. It is assumed that the SOM can boot from the NOR flash. If not, please see [[BORA_SOM/BELK-L/Deployment/Restoring_U-Boot_on_NOR_flash|this page]]. =====Testbed=====The testbed used to test this configuration consists of the following boards:*SOM: DBXD4110S2R*Carrier board: EVBBX0000C0R*Software: BXELK 4.0.0 + PetaLinux 2017.1 ====Storing the images in onto the first three raw partitions of the NAND memory====Before storing the images onto into the NAND flash, the bitstrem bitstream must be converted. For more details, please refer to [[BELK-AN-008:_Programming_FPGA_Bitstream_with_UProgramming the FPGA Bitstream with U-Boot|this page]]:
Once the U-Boot console is available, the binary files to be stored onto the NAND flash can be downloaded via TFTP. The following box shows the full procedure:
Once the U-Boot console is available, the binary files to be stored into the NAND flash can be downloaded via TFTP. The size of the partitions illustrated in the previous image determine the offsets to use with the <code>nand erase/write</code> commands. The following box shows the full procedure. The first file to be stored is <code>uImage</code>:<preclass="board-terminal">
Bora> nand info
options 0x 0
bbt options 0x 20000
Bora> tftpboot ${loadaddr} borax/uImage
Using ethernet@e000b000 device
TFTP from server 192.168.0.13; our IP address is 192.168.0.81
Bora> nand write ${loadaddr} 0 ${filesize} NAND write: device 0 offset 0x0, size 0x972038 9904184 bytes written: OKBora><INTERRUPT/pre> Downloading and flashing of the bitstream file:<pre class="board-terminal">Bora> print tftpboot ${loadaddr} borax/bitstream.binUsing ethernet@e000b000 deviceTFTP from server 192.168.0.13; our IP address is 192.168.0.81Filename 'borax/bitstream.bin'.Load address: 0x2080000Loading: ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ############################################################### 2.5 MiB/sdoneBytes transferred = 5979916 (5b3f0c hex)Bora> nand erase 3000000 f00000 NAND erase: device 0 offset 0x3000000, size 0xf00000Erasing at 0x3ee0000 -- 100% complete.OKBora> nand write ${loadaddr} 3000000 ${filesize} NAND write: device 0 offset 0x3000000, size 0x5b3f75 5980021 bytes written: OK</pre> Downloading and flashing of the DTB:<pre class="board-terminal">Bora> tftpboot ${loadaddr} borax/bora.dtbUsing ethernet@e000b000 deviceTFTP from server 192.168.0.13; our IP address is 192.168.0.81Filename 'borax/bora.dtb'.Load address: 0x2080000Loading: ## Error# 746.1 KiB/sdoneBytes transferred = 15280 (3bb0 hex)Bora> nand erase 3f00000 100000 NAND erase: device 0 offset 0x3f00000, size 0x100000Erasing at 0x3fe0000 -- 100% complete.OKBora> nand write ${loadaddr} 3f00000 ${filesize} NAND write: device 0 offset 0x3f00000, size 0x3bb0 15280 bytes written: OK</pre> ===Setting up the U-Boot environment===In order to boot the system as desired, the U-Boot environment must be configured properly. The most important variable is <code>nandboot2</code> that can be created as follows:<pre class="board-terminal">Bora> setenv nandboot2 'run program_fpga2 loadunand loadfdtnand nandargs2 addip addcons addmisc; run configid_fixupfdt; bootm ${loadaddr} - ${fdtaddr}'Bora> saveeSaving Environment to SPI Flash...SF: Detected s25fl128s_64k with page size 256 Bytes, erase size 64 KiB, total 32 MiBErasing SPI flash...Writing to SPI flash...doneValid environment: 1</pre> Another important variable that needs to be changed is <code>mtdparts</code>. It must be set like this in order to tell the kernel how the NAND flash is partitioned:<pre class="board-terminal">mtdparts=mtdparts=pl35x-nand:48M(data0),15M(data1),1M(data2),-(data3)</pre> Similarly, other variables need to be created such as <code>loadunand</code> and <code>loadfdtnand</code>. The resulting environment should look like this:<pre class="8fc790board-terminal" not defined>
Please note that the variable <code>bootcmd</code> is set to run the desired boot sequence (<code>nandboot2</precode>).
====Formatting the fourth partition of the NAND memory(<code>mtd3</code>)====After setting up the U-Boot environment, it is possible to start a full bootstrap sequence by issuing the <code>boot</code> command. Please refer to [[#Full bootstrap procedure|this section]] to see the dump of the serial console during the full bootstrap sequence.
Once the system has completed the bootstrap procedure, it is possible to format the <code>mtd3</code> partition in order to store a ''UBIFS'' filesystem.
First of all, check that the NAND's partitions are defined properly:<preclass="board-terminal">root@bora-ubi:~# cat /proc/mtd
dev: size erasesize name
mtd0: 03000000 00020000 "data0"
mtd2: 00100000 00020000 "data2"
mtd3: 3c000000 00020000 "data3"
</pre> To format the partition and to mount the newly created filesystem, issue the following commands:<pre class="board-terminal">root@bora-ubi:~# ubiformat /dev/mtd3
ubiformat: mtd3 (nand), size 1006632960 bytes (960.0 MiB), 7680 eraseblocks of 131072 bytes (128.0 KiB), min. I/O size 2048 bytes
root@bora:~# ls -la /mnt/total 16drwxr-xr-x 4 root root 4096 Mar 19 2018 .drwxrwxr-x 16 541 502 4096 Jul 9 21:11 ..drwxr-xr-x 2 root root 4096 Mar 19 2018 tftpvideodrwxr-xr-x 2 root root 4096 Mar 19 2018 ubifsroot@boraubi:~# mkdir -p /mnt/data3root@bora-ubi:~# mount -t ubifs ubi0_0 /mnt/data3[ 12386634.777228342953] UBIFS (ubi0:0): default file-system created[ 12386634.783887349787] UBIFS (ubi0:0): background thread "ubifs_bgt0_0" started, PID 8781473[ 12386634.913347536639] UBIFS (ubi0:0): UBIFS: mounted UBI device 0, volume 0, name "data3"[ 12386634.920577543901] UBIFS (ubi0:0): LEB size: 129024 bytes (126 KiB), min./max. I/O unit sizes: 2048 bytes/2048 bytes[ 12386634.930509553858] UBIFS (ubi0:0): FS size: 967421952 bytes (922 MiB, 7498 LEBs), journal size 33546240 bytes (31 MiB, 260 LEBs)[ 12386634.941440564767] UBIFS (ubi0:0): reserved for root: 4952683 bytes (4836 KiB)[ 12386634.948006571363] UBIFS (ubi0:0): media format: w4/r0 (latest is w4/r0), UUID B4CA7F108B1F86F2-B2AEF2C3-4C894292-B2E1845F-59B38879E56477D3BF3E212A, small LPT model</pre> It is now possible to verify that the filesystem was mounted properly:<pre class="board-terminal">root@bora-ubi:~# mount192.168.0.13:/opt/nfsroot/bora/belk-4.0.0 rootfs on / type nfs rootfs (rw,relatime,vers=2,rsize=4096,wsize=4096,namlen=255,hard,nolock,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.0.13,mountvers=1,mountproto=tcp,local_lock=all,addr=192.168.0.13)devtmpfs on /dev type devtmpfs (rw,relatime,size=506608k,nr_inodes=126652,mode=755)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=503536k,nr_inodes=125884,mode=755)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /var/volatile type tmpfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620,ptmxmode=000)
ubi0_0 on /mnt/data3 type ubifs (rw,relatime)
</pre> As expected, the available space on the <code>ubi0_0</code> is less than the raw size of the partition:<pre class="board-terminal">root@bora-ubi:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
SF: Detected s25fl128s_64k with page size 256 Bytes, erase size 64 KiB, total 32 MiB
Erasing SPI flashIn: serial@e0001000Out: serial@e0001000Err: serial@e0001000Model: BoraBoard: Xilinx ZynqSF: Detected s25fl128s_64k with page size 256 Bytes, erase size 64 KiB, total 32 MiBSF: Detected s25fl128s_64k with page size 256 Bytes, erase size 64 KiB, total 32 MiBSOM ConfigID#: 00000005SOM UniqueID#: 3a11013a:40b52447ds2431_readmem(): error in chip resetds2431_readmem(): error in reading bufferds2431_readmem(): error in chip resetds2431_readmem(): error in reading bufferCB ConfigID CRC mismatch for 0x00000000 (was 0x00000000, expected 0x2144df1c) at block 3 (offset 96): using defaultCB ConfigID#: ffffffffCB UniqueID#: 00000000:00000000Net: ZYNQ GEM: e000b000, phyaddr 7, interface rgmii-ideth0: ethernet@e000b000Hit ENTER within 3 seconds to stop autoboot NAND read: device 0 offset 0x3000000, size 0xf00000 15728640 bytes read: OK NAND read: device 0 offset 0x0, size 0x3000000 50331648 bytes read: OK NAND read: device 0 offset 0x3f00000, size 0x100000 1048576 bytes read: OKFDT: property som_configid FDT: override 'som_configid' with '00000005'FDT: override 'som_uniqueid' with '3a11013a:40b52447'FDT: override 'cb_uniqueid' with '00000000:00000000'## Booting kernel from Legacy Image at 02080000 ... Image Name: Linux-4.9.0-belk-4.0.0-xilinx Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 9904120 Bytes = 9.4 MiB Load Address: 00008000 Entry Point: 00008000 Verifying Checksum ...OK## Flattened Device Tree blob at 01f00000 Booting using the fdt blob at 0x1f00000 Loading Kernel Image ..Writing . OK Loading Device Tree to 1effa000, end 1efff996 ... OKSwitching to SPI flashNAND storage before starting Linux Starting kernel ... Uncompressing Linux...done, booting the kernel.[ 0.000000] Booting Linux on physical CPU 0x0Valid environment[ 0.000000] Linux version 4.9.0-belk-4.0.0-xilinx (dvdk@osboxes) (gcc version 6.2.1 20161016 (Linaro GCC 6.2-2016.11) ) #4 SMP PREEMPT Tue Mar 5 10:27:41 CET 2019[ 0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache[ 0.000000] OF: fdt:Machine model: Bora[ 0.000000] bootconsole [earlycon0] enabled[ 0.000000] cma: Reserved 16 MiB at 0x3f000000[ 0.000000] Memory policy: Data cache writealloc[ 0.000000] On node 0 totalpages: 262144[ 0.000000] free_area_init_node: node 0, pgdat c102d8c0, node_mem_map ef7f7000[ 0.000000] Normal zone: 1536 pages used for memmap[ 0.000000] Normal zone: 0 pages reserved[ 0.000000] Normal zone: 196608 pages, LIFO batch:31[ 0.000000] HighMem zone: 65536 pages, LIFO batch: 15[ 0.000000] percpu: Embedded 14 pages/cpu @ef7d1000 s26124 r8192 d23028 u57344[ 0.000000] pcpu-alloc: s26124 r8192 d23028 u57344 alloc=14*4096[ 0.000000] pcpu-alloc: [0] 0 [0] 1[ 0.000000] Built 1zonelists in Zone order, mobility grouping on. Total pages: 260608Bora[ 0.000000] Kernel command line: root=/dev/nfs rw nfsroot=${serverip}:${rootpath},tcp ip=192.168.0.81:192.168.0.13:192.168.0.254:255.255.255.0:bora:eth0 console=ttyPS0,115200n8 debug earlyprintk cma=16M mtdparts=pl35x-nand:48M(data0),15M(data1),1M(data2),-(data3)[ 0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes)[ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)[ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)[ 0.000000] Memory: 1007072K/1048576K available (6144K kernel code, 232K rwdata, 1576K rodata, 7168K init, 323K bss, 25120K reserved, 16384K cma-reserved, 245760K highmem)[ 0.000000] Virtual kernel memory layout:[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)[ 0.000000] fixmap : 0xffc00000 - 0xfff00000 (3072 kB)[ 0.000000] vmalloc : 0xf0800000 - 0xff800000 ( 240 MB)[ 0.000000] lowmem : 0xc0000000 - 0xf0000000 ( 768 MB)[ 0.000000] pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB)[ 0.000000] modules : 0xbf000000 - 0xbfe00000 ( 14 MB)[ 0.000000] .text : 0xc0008000 - 0xc0700000 (7136 kB)[ 0.000000] .init : 0xc0900000 - 0xc1000000 (7168 kB)[ 0.000000] .data : 0xc1000000 - 0xc103a2e0 ( 233 kB)[ 0.000000] .bss : 0xc103a2e0 - 0xc108b0f4 ( 324 kB)[ 0.000000] Preemptible hierarchical RCU implementation.[ 0.000000] Build-time adjustment of leaf fanout to 32.[ 0.000000] RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=2.[ 0.000000] RCU: Adjusting geometry for rcu_fanout_leaf=32, nr_cpu_ids=2[ 0.000000] NR_IRQS:16 nr_irqs:16 16[ 0.000000] efuse mapped to f0802000[ 0.000000] slcr mapped to f0804000[ 0.000000] L2C: platform modifies aux control register: 0x02060000 -> 0x02460000[ 0.000000] L2C: DT/platform modifies aux control register: 0x02060000 -> edit loadunand0x02460000[ 0.000000] L2C-310 erratum 769419 enabled[ 0.000000] L2C-310 enabling early BRESP for Cortex-A9[ 0.000000] L2C-310 full line of zeros enabled for Cortex-A9[ 0.000000] L2C-310 dynamic clock gating enabled, standby mode enabled[ 0.000000] L2C-310 cache controller enabled, 8 ways, 512 kB[ 0.000000] L2C-310: CACHE_ID 0x410000c8, AUX_CTRL 0x46460001[ 0.000000] zynq_clock_init: clkc starts at f0804100[ 0.000000] Zynq clock init[ 0.000000] ps_clk frequency not specified, using 33 MHz.[ 0.000011] sched_clock: 64 bits at 333MHz, resolution 3ns, wraps every 4398046511103ns[ 0.007866] clocksource: arm_global_timer: mask: 0xffffffffffffffff max_cycles: 0x4ce07af025, max_idle_ns: 440795209040 ns[ 0.018884] Switching to timer-based delay loop, resolution 3ns[ 0.024886] clocksource: ttc_clocksource: mask: 0xffff max_cycles: 0xffff, max_idle_ns: 537538477 ns[ 0.033933] timer #0 at f080c000, irq=17[ 0.038249] Console: colour dummy device 80x30[ 0.042577] Calibrating delay loop (skipped), value calculated using timer frequency.. 666.66 BogoMIPS (lpj=3333333)[ 0.053057] pid_max: default: 32768 minimum: 301[ 0.057838] Mount-cache hash table entries: 2048 (order: 1, 8192 bytes)[ 0.064341] Mountpoint-cache hash table entries: 2048 (order: 1, 8192 bytes)[ 0.071972] CPU: Testing write buffer coherency: ok[ 0.076891] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000[ 0.082480] Setting up static identity map for 0x100000 - 0x100058[ 0.238338] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001[ 0.238441] Brought up 2 CPUs[ 0.246981] SMP: Total of 2 processors activated (1333.33 BogoMIPS).[ 0.253360] CPU: All CPU(s) started in SVC mode.[ 0.258930] devtmpfs: initialized[ 0.265358] VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 4[ 0.273121] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns[ 0.283743] pinctrl core: initialized pinctrl subsystem[ 0.290081] NET: Registered protocol family 16[ 0.296286] DMA: preallocated 256 KiB pool for atomic coherent allocations[ 0.338362] cpuidle: using governor ladder[ 0.378348] cpuidle: using governor menu[ 0.394845] hw-breakpoint: found 5 (+1 reserved) breakpoint and 1 watchpoint registers.[ 0.402735] hw-breakpoint: maximum watchpoint size is 4 bytes.[ 0.408680] zynq-ocm f800c000.ocmc: ZYNQ OCM pool: 256 KiB @ 0xf0880000[ 0.415532] zynq-pinctrl 700.pinctrl: zynq pinctrl initialized[ 0.435803] vgaarb: loaded[ 0.439188] SCSI subsystem initialized[ 0.443427] usbcore: registered new interface driver usbfs[ 0.448889] usbcore: registered new interface driver hub[ 0.454202] usbcore: registered new device driver usbedit[ 0.460236] pps_core: BoraLinuxPPS API ver. 1 registered[ 0.465075] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it> [ 0.474261] PTP clock support registered[ 0.498445] clocksource: Switched to clocksource arm_global_timer[ 0.518806] NET: Registered protocol family 2[ 0.523753] TCP established hash table entries: 8192 (order: 3, 32768 bytes)[ 0.530869] TCP bind hash table entries: 8192 (order: 4, 65536 bytes)[ 0.537296] TCP: Hash tables configured (established 8192 bind 8192)[ 0.543630] UDP hash table entries: 512 (order: 2, 16384 bytes)[ 0.549530] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)[ 0.556004] NET: Registered protocol family 1[ 0.560678] RPC: Registered named UNIX socket transport module.[ 0.566459] RPC: Registered udp transport module.[ 0.571228] RPC: Registered tcp transport module.[ 0.575919] RPC: Registered tcp NFSv4.1 backchannel transport module.[ 0.582400] PCI: CLS 0 bytes, default 64[ 1.102945] hw perfevents: enabled with armv7_cortex_a9 PMU driver, 7 counters available[ 1.112338] futex hash table entries: 512 (order: 3, 32768 bytes)[ 1.119158] workingset: timestamp_bits=30 max_order=18 bucket_order=0[ 1.126156] jffs2: version 2.2. (NAND) (SUMMARY) c 2001-2006 Red Hat, Inc.[ 1.133986] bounce: pool size: 64 pages[ 1.137708] io scheduler noop registered[ 1.141742] io scheduler deadline registered[ 1.145977] io scheduler cfq registered (default)[ 1.153301] dma-pl330 f8003000.dmac: Loaded driver for PL330 DMAC-241330[ 1.159920] dma-pl330 f8003000.dmac: DBUFF-128x8bytes Num_Chans-8 Num_Peri-4 Num_Events-16[ 1.169000] e0000000.serial: ttyPS1 at MMIO 0xe0000000 (irq = 145, base_baud = 3125000) is a xuartps[ 1.178412] e0001000.serial: ttyPS0 at MMIO 0xe0001000 (irq = 146, base_baud = 3125000) is a xuartpsà[ 1.187538] console [ttyPS0] enabled[ 1.187538] console [ttyPS0] enabled[ 1.194636] bootconsole [earlycon0] disabled[ 1.194636] bootconsole [earlycon0] disabled[ 1.203842] xdevcfg f8007000.devcfg: ioremap 0xf8007000 to f086f000[ 1.210771] [drm] Initialized[ 1.226747] brd: module loaded[ 1.237253] loop: module loaded[ 1.242684] libphy: Fixed MDIO Bus: probed[ 1.249767] CAN device driver interface[ 1.256030] libphy: MACB_mii_bus: probed[ 1.359199] macb e000b000.ethernet eth0: Cadence GEM rev 0x00020118 at 0xe000b000 irq 148 (00:50:c2:1e:af:b3)[ 1.369069] Micrel KSZ9031 Gigabit PHY e000b000.etherne:07: attached PHY driver [Micrel KSZ9031 Gigabit PHY] (mii_bus:phy_addr=e000b000.etherne:07, irq=-1)[ 1.383239] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k[ 1.389008] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.[ 1.395903] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver[ 1.402401] ehci-pci: EHCI PCI platform driver[ 1.406934] usbcore: registered new interface driver usb-storage[ 1.413140] e0002000.usb supply vbus not found, using dummy regulator[ 1.419839] ULPI transceiver vendor/product ID 0x0424/0x0006[ 1.425414] Found SMSC USB331x ULPI transceiver.[ 1.430048] ULPI integrity check: passed.[ 1.435825] mousedev: PS/2 mouse device common for all mice[ 1.441733] i2c /dev entries driver[ 1.445407] cdns-i2c e0004000.i2c: 100 kHz mmio e0004000 irq 142[ 1.458675] rtc-ds3232 0-0068: rtc core: registered ds3232 as rtc0[ 1.466248] ina2xx 0-0041: power monitor ina226 (Rshunt = 10000 uOhm)[ 1.474606] Xilinx Zynq CpuIdle Driver started[ 1.479492] sdhci: Secure Digital Host Controller Interface driver[ 1.485582] sdhci: Copyright(c) Pierre Ossman[ 1.489994] sdhci-pltfm: SDHCI platform and OF driver helper[ 1.548509] mmc0: SDHCI controller on e0100000.sdhci [e0100000.sdhci] using DMA[ 1.556145] usbcore: registered new interface driver usbhid[ 1.562699] usbhid: USB HID core driver[ 1.569627] nand: device found, Manufacturer ID: 0xef, Chip ID: 0xd3[ 1.575932] nand: Unknown W29N08GV[ 1.579320] nand help: 1024 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64[ 1.587634] Bad block table found at page 524224, version 0x01[ 1.594713] Bad block table found at page 524160, version 0x01[ 1.601301] 4 cmdlinepart partitions found on MTD device pl35x-nand [ 1.607504] Creating 4 MTD partitions on "pl35x-nand":[ 1.612653] 0x000000000000-0x000003000000 : "data0"[ 1.630900] 0x000003000000-0x000003f00000 : "data1"[ 1.636915] 0x000003f00000-0x000004000000 : "data2"[ 1.642873] 0x000004000000-0x000040000000 : "data3"[ 1.656664] NET: Registered protocol family 17[ 1.662102] can: controller area network core (rev 20120528 abi 9)[ 1.668256] NET: Registered protocol family 29[ 1.672658] can: raw protocol (rev 20120528)[ 1.676874] can: broadcast manager protocol (rev 20161123 t)[ 1.682548] can: netlink gateway (rev 20130117) max_hops=1[ 1.688386] Registering SWP/SWPB emulation handler[ 1.707302] rtc- NAND subds3232 0-0068: setting systemclock to 2019-03-05 11:36:06 UTC (1551785766)[ 4.838753] macb e000b000.ethernet eth0: link up (1000/Full)[ 4.898465] IP-Config: Complete:[ 4.901612] device=eth0, hwaddr=00:50:c2:1e:af:b3, ipaddr=192.168.0.81, mask=255.255.255.0, gw=192.168.0.254[ 4.911871] host=bora, domain=, nis-domain=(none)[ 4.916971] bootserver=192.168.0.13, rootserver=192.168.0.13, rootpath=[ 4.924277] Warning: unable to open an initial console.[ 4.950584] Freeing unused kernel memory: 7168K (c0900000 - c1000000)[ 5.765125] udevd[688]: starting version 3.2[ 5.770394] random: udevd: uninitialized urandom read (16 bytes read)[ 5.776981] random: udevd: uninitialized urandom read (16 bytes read)[ 5.783499] random: udevd: uninitialized urandom read (16 bytes read)[ 5.799662] udevd[689]: starting eudev-3.2[ 5.833892] random: udevd: uninitialized urandom read (16 bytes read)[ 6.769401] random: dd: uninitialized urandom read (512 bytes read)[ 11.480222] random: fast init done[ 27.774344] NET: Registered protocol family 10 PetaLinux 2017.2 bora-ubi /dev/ttyPS0
Usage:nand info - show available NAND devicesnand device [dev] - show or set current devicenand read - addr off|partition sizenand write - addr off|partition size read/write 'size' bytes starting at offset 'off' to/from memory address 'addr', skipping bad blocks.nand read.raw - addr off|partition [count]nand write.raw[.noverify] - addr off|partition [count] Use read.raw/write.raw to avoid ECC and access the flash as-is.nand erase[.spread] [clean] off size - erase 'size' bytes from offset 'off' With '.spread', erase enough for given file size, otherwise, 'size' includes skipped bad blocks.nand erase.part [clean] partition - erase entire mtd partition'nand erase.chip [clean] - erase entire chip'nand bad - show bad blocksnand dump[.oob] off - dump pagenand scrub [-y] off size | scrub.part partition | scrub.chip really clean NAND erasing bad blocks (UNSAFE)nand markbad off [...] - mark bad block(s) at offset (UNSAFE)nand biterr off - make a bit error at offset (UNSAFE)nand lock [tight] [status] bring nand to lock state or display locked pagesnand unlock[.allexcept] [offset] [size] bora- unlock sectionBora> edit loadunandedit: nand read ${loadaddr} 0 3000000Bora> edit loadfdtnandedit: nand read ${fdtaddr} 3000000 f00000Bora> edit loadfdtnandedit: nand read ${fdtaddr} 3f00000 100000Bora> saveeSaving Environment to SPI Flash...Erasing SPI flash...Writing to SPI flash...doneValid environment: 2Bora> edit nandargs2editubi login: setenv bootargs ''
</pre>
====Additional notes====
*<code>mtd0</code>, <code>mtd1</code>, and <code>mtd2</code> are significantly larger than the files they store used in this example. This allows having a spare room to store larger images. For the sake of simplicity, U-Boot was configured to read the whole partitions (see how the <code>loadunand</code>, <code>loadfdtnand</code>, and <code>loadfpga2</code> variables are defined). Obviously, this affect the overall boot time negatively. To optimize it, these variables have to be changed in order to read just the required amount of data according to the size of the actual stored files.
*As stated previously, the root filesystem is <code>initramfs</code> and thus not persistent. Consequently, every time the system boots, the directory <code>/mnt/data3</code> must be created before mounting the ''UBIFS'' file system stored in the NAND flash.