
README for the Palm Treo 680.

Copyright (C) 2013 Mike Dunn <mikedunn@newsguy.com>

You may reproduce the contents of this file entirely or in part, but please
credit me by name if you do.  Thanks.


Intro
=====

Yes, you can program u-boot onto the flash of your Palm Treo 680 so that u-boot
(then Linux, Android, ...) runs at power-up.  This document describes how, and
gives some implementation details on this port of u-boot and describes how the
Treo 680 boots from reset.

But first, I probably don't need to tell you that after doing this, your phone
will no longer run PalmOS.  You *may* be able to later restore your phone to its
original state by creating a backup image of the flash before writing u-boot
(details below), but this is not heavily tested and should not be relied upon.
There is also the possibility that something may go wrong during the process of
programming u-boot, leaving you with a bricked phone.  If you follow these
instructions carefully this chance will be minimized, but I do not recommend
that you program u-boot onto a phone that you can not afford to lose, and
certainly not one that contains important data that is not backed up elsewhere.
I AM NOT RESPONSIBLE FOR THE LOSS OF YOUR PHONE.  DO THIS AT YOUR OWN RISK.
Having said that, feel free to send me a note cursing me out if something does
go wrong, but please tell me what happened exactly.  For that matter, I'd love
to hear from you if you succeed.


Details on the SPL
==================

The docg4 features a 2k region at the start of its address space that interfaces
to the system bus like a NOR flash.  This allows the docg4 to function as a boot
ROM.  The Treo 680 uses this feature.  The contents of this 2k region are
write-protected and can not be reprogrammed.  Fortunately, the code it contains
does what we need to do, at least partially.  After some essential hardware
initialization (like the SDRAM controller), it runs an IPL (initial program
loader) that copies 128K (no more, no less) from flash to a fixed address in
SDRAM (0xa1700000) and jumps to it.  128K is too small for u-boot, so we use it
to load a u-boot secondary program loader (SPL).  But since our SPL only
occupies a little over 1k, we can economize on flash usage by having the IPL
load a portion of u-boot proper as well.  We let the IPL load the first 128k of
a concatenated spl + u-boot image, and because the SPL is placed before u-boot
proper, the IPL jumps to the SPL, which copies the portion of u-boot that the
IPL has already loaded to its correct SDRAM address, and then loads the
remainder of u-boot and jumps to it.


The docg4's "reliable mode"
===========================

This is a special mode of operation of the docg4's integrated controller whereby
consecutive pairs of 2k regions are used in parallel (in some fashion) to store
2k of data.  In other words, the normal capacity is halved, but the data
integrity is improved.  In this mode, the data is read or written from pages in
even-numbered 2k regions (regions starting at 0x000, 0x1000, 0x2000, ...).  The
odd-numbered 2k regions (regions starting at 0x800, 0x1800, 0x2800, ...) are
transparently used in parallel.  In reliable mode, the odd-numbered 2k regions
are not meant to be read or written directly.

Reliable mode is used by the IPL because there is not enough space in its 2k
footprint to implement the BCH ecc algorithm.  Data that is read while reliable
mode is enabled must have been written in reliable mode, or the read fails.
However, data written in reliable mode can also be read in normal mode (just not
as reliably), but only from the even-numbered 2k regions; the odd-numbered 2k
regions appear to contain junk, and will generate ecc errors.  When the IPL and
SPL read from flash, the odd-numbered 2k regions are explicitly skipped.  The
same is true for the flash_u-boot utility when it writes the u-boot image in
reliable mode.

The docg4 Linux driver supports writing in reliable mode (it is enabled by the
module parameter), but not reading.  However, the u-boot docg4_spl driver does
read in reliable mode, in the same fashion as the IPL.


Details on the IPL and its data format
======================================

Starting from block 5 and counting upward, the IPL will search for and load the
first two blocks it finds that contain a magic number in the oob of the first
page of the block.  The contents are loaded to SDRAM starting at address
0xa1700000.  After two blocks have been loaded, it jumps to 0xa1700000.  The
number of blocks loaded and the load address in SDRAM are hard-coded; only the
flash offset of the blocks can vary at run-time (based on the presence of the
magic number).

In addition to using the docg4's reliable mode, the IPL expects each 512 byte
page to be written redundantly in the subsequent page.  The hardware is capable
of detecting bit errors (but not correcting them), and if a bit error is
detected when a page is read, the page contents are discarded and the subsequent
page is read.

Reliable mode reduces the capacity of a block by half, and the redundant pages
reduce it by half again.  As a result, the normal 256k capacity of a block is
reduced to 64k for the purposes of the IPL/SPL.

For the sake of simplicity and uniformity, the u-boot SPL mimics the operation
of the IPL, and expects the image to be stored in the same format.


Instructions on Programming u-boot to flash
===========================================

To program u-boot to your flash, you will need to boot the Linux kernel on your
phone using a PalmOS bootloader such as cocoboot.  The details of building and
running Linux on your Treo (cross-compiling, creating a root filesystem,
configuring the kernel, etc) are beyond the scope of this document.  The
remainder of this document describes in detail how to program u-boot to the
flash using Linux running on the Treo.


Hardware Prerequisites
======================

A Palm Treo 680:
  (dugh)

A Palm usb cable:
  You'll need this to establish a usbtty console connection to u-boot from a
  desktop PC.  Currently there is no support in u-boot for the pxa27x keypad
  (coming soon), so a serial link must be used for the console.
  These cables are still widely available if you don't already have one.

A Linux desktop PC.
  You may be able to use Windows for the u-boot console if you have a usb driver
  that is compatible with the Linux usbserial driver, but for programming u-boot
  to flash, you'll really want to use a Linux PC.


Treo-side Software Prerequisites
================================

Linux bootloader for PalmOS:

  Cocoboot is the only one I'm aware of.  If you don't already have this, you
  can download it from
  https://download.enlightenment.org/misc/Illume/Treo-650/2008-11-13/sdcard-base.tar.gz
  which is a compressed tar archive of the contents of an sd card containing
  cocoboot.  Use mkdosfs to create a fat16 filesystem on the first primary
  partition of the card, mount the partition, and extract the tar file to it.
  You will probably need to edit the cocoboot.conf file to customize the
  parameters passed to the kernel.


Linux kernel:

  The kernel on the Treo 680 is still a little rough around the edges, and the
  official kernel frequently breaks on the Treo :(  A development kernel
  specifically for the Treo 680 can be found on github:
    http://github.com/mike-dunn/linux-treo680
  The master branch of this tree has been tested on the Treo, and I recommend
  using this kernel for programming u-boot.  As of this writing, there may be a
  bug in the docg4 nand flash driver that sometimes causes block erasures to
  fail.  This has been fixed in the above tree.

  If you choose to use the official kernel, it must contain the docg4 driver that
  includes the reliable_mode module parameter.  This was a later enhancement to
  the driver, and was merged to the kernel as of v3.8.  Do not try to use an
  earlier kernel that contains the docg4 driver without support for writing in
  reliable mode.  If you try to program u-boot to flash with the docg4 driver
  loaded without the reliable_mode parameter enabled, you *will* brick your
  phone!

  For the purpose of programming u-boot to flash, the following options must be
  enabled in the Treo kernel's .config:

     CONFIG_MTD=y
     CONFIG_MTD_CMDLINE_PARTS=y
     CONFIG_MTD_CHAR=y
     CONFIG_MTD_NAND_DOCG4=m

  Note that the docg4 nand driver is configured as a module, because we will
  want to load and unload it with reliable_mode enabled or disabled as needed.

  You will also need to specify mtd partitions on the kernel command line.  In
  the instructions that follow, we will assume that the flash blocks to which
  u-boot will be programmed are defined by the second partition on the device.
  The u-boot config file (include/configs/palmtreo680.h) places the u-boot image
  at the start of block 6 (offset 0x180000), which is the first writable
  (non-protected) block on the flash (this is also where the PalmOS SPL starts).
  The u-boot image occupies four blocks, so to create the u-boot partition, pass
  this command line to the kernel:
    mtdparts=Msys_Diskonchip_G4:1536k(protected_part)ro,1024k(bootloader_part),-(filesys_part)
  This will create three partitions:
    protected_part: the first six blocks, which are read-only
    bootloader_part: the next four blocks, for the u-boot image
    filesys_part: the remainder of the device
  The mtdchar kernel device driver will use device nodes /dev/mtd0, /dev/mtd1,
  and /dev/mtd2 for these partitions, respectively.  Ensure that your root file
  system at least has /dev/mtd1 if you are not running udev or mdev.

Userspace Utilities:

  In addition to everything necessary to provide a useful userspace environment
  (busybox is indispensable, of course), you will need the mtd-utils package on
  your root filesystem.  I use version 1.5.0 of mtd-utils, and I suggest you use
  this version as well, or at leat a version very close to this one, as
  mtd-utils has tended to be fluid.

  Note that busybox includes a version of mtd-utils.  These are deficient and
  should not be used.  When you run one of these utilities (nanddump, etc),
  ensure you are invoking the separate executable from mtd-utils, and not the
  one built into busybox.  I recommend that you configure busybox with its
  mtd-utils disabled to avoid any possibility of confusion.

  You will also need to cross-compile the userspace Linux utility in
  tools/palmtreo680/flash_u-boot.c, which we will run on the Treo to perform the
  actual write of the u-boot image to flash.  This utility links against libmtd
  from the mtd-utils package.


Desktop PC-side Software Prerequisites
======================================

Terminal emulator application:
  minicom, kermit, etc.

Linux kernel:
  Compiled with CONFIG_USB_SERIAL enabled.  Build this as a module.


Recommended (Not directly related to u-boot)
============================================

Working directly on the Treo's tiny screen and keypad is difficult and
error-prone.  I recommend that you log into the Linux kernel running on your
Treo from your desktop PC using ethernet over usb.  The desktop's kernel must be
configured with CONFIG_USB_USBNET, CONFIG_USB_NET_CDCETHER, and
CONFIG_USB_NET_CDC_SUBSET.  The Treo's kernel will need CONFIG_USB_ETH, and its
init script will need to start an ssh daemon like dropbear.  Note that the usb0
network interface will not appear on the desktop PC until the Treo kernel's usb
ethernet gadget driver has initialized.  You must wait for this to occur (watch
the PC's kernel log) before you can assign usb0 an ip address and log in to the
Treo.  If you also build the Treo's kernel with CONFIG_IP_PNP enabled, you can
pass its ip address on the kernel command line, and obviate the need to
initialize the network interface in your init script.

Having the Palm usb cable connected to the host has the added benefit of keeping
power supplied to your Treo, reducing the drain on the battery.  If something
goes wrong while you're programming u-boot to the flash, you will have lots of
time to correct it before the battery dies.

I have encountered a situation where the kernel is sometimes unable to mount a
root filesystem on the mmc card due to the mmc controller not initializing in
time, (and CONFIG_MMC_UNSAFE_RESUME doesn't seem to help) so I recommend that
you build a minimal root filesystem into the kernel using the kernel's initramfs
feature (CONFIG_BLK_DEV_INITRD).  If you want your root filesystem on the mmc
card, your init script can mount and switch_root to the mmc card after a short
sleep.  But keep in mind that in this case you won't be able to use an mmc card
to transfer files between your desktop and the Treo once Linux is running.
Another option for transfering files is to mount an nfs filesystem exported by
the desktop PC.  For greatest convenience, you can export the root filesystem
itself from your desktop PC and switch_root to it in your init script.  This
will work if your initramfs init script contains a loop that waits for you to
initialize the usb0 network interface on the desktop PC; e.g., loop while a ping
to the desktop PC returns an error.  After the loop exits, do the nfs mount and
call switch_root.  (You can not use the kernel nfsroot feature because the
network will not be up when the kernel expects it to be; i.e., not until you
configure the usb0 interface on the desktop.)  Use the nfs 'nolock' option when
mounting to avoid the need to run a portmapper like rpcbind.


Preliminaries
=============

Once Linux is running on your Treo, you may want to perform a few sanity checks
before programming u-boot.  These checks will verify my assumptions regarding
all the Treo 680s out there, and also ensure that the flash and mtd-utils are
working correctly.  If you are impatient and reckless, you may skip this
section, but see disclaimer at the top of this file!

Load the docg4 driver:

  $ modprobe docg4 ignore_badblocks=1 reliable_mode=1

We tell the driver to use the docg4's "reliable mode" when writing because this
is the format required by the IPL, which runs from power-up and loads the first
portion of u-boot.  We must ignore bad blocks because linux mtd uses out-of-band
(oob) bytes to mark bad blocks, which will cause the blocks written by PalmOS to
be misidentified as "bad" by libmtd.

Check the kernel log to ensure that all's well:

  $ dmesg | tail
   	      <... snip ...>
  docg4 docg4: NAND device: 128MiB Diskonchip G4 detected
  3 cmdlinepart partitions found on MTD device Msys_Diskonchip_G4
  Creating 3 MTD partitions on "Msys_Diskonchip_G4":
  0x000000000000-0x000000180000 : "protected_part"
  0x000000180000-0x000000280000 : "bootloader_part"
  0x000000280000-0x000008000000 : "filesys_part"

Ensure that the partition boundaries are as shown.  (If no partitions are shown,
did you remember to pass them to the kernel on the command line?)  We will write
u-boot to bootloader_part, which starts at offset 0x180000 (block 6) and spans 4
256k blocks.  This partition is accessed through the device node /dev/mtd1.

The docg4 contains a read-only table that identifies blocks that were marked as
bad at the factory.  This table is in the page at offset 0x2000, which is within
the partition protected_part (/dev/mtd0).  There is a slight chance that one or
more of the four blocks that we will use for u-boot is listed in the table, so
use nanddump to inspect the table to see if this is the case:

  $ nanddump -p -l 512 -s 0x2000 -o /dev/mtd0
  ECC failed: 0
  ECC corrected: 0
  Number of bad blocks: 0
  Number of bbt blocks: 0
  Block size 262144, page size 512, OOB size 16
  Dumping data starting at 0x00002000 and ending at 0x00002200...
  0x00002000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
   	      <... snip ...>

The format of the table is simple: one bit per block, with block numbers
increasing from left to right, starting with block 0 as the most significant bit
of the first byte.  A bit will be clear if the corresponding block is bad.  We
want to use blocks 6 throgh 9, so both of the two least significant bits of the
first byte must be set, as must the two most significant bits of the second
byte.  If this is not true in your case (you are very unlucky), you should use
the first contiguous set of four good blocks after block 6, and adjust the
partition boundaries accordingly.  You will also have to change the value of
CONFIG_SYS_NAND_U_BOOT_OFFS in include/configs/palmtreo680.h and recompile
u-boot.  Because the two blocks loaded by the IPL do not have to be contiguous,
but our SPL expects them to be, you will need to erase any good blocks that are
at an offset prior to CONFIG_SYS_NAND_U_BOOT_OFFS, so that the IPL does not find
the magic number in oob and load it.  Once you have done all this, the
instructions in this file still apply, except that the instructions below for
restoring the original PalmOS block contents may need to be modified.

Next, use nanddump to verify that the PalmOS SPL is where we expect it to be.
The SPL can be identified by a magic number in the oob bytes of the first page
of each of the two blocks containing the SPL image.  Pages are 512 bytes in
size, so to dump the first page, plus the oob:

  $ nanddump -p -l 512 -s 0 -o /dev/mtd1
  ECC failed: 0
  ECC corrected: 0
  Number of bad blocks: 0
  Number of bbt blocks: 0
  Block size 262144, page size 512, OOB size 16
  Dumping data starting at 0x00000000 and ending at 0x00000200...
  0x00000000: 0a 00 00 ea 00 00 00 00 00 00 00 00 00 00 00 00
   	      <... snip ...>
  0x000001f0: 13 4c 21 60 13 4d 2a 69 13 4b 29 69 89 1a 99 42
    OOB Data: 42 49 50 4f 30 30 30 10 3a e2 00 92 be a0 11 ff

Verify that the first seven bytes of oob data match those in the above line.
(This is ASCII "BIPO000".)

Do the same for the next block:
  $ nanddump -p -l 512 -s 0x40000 -o /dev/mtd1

The first seven oob bytes in last line should read:

    OOB Data: 42 49 50 4f 30 30 31 81 db 8e 8f 46 07 9b 59 ff

(This is ASCII "BIPO001".)

For additional assurance, verify that the next block does *not* contain SPL
data.

  $ nanddump -p -l 512 -s 0x80000 -o /dev/mtd1

It doesn't matter what the oob contains, as long as the first four bytes are
*not* ASCII "BIPO".  PalmOS should only be using two blocks for the SPL
(although we will need four for u-boot).

If you want, you can back up the contents of bootloader_part to a file.  You may
be able to restore it later, if desired (see "Restoring PalmOS" below).

  $ nanddump -l 0x100000 -s 0 -o -f bootloader_part.orig /dev/mtd1

nanddump will spew voluminous warnings about uncorrectable ecc errors.  This is
a consequence of reading pages that were written in reliable mode, and is
expected (these should all occur on pages in odd-numbered 2k regions; i.e.,
0x800, 0xa00, 0xc00, 0xe00, 0x1800, 0x1a00, ...).  The size of the file
bootloader_part.orig should be 1081344, which is 2048 pages, each of size 512
plus 16 oob bytes.  If you are using initramfs for the root filesystem, don't
forget to copy the file to permanent storage, such as an mmc card.

If all of the above went well, you can now program u-boot.


Programming u-boot
==================

Our u-boot includes a small SPL that must be prepended to u-boot proper.  From
the base u-boot source directory on your desktop PC:

  $ cat spl/u-boot-spl.bin u-boot.bin > u-boot-concat.bin

cd to the tools/palmtreo680/ directory, and cross-compile flash_u-boot.c for the
Treo:

  $(CC) -o flash_u-boot $(CFLAGS) $(INCLUDEPATH) $(LIBPATH) flash_u-boot.c -lmtd

Substitute variable values from your cross-compilation environment as
appropriate.  Note that it links to libmtd from mtd-utils, and this must be
included in $(LIBPATH) and $(INCLUDEPATH).

Transfer u-boot-concat.bin and the compiled flash_u-boot utility to the Treo's
root filesystem.  On the Treo, cd to the directory where these files were
placed.

Load the docg4 driver if you have not already done so.

  $ modprobe docg4 ignore_badblocks=1 reliable_mode=1

Erase the blocks to which we will write u-boot:

  $ flash_erase /dev/mtd1 0x00 4

If no errors are reported, write u-boot to the flash:

  $ ./flash_u-boot u-boot-concat.bin /dev/mtd1

You can use nanddump (see above) to verify that the data was written.  This
time, "BIPO" should be seen in the first four oob bytes of the first page of all
four blocks in /dev/mtd1; i.e., at offsets 0x00000, 0x40000, 0x80000, 0xc0000.

Shutdown linux, remove and re-insert the battery, hold your breath...


Enjoying u-boot
===============

After you insert the battery, the u-boot splash screen should appear on the lcd
after a few seconds.  With the usb cable connecting the Treo to your PC, in the
kernel log of your PC you should see

  <6>usb 3-1: New USB device found, idVendor=0525, idProduct=a4a6
  <6>usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
  <6>usb 3-1: Product: U-Boot 2013.01-00167-gd62ef56-dirty
  <6>usb 3-1: Manufacturer: Das U-Boot

Load the usbserial module on your desktop PC:

  $ modprobe usbserial vendor=0x0525 product=0xa4a6

and run your favorite terminal emulation utility (minicom, kermit, etc) with the
serial device set to /dev/ttyUSB0 (assuming this is your only usb serial
device).  You should be at the u-boot console (type 'help').

There is not much that is unique about using u-boot on the palm treo 680.
Kernels can be loaded from mmc, flash, and from the desktop PC via kermit.  You
can expand the size of the second partition on the flash to contain a kernel, or
else put the kernel(s) in their own partition.

Nand commands work as expected, with the excepton that blocks not written by the
linux mtd subsystem may be misidentified by the u-boot docg4 driver as "bad" if
they contain data in the oob bytes.  This will be the case for the blocks
containing the u-boot image, for example.  To work around this, use 'nand scrub'
instead of 'nand erase' to erase these blocks, and 'nand read.raw' to read them
to memory.  (It would be useful if u-boot's nand commands provided a way to
explicitly ignore "bad" blocks, because read.raw does not perform ecc.)  The
'nand dump' command will read these "bad" blocks, however.

Currently u-boot itself can only be programmed to flash from Linux; there is no
support for reliable mode in u-boot's docg4 flash driver.  This should be
corrected soon.


Customizing
===========

If you change u-boot's configuration significantly (adding or removing
features), you may have to adjust the value of CONFIG_SYS_NAND_U_BOOT_SIZE.
This is the size of the concatenated spl + u-boot image, and tells the SPL how
many flash blocks it needs to load.  It will be rounded up to the next 64k
boundary (the spl flash block capacity), so it does not have to be exact, but
you must ensure that it is not less than the actual image size.  If it is larger
than the image, blocks may be needlessly loaded, but if too small, u-boot may
only be partially loaded, resulting in a boot failure (bricked phone), so better
to be too large.  The flash_u-boot utility will work with any size image and
write the required number of blocks, provided that the partition is large
enough.

As the first writable block on the device, block 6 seems to make the most sense
as the flash offset for writing u-boot (and this is where PalmOS places its
SPL).  But you can place it elsewhere if you like.  If you do, you need to
adjust CONFIG_SYS_NAND_U_BOOT_OFFS accordingly, and you must ensure that blocks
preceeding the ones containing u-boot do *not* have the magic number in oob (the
IPL looks for this).  In other words, make sure that any blocks that previously
contained the u-boot image or PalmOS SPL are erased (and optionally written with
something else) so that the IPL does not load it.  Also make sure that the new
u-boot starting offset is at the start of a flash partition (check the kernel
log after loading the docg4 driver), and pass the corresponding mtd device file
to the flash_u-boot utility.

The u-boot built-in default environment is used because a writable environment
in flash did not seem worth the cost of a 256k flash block.  But adding this
should be straightforward.


Restoring PalmOS
================

If you backed up the contents of bootloader_part flash partition earlier, you
should be able to restore it with the shell script shown below.  The first two
blocks of data contain the PalmOS SPL and were written in reliable mode, whereas
the next two blocks were written in normal mode, so the script has to load and
unload the docg4 driver.  Make sure that the mtd-utils nandwrite and flash_erase
are in your path (and are not those from busybox).  Also double-check that the
backup image file bootloader_part.orig is exactly 1081344 bytes in length.  If
not, it was not backed up correctly.  Run the script as:

  ./restore_bootpart bootloader_part.orig /dev/mtd1

The script will take a minute or so to run.  When it finishes, you may want to
verify with nanddump that the data looks correct before you cycle power, because
if the backup or restore failed, your phone will be bricked.  Note that as a
consequence of reliable mode, the odd-numbered 2k regions in the first two
blocks will not exactly match the contents of the backup file, (so unfortunately
we can't simply dump the flash contents to a file and do a binary diff with the
original back-up image to verify that it was restored correctly).  Also,
nanddump will report uncorrectable ecc errors when it reads those regions.

#!/bin/sh

if [ $# -ne 2 ]; then
    echo "usage: $0: <image file> <mtd device node>"
    exit 1
fi

# reliable mode used for the first two blocks
modprobe -r docg4
modprobe docg4 ignore_badblocks=1 reliable_mode=1 || exit 1

# erase all four blocks
flash_erase $2 0 4

# Program the first two blocks in reliable mode.
# 2k (4 pages) is written at a time, skipping alternate 2k regions
# Note that "2k" is 2112 bytes, including 64 oob bytes
file_ofs=0
flash_ofs=0
page=0
while [ $page -ne 1024 ]; do
    dd if=$1 bs=2112 skip=$file_ofs count=1 | nandwrite -o -n -s $flash_ofs $2 - || exit 1
    file_ofs=$((file_ofs+2))
    flash_ofs=$((flash_ofs+0x1000))
    page=$((page+8))
done;

# normal mode used for the next two blocks
modprobe -r docg4
modprobe docg4 ignore_badblocks=1 || exit 1
dd if=$1 bs=1 skip=$file_ofs count=540672 | nandwrite -o -n -s 0x80000 $2 - || exit 1
modprobe -r docg4

TODO
====

  - Keypad support.
  - Interactive boot menu using keypad and lcd.
  - Add reliable mode support to the u-boot docg4 driver.
  - U-boot command that will write a new image to the bootloader partition in
    flash.
  - Linux FTD support.
