
Summary
=======

This README is about U-Boot support for TI's ARM Cortex-A8 based OMAP3 [1]
family of SoCs. TI's OMAP3 SoC family contains an ARM Cortex-A8. Additionally,
some family members contain a TMS320C64x+ DSP and/or an Imagination SGX 2D/3D
graphics processor and various other standard peripherals.

Currently the following boards are supported:

* OMAP3530 BeagleBoard [2]

* Gumstix Overo [3]

* TI EVM [4]

* OpenPandora Ltd. Pandora [5]

* TI/Logic PD Zoom MDK [6]

* TI/Logic PD Zoom 2 [7]

* CompuLab Ltd. CM-T35 [8]

Toolchain
=========

While ARM Cortex-A8 support ARM v7 instruction set (-march=armv7a) we compile
with -march=armv5 to allow more compilers to work. For U-Boot code this has
no performance impact.

Build
=====

* BeagleBoard:

make omap3_beagle_config
make

* Gumstix Overo:

make omap3_overo_config
make

* TI EVM:

make omap3_evm_config
make

* Pandora:

make omap3_pandora_config
make

* Zoom MDK:

make omap3_zoom1_config
make

* Zoom 2:

make omap3_zoom2_config
make

* CM-T35:

make cm_t35_config
make


Custom commands
===============

To make U-Boot for OMAP3 support NAND device SW or HW ECC calculation, U-Boot
for OMAP3 supports custom user command

nandecc hw/sw

To be compatible with NAND drivers using SW ECC (e.g. kernel code)

nandecc sw

enables SW ECC calculation. HW ECC enabled with

nandecc hw

is typically used to write 2nd stage bootloader (known as 'x-loader') which is
executed by OMAP3's boot rom and therefore has to be written with HW ECC.

For all other commands see

help

Interfaces
==========

gpio
----

To set a bit :

	if (!gpio_request(N, "")) {
		gpio_direction_output(N, 0);
		gpio_set_value(N, 1);
	}

To clear a bit :

	if (!gpio_request(N, "")) {
		gpio_direction_output(N, 0);
		gpio_set_value(N, 0);
	}

To read a bit :

	if (!gpio_request(N, "")) {
		gpio_direction_input(N);
		val = gpio_get_value(N);
		gpio_free(N);
	}
	if (val)
		printf("GPIO N is set\n");
	else
		printf("GPIO N is clear\n");

dma
---
void omap3_dma_init(void)
	Init the DMA module
int omap3_dma_get_conf_chan(uint32_t chan, struct dma4_chan *config);
	Read config of the channel
int omap3_dma_conf_chan(uint32_t chan, struct dma4_chan *config);
	Write config to the channel
int omap3_dma_conf_transfer(uint32_t chan, uint32_t *src, uint32_t *dst,
		uint32_t sze)
	Config source, destination and size of a transfer
int omap3_dma_wait_for_transfer(uint32_t chan)
	Wait for a transfer to end - this hast to be called before a channel
	or the data the channel transferd are used.
int omap3_dma_get_revision(uint32_t *minor, uint32_t *major)
	Read silicon Revision of the DMA module

NAND
====

There are some OMAP3 devices out there with NAND attached. Due to the fact that
OMAP3 ROM code can only handle 1-bit hamming ECC for accessing first page
(place where SPL lives) we require this setup for u-boot at least when reading
the second progam within SPL.  A lot of newer NAND chips however require more
than 1-bit ECC for the pages, some can live with 1-bit for the first page. To
handle this we can switch to another ECC algorithm after reading the payload
within SPL.

BCH8
----

To enable hardware assisted BCH8 (8-bit BCH [Bose, Chaudhuri, Hocquenghem]) on
OMAP3 devices we can use the BCH library in lib/bch.c. To do so add CONFIG_BCH
and set CONFIG_NAND_OMAP_ECCSCHEME=5 (refer README.nand) for selecting BCH8_SW.
The NAND OOB layout is the same as in linux kernel, if the linux kernel BCH8
implementation for OMAP3 works for you so the u-boot version should also.
When you require the SPL to read with BCH8 there are two more configs to
change:

 * CONFIG_SYS_NAND_ECCPOS (must be the same as .eccpos in
   GPMC_NAND_HW_BCH8_ECC_LAYOUT defined in
   arch/arm/include/asm/arch-omap3/omap_gpmc.h)
 * CONFIG_SYS_NAND_ECCSIZE must be 512
 * CONFIG_SYS_NAND_ECCBYTES must be 13 for this BCH8 setup

Acknowledgements
================

OMAP3 U-Boot is based on U-Boot tar ball [9] for BeagleBoard and EVM done by
several TI employees.

Links
=====

[1] OMAP3:

http://www.ti.com/omap3 (high volume) and
http://www.ti.com/omap35x (broad market)

[2] OMAP3530 BeagleBoard:

http://beagleboard.org/

[3] Gumstix Overo:

http://www.gumstix.net/Overo/

[4] TI EVM:

http://focus.ti.com/docs/toolsw/folders/print/tmdxevm3503.html

[5] OpenPandora Ltd. Pandora:

http://openpandora.org/

[6] TI/Logic PD Zoom MDK:

http://www.logicpd.com/products/devkit/ti/zoom_mobile_development_kit

[7] TI/Logic PD Zoom 2

http://www.logicpd.com/sites/default/files/1012659A_Zoom_OMAP34x-II_MDP_Brief.pdf

[8] CompuLab Ltd. CM-T35:

http://www.compulab.co.il/t3530/html/t3530-cm-datasheet.htm

[9] TI OMAP3 U-Boot:

http://beagleboard.googlecode.com/files/u-boot_beagle_revb.tar.gz
