| | 1 | [[Outline]] |
| | 2 | |
| | 3 | = IMX Serial Download Protocol (SDP) |
| | 4 | The i.MX95 processor's internal BOOT ROM handles the first boot stage in order to be able to boot from a variety of devices (eMMC, SD / uSDHC, FlexSPI NOR, USB). One of the boot devices, referred to as the 'Serial Downloader Protocol' (SDP) provides an API over USB. |
| | 5 | |
| | 6 | == Catalina SDP hardware support |
| | 7 | NXP's i.MX95 BOOT ROM only supports SDP on one of the two USB interfaces which is specified by a part ordering option. The GW920x and GW940x boards routes the USB1 interface which supports USB3.0 to the onboard USB 3.0 HUB to support USB 3.0 to the FSA modules and routes the USB2 interface which supports USB2.0 to the front panel Type-C connector. |
| | 8 | |
| | 9 | However, due to part availability from NXP the currently produced GW900x SOM's used for the GW920x boards use the i.MX95 variant supports SDP on the the USB1 (USB3.0) interface. Therefore if you need to use SDP on the current Catalina boards you need to have a specially modified board from Gateworks (contact support@gateworks.com) |
| | 10 | |
| | 11 | Additionally the Gateworks Catalina boards are configured by default via resistor strapping to boot from eMMC. If the eMMC has a valid software image on it the BOOT ROM will boot that. To boot from SDP you must either erase the eMMC or disable it. |
| | 12 | |
| | 13 | To erase boot firmware on eMMC (requires a booting board): |
| | 14 | - via uboot when using emmc boot0 for boot firmware (most common) |
| | 15 | {{{#!bash |
| | 16 | u-boot=> mmc dev 0 1 && mmc erase 0 2000 # erase 4MB of boot0 |
| | 17 | switch to partitions #1, OK |
| | 18 | mmc0(part 1) is current device |
| | 19 | MMC erase: dev # 0, block # 0, count 8192 ... 8192 blocks erased: OK |
| | 20 | }}} |
| | 21 | - via uboot when using emmc boot1 for boot firmware: |
| | 22 | {{{#!bash |
| | 23 | u-boot=> mmc dev 0 2 && mmc erase 0 2000 # erase 4MB of boot1 |
| | 24 | switch to partitions #2, OK |
| | 25 | mmc0(part 2) is current device |
| | 26 | MMC erase: dev # 0, block # 0, count 8192 ... 8192 blocks erased: OK |
| | 27 | }}} |
| | 28 | - via uboot when using emmc user for boot firmware: |
| | 29 | {{{#!bash |
| | 30 | mmc dev 0 0 && mmc erase 40 2000 # erase 4MB at 32KB of user |
| | 31 | switch to partitions #0, OK |
| | 32 | mmc0(part 0) is current device |
| | 33 | MMC erase: dev # 0, block # 64, count 8192 ... 8192 blocks erased: OK |
| | 34 | }}} |
| | 35 | - via linux when using emmc boot0 for boot firmware (most common): |
| | 36 | {{{#!bash |
| | 37 | # echo 0 > /sys/block/mmcblk0boot0/force_ro |
| | 38 | # dd if=/dev/zero of=/dev/mmcblk0boot0 bs=8192 count=1 |
| | 39 | 1+0 records in |
| | 40 | 1+0 records out |
| | 41 | }}} |
| | 42 | - via linux when using emmc boot1 for boot firmware: |
| | 43 | {{{#!bash |
| | 44 | # echo 0 > /sys/block/mmcblk0boot1/force_ro |
| | 45 | # dd if=/dev/zero of=/dev/mmcblk0boot1 bs=8192 count=1 |
| | 46 | 1+0 records in |
| | 47 | 1+0 records out |
| | 48 | }}} |
| | 49 | - via linux when using emmc user for boot firmware: |
| | 50 | {{{#!bash |
| | 51 | # dd if=/dev/zero of=/dev/mmcblk0 bs=1024 seek=32 count=4064 # erase 4MB at 32KB |
| | 52 | 1+0 records in |
| | 53 | 1+0 records out |
| | 54 | }}} |
| | 55 | |
| | 56 | Alternatively if the firmware on your board is not booting to U-Boot or Linux and thus keeping the BOOT ROM from enumerating SDP on the USB bus you can use metal tweezers to short the unloaded R58 pads on the GW900x SOM at power-on to effectively disable the eMMC by grounding the CMD signal (remove the short as soon as you see the board boot in order to be able to access the eMMC). |
| | 57 | |
| | 58 | == Catalina SDP software support |
| | 59 | Assuming you have the proper hardware support (see above) the latest Catalina boot firmware supports booting over SDP. |
| | 60 | |
| | 61 | == Booting Catalina U-Boot over SDP with uuu |
| | 62 | NXP provides 'uuu' (Universal Update Utility) which is an evolution of the old Freescale MFGtools. This tool is supported on both Linux and Windows hosts. |
| | 63 | |
| | 64 | NXP recommends using UUU version 1.5.243 or higher for the i.MX95. |
| | 65 | |
| | 66 | Linux Install: |
| | 67 | {{{#!bash |
| | 68 | wget https://github.com/NXPmicro/mfgtools/releases/download/uuu_1.5.243/uuu |
| | 69 | chmod +x uuu |
| | 70 | sudo mv uuu /usr/local/bin |
| | 71 | }}} |
| | 72 | |
| | 73 | Once a Catalina board with proper hardware support (see above) has its USB SDP interface connected to a host PC and has a blank/disabled eMMC or is otherwise configured for SDP boot you will see it on the list of supported SDP devices when powered on: |
| | 74 | {{{#!bash |
| | 75 | $ uuu -lsusb # list compatible devices on the USB bus in SDP mode |
| | 76 | uuu (Universal Update Utility) for nxp imx chips -- libuuu_1.5.243-0-g230f1b1 |
| | 77 | |
| | 78 | Connected Known USB Devices |
| | 79 | Path Chip Pro Vid Pid BcdVersion Serial_no |
| | 80 | ==================================================================== |
| | 81 | 1:1372 MX95 SDPS: 0x1FC9 0x015D 0x0002 |
| | 82 | }}} |
| | 83 | |
| | 84 | Once you have verified the device is attempting to boot via SDP you can boot it over SDP using the correct flash.bin for your board's DRAM configuration (from https://dev.gateworks.com/catalina/boot_firmware/). Note that this takes two invocations of uuu: |
| | 85 | * Phase 1. Sending the flash.bin to the BOOT ROM |
| | 86 | * Phase 2. Sending the flash.bin to U-Boot SPL to load U-Boot proper (after U-Boot SPL hits 'SDP: handle requests...' |
| | 87 | |
| | 88 | Example: |
| | 89 | - Linux host: |
| | 90 | {{{#!bash |
| | 91 | $ sudo uuu flash-4GB_1Gbx16_1R.bin # 4GB DRAM |
| | 92 | [sudo] password for tharvey: |
| | 93 | uuu (Universal Update Utility) for nxp imx chips -- libuuu_1.5.243-0-g230f1b1 |
| | 94 | |
| | 95 | Success 1 Failure 0 |
| | 96 | |
| | 97 | |
| | 98 | 1:1372-6A56B 2/ 2 [Done ] SDPS: done |
| | 99 | }}} |
| | 100 | - Note you can put this in a while loop to handle both phases and/or multiple boots 'while [ 1 ]; do sudo uuu flash-4GB_1Gbx16_1R.bin; done' |
| | 101 | * Catalina serial console: |
| | 102 | - Phase 1: |
| | 103 | {{{#!bash |
| | 104 | imx-oei lf-6.18.2-1.0.0-10-g01fe2ff9 mx95catalina (Oct 15 2026 00:56:06) |
| | 105 | imx-oei: LPDDR5 4GB MT62F1G32D2DS-023 |
| | 106 | DDR OEI: IMEM + DMEM load in 3317 us |
| | 107 | DDR OEI: TRAINING complete in 2551823 us |
| | 108 | DDR OEI: done, err = 0 |
| | 109 | imx-sm automotive-16.0.0_1.3.0-5-g7da12332 (Oct 15 2026 00:56:08) |
| | 110 | |
| | 111 | U-Boot SPL 2026.04-00024-g572caacf6eae (Nov 04 2026 - 18:36:18 +0000) |
| | 112 | GSCv3 : v67 0xf07b RST:VIN Thermal protection:disabled |
| | 113 | RTC : 1970-01-01 20:25:11 UTC |
| | 114 | DRAM : LPDDR5 4GiB |
| | 115 | Trying to boot from USB SDP |
| | 116 | SDP: initialize... |
| | 117 | SDP: handle requests... |
| | 118 | }}} |
| | 119 | - Phase 2: (invoke the uuu command again with the same flash.bin) |
| | 120 | {{{#!bash |
| | 121 | Downloading file of size 1376256 to 0x90400000... done |
| | 122 | Jumping to header at 0x90400000 |
| | 123 | Header Tag is not an IMX image |
| | 124 | Found header at 0x90400000 |
| | 125 | NOTICE: BL31: v2.12.0(release):lf-6.18.2-1.0.0 |
| | 126 | NOTICE: BL31: Built : 00:56:09, Oct 15 2026 |
| | 127 | |
| | 128 | |
| | 129 | U-Boot 2026.04-00024-g572caacf6eae (Nov 04 2026 - 18:36:18 +0000) |
| | 130 | |
| | 131 | CPU: NXP i.MX95 Rev2.0 A55 at 1800 MHz |
| | 132 | DTB : imx95-catalina-gw92xx-0x |
| | 133 | Model: Gateworks Catalina GW92xx-0x i.MX95 Development Kit |
| | 134 | DRAM: 3.8 GiB |
| | 135 | Model : GW9201B-S02C |
| | 136 | Serial : 577802 |
| | 137 | MFGDate : 10-08-2026 |
| | 138 | Core: 307 devices, 32 uclasses, devicetree: fit |
| | 139 | MMC: FSL_SDHC: 0, FSL_SDHC: 1 |
| | 140 | Loading Environment from MMC... *** Warning - bad CRC, using default environment |
| | 141 | |
| | 142 | Reading from MMC(0)... In: serial@44380000 |
| | 143 | Out: serial@44380000 |
| | 144 | Err: serial@44380000 |
| | 145 | |
| | 146 | BuildInfo: |
| | 147 | - ELE firmware version 2.0.6-9a9290a |
| | 148 | |
| | 149 | booting from SDP; setting mmcroot to emmc |
| | 150 | switch to partitions #0, OK |
| | 151 | mmc0(part 0) is current device |
| | 152 | MMC Device 2 not found |
| | 153 | Net: eth0: enetc-0 [PRIME], eth1: enetc-1, eth2: enetc-2 |
| | 154 | GSC : boot watchdog disabled |
| | 155 | Thermal protection:disabled |
| | 156 | Hit any key to stop autoboot: 0 |
| | 157 | u-boot=> |
| | 158 | }}} |
| | 159 | |
| | 160 | At this point you can continue using U-Boot. If you wish to flash the firmware to the emmc at this point be sure to specify the emmc device and set the MMC boot partition if needed. For example for eMMC boot0: |
| | 161 | {{{#!bash |
| | 162 | setenv dev 0 |
| | 163 | setenv bootpart 1 |
| | 164 | run update_firmware && mmc partconf $dev 0 $bootpart 0 |
| | 165 | }}} |