Custom bootloader: Difference between revisions
(added link to kernel options, minor spellfixes) |
(Added lots of info) |
||
Line 1: | Line 1: | ||
On an unsecured XO, Open Firmware auto-boots by executing a Forth script named /boot/olpc.fth . The search order is USB, then SD, then NAND. If OFW doesn't find /boot/olpc.fth on any on those devices, it will try to boot from a wired USB network interface or wireless LAN using DHCP and TFTP. ([[Firmware Security]] tells how OFW boots a secured XO.) |
|||
This is the boot script for the olpc. It is normally found on the nand, in /boot. |
|||
The olpc.fth script that is present on OLPC system installations tries to boot Linux from the same device |
|||
Open firmware first searches for this file on a usb stick, then on a sd card, and finally on the nand. |
|||
where olpc.fth was found, using command line arguments appropriate for that device. (Some versions of it |
|||
Below are found a commonly used script to allow for booting from a variety of locations. If you are booting into something other than sugar on fedora you will need to remove the startup animation as it causes the machine to freeze. This is easily accomplished by putting a line of unfreeze before the boot. |
|||
do additional things, like automatically updating the firmware if a newer firmware image file is present.) |
|||
If you want to try a new operating system build, you can put it and a suitable olpc.fth on a removable device like a USB stick or SD card. If the device is inserted, the XO will try to boot from them, and you can revert to the |
|||
==Boot location== |
|||
"normal" XO operating system on NAND by removing the device. |
|||
You can make custom olpc.fth scripts to boot any way you want. For example, you could have an olpc.fth on |
|||
You need 3 things to boot, a boot-file a boot-device and a ramdisk. You can hose these on a USB, a SD or on the internal nand. You may even have the olpc.fth boot file in any of these places (in /boot/) and the first location it finds is the one it is going to use. The order for searching is USB -> SD -> nand so it is possible to make a bootable USB stick, and it will boot that when present, but it will boot the normal nand when it is removed. this is helpful for trying out unstable distro's as it doesn't alter the internal memory at all. |
|||
a USB stick that boots Linux from an SD card. You could make an olpc.fth that boots a different operating |
|||
system with arbitrary command line arguments. Or you could make an olpc.fth that does pretty much anything |
|||
without needing an operating system, because olpc.fth can contain an arbitrary Forth language program that |
|||
can call any of the thousands of functions that Open Firmware provides. |
|||
Some example olpc.fth scripts are shown below. |
|||
The locations of these items with either be: |
|||
* sd:\ - SD card |
|||
* disk:\ - USB disk |
|||
* nand:\ - internal nand |
|||
==Boot Parameters== |
|||
The inputs needed for the boot file are: |
|||
*ro - mount read only (it is remounted read-write during the boot process) |
|||
*root - location of the root filesystem |
|||
*rootdelay - optional adds in a delay before booting |
|||
*console - sets up the console display |
|||
*fbcon - sets up some fonts |
|||
To boot Linux, you need to specify |
|||
The rootfile is the main editable place it points to the root filesystem partition Usually |
|||
* the device and file that contains the OS kernel |
|||
* /dev/mmcblk0p1 - SD card |
|||
* the Linux command line arguments |
|||
* /dev/sda1 - USB stick |
|||
* optionally, a ramdisk image to use as an initial root filesystem. (Linux can boot without a ramdisk, but it's tricky to set that up, especially on a USB stick.) |
|||
* mtd0 - internal nand |
|||
There are two different ways to specify the OS image file and the command line - either |
|||
A complete list of linux kernel options may be found at [http://www.kernel.org/pub/linux/kernel/people/gregkh/lkn/lkn_pdf/ch09.pdf Linux Kernel in a Nutshell] (PDF warning) |
|||
on the same line with the OFW "boot" command or in configuration variables. These |
|||
two command sequences do the same thing: |
|||
boot u:\boot\vmlinuz ro root=sda1 |
|||
===Boot-device=== |
|||
This is the location of the kernel that you wish to boot this line usually works to: |
|||
or |
|||
locator\boot\vmlinuz |
|||
for example to boot from SD |
|||
" u:\boot\vmlinuz" to boot-device |
|||
" ro root=sda1" to boot-file |
|||
boot |
|||
===OS image names ("boot-device" configuration variable)=== |
|||
The "boot-device" configuration variable contains the name of the device and file from which to load the |
|||
OS kernel image (unless overridden on the "boot" line). The form is "device-specifier:pathname". |
|||
The most common "device-specifier" values for the XO are: |
|||
u - USB 2.0 mass storage device (e.g. USB stick) |
|||
disk - USB 1.1 or 2.0 mass storage device (USB 1.1 storage devices are supported, but not recommended) |
|||
sd - SD card |
|||
nand - NAND FLASH with JFFS2 filesystem |
|||
n - an even shorter alias for "nand" |
|||
On USB and SD devices, the supported filesystems are FAT (any variant) and ext2. ext3 also works if |
|||
the journal is empty (ext3 is not a great choice for a removable device). When specifying the pathname |
|||
to Open Firmware, you must use "\" instead of "/". (OFW uses "/" to separate device tree name components. |
|||
Using "/" in the pathname would confuse OFW's device-specifier parser.) |
|||
For FAT filesystems, the pathname is case-insensitive and 8.3 names must be used. |
|||
(OFW doesn't support long FAT filenames because of patent issues.) |
|||
For ext2/3 filesystems, the pathname is case-sensitive and names can be long. |
|||
The OS image file (e.g. u:\boot\vmlinuz) can be in either Linux "bzImage" format or ELF format. |
|||
For bzImage format, OFW places the data at memory address 0x100000 (1 MiB). |
|||
For ELF format, OFW places the various ELF program sections at the addresses specified in the ELF header. |
|||
(The image file can also be in Forth source code format, signified by the first line starting with a |
|||
" \ " comment. That is how OFW initially boots olpc.fth .) |
|||
If the OS image file is zlib-compressed, OFW will automatically uncompress it. OFW recognizes the |
|||
compressed format by the image contents, not by the pathname. |
|||
Example values for the OS image name: |
|||
sd:\boot\vmlinuz |
sd:\boot\vmlinuz |
||
disk:\boot\vmlinuz |
|||
nand:\boot\vmlinuz |
|||
disk:\bzImage |
|||
OLPC system installations put OS images in the /boot directory (\boot in the OFW pathname representation), |
|||
but that is just a convention, not a requirement. The olpc.fth file, however, |
|||
must be in /boot if you wish to auto-boot, because the pathname "\boot\olpc.fth" is in OFW's default |
|||
value for boot-device . olpc.fth typically then either replaces the value of boot-device with the name |
|||
of an OS image file, or else supplies the image name on the "boot ..." line, thus "chaining" from olpc.fth |
|||
to an OS. |
|||
===Linux command line arguments (boot-file value)=== |
|||
The "boot-file" configuration variable contains the command line arguments to pass to the OS (unless overridden on the "boot" line). (The name "boot-file" is historical.) For booting Linux, the most |
|||
important command line argument is "root=", which specifies the root filesystem device. When booting from |
|||
NAND, you also have to specify "rootfstype=jffs2", because Linux can't auto-detect the JFFS2 filesystem |
|||
type. The other "standard" OLPC command line arguments are not strictly necessary. |
|||
Some common Linux command line arguments for XO are: |
|||
*ro - mount read only (it is remounted read-write during the boot process) |
|||
*root=<device> - location of the root filesystem |
|||
*rootfstype=jffs2 - needed only when the root filesystem is on the NAND FLASH |
|||
*rootfstype=ext3 - conventionally supplied for EXT3 filesystems, but not strictly necessary, as EXT3 can be auto-detected |
|||
*rootdelay=<seconds> - optional adds in a delay before booting (useful for slow-starting devices) |
|||
*console=<device>[,arguments] - sets up the console display. You can have multiple console= arguments. |
|||
*fbcon=font:SUN12x22 - chooses a font that's a good size for the OLPC display resolution |
|||
If you just want the normal Linux text console on the OLPC screen, you don't really need and "console=<device>" arguments, because screen console is the default. A lot of olpc.fth scripts say "console=ttyS0,115200 console=tty0" to get console messages on both the screen and on the serial debug port (which you can only get to by opening the machine and connecting a special adapter). |
|||
Some useful values for the "root=" device are: |
|||
* mmcblk0p1 - SD card |
|||
* sda1 - USB stick |
|||
* mtd0 - internal NAND (also specify rootfstype=jffs2) |
|||
* LABEL=OLPCRoot - instead of specifying a specific device, you can specify a label value and Linux will search for a disk that has that label on it |
|||
A complete list of linux kernel options may be found at [http://www.kernel.org/pub/linux/kernel/people/gregkh/lkn/lkn_pdf/ch09.pdf Linux Kernel in a Nutshell] (in PDF format). |
|||
===Ramdisk=== |
===Ramdisk=== |
||
This is the initial ramdisk used for booting. Usually: |
|||
Linux can boot without a ramdisk, locating the initial root filesystem on a disk device, but it is |
|||
locator\boot\olpcrd.img |
|||
now common practice to use a ramdisk. The ramdisk image contains a minimal root filesystem that Linux |
|||
example to boot from SD |
|||
uses to get started, doing things like probing for USB devices with udev, before switching over to the |
|||
sd:\boot\olpcrd.img |
|||
real root filesystem on disk. |
|||
OFW doesn't get the ramdisk image name from the "boot ..." line. To boot with a ramdisk, you must |
|||
specify the device and pathname of the ramdisk image file via the "ramdisk" configuration variable, as in: |
|||
" u:\boot\initrd" to ramdisk |
|||
or |
|||
" sd:\boot\initrd" to ramdisk |
|||
If the value of "ramdisk" is not empty, OFW will load the specified file into memory after it loads the |
|||
Linux OS image, telling Linux the memory location of the ramdisk via Linux "zero page" startup-info data |
|||
structure. The ramdisk loading mechanism only applies to Linux. If OFW loads an operating system image |
|||
that doesn't look like Linux, OFW won't try to load a ramdisk. Only Linux has a defined mechanism for |
|||
passing the ramdisk location to the OS, so OFW would have no way to tell another OS about the ramdisk. |
|||
The device:pathname format is the same as for the OS kernel image file. As with the kernel image, if |
|||
the ramdisk image is zlib-compressed, OFW will automatically decompress it. |
|||
===Simple /boot/olpc.fth script=== |
|||
Here is a simple olpc.fth script that doesn't do anything fancy; it just boots Linux from a USB disk |
|||
with a ramdisk. |
|||
\ OLPC boot script |
|||
unfreeze |
|||
" u:\boot\initrd" to ramdisk |
|||
boot u:\boot\vmlinuz root=sda1 |
|||
In many cases, that simple script is all you really need. See the next section for an explanation of "unfreeze". |
|||
In fact, if you just want to try something, and you don't want to auto-boot, you don't have to make the script at all. You can just type the commands at the "ok" prompt. At the ok prompt, you don't have to type the comment line ("\ OLPC boot script"), but olpc.fth must be begin with a comment so OFW will recognize that it contains Forth source code instead of a binary image format. Only the first two characters "\ " (backslash space) are required for recognition, so if you're really lazy, you don't need much of a comment line. |
|||
===Sample menued bootloader to allow for selection of boot location=== |
===Sample menued bootloader to allow for selection of boot location=== |
||
Line 46: | Line 148: | ||
." 1 to boot from SD" cr |
." 1 to boot from SD" cr |
||
." 2 to boot from USB" cr |
." 2 to boot from USB" cr |
||
." 3 to boot from internal |
." 3 to boot from internal NAND" cr |
||
." 4 to boot alternate image from |
." 4 to boot alternate image from NAND" cr |
||
cr |
cr |
||
key |
key case |
||
char 1 of |
|||
31 = if |
|||
\ SD boot info |
|||
" ro root= |
" ro root=mmcblk0p1 rootdelay=1 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file |
||
" sd:\boot\vmlinuz" to boot-device |
" sd:\boot\vmlinuz" to boot-device |
||
" sd:\boot\olpcrd.img" to ramdisk |
" sd:\boot\olpcrd.img" to ramdisk |
||
endof |
|||
else 32 = if |
|||
char 2 of |
|||
\ USB boot info |
|||
\ USB boot info |
|||
" ro root=/dev/sda1 rootdelay=1 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file |
|||
" ro root=sda1 rootdelay=1 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file |
|||
" disk:\boot\vmlinuz" to boot-device |
|||
" disk:\boot\ |
" disk:\boot\vmlinuz" to boot-device |
||
" disk:\boot\olpcrd.img" to ramdisk |
|||
else 34 = if |
|||
endof |
|||
\ Alternate boot image info |
|||
char 4 of |
|||
" ro root=mtd0 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file |
|||
\ Alternate boot image info |
|||
" nand:\boot-alt\vmlinuz" to boot-device |
|||
" ro root=mtd0 rootfstype=jffs2 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file |
|||
" nand:\boot-alt\olpcrd.img" to ramdisk |
|||
" nand:\boot-alt\vmlinuz" to boot-device |
|||
else |
|||
" nand:\boot-alt\olpcrd.img" to ramdisk |
|||
\ Default into boot as sugar |
|||
endof |
|||
" ro root=mtd0 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file |
|||
( default ) |
|||
" nand:\boot\vmlinuz" to boot-device |
|||
\ Default into boot as sugar |
|||
" ro root=mtd0 rootfstype=jffs2 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file |
|||
then |
|||
" nand:\boot\vmlinuz" to boot-device |
|||
then |
|||
" nand:\boot\olpcrd.img" to ramdisk |
|||
then |
|||
endcase |
|||
unfreeze |
unfreeze |
||
boot |
boot |
||
\ end of script |
\ end of script |
||
The "unfreeze" line near the end releases the display so that OS output can be seen. |
|||
Open Firmware "freezes" the screen (by using the DCON chip to hold the last graphical image) just before |
|||
starting the OS. This hides Linux's scrolling text messages to make the boot sequence prettier. |
|||
The OLPC Linux/Sugar startup code "unfreezes" the screen when it is ready to display its own startup animation. |
|||
If your OS doesn't know how to tell the DCON to unfreeze the screen, you need to say "unfreeze" in olpc.fth, |
|||
otherwise your OS's output won't be seen. You can also use "unfreeze" if you want to see the Linux |
|||
startup text with the normal OLPC OS. |
|||
==overclock== |
==overclock== |
||
Line 100: | Line 211: | ||
." 3 to overclock it to 500 memory 200" cr |
." 3 to overclock it to 500 memory 200" cr |
||
." 4 to overclock extreme to 533 233 WARNING MIGHT BE UNSTABLE" cr cr |
." 4 to overclock extreme to 533 233 WARNING MIGHT BE UNSTABLE" cr cr |
||
key |
key case |
||
char 2 of |
|||
32 = if |
|||
\ underclock |
|||
7de009e 3d3 4c000014 wrmsr ." underclock" |
|||
endof |
|||
else 33 = if |
|||
char 3 of |
|||
\ over clock normal |
|||
\ over clock normal |
|||
7de009e 5dd 4c000014 wrmsr ." overclock normal" |
|||
else 34 = if |
|||
endof |
|||
\ overclock EXTREME |
|||
char 4 of |
|||
7de009e 6df 4c000014 wrmsr ." overclock EXTREME" |
|||
\ overclock EXTREME |
|||
then then then |
|||
7de009e 6df 4c000014 wrmsr ." overclock EXTREME" |
|||
endof |
|||
endcase |
|||
\ select boot location |
\ select boot location |
||
cr |
cr |
||
Line 118: | Line 232: | ||
." 4 to boot alternate image from Nand" cr |
." 4 to boot alternate image from Nand" cr |
||
cr |
cr |
||
key |
key case |
||
char 1 of |
|||
31 = if |
|||
\ SD boot info |
|||
" ro root= |
" ro root=mmcblk0p1 rootdelay=1 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file |
||
" sd:\boot\vmlinuz" to boot-device |
" sd:\boot\vmlinuz" to boot-device |
||
" sd:\boot\olpcrd.img" to ramdisk |
" sd:\boot\olpcrd.img" to ramdisk |
||
endof |
|||
else 32 = if |
|||
char 2 of |
|||
\ USB boot info |
|||
\ USB boot info |
|||
" ro root=/dev/sda1 rootdelay=1 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file |
|||
" ro root=sda1 rootdelay=1 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file |
|||
" disk:\boot\vmlinuz" to boot-device |
|||
" disk:\boot\ |
" disk:\boot\vmlinuz" to boot-device |
||
" disk:\boot\olpcrd.img" to ramdisk |
|||
else 34 = if |
|||
endof |
|||
\ Alternate boot image info |
|||
char 4 of |
|||
" ro root=mtd0 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file |
|||
\ Alternate boot image info |
|||
" nand:\boot-alt\vmlinuz" to boot-device |
|||
" ro root=mtd0 rootfstype=jffs2 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file |
|||
" nand:\boot-alt\olpcrd.img" to ramdisk |
|||
" nand:\boot-alt\vmlinuz" to boot-device |
|||
else |
|||
" nand:\boot-alt\olpcrd.img" to ramdisk |
|||
\ Default into boot as sugar |
|||
endof |
|||
" ro root=mtd0 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file |
|||
( default ) |
|||
" nand:\boot\vmlinuz" to boot-device |
|||
\ Default into boot as sugar |
|||
" ro root=mtd0 rootfstype=jffs2 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file |
|||
then |
|||
" nand:\boot\vmlinuz" to boot-device |
|||
then |
|||
" nand:\boot\olpcrd.img" to ramdisk |
|||
then |
|||
endcase |
|||
unfreeze |
unfreeze |
||
boot |
boot |
Revision as of 09:03, 25 August 2008
On an unsecured XO, Open Firmware auto-boots by executing a Forth script named /boot/olpc.fth . The search order is USB, then SD, then NAND. If OFW doesn't find /boot/olpc.fth on any on those devices, it will try to boot from a wired USB network interface or wireless LAN using DHCP and TFTP. (Firmware Security tells how OFW boots a secured XO.)
The olpc.fth script that is present on OLPC system installations tries to boot Linux from the same device where olpc.fth was found, using command line arguments appropriate for that device. (Some versions of it do additional things, like automatically updating the firmware if a newer firmware image file is present.)
If you want to try a new operating system build, you can put it and a suitable olpc.fth on a removable device like a USB stick or SD card. If the device is inserted, the XO will try to boot from them, and you can revert to the "normal" XO operating system on NAND by removing the device.
You can make custom olpc.fth scripts to boot any way you want. For example, you could have an olpc.fth on a USB stick that boots Linux from an SD card. You could make an olpc.fth that boots a different operating system with arbitrary command line arguments. Or you could make an olpc.fth that does pretty much anything without needing an operating system, because olpc.fth can contain an arbitrary Forth language program that can call any of the thousands of functions that Open Firmware provides.
Some example olpc.fth scripts are shown below.
Boot Parameters
To boot Linux, you need to specify
- the device and file that contains the OS kernel
- the Linux command line arguments
- optionally, a ramdisk image to use as an initial root filesystem. (Linux can boot without a ramdisk, but it's tricky to set that up, especially on a USB stick.)
There are two different ways to specify the OS image file and the command line - either on the same line with the OFW "boot" command or in configuration variables. These two command sequences do the same thing:
boot u:\boot\vmlinuz ro root=sda1
or
" u:\boot\vmlinuz" to boot-device " ro root=sda1" to boot-file boot
OS image names ("boot-device" configuration variable)
The "boot-device" configuration variable contains the name of the device and file from which to load the OS kernel image (unless overridden on the "boot" line). The form is "device-specifier:pathname". The most common "device-specifier" values for the XO are:
u - USB 2.0 mass storage device (e.g. USB stick) disk - USB 1.1 or 2.0 mass storage device (USB 1.1 storage devices are supported, but not recommended) sd - SD card nand - NAND FLASH with JFFS2 filesystem n - an even shorter alias for "nand"
On USB and SD devices, the supported filesystems are FAT (any variant) and ext2. ext3 also works if the journal is empty (ext3 is not a great choice for a removable device). When specifying the pathname to Open Firmware, you must use "\" instead of "/". (OFW uses "/" to separate device tree name components. Using "/" in the pathname would confuse OFW's device-specifier parser.) For FAT filesystems, the pathname is case-insensitive and 8.3 names must be used. (OFW doesn't support long FAT filenames because of patent issues.) For ext2/3 filesystems, the pathname is case-sensitive and names can be long.
The OS image file (e.g. u:\boot\vmlinuz) can be in either Linux "bzImage" format or ELF format. For bzImage format, OFW places the data at memory address 0x100000 (1 MiB). For ELF format, OFW places the various ELF program sections at the addresses specified in the ELF header. (The image file can also be in Forth source code format, signified by the first line starting with a " \ " comment. That is how OFW initially boots olpc.fth .)
If the OS image file is zlib-compressed, OFW will automatically uncompress it. OFW recognizes the compressed format by the image contents, not by the pathname.
Example values for the OS image name:
sd:\boot\vmlinuz disk:\boot\vmlinuz nand:\boot\vmlinuz disk:\bzImage
OLPC system installations put OS images in the /boot directory (\boot in the OFW pathname representation), but that is just a convention, not a requirement. The olpc.fth file, however, must be in /boot if you wish to auto-boot, because the pathname "\boot\olpc.fth" is in OFW's default value for boot-device . olpc.fth typically then either replaces the value of boot-device with the name of an OS image file, or else supplies the image name on the "boot ..." line, thus "chaining" from olpc.fth to an OS.
Linux command line arguments (boot-file value)
The "boot-file" configuration variable contains the command line arguments to pass to the OS (unless overridden on the "boot" line). (The name "boot-file" is historical.) For booting Linux, the most important command line argument is "root=", which specifies the root filesystem device. When booting from NAND, you also have to specify "rootfstype=jffs2", because Linux can't auto-detect the JFFS2 filesystem type. The other "standard" OLPC command line arguments are not strictly necessary.
Some common Linux command line arguments for XO are:
- ro - mount read only (it is remounted read-write during the boot process)
- root=<device> - location of the root filesystem
- rootfstype=jffs2 - needed only when the root filesystem is on the NAND FLASH
- rootfstype=ext3 - conventionally supplied for EXT3 filesystems, but not strictly necessary, as EXT3 can be auto-detected
- rootdelay=<seconds> - optional adds in a delay before booting (useful for slow-starting devices)
- console=<device>[,arguments] - sets up the console display. You can have multiple console= arguments.
- fbcon=font:SUN12x22 - chooses a font that's a good size for the OLPC display resolution
If you just want the normal Linux text console on the OLPC screen, you don't really need and "console=<device>" arguments, because screen console is the default. A lot of olpc.fth scripts say "console=ttyS0,115200 console=tty0" to get console messages on both the screen and on the serial debug port (which you can only get to by opening the machine and connecting a special adapter).
Some useful values for the "root=" device are:
- mmcblk0p1 - SD card
- sda1 - USB stick
- mtd0 - internal NAND (also specify rootfstype=jffs2)
- LABEL=OLPCRoot - instead of specifying a specific device, you can specify a label value and Linux will search for a disk that has that label on it
A complete list of linux kernel options may be found at Linux Kernel in a Nutshell (in PDF format).
Ramdisk
Linux can boot without a ramdisk, locating the initial root filesystem on a disk device, but it is now common practice to use a ramdisk. The ramdisk image contains a minimal root filesystem that Linux uses to get started, doing things like probing for USB devices with udev, before switching over to the real root filesystem on disk.
OFW doesn't get the ramdisk image name from the "boot ..." line. To boot with a ramdisk, you must specify the device and pathname of the ramdisk image file via the "ramdisk" configuration variable, as in:
" u:\boot\initrd" to ramdisk
or
" sd:\boot\initrd" to ramdisk
If the value of "ramdisk" is not empty, OFW will load the specified file into memory after it loads the Linux OS image, telling Linux the memory location of the ramdisk via Linux "zero page" startup-info data structure. The ramdisk loading mechanism only applies to Linux. If OFW loads an operating system image that doesn't look like Linux, OFW won't try to load a ramdisk. Only Linux has a defined mechanism for passing the ramdisk location to the OS, so OFW would have no way to tell another OS about the ramdisk.
The device:pathname format is the same as for the OS kernel image file. As with the kernel image, if the ramdisk image is zlib-compressed, OFW will automatically decompress it.
Simple /boot/olpc.fth script
Here is a simple olpc.fth script that doesn't do anything fancy; it just boots Linux from a USB disk with a ramdisk.
\ OLPC boot script unfreeze " u:\boot\initrd" to ramdisk boot u:\boot\vmlinuz root=sda1
In many cases, that simple script is all you really need. See the next section for an explanation of "unfreeze".
In fact, if you just want to try something, and you don't want to auto-boot, you don't have to make the script at all. You can just type the commands at the "ok" prompt. At the ok prompt, you don't have to type the comment line ("\ OLPC boot script"), but olpc.fth must be begin with a comment so OFW will recognize that it contains Forth source code instead of a binary image format. Only the first two characters "\ " (backslash space) are required for recognition, so if you're really lazy, you don't need much of a comment line.
\ \ Uber bootscript for OLPC Place in /boot as olpc.fth \ cr ." 1 to boot from SD" cr ." 2 to boot from USB" cr ." 3 to boot from internal NAND" cr ." 4 to boot alternate image from NAND" cr cr key case char 1 of \ SD boot info " ro root=mmcblk0p1 rootdelay=1 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file " sd:\boot\vmlinuz" to boot-device " sd:\boot\olpcrd.img" to ramdisk endof char 2 of \ USB boot info " ro root=sda1 rootdelay=1 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file " disk:\boot\vmlinuz" to boot-device " disk:\boot\olpcrd.img" to ramdisk endof char 4 of \ Alternate boot image info " ro root=mtd0 rootfstype=jffs2 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file " nand:\boot-alt\vmlinuz" to boot-device " nand:\boot-alt\olpcrd.img" to ramdisk endof ( default ) \ Default into boot as sugar " ro root=mtd0 rootfstype=jffs2 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file " nand:\boot\vmlinuz" to boot-device " nand:\boot\olpcrd.img" to ramdisk endcase unfreeze boot \ end of script
The "unfreeze" line near the end releases the display so that OS output can be seen. Open Firmware "freezes" the screen (by using the DCON chip to hold the last graphical image) just before starting the OS. This hides Linux's scrolling text messages to make the boot sequence prettier. The OLPC Linux/Sugar startup code "unfreezes" the screen when it is ready to display its own startup animation. If your OS doesn't know how to tell the DCON to unfreeze the screen, you need to say "unfreeze" in olpc.fth, otherwise your OS's output won't be seen. You can also use "unfreeze" if you want to see the Linux startup text with the normal OLPC OS.
overclock
You can also overclock your OLPC with the olpc.fth file. In order to accomplish this you need to set your timings before it loads the operating system. You must add some numbers to the forth stack and when write these registers using wmrsr. Shown below is a specific overclock frequency and that can be changed by altering the middle number to what you find below in the overclock table.
7de009e 5dd 4c000014 wrmsr
You then add in any specific booting information you want (see above).
XO-1 Overclock Settings in MHz; default is 433/166 (4d9) |
|||||
CPU | Bus Speed | ||||
133 | 166 | 200 | 216 | 233 | |
333 | 3d3 | 4d3 | 5d3 | 653 | 6d3 |
366 | 3d5 | 4d5 | 5d5 | 655 | 6d5 |
400 | 3d7 | 4d7 | 5d7 | 657 | 6d7 |
433 | 3d9 | 4d9 | 5d9 | 659 | 6d9 |
466 | 3db | 4db | 5db | 65b | 6db |
500 | 3dd | 4dd | 5dd | 65d | 6dd |
533 | 3df | 4df | 5df | 65f | 6df |
566 | 3e1 | 4e1 | 5e1 | 661 | 6e1 |
Sample Uber Bootscript
\ \ Uber bootscript for OLPC Place in /boot as olpc.fth \ \ select overclock level \ cr ." 1 to set the clock speed as normal" cr ." 2 to under clock the machine to 333 MHZ memory 133" cr ." 3 to overclock it to 500 memory 200" cr ." 4 to overclock extreme to 533 233 WARNING MIGHT BE UNSTABLE" cr cr key case char 2 of \ underclock 7de009e 3d3 4c000014 wrmsr ." underclock" endof char 3 of \ over clock normal 7de009e 5dd 4c000014 wrmsr ." overclock normal" endof char 4 of \ overclock EXTREME 7de009e 6df 4c000014 wrmsr ." overclock EXTREME" endof endcase \ select boot location cr ." 1 to boot from SD" cr ." 2 to boot from USB" cr ." 3 to boot from internal nand" cr ." 4 to boot alternate image from Nand" cr cr key case char 1 of \ SD boot info " ro root=mmcblk0p1 rootdelay=1 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file " sd:\boot\vmlinuz" to boot-device " sd:\boot\olpcrd.img" to ramdisk endof char 2 of \ USB boot info " ro root=sda1 rootdelay=1 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file " disk:\boot\vmlinuz" to boot-device " disk:\boot\olpcrd.img" to ramdisk endof char 4 of \ Alternate boot image info " ro root=mtd0 rootfstype=jffs2 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file " nand:\boot-alt\vmlinuz" to boot-device " nand:\boot-alt\olpcrd.img" to ramdisk endof ( default ) \ Default into boot as sugar " ro root=mtd0 rootfstype=jffs2 console=ttyS0,115200 console=tty0 fbcon=font:SUN12x22" to boot-file " nand:\boot\vmlinuz" to boot-device " nand:\boot\olpcrd.img" to ramdisk endcase unfreeze boot \ end of script