initial version
[glsdk/dra7xx-umlo.git] / README.md
1 # Purpose
3 On DRA7xx, Boot ROM copies the first stage boot loader(MLO/SPL) from
4 QSPI at a conservative speed of 11 MBps. A 120 KB binary takes around
5 11 ms to be copied from QSPI into OCMC. Usually this is not an
6 issue. However there are usecases(e.g. CAN response) where we need to
7 have a specific functionality available in less than 100 ms.  In such
8 usecases, the time spent in ROM copy forms a significant portion (10%)
9 of the usecase time. The micro bootloader(`umlo`) built in this
10 project speeds up this copy.
12 `umlo` first sets up the QSPI interface to the maximum speed possible
13 on DRA7xx i.e. 76.8 MHz interface clock, Quad Mode and Mode 0
14 operation. Then `umlo` copies the `MLO` to the execution address in
15 OCMC and jumps to it.
17 With this change, we see the time taken to enter a 120 KB MLO reduce
18 from 24.5 ms to 19 ms, a saving of 5.5 ms.
20 Please refer to manifest.html for license information.
22 # Build Instructions
24 This tool is compiled and tested with `gcc-arm-none-eabi-4_9-2015q3`.
25 However any baremetal compiler supporting Cortex A15 should work.
26 Please make sure that you have the toolchain installed and have
27 `arm-none-eabi-gcc` in the path.
29 Run `make` to produce the required binaries.
31 If you are modifiying the toolchain, please ensure that the `CROSS_COMPILE`
32 option is set correctly in the Makefile.
34 # Flashing instructions
36 1. Flash the output file `umlo` to offset 0x0 in QSPI.
38 2. Flash the actual MLO from your normal build process to offset
39    0x10000 (64 KB).
41 Nothing else needs to change.
43 Reboot the EVM in QSPI4 boot mode. `umlo` boots and reads the actual
44 MLO from offset 0x10000 into OCMC and jumps to it. You will not see
45 any difference in execution except a slight speed up in reading MLO.
47 For information on measuring time to enter MLO, please see [1]
48 in references.
50 ## Undoing the changes
52 If you suspect a problem is being introduced due to `umlo`, you can
53 remove it by erasing the first 64 KB of QSPI. This will cause
54 Boot ROM to jump to your MLO.
56 # Development Notes
58 1. We used the peripheral boot feature of the DRA7xx Boot ROM heavily for
59 testing `umlo` during development. If you are customizing `umlo`,
60 please see [2] and [3] in references on how to use perhipheral boot
61 for debugging.
63 2. The `Makefile` has two sets of build options, one for development
64    and another for release. Please switch to the development build
65    options when debugging.
67 3. The file `main.c` contains an infinite loop function
68    `wait_for_debugger()`. You can call this function at the point
69    where you want to halt execution in code and single step via CCS
70    from that point.
73 # Caveats
75 1. `umlo` expects that the first 512 bytes of the acutal MLO is the CH Header
76    and skips it. This is the case when MLO is produced from building U-Boot.
77    Please modify the code in `main.c` if this assumption is not true for the
78    `MLO` from your build.
80 2. `umlo` does not do any SPI flash specific configuration.  `umlo`
81    expects that the SPI flash has quad read mode enabled. It has only
82    been tested on TI EVM's which have a Spansion flash device.
84 3. `umlo` is loaded to address 0x40330000 to avoid any overlap with the actual
85    MLO. Please modify this address in the `Makefile` if the actual MLO runtime
86    locations overlap with 0x40330000.
88         CONFIG_UMLO_BASE=0x40300000
90 # Support
92 For support, please post any questions to
94 <https://e2e.ti.com/support/arm/automotive_processors/f/1020>
96 # References
98 1. Linux Boot Time Optimizations on DRA7xx devices
100     <http://www.ti.com/lit/pdf/sprac82>
102 2. Using Peripheral Boot and DFU for Rapid Development on Jacinto 6 Devices
104     <http://www.ti.com/lit/pdf/sprac65>
106 3. DRA7xx Bootswitch - Utility for Peripheral boot
108     <https://git.ti.com/glsdk/dra7xx-bootswitch>
110 4. Please see the chapter "Initialization" in the Device TRM.