| Freescale i.MX233/i.MX28 SB image generator via mkimage |
| ======================================================= |
| |
| This tool allows user to produce SB BootStream encrypted with a zero key. |
| Such a BootStream is then bootable on i.MX23/i.MX28. |
| |
| Usage -- producing image: |
| ========================= |
| The mxsimage tool is targeted to be a simple replacement for the elftosb2 . |
| To generate an image, write an image configuration file and run: |
| |
| mkimage -A arm -O u-boot -T mxsimage -n <path to configuration file> \ |
| <output bootstream file> |
| |
| The output bootstream file is usually using the .sb file extension. Note |
| that the example configuration files for producing bootable BootStream with |
| the U-Boot bootloader can be found under arch/arm/boot/cpu/arm926ejs/mxs/ |
| directory. See the following files: |
| |
| mxsimage.mx23.cfg -- This is an example configuration for i.MX23 |
| mxsimage.mx28.cfg -- This is an example configuration for i.MX28 |
| |
| Each configuration file uses very simple instruction semantics and a few |
| additional rules have to be followed so that a useful image can be produced. |
| These semantics and rules will be outlined now. |
| |
| - Each line of the configuration file contains exactly one instruction. |
| - Every numeric value must be encoded in hexadecimal and in format 0xabcdef12 . |
| - The configuration file is a concatenation of blocks called "sections" and |
| optionally "DCD blocks" (see below). |
| - Each "section" is started by the "SECTION" instruction. |
| - The "SECTION" instruction has the following semantics: |
| |
| SECTION u32_section_number [BOOTABLE] |
| - u32_section_number :: User-selected ID of the section |
| - BOOTABLE :: Sets the section as bootable |
| |
| - A bootable section is one from which the BootROM starts executing |
| subsequent instructions or code. Exactly one section must be selected |
| as bootable, usually the one containing the instructions and data to |
| load the bootloader. |
| |
| - A "SECTION" must be immediatelly followed by a "TAG" instruction. |
| - The "TAG" instruction has the following semantics: |
| |
| TAG [LAST] |
| - LAST :: Flag denoting the last section in the file |
| |
| - After a "TAG" unstruction, any of the following instructions may follow |
| in any order and any quantity: |
| |
| NOOP |
| - This instruction does nothing |
| |
| LOAD u32_address string_filename |
| - Instructs the BootROM to load file pointed by "string_filename" onto |
| address "u32_address". |
| |
| LOAD IVT u32_address u32_IVT_entry_point |
| - Crafts and loads IVT onto address "u32_address" with the entry point |
| of u32_IVT_entry_point. |
| - i.MX28-specific instruction! |
| |
| LOAD DCD u32_address u32_DCD_block_ID |
| - Loads the DCD block with ID "u32_DCD_block_ID" onto address |
| "u32_address" and executes the contents of this DCD block |
| - i.MX28-specific instruction! |
| |
| FILL u32_address u32_pattern u32_length |
| - Starts to write memory from addres "u32_address" with a pattern |
| specified by "u32_pattern". Writes exactly "u32_length" bytes of the |
| pattern. |
| |
| JUMP [HAB] u32_address [u32_r0_arg] |
| - Jumps onto memory address specified by "u32_address" by setting this |
| address in PT. The BootROM will pass the "u32_r0_arg" value in ARM |
| register "r0" to the executed code if this option is specified. |
| Otherwise, ARM register "r0" will default to value 0x00000000. The |
| optional "HAB" flag is i.MX28-specific flag turning on the HAB boot. |
| |
| CALL [HAB] u32_address [u32_r0_arg] |
| - See JUMP instruction above, as the operation is exactly the same with |
| one difference. The CALL instruction does allow returning into the |
| BootROM from the executed code. U-Boot makes use of this in it's SPL |
| code. |
| |
| MODE string_mode |
| - Restart the CPU and start booting from device specified by the |
| "string_mode" argument. The "string_mode" differs for each CPU |
| and can be: |
| i.MX23, string_mode = USB/I2C/SPI1_FLASH/SPI2_FLASH/NAND_BCH |
| JTAG/SPI3_EEPROM/SD_SSP0/SD_SSP1 |
| i.MX28, string_mode = USB/I2C/SPI2_FLASH/SPI3_FLASH/NAND_BCH |
| JTAG/SPI2_EEPROM/SD_SSP0/SD_SSP1 |
| |
| - An optional "DCD" blocks can be added at the begining of the configuration |
| file. Note that the DCD is only supported on i.MX28. |
| - The DCD blocks must be inserted before the first "section" in the |
| configuration file. |
| - The DCD block has the following semantics: |
| |
| DCD u32_DCD_block_ID |
| - u32_DCD_block_ID :: The ID number of the DCD block, must match |
| the ID number used by "LOAD DCD" instruction. |
| |
| - The DCD block must be followed by one of the following instructions. All |
| of the instructions operate either on 1, 2 or 4 bytes. This is selected by |
| the 'n' suffix of the instruction: |
| |
| WRITE.n u32_address u32_value |
| - Write the "u32_value" to the "u32_address" address. |
| |
| ORR.n u32_address u32_value |
| - Read the "u32_address", perform a bitwise-OR with the "u32_value" and |
| write the result back to "u32_address". |
| |
| ANDC.n u32_address u32_value |
| - Read the "u32_address", perform a bitwise-AND with the complement of |
| "u32_value" and write the result back to "u32_address". |
| |
| EQZ.n u32_address u32_count |
| - Read the "u32_address" at most "u32_count" times and test if the value |
| read is zero. If it is, break the loop earlier. |
| |
| NEZ.n u32_address u32_count |
| - Read the "u32_address" at most "u32_count" times and test if the value |
| read is non-zero. If it is, break the loop earlier. |
| |
| EQ.n u32_address u32_mask |
| - Read the "u32_address" in a loop and test if the result masked with |
| "u32_mask" equals the "u32_mask". If the values are equal, break the |
| reading loop. |
| |
| NEQ.n u32_address u32_mask |
| - Read the "u32_address" in a loop and test if the result masked with |
| "u32_mask" does not equal the "u32_mask". If the values are not equal, |
| break the reading loop. |
| |
| NOOP |
| - This instruction does nothing. |
| |
| - If the verbose output from the BootROM is enabled, the BootROM will produce a |
| letter on the Debug UART for each instruction it started processing. Here is a |
| mapping between the above instructions and the BootROM verbose output: |
| |
| H -- SB Image header loaded |
| T -- TAG instruction |
| N -- NOOP instruction |
| L -- LOAD instruction |
| F -- FILL instruction |
| J -- JUMP instruction |
| C -- CALL instruction |
| M -- MODE instruction |
| |
| Usage -- verifying image: |
| ========================= |
| |
| The mxsimage can also verify and dump contents of an image. Use the following |
| syntax to verify and dump contents of an image: |
| |
| mkimage -l <input bootstream file> |
| |
| This will output all the information from the SB image header and all the |
| instructions contained in the SB image. It will also check if the various |
| checksums in the SB image are correct. |