| 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 "tools/buildman/buildman -k ipam390" in the u-boot source tree. | |
| Once this build completes you will have a ../current/ipam390/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: | |
| $ tools/buildman/buildman -k 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 ../current/ipam390/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/ |