| Summary |
| ======= |
| The README is for the boot procedure on the ipam390 board |
| |
| In the context of U-Boot, the board is booted in three stages. The initial |
| bootloader which executes upon reset is the ROM Boot Loader (RBL) and sits |
| in the internal ROM. The RBL initializes the internal memory and then |
| depending on the exact board and pin configurations will initialize another |
| controller (such as NAND) to continue the boot process by loading |
| the secondary program loader (SPL). The SPL will initialize the system |
| further (some clocks, SDRAM). As on this board is used the falcon boot |
| mode, now 2 ways are possible depending on the GPIO 7_14 input pin, |
| connected with the "soft reset switch" |
| |
| If this pin is logical 1 (high level): |
| spl code starts the kernel image without delay |
| |
| If this pin is logical 0 (low level): |
| spl code starts the u-boot image |
| |
| AIS is an image format defined by TI for the images that are to be loaded |
| to memory by the RBL. The image is divided into a series of sections and |
| the image's entry point is specified. Each section comes with meta data |
| like the target address the section is to be copied to and the size of the |
| section, which is used by the RBL to load the image. At the end of the |
| image the RBL jumps to the image entry point. The AIS format allows for |
| other things such as programming the clocks and SDRAM if the header is |
| programmed for it. We do not take advantage of this and instead use SPL as |
| it allows for additional flexibility (run-time detect of board revision, |
| loading the next image from a different media, etc). |
| |
| Compilation |
| =========== |
| run "./MAKEALL ipam390" in the u-boot source tree. |
| Once this build completes you will have a u-boot.ais file that needs to |
| be written to the nand flash. |
| |
| Flashing the images to NAND |
| ========================== |
| The AIS image can be written to NAND flash using the following commands. |
| Assuming that the network is configured and enabled and the u-boot.ais file |
| is tftp'able. |
| |
| U-Boot > print upd_uboot |
| upd_uboot=tftp c0000000 ${u-boot};nand erase.part u-boot;nand write c0000000 20000 ${filesize} |
| U-Boot > |
| U-Boot > run upd_uboot |
| Using DaVinci-EMAC device |
| TFTP from server 192.168.1.1; our IP address is 192.168.20.71 |
| Filename '/tftpboot/ipam390/u-boot.ais'. |
| Load address: 0xc0000000 |
| Loading: ################################## |
| 1.5 MiB/s |
| done |
| Bytes transferred = 493716 (78894 hex) |
| |
| NAND erase.part: device 0 offset 0x20000, size 0x160000 |
| Erasing at 0x160000 -- 100% complete. |
| OK |
| |
| NAND write: device 0 offset 0x20000, size 0x78894 |
| 493716 bytes written: OK |
| U-Boot > |
| |
| Recovery |
| ======== |
| |
| In the case of a "bricked" board, you need to use the TI tools found |
| here[1] to create an uboot-uart-ais.bin file |
| |
| - cd to the u-boot source tree |
| |
| - compile the u-boot for the ipam390 board: |
| $ ./MAKEALL ipam390 |
| |
| -> Now we shall have u-boot.bin |
| |
| - Create u-boot-uart-ais.bin |
| $ mono HexAIS_OMAP-L138.exe -entrypoint 0xC1080000 -ini |
| ipam390-ais-uart.cfg -o ./uboot-uart-ais.bin ./u-boot.bin@0xC1080000; |
| |
| Note: The ipam390-ais-uart.cfg is found in the board directory |
| for the ipam390 board, u-boot:/board/Barix/ipam390/ipam390-ais-uart.cfg |
| |
| - We can now run bootloader on IPAM390 via UART using the command below: |
| |
| $ mono ./slh_OMAP-L138.exe -waitForDevice -v -p /dev/tty.UC-232AC uboot-uart-ais.bin |
| NOTE: Do not cancel the command execution! The command takes 20+ seconds |
| to upload u-boot over serial and run it! |
| Outcome: |
| Waiting for the OMAP-L138... |
| (AIS Parse): Read magic word 0x41504954. |
| (AIS Parse): Waiting for BOOTME... (power on or reset target now) |
| (AIS Parse): BOOTME received! |
| (AIS Parse): Performing Start-Word Sync... |
| (AIS Parse): Performing Ping Opcode Sync... |
| (AIS Parse): Processing command 0: 0x5853590D. |
| (AIS Parse): Performing Opcode Sync... |
| (AIS Parse): Executing function... |
| (AIS Parse): Processing command 1: 0x5853590D. |
| (AIS Parse): Performing Opcode Sync... |
| (AIS Parse): Executing function... |
| (AIS Parse): Processing command 2: 0x5853590D. |
| (AIS Parse): Performing Opcode Sync... |
| (AIS Parse): Executing function... |
| (AIS Parse): Processing command 3: 0x5853590D. |
| (AIS Parse): Performing Opcode Sync... |
| (AIS Parse): Executing function... |
| (AIS Parse): Processing command 4: 0x5853590D. |
| (AIS Parse): Performing Opcode Sync... |
| (AIS Parse): Executing function... |
| (AIS Parse): Processing command 5: 0x58535901. |
| (AIS Parse): Performing Opcode Sync... |
| (AIS Parse): Loading section... |
| (AIS Parse): Loaded 326516-Byte section to address 0xC1080000. |
| (AIS Parse): Processing command 6: 0x58535906. |
| (AIS Parse): Performing Opcode Sync... |
| (AIS Parse): Performing jump and close... |
| (AIS Parse): AIS complete. Jump to address 0xC1080000. |
| (AIS Parse): Waiting for DONE... |
| (AIS Parse): Boot completed successfully. |
| |
| Operation completed successfully. |
| |
| Falcon Bootmode (boot linux without booting U-Boot) |
| =================================================== |
| |
| The Falcon Mode extends this way allowing to start the Linux kernel directly |
| from SPL. A new command is added to U-Boot to prepare the parameters that SPL |
| must pass to the kernel, using ATAGS or Device Tree. |
| |
| In normal mode, these parameters are generated each time before |
| loading the kernel, passing to Linux the address in memory where |
| the parameters can be read. |
| With Falcon Mode, this snapshot can be saved into persistent storage and SPL is |
| informed to load it before running the kernel. |
| |
| To boot the kernel, these steps under a Falcon-aware U-Boot are required: |
| |
| 1. Boot the board into U-Boot. |
| Use the "spl export" command to generate the kernel parameters area or the DT. |
| U-Boot runs as when it boots the kernel, but stops before passing the control |
| to the kernel. |
| |
| Here the command sequence for the ipam390 board: |
| - load the linux kernel image into ram: |
| |
| U-Boot > nand read c0100000 2 200000 400000 |
| |
| NAND read: device 0 offset 0x200000, size 0x400000 |
| 4194304 bytes read: OK |
| |
| - generate the bootparms image: |
| |
| U-Boot > spl export atags c0100000 |
| ## Booting kernel from Legacy Image at c0100000 ... |
| Image Name: Linux-3.5.1 |
| Image Type: ARM Linux Kernel Image (uncompressed) |
| Data Size: 2504280 Bytes = 2.4 MiB |
| Load Address: c0008000 |
| Entry Point: c0008000 |
| Verifying Checksum ... OK |
| Loading Kernel Image ... OK |
| subcommand not supported |
| subcommand not supported |
| Argument image is now in RAM at: 0xc0000100 |
| |
| - copy the bootparms image into nand: |
| |
| U-Boot > mtdparts |
| |
| device nand0 <davinci_nand.0>, # parts = 6 |
| #: name size offset mask_flags |
| 0: u-boot-env 0x00020000 0x00000000 0 |
| 1: u-boot 0x00160000 0x00020000 0 |
| 2: bootparms 0x00020000 0x00180000 0 |
| 3: factory-info 0x00060000 0x001a0000 0 |
| 4: kernel 0x00400000 0x00200000 0 |
| 5: rootfs 0x07a00000 0x00600000 0 |
| |
| active partition: nand0,0 - (u-boot-env) 0x00020000 @ 0x00000000 |
| |
| defaults: |
| mtdids : nand0=davinci_nand.0 |
| mtdparts: mtdparts=davinci_nand.0:128k(u-boot-env),1408k(u-boot),128k(bootparms),384k(factory-info),4M(kernel),-(rootfs) |
| U-Boot > nand erase.part bootparms |
| |
| NAND erase.part: device 0 offset 0x180000, size 0x20000 |
| Erasing at 0x180000 -- 100% complete. |
| OK |
| U-Boot > nand write c0000100 180000 20000 |
| |
| NAND write: device 0 offset 0x180000, size 0x20000 |
| 131072 bytes written: OK |
| U-Boot > |
| |
| You can use also the predefined U-Boot Environment variable "setbootparms", |
| which will do all the above steps in one command: |
| |
| U-Boot > print setbootparms |
| setbootparms=nand read c0100000 200000 400000;spl export atags c0100000;nand erase.part bootparms;nand write c0000100 180000 20000 |
| U-Boot > run setbootparms |
| |
| NAND read: device 0 offset 0x200000, size 0x400000 |
| 4194304 bytes read: OK |
| ## Booting kernel from Legacy Image at c0100000 ... |
| Image Name: Linux-3.5.1 |
| Image Type: ARM Linux Kernel Image (uncompressed) |
| Data Size: 2504280 Bytes = 2.4 MiB |
| Load Address: c0008000 |
| Entry Point: c0008000 |
| Verifying Checksum ... OK |
| Loading Kernel Image ... OK |
| subcommand not supported |
| subcommand not supported |
| Argument image is now in RAM at: 0xc0000100 |
| |
| NAND erase.part: device 0 offset 0x180000, size 0x20000 |
| Erasing at 0x180000 -- 100% complete. |
| OK |
| |
| NAND write: device 0 offset 0x180000, size 0x20000 |
| 131072 bytes written: OK |
| U-Boot > |
| |
| Links |
| ===== |
| [1] |
| http://sourceforge.net/projects/dvflashutils/files/OMAP-L138/ |