A great starting point if you have questions like this is the OMAP35x Technical Reference Manual. This sprawling document holds the answers to a lot of BeagleBoard questions. Of particular interest is Chapter 25, which details the intialization process. The basic steps of initialization are as follows:
- Preinitialization
- Power/clock/reset ramp sequence
- Boot ROM
- Bootloader
- OS/application
- NAND, USB, UART3, MMC1, if the button is not pressed
- USB, UART3, MMC1, NAND, if the button is pressed
To understand the bootloader, it's worth taking a closer look at the Linux boot process, which looks roughly like this:
- System startup
- Stage 1 bootloader
- Stage 2 bootloader
- Kernel
- Init
The first-stage bootloader must be small enough to fit in the OMAP3530's on-chip memory. Remember, at this point the device has not initialized external memory, so it has only 64 kB of SRAM to work with. Our first-stage bootloader is called "X-Loader". A signed copy of X-Loader, called "MLO", is the first thing we copied onto the SD card when we set up Ångström. The first-stage bootloader initializes external memory, copies the secont-stage bootloader into memory, and executes it.
Our second-stage bootloader is called "U-Boot". Its job is to load the kernel and root filesystem. On our bootable SD card, "uImage" is the kernel image, and the second partition is our root filesystem.
Now that we understand the contents of the SD card a little better, we can return to the main question: How can we avoid having to hold the USER button on every boot?
My first thought was, if the boot ROM is looking in NAND first, why don't we just put the whole system there, instead of on the SD card? I had come across an article which describes how to do exactly that, so it seemed like a sensible enough starting point.
Ultimately, however, I had some difficulty installing MTD utils. I later discovered that a stable tarball could be found here, but the hiccup stalled me just long enough to wonder, is it even a good idea to put all of this in NAND?
Talking with other developers on the #beagle IRC channel, I realized that the main reason to put the system in NAND is to operate without an SD card attached. This may be useful in a production environment, but for development purposes, the general wisdom seems to be that keeping the bootloaders, kernel, and filesystem on the SD card increases flexibility.
So, why wasn't the SD card we prepared previously booting without the USER button depressed? On the BeagleBoard, the OMAP3530's NAND is partitioned as follows:
- 0x00000000 to 0x00080000: X-Loader
- 0x00080000 to 0x00260000: U-Boot
- 0x00260000 to 0x00280000: U-Boot environment
- 0x00280000 to 0x00680000: Kernel
- 0x00680000 to 0x10000000: Filesystem
- Reset the BeagleBoard.
- When U-Boot comes up, hit a key to stop autoboot.
- At the prompt, enter "nand erase 0 80000".
Finally, it is necessary to update U-Boot's "bootargs" and "bootcmd" as noted on the BeagleBoardBeginners page. With an Ångström SD card in place and the first NAND partition erased, the BeagleBoard now boots from the SD card without the need to hold the USER button down.