| 
							
							
							
						 |  |  | @ -1,563 +0,0 @@ | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 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. |