| 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), and optional flags lines. | |
| - 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. | |
| - An optional flags lines can be one of the following: | |
| DISPLAYPROGRESS | |
| - Enable boot progress output form the BootROM. | |
| - If the boot progress 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 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. |