| How to Update U-Boot on Pico-imx6ul board | 
 | ----------------------------------------- | 
 |  | 
 | Required software on the host PC: | 
 |  | 
 | - imx_usb_loader: https://github.com/boundarydevices/imx_usb_loader | 
 |  | 
 | - dfu-util: http://dfu-util.sourceforge.net/releases/ | 
 |  | 
 | Build U-Boot for Pico: | 
 |  | 
 | $ make mrproper | 
 | $ make pico-imx6ul_defconfig | 
 | $ make | 
 |  | 
 | This generates the SPL and u-boot.img binaries. | 
 |  | 
 | 1. Loading U-Boot via USB Serial Download Protocol | 
 |  | 
 | Note: This method is convenient for development purposes. | 
 | If the eMMC has already a U-Boot flashed with DFU support then | 
 | the user can go to step 2 below in order to update U-Boot. | 
 |  | 
 | Put pico board in USB download mode (refer to the document | 
 | http://www.wandboard.org/images/hobbit/hobbitboard-imx6ul-reva1.pdf | 
 | page 15). | 
 |  | 
 | Connect a USB to serial adapter between the host PC and pico. | 
 |  | 
 | Connect a USB cable between the OTG pico port and the host PC. | 
 |  | 
 | Open a terminal program such as minicom. | 
 |  | 
 | Copy SPL and u-boot.img to the imx_usb_loader folder. | 
 |  | 
 | Load the SPL binary via USB: | 
 |  | 
 | $ sudo ./imx_usb SPL | 
 |  | 
 | Load the u-boot.img binary via USB: | 
 |  | 
 | $ sudo ./imx_usb u-boot.img | 
 |  | 
 | Then U-Boot starts and its messages appear in the console program. | 
 |  | 
 | Use the default environment variables: | 
 |  | 
 | => env default -f -a | 
 | => saveenv | 
 |  | 
 | 2. Flashing U-Boot into the eMMC | 
 |  | 
 | Run the DFU agent so we can flash the new images using dfu-util tool: | 
 |  | 
 | => dfu 0 mmc 0 | 
 |  | 
 | Flash SPL and u-boot.img into the eMMC running the following commands on a PC: | 
 |  | 
 | $ sudo dfu-util -D SPL -a spl | 
 |  | 
 | $ sudo dfu-util -D u-boot.img -a u-boot | 
 |  | 
 | Remove power from the pico board. | 
 |  | 
 | Put pico board into normal boot mode. | 
 |  | 
 | Power up the board and the new updated U-Boot should boot from eMMC. | 
 |  | 
 | Booting in Falcon mode | 
 | ====================== | 
 |  | 
 | Generate a uImage kernel: | 
 |  | 
 | $ make imx_v6_v7_defconfig (Using the default imx_v6_v7_defconfig configuration | 
 | just for an example. In order to boot faster the user should customize the | 
 | defconfig by only enabling the minimal required drivers). | 
 |  | 
 | $ make -j4 uImage LOADADDR=0x80800000 | 
 |  | 
 | $ cp arch/arm/boot/uImage /tftpboot | 
 | $ cp arch/arm/boot/dts/imx6ul-pico-hobbit.dtb /tftpboot | 
 |  | 
 | In the U-Boot prompt: | 
 |  | 
 | Setup the server and board IP addresses: | 
 | => setenv serverip 192.168.0.10 | 
 | => setenv ipaddr 192.168.0.11 | 
 |  | 
 | Get the dtb file: | 
 | => tftp ${fdt_addr} imx6ul-pico-hobbit.dtb | 
 |  | 
 | Get the kernel: | 
 | => tftp ${loadaddr} uImage | 
 |  | 
 | Write the kernel at 2MB offset: | 
 | => mmc write ${loadaddr} 0x1000 0x4000 | 
 |  | 
 | Setup the bootargs: | 
 | => setenv bootargs 'console=ttymxc5,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rw' | 
 |  | 
 | Prepare args: | 
 | => spl export fdt ${loadaddr} - ${fdt_addr} | 
 | ## Booting kernel from Legacy Image at 82000000 ... | 
 |    Image Name:   Linux-4.19.0-rc2-next-20180905-0 | 
 |    Image Type:   ARM Linux Kernel Image (uncompressed) | 
 |    Data Size:    8365608 Bytes = 8 MiB | 
 |    Load Address: 80800000 | 
 |    Entry Point:  80800000 | 
 |    Verifying Checksum ... OK | 
 | ## Flattened Device Tree blob at 83000000 | 
 |    Booting using the fdt blob at 0x83000000 | 
 |    Loading Kernel Image ... OK | 
 |    Using Device Tree in place at 83000000, end 83009c63 | 
 | subcommand not supported | 
 | subcommand not supported | 
 |    Using Device Tree in place at 83000000, end 8300cc63 | 
 | Argument image is now in RAM: 0x83000000 | 
 |  | 
 | Write 1MB of args data (0x800 sectors) to 1MB offset (0x800 sectors): | 
 |  | 
 | => mmc write ${fdt_addr} 0x800 0x800 | 
 |  | 
 | In order to boot with Falcon mode, activate the CONFIG_SPL_OS_BOOT | 
 | option in the defconfig | 
 |  | 
 | --- a/configs/pico-hobbit-imx6ul_defconfig | 
 | +++ b/configs/pico-hobbit-imx6ul_defconfig | 
 | @@ -53,3 +53,4 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x0525 | 
 |  CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5 | 
 |  CONFIG_CI_UDC=y | 
 |  CONFIG_OF_LIBFDT=y | 
 | +CONFIG_SPL_OS_BOOT=y | 
 |  | 
 | Then rebuild U-Boot: | 
 |  | 
 | $ make pico-hobbit-imx6ul_defconfig | 
 | $ make -j4 | 
 |  | 
 | Launch UMS: | 
 | => ums 0 mmc 0 | 
 |  | 
 | Flash the new binaries: | 
 |  | 
 | $ sudo dd if=SPL of=/dev/sdX bs=1k seek=1; sync | 
 | $ sudo dd if=u-boot.img  of=/dev/sdX bs=1k seek=69; sync | 
 |  | 
 | And then SPL binary will load and jump directly to the kernel: | 
 |  | 
 | U-Boot SPL 2018.09-rc2-00156-g8c46f15-dirty (Sep 05 2018 - 16:24:05 -0300) | 
 | Trying to boot from MMC1 | 
 | [    0.000000] Booting Linux on physical CPU 0x0 | 
 | [    0.000000] Linux version 4.19.0-rc2-next-20180905-00001-gb805e2d (fabio@fabio-Latitude-E5450) (gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9)) #533 SMP Wed Sep 5 16:21:03 -03 2018 | 
 | [    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d | 
 | [    0.000000] CPU: div instructions available: patching division code | 
 | [    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache | 
 | [    0.000000] OF: fdt: Machine model: Technexion Pico i.MX6UL Board | 
 | [    0.000000] Memory policy: Data cache writealloc | 
 | [    0.000000] cma: Reserved 64 MiB at 0x8c000000 | 
 | ... |