| The Korat board has two NOR flashes, FLASH0 and FLASH1, which are connected to | 
 | chip select 0 and 1, respectively.  FLASH0 contains 16 MiB, and is mapped to | 
 | addresses 0xFF000000 - 0xFFFFFFFF as U-Boot Flash Bank #2.  FLASH1 contains | 
 | from 16 to 128 MiB, and is mapped to 0xF?000000 - 0xF7FFFFFF as U-Boot Flash | 
 | Bank #1 (with the starting address depending on the flash size detected at | 
 | runtime).  The write-enable pin on FLASH0 is disabled, so the contents of FLASH0 | 
 | cannot be modified in the field.  This also prevents FLASH0 from executing | 
 | commands to return chip information, so its configuration is hard-coded in | 
 | U-Boot. | 
 |  | 
 | There are two versions of U-Boot for Korat: "permanent" and "upgradable".  The | 
 | permanent U-Boot is pre-programmed at the top of FLASH0, e.g., at addresses | 
 | 0xFFFA0000 - 0xFFFFFFFF for the current 384 KiB size.  The upgradable U-Boot is | 
 | located 256 KiB from the top of FLASH1, e.g. at addresses 0xF7F6000 - 0xF7FC0000 | 
 | for the current 384 KiB size.  FLASH1 addresses 0xF7FE0000 - 0xF7FF0000 are | 
 | used for the U-Boot environmental parameters, and addresses 0xF7FC0000 - | 
 | 0xF7FDFFFF are used for the redundant copy of the parameters.  These locations | 
 | are used by both versions of U-Boot. | 
 |  | 
 | On booting, the permanent U-Boot in FLASH0 begins executing.  After performing | 
 | minimal setup, it monitors the state of the board's Reset switch (GPIO47).  If | 
 | the switch is sensed as open before a timeout period, then U-Boot branches to | 
 | address 0xF7FBFFFC.  This causes the upgradable U-Boot to execute from the | 
 | beginning.  If the switch remains closed thoughout the timeout period, the | 
 | permanent U-Boot activates the on-board buzzer until the switch is sensed as | 
 | opened.  It then continues to execute without branching to FLASH1.  The effect | 
 | of this is that normally the Korat board boots its upgradable U-Boot, but, if | 
 | this has been corrupted, the user can boot the permanent U-Boot, which can then | 
 | be used to erase and reload FLASH1 as needed. | 
 |  | 
 | Note that it is not necessary for the permanent U-Boot to have all the latest | 
 | features, but only that it have sufficient functionality (working "tftp", | 
 | "erase", "cp.b", etc.) to repair FLASH1.  Also, the permanent U-Boot makes no | 
 | assumptions about the size of FLASH1 or the size of the upgradable U-Boot: it is | 
 | sufficient that the upgradable U-Boot can be started by a branch to 0xF7FBFFFC. | 
 |  | 
 | The build sequence: | 
 |  | 
 | 	make korat_config | 
 | 	make all perm=1 | 
 |  | 
 | builds the permanent U-Boot by selecting loader file "u-boot.lds" and defining | 
 | preprocessor symbol "CONFIG_KORAT_PERMANENT".  The default build: | 
 |  | 
 | 	make korat_config | 
 | 	make all | 
 |  | 
 | creates the upgradable U-Boot but selecting loader file "u-boot-F7FC.lds" and | 
 | leaving preprocessor symbol "CONFIG_KORAT_PERMANENT" undefined. | 
 |  | 
 | 2008-02-22, Larry Johnson <lrj@acm.org> | 
 |  | 
 |  | 
 | The CompactFlash(R) controller on the Korat board provides a hi-speed USB | 
 | interface.  This may be connected to either a dedicated port on the on-board | 
 | USB controller, or to a USB port on the PowerPC 440EPx processor.  The U-Boot | 
 | environment variable "korat_usbcf" can be used to specify which of these two | 
 | USB host ports is used for CompactFlash.  The valid setting for the variable are | 
 | the strings "pci" and "ppc".  If the variable defined and set to "ppc", then the | 
 | PowerPC USB port is used.  In all other cases the on-board USB controller is | 
 | used, but if "korat_usbcf" is defined but is set to a string other than the two | 
 | valid options, a warning is also issued. | 
 |  | 
 | 2009-01-28, Larry Johnson <lrj@acm.org> |