https://github.com/jameswalmsley/imx6-spi-sd-boot-trampoline
A pico bootloader for imx6 to reset from SPI mode into booting from an SD card.
https://github.com/jameswalmsley/imx6-spi-sd-boot-trampoline
Last synced: about 1 month ago
JSON representation
A pico bootloader for imx6 to reset from SPI mode into booting from an SD card.
- Host: GitHub
- URL: https://github.com/jameswalmsley/imx6-spi-sd-boot-trampoline
- Owner: jameswalmsley
- Created: 2015-08-07T14:02:59.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2015-08-07T14:09:10.000Z (almost 10 years ago)
- Last Synced: 2025-04-02T04:23:26.376Z (about 2 months ago)
- Language: Assembly
- Size: 97.7 KB
- Stars: 8
- Watchers: 2
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# IMX6 Boot Trampoline
The code in boot.S is a tiny nano boot-loader that causes the iMX.6
processor to reset itself in SD-Card boot mode, so that the main
boot-loader can be loaded from the another SD-card / uSD card.## Boot Process overview.
Many imx6 boards are shipped with an spi flash pre-programmed with
something like u-boot.In order to make the imx6 boot from the spi flash on POR (power-on-reset)
the manufacturer as blown some fuses (the eFUSEs - see HRM (hardware ref manual).This means that the device always boots from SPI flash, and this can be
inconvenient during development, and even production.This simple boot-loader can be stored into the SPI flash to cause the imx6 to reboot
but load the main boot-loader from an SD-Card instead.To do this, it sets the registers at:
0x020d8040 <= (SD 0x3840) (uSD 0x3040) ; // The bit-pattern seems to be undocumented. (Typical Sabrelite board)
0x020d8040 <= (SD 0x3850) (uSD 0x2850) (eMMC 0x5262) ; // (Congatex QMX-6 board).
0x020d8044 <= 0x10000000 ; // Signals a persistent boot.It then causes a system warm reset, i.e. not POR, which causes the boot rom
to read the values in these registers as arguments to the boot flow.So far I didn't manage to find any real documentation on the meaning of these
bits. Maybe I should read more carefully.## Building the boot image
make
## Flash the SPI flash using u-boot:
Copy the boot image onto an sd-card or other medium usable by u-boot:
dd if=boot.bin of=/dev/sdc
Note this operation overwrites the MBR of the sd-card, ensure you backup anything important.
Now insert the SD-Card into a slot.
# Replace 0 with the correct ID for your sd-slot.
mmc dev 0
mmc read 0x10800000 0 200Flash the spi:
sf probe 1
# Note the next command erases any current boot-loader.
sf erase 0 0x40000
sf write 0x10800000 0 0x40000## Make a bootable SD-Card.
You should find out if your u-boot image is padded:
arm-none-eabi-objdump -b binary -D u-boot.bin -marm | more
You'll see output like:
u-boot.bin: file format binary
Disassembly of section .data:
00000000 <.data>:
0: ea0001be b 0x700
...
400: 402000d1 ldrdmi r0, [r0], -r1 ;
404: 27800700 strcs r0, [r0, r0, lsl #14]
408: 00000000 andeq r0, r0, r0
40c: 2780042c strcs r0, [r0, ip, lsr #8]
410: 27800420 strcs r0, [r0, r0, lsr #8]
414: 27800400 strcs r0, [r0, r0, lsl #8]
If the value 0x402000d1 (as seen at address 0x400) is at 0x0 then your image is not padded.
dd if=u-boot.bin of=/dev/sdc bs=512 skip=2 seek=2 # Padded image
dd if=u-boot.bin of=/dev/sdc bs=512 skip=0 seek=2 # Non-padded image