# Porting U-Boot onto RPXlite board
# Written by Yoo. Jonghoon
# E-Mail : yooth@ipone.co.kr
# IP ONE Inc.

# Since 2001. 1. 29

# Shell : bash
# Cross-compile tools : Montavista Hardhat
# Debugging tools : Windriver VisionProbe (PowerPC BDM)
# ppcboot ver. : ppcboot-0.8.1

###############################################################
#	1. Hardware setting
###############################################################

1.1. Board, BDM settings
	Install board, BDM, connect each other

1.2. Save Register value
	Boot with board-on monitor program and save the
	register values with BDM.

1.3. Configure flash programmer
	Check flash memory area in the memory map.
	0xFFC00000 - 0xFFFFFFFF

	Boot monitor program is at
	0xFFF00000

	You can program on-board flash memory with VisionClick
	flash programmer. Set the target flash device as:

	29DL800B

	(?) The flash memory device in the board *is* 29LV800B,
		but I cannot program it with '29LV800B' option.
		(in VisionClick flash programming tools)
		I don't know why...

1.4. Save boot monitor program *IMPORTANT*
	Upload boot monitor program from board to file.
	boot monitor program starts at 0xFFF00000

1.5. Test flash memory programming
	Try to erase boot program in the flash memory,
	and re-write them.
	*WARNING* YOU MUST SAVE BOOT PROGRAM TO FILE
		BEFORE ERASING FLASH

###############################################################
#	2. U-Boot setting
###############################################################

2.1. Download U-Boot tarball at
	ftp://ftp.denx.de
	(The latest version is ppcboot-0.8.1.tar.bz2)

	To extract the archive use the following syntax :
	> bzip2 -cd ppcboot-0.8.1.tar.bz2 | tar xf -

2.2. Add the following lines in '.profile'
	export PATH=$PATH:/opt/hardhat/devkit/ppc/8xx/bin

2.3. Make board specific config, for example:
	> cd ppcboot-0.8.1
	> make TQM860L_config

	Now we can build ppcboot bin files.
	After make all, you must see these files in your
	ppcboot root directory.

	ppcboot
	ppcboot.bin
	ppcboot.srec
	ppcboot.map

2.4. Make your own board directory into the
	ppcboot-0.8.1/board
	and make your board-specific files here.

	For exmanple, tqm8xx files are composed of
	.depend : Nothing
	Makefile : To make config file
	config.mk : Sets base address
	flash.c : Flash memory control files
	ppcboot.lds : linker(ld) script? (I don't know this yet)
	tqm8xx.c : DRAM control and board check routines

	And, add your board config lines in the
	ppcboot-0.8.1/Makefile

	Finally, add config_(your board).h file in the
	ppcboot-0.8.1/include/

	I've made board/rpxlite directory, and just copied
	tqm8xx settings for now.

	Rebuild ppcboot for rpxlite board:
	> make rpxlite_config
	> make

###############################################################
#	3. U-Boot porting
###############################################################

3.1. My RPXlite files are based on tqm8xx board files.
	> cd board
	> cp -r tqm8xx RPXLITE
	> cd RPXLITE
	> mv tqm8xx.c RPXLITE.c
	> cd ../../include
	> cp config_tqm8xx.h config_RPXLITE.h

3.2. Modified files are:
	board/RPXLITE/RPXLITE.c		/* DRAM-related routines */
	board/RPXLITE/flash.c		/* flash-related routines */
	board/RPXLITE/config.mk		/* set text base address */
	arch/powerpc/cpu/mpc8xx/serial.c /* board specific register setting */
	include/config_RPXLITE.h	/* board specific registers */

	See 'reg_config.txt' for register values in detail.

###############################################################
#	4. Running Linux
###############################################################


###############################################################
#	Misc Information
###############################################################

mem_config.txt:
===============

Flash memory device : AM29LV800BB (1Mx8Bit) x 4 device
manufacturer id : 01     (AMD)
device id       : 5B     (AM29LV800B)
size            : 4Mbyte
sector #        : 19

Sector information :

number   start addr.     size
00       FFC0_0000       64
01       FFC1_0000       32
02       FFC1_8000       32
03       FFC2_0000       128
04       FFC4_0000       256
05       FFC8_0000       256
06       FFCC_0000       256
07       FFD0_0000       256
08       FFD4_0000       256
09       FFD8_0000       256
10       FFDC_0000       256
11       FFE0_0000       256
12       FFE4_0000       256
13       FFE8_0000       256
14       FFEC_0000       256
15       FFF0_0000       256
16       FFF4_0000       256
17       FFF8_0000       256
18       FFFC_0000       256


reg_config.txt:
===============


/*------------------------------------------------------------------- */
/*------------------------------------------------------------------- */
/*	SIU (System Interface Unit) */
/* */
/*------------------------------------------------------------------- */
/*------------------------------------------------------------------- */


/*### IMMR */
/*### Internal Memory Map Register */
/*### Chap. 11.4.1 */

	ISB		= 0xFA20		/* Set the Immap base = 0xFA20 0000 */
	PARTNUM = 0x21
	MASKNUM = 0x00

	=> 0xFA20 2100

---------------------------------------------------------------------

/*### SIUMCR */
/*### SIU Module Configuration Register */
/*### Chap. 11.4.2 */
/*### Offset : 0x0000 0000 */

	EARB	= 0
	EARP	= 0
	DSHW	= 0
	DBGC	= 0
	DBPC	= 0
	FRC		= 0
	DLK		= 0
	OPAR	= 0
	PNCS	= 0
	DPC		= 0
	MPRE	= 0
	MLRC	= 10		/* ~KR/~RETRY/~IRQ4/SPKROUT functions as ~KR/~TRTRY */
	AEME	= 0
	SEME	= 0
	BSC		= 0
	GB5E	= 0
	B2DD	= 0
	B3DD	= 0

	=> 0x0000 0800

---------------------------------------------------------------------

/*### SYPCR */
/*### System Protection Control Register */
/*### Chap. 11.4.3 */
/*### Offset : 0x0000 0004 */

	SWTC	= 0xFFFF	/* SW watchdog timer count = 0xFFFF */
	BMT		= 0x06		/* BUS monitoring timing */
	BME		= 1			/* BUS monitor enable */
	SWF		= 1
	SWE		= 0			/* SW watchdog disable */
	SWRI	= 0
	SWP		= 1

	=> 0xFFFF 0689

---------------------------------------------------------------------

/*### TESR */
/*### Transfer Error Status Register */
/*### Chap. 11.4.4 */
/*### Offset : 0x0000 0020 */

	IEXT	= 0
	ITMT	= 0
	IPB		= 0000
	DEXT	= 0
	DTMT	= 0
	DPB		= 0000

	=> 0x0000 0000

---------------------------------------------------------------------

/*### SIPEND */
/*### SIU Interrupt Pending Register */
/*### Chap. 11.5.4.1 */
/*### Offset : 0x0000 0010 */

	IRQ0~IRQ7 = 0
	LVL0~LVL7 = 0

	=> 0x0000 0000

---------------------------------------------------------------------

/*### SIMASK */
/*### SIU Interrupt Mask Register */
/*### Chap. 11.5.4.2 */
/*### Offset : 0x0000 0014 */

	IRM0~IRM7 = 0		/* Mask all interrupts */
	LVL0~LVL7 = 0

	=> 0x0000 0000

---------------------------------------------------------------------

/*### SIEL */
/*### SIU Interrupt Edge/Level Register */
/*### Chap. 11.5.4.3 */
/*### Offset : 0x0000 0018 */

	ED0~ED7 = 0			/* Low level triggered */
	WMn0~WMn7 = 0		/* Not allowed to exit from low-power mode */

	=> 0x0000 0000

---------------------------------------------------------------------

/*### SIVEC */
/*### SIU Interrupt Vector Register */
/*### Chap. 11.5.4.4 */
/*### Offset : 0x0000 001C */

	INTC = 3C		/* The lowest interrupt is pending..(?) */

	=> 0x3C00 0000

---------------------------------------------------------------------

/*### SWSR */
/*### Software Service Register */
/*### Chap. 11.7.1 */
/*### Offset : 0x0000 001E */

	SEQ = 0

	=> 0x0000

---------------------------------------------------------------------

/*### SDCR */
/*### SDMA Configuration Register */
/*### Chap. 20.2.1 */
/*### Offset : 0x0000 0032 */

	FRZ = 0
	RAID = 01	/* Priority level 5 (BR5) (normal operation) */

	=> 0x0000 0001


/*------------------------------------------------------------------- */
/*------------------------------------------------------------------- */
/*	UPMA (User Programmable Machine A) */
/* */
/*------------------------------------------------------------------- */
/*------------------------------------------------------------------- */

/*### Chap. 16.6.4.1 */
/*### Offset = 0x0000 017c */

	T0  = CFFF CC24		/* Single Read */
	T1  = 0FFF CC04
	T2  = 0CAF CC04
	T3  = 03AF CC08
	T4  = 3FBF CC27		/* last */
	T5  = FFFF CC25
	T6  = FFFF CC25
	T7  = FFFF CC25
	T8  = CFFF CC24		/* Burst Read */
	T9  = 0FFF CC04
	T10 = 0CAF CC84
	T11 = 03AF CC88
	T12 = 3FBF CC27		/* last */
	T13 = FFFF CC25
	T14 = FFFF CC25
	T15 = FFFF CC25
	T16 = FFFF CC25
	T17 = FFFF CC25
	T18 = FFFF CC25
	T19 = FFFF CC25
	T20 = FFFF CC25
	T21 = FFFF CC25
	T22 = FFFF CC25
	T23 = FFFF CC25
	T24 = CFFF CC24		/* Single Write */
	T25 = 0FFF CC04
	T26 = 0CFF CC04
	T27 = 03FF CC00
	T28 = 3FFF CC27		/* last */
	T29 = FFFF CC25
	T30 = FFFF CC25
	T31 = FFFF CC25
	T32 = CFFF CC24		/* Burst Write */
	T33 = 0FFF CC04
	T34 = 0CFF CC80
	T35 = 03FF CC8C
	T36 = 0CFF CC00
	T37 = 33FF CC27		/* last */
	T38 = FFFF CC25
	T39 = FFFF CC25
	T40 = FFFF CC25
	T41 = FFFF CC25
	T42 = FFFF CC25
	T43 = FFFF CC25
	T44 = FFFF CC25
	T45 = FFFF CC25
	T46 = FFFF CC25
	T47 = FFFF CC25
	T48 = C0FF CC24		/* Refresh */
	T49 = 03FF CC24
	T50 = 0FFF CC24
	T51 = 0FFF CC24
	T52 = 3FFF CC27		/* last */
	T53 = FFFF CC25
	T54 = FFFF CC25
	T55 = FFFF CC25
	T56 = FFFF CC25
	T57 = FFFF CC25
	T58 = FFFF CC25
	T59 = FFFF CC25
	T60 = FFFF CC25		/* Exception */
	T61 = FFFF CC25
	T62 = FFFF CC25
	T63 = FFFF CC25


/*------------------------------------------------------------------- */
/*------------------------------------------------------------------- */
/*	UPMB */
/* */
/*------------------------------------------------------------------- */
/*------------------------------------------------------------------- */
---------------------------------------------------------------------

/*### Chap. 16.6.4.1 */


/*------------------------------------------------------------------- */
/*------------------------------------------------------------------- */
/*	MEMC */
/* */
/*------------------------------------------------------------------- */
/*------------------------------------------------------------------- */
---------------------------------------------------------------------

/*### BR0 & OR0 */
/*### Base Registers & Option Registers */
/*### Chap. 16.4.1 & 16.4.2 */
/*### Offset : BR0(0x0000 0100) & OR0(0x0000 0104) */
/*### Flash memory */

	BA   = 1111 1110 0000 0000 0	/* Base addr = 0xFE00 0000 */
	AT   = 000
	PS   = 00
	PARE = 0
	WP   = 0
	MS   = 0				/* GPCM */
	V    = 1				/* Valid */

	=> 0xFE00 0001

	AM            = 1111 1110 0000 0000 0	/* 32MBytes */
	ATM           = 000
	CSNT/SAM      = 0
	ACS/G5LA,G5LS = 00
	BIH           = 1			/* Burst inhibited */
	SCY           = 0100		/* cycle length = 4 */
	SETA          = 0
	TRLX          = 0
	EHTR          = 0

	=> 0xFE00 0140

/*### BR1 & OR1 */
/*### Base Registers & Option Registers */
/*### Chap. 16.4.1 & 16.4.2 */
/*### Offset : BR1(0x0000 0108) & OR1(0x0000 010C) */
/*### SDRAM */

	BA   = 0000 0000 0000 0000 0	/* Base addr = 0x0000 0000 */
	AT   = 000
	PS   = 00
	PARE = 0
	WP   = 0
	MS   = 1				/* UPMA */
	V    = 1				/* Valid */

	=> 0x0000 0081

	AM            = 1111 1110 0000 0000	/* 32MBytes */
	ATM           = 000
	CSNT/SAM      = 1
	ACS/G5LA,G5LS = 11
	BIH           = 0
	SCY           = 0000		/* cycle length = 0 */
	SETA          = 0
	TRLX          = 0
	EHTR          = 0

	=> 0xFE00 0E00

/*### BR2 & OR2 */
/*### Base Registers & Option Registers */
/*### Chap. 16.4.1 & 16.4.2 */
/*### Offset : BR2(0x0000 0110) & OR2(0x0000 0114) */

	BR2 & OR2 = 0x0000 0000		/* Not used */

/*### BR3 & OR3 */
/*### Base Registers & Option Registers */
/*### Chap. 16.4.1 & 16.4.2 */
/*### Offset : BR3(0x0000 0118) & OR3(0x0000 011C) */
/*### BCSR */

	BA   = 1111 1010 0100 0000 0	/* Base addr = 0xFA40 0000 */
	AT   = 000
	PS   = 00
	PARE = 0
	WP   = 0
	MS   = 0				/* GPCM */
	V    = 1				/* Valid */

	=> 0xFA40 0001

	AM            = 1111 1111 0111 1111 1	/* (?) */
	ATM           = 000
	CSNT/SAM      = 1
	ACS/G5LA,G5LS = 00
	BIH           = 1			/* Burst inhibited */
	SCY           = 0001		/* cycle length = 1 */
	SETA          = 0
	TRLX          = 0

	=> 0xFF7F 8910

/*### BR4 & OR4 */
/*### Base Registers & Option Registers */
/*### Chap. 16.4.1 & 16.4.2 */
/*### Offset : BR4(0x0000 0120) & OR4(0x0000 0124) */
/*### NVRAM & SRAM */

	BA   = 1111 1010 0000 0000 0	/* Base addr = 0xFA00 0000 */
	AT   = 000
	PS   = 01
	PARE = 0
	WP   = 0
	MS   = 0				/* GPCM */
	V    = 1				/* Valid */

	=> 0xFA00 0401

	AM            = 1111 1111 1111 1000 0	/* 8MByte */
	ATM           = 000
	CSNT/SAM      = 1
	ACS/G5LA,G5LS = 00
	BIH           = 1			/* Burst inhibited */
	SCY           = 0111		/* cycle length = 7 */
	SETA          = 0
	TRLX          = 0

	=> 0xFFF8 0970

/*### BR5 & OR5 */
/*### Base Registers & Option Registers */
/*### Chap. 16.4.1 & 16.4.2 */
/*### Offset : BR2(0x0000 0128) & OR2(0x0000 012C) */

	BR5 & OR5 = 0x0000 0000		/* Not used */

/*### BR6 & OR6 */
/*### Base Registers & Option Registers */
/*### Chap. 16.4.1 & 16.4.2 */
/*### Offset : BR2(0x0000 0130) & OR2(0x0000 0134) */

	BR6 & OR6 = 0x0000 0000		/* Not used */

/*### BR7 & OR7 */
/*### Base Registers & Option Registers */
/*### Chap. 16.4.1 & 16.4.2 */
/*### Offset : BR7(0x0000 0138) & OR7(0x0000 013C) */

	BR7 & OR7 = 0x0000 0000		/* Not used */

/*### MAR */
/*### Memory Address Register */
/*### Chap. 16.4.7 */
/*### Offset : 0x0000 0164 */

	MA = External memory address

/*### MCR */
/*### Memory Command Register */
/*### Chap. 16.4.5 */
/*### Offset : 0x0000 0168 */

	OP   = xx			/* Command op code */
	UM   = 1			/* Select UPMA */
	MB   = 001			/* Select CS1 */
	MCLF = xxxx			/* Loop times */
	MAD  = xx xxxx		/* Memory array index */

/*### MAMR */
/*### Machine A Mode Register */
/*### Chap. 16.4.4 */
/*### Offset : 0x0000 0170 */

	PTA = 0101 1000
	PTAE = 1			/* Periodic timer A enabled */
	AMA = 010
	DSA = 00
	G0CLA = 000
	GPLA4DIS = 1
	RLFA = 0100
	WLFA = 0011
	TLFA = 0000

	=> 0x58A0 1430

/*### MBMR */
/*### Machine B Mode Register */
/*### Chap. 16.4.4 */
/*### Offset : 0x0000 0174 */

	PTA = 0100 1110
	PTAE = 0			/* Periodic timer B disabled */
	AMA = 000
	DSA = 00
	G0CLA = 000
	GPLA4DIS = 1
	RLFA = 0000
	WLFA = 0000
	TLFA = 0000

	=> 0x4E00 1000

/*### MSTAT */
/*### Memory Status Register */
/*### Chap. 16.4.3 */
/*### Offset : 0x0000 0178 */

	PER0~PER7 = Parity error
	WPER      = Write protection error

	=> 0x0000

/*### MPTPR */
/*### Memory Periodic Timer Prescaler Register */
/*### Chap. 16.4.8 */
/*### Offset : 0x0000 017A */

	PTP = 0000 1000		/* Divide by 8 */

	=> 0x0800

/*### MDR */
/*### Memory Data Register */
/*### Chap. 16.4.6 */
/*### Offset : 0x0000 017C */

	MD = Memory data contains the RAM array word


/*------------------------------------------------------------------- */
/*------------------------------------------------------------------- */
/*	TIMERS */
/* */
/*------------------------------------------------------------------- */
/*------------------------------------------------------------------- */
---------------------------------------------------------------------

/*### TBREFx */
/*### Timebase Reference Registers */
/*### Chap. 11.9.2 */
/*### Offset : TBREFF0(0x0000 0204)/TBREFF1(0x0000 0208) */
/*### (Locked) */

	TBREFF0 = 0xFFFF FFFF
	TBREFF1 = 0xFFFF FFFF

---------------------------------------------------------------------

/*### TBSCR */
/*### Timebase Status and Control Registers */
/*### Chap. 11.9.3 */
/*### Offset : 0x0000 0200 */
/*### (Locked) */

	TBIRQ = 00000000
	REF0  = 0
	REF1  = 0
	REFE0 = 0			/* Reference interrupt disable */
	REFE1 = 0
	TBF   = 1
	TBE   = 1			/* Timebase enable */

	=> 0x0003

---------------------------------------------------------------------

/*### RTCSC */
/*### Real-Time Clock Status and Control Registers */
/*### Chap. 11.10.1 */
/*### Offset : 0x0000 0220 */
/*### (Locked) */

	RTCIRQ = 00000000
	SEC = 1
	ALR = 0
	38K = 0				/* PITRTCLK is driven by 32.768KHz */
	SIE = 0
	ALE = 0
	RTF = 0
	RTE = 1				/* Real-Time clock enabled */

	=> 0x0081

---------------------------------------------------------------------

/*### RTC */
/*### Real-Time Clock Registers */
/*### Chap. 11.10.2 */
/*### Offset : 0x0000 0224 */
/*### (Locked) */

	RTC = Real time clock measured in second

---------------------------------------------------------------------

/*### RTCAL */
/*### Real-Time Clock Alarm Registers */
/*### Chap. 11.10.3 */
/*### Offset : 0x0000 022C */
/*### (Locked) */

	ALARM = 0xFFFF FFFF

---------------------------------------------------------------------

/*### RTSEC */
/*### Real-Time Clock Alarm Second Registers */
/*### Chap. 11.10.4 */
/*### Offset : 0x0000 0228 */
/*### (Locked) */

	COUNTER = Counter bits(fraction of a second)

---------------------------------------------------------------------

/*### PISCR */
/*### Periodic Interrupt Status and Control Register */
/*### Chap. 11.11.1 */
/*### Offset : 0x0000 0240 */
/*### (Locked) */

	PIRQ = 0
	PS   = 0		/* Write 1 to clear */
	PIE  = 0
	PITF = 1
	PTE  = 0		/* PIT disabled */

---------------------------------------------------------------------

/*### PITC */
/*### PIT Count Register */
/*### Chap. 11.11.2 */
/*### Offset : 0x0000 0244 */
/*### (Locked) */

	PITC = PIT count

---------------------------------------------------------------------

/*### PITR */
/*### PIT Register */
/*### Chap. 11.11.3 */
/*### Offset : 0x0000 0248 */
/*### (Locked) */

	PIT = PIT count		/* Read only */


/*------------------------------------------------------------------- */
/*------------------------------------------------------------------- */
/*	CLOCKS */
/* */
/*------------------------------------------------------------------- */
/*------------------------------------------------------------------- */
---------------------------------------------------------------------


---------------------------------------------------------------------

/*### SCCR */
/*### System Clock and Reset Control Register */
/*### Chap. 15.6.1 */
/*### Offset : 0x0000 0280 */
/*### (Locked) */

	COM    = 11		/* Clock output disabled */
	TBS    = 1		/* Timebase frequency source is GCLK2 divided by 16 */
	RTDIV  = 0		/* The clock is divided by 4 */
	RTSEL  = 0		/* OSCM(Crystal oscillator) is selected */
	CRQEN  = 0
	PRQEN  = 0
	EBDF   = 00		/* CLKOUT is GCLK2 divided by 1 */
	DFSYNC = 00		/* Divided by 1 (normal operation) */
	DFBRG  = 00		/* Divided by 1 (normal operation) */
	DFNL   = 000
	DFNH   = 000

	=> 0x6200 0000

---------------------------------------------------------------------

/*### PLPRCR */
/*### PLL, Low-Power, and Reset Control Register */
/*### Chap. 15.6.2 */
/*### Offset : 0x0000 0284 */
/*### (Locked) */

	MF    = 0x005	/* 48MHz (?) (  = 8MHz * (MF+1) ) */
	SPLSS = 0
	TEXPS = 0
	TMIST = 0
	CSRC  = 0		/* The general system clock is generated by the DFNH field */
	LPM   = 00		/* Normal high/normal low mode */
	CSR   = 0
	LOLRE = 0
	FIOPD = 0

	=> 0x0050 0000

---------------------------------------------------------------------

/*### RSR */
/*### Reset Status Register */
/*### Chap. 12.2 */
/*### Offset : 0x0000 0288 */
/*### (Locked) */

	EHRS  = External hard reset
	ESRS  = External soft reset
	LLRS  = Loss-of-lock reset
	SWRS  = Software watchdog reset
	CSRS  = Check stop reset
	DBHRS = Debug port hard reset
	DBSRS = Debug port soft reset
	JTRS  = JTAG reset


/*------------------------------------------------------------------- */
/*------------------------------------------------------------------- */
/*	DMA */
/* */
/*------------------------------------------------------------------- */
/*------------------------------------------------------------------- */
---------------------------------------------------------------------

/*### SDSR */
/*### SDMA Status Register */
/*### Chap. 20.2.2 */
/*### Offset : 0x0000 0908 */

	SBER = 0	/* SDMA channel bus error */
	DSP2 = 0	/* DSP chain2 (Tx) interrupt */
	DSP1 = 0	/* DSP chain1 (Rx) interrupt */

	=> 0x00

/*### SDMR */
/*### SDMA Mask Register */
/*### Chap. 20.2.3 */
/*### Offset : 0x0000 090C */

	SBER = 0
	DSP2 = 0
	DSP1 = 0	/* All interrupts are masked */

	=> 0x00

/*### SDAR */
/*### SDMA Address Register */
/*### Chap. 20.2.4 */
/*### Offset : 0x0000 0904 */

	AR = 0xxxxx xxxx	/* current system address */

	=> 0xFA20 23AC

/*### IDSRx */
/*### IDMA Status Register */
/*### Chap. 20.3.3.2 */
/*### Offset : IDSR1(0x0000 0910) & IDSR2(0x0000 0918) */

	AD   = 0
	DONE = 0
	OB   = 0

	=> 0x00

/*### IDMRx */
/*### IDMA Mask Register */
/*### Chap. 20.3.3.3 */
/*### Offset : IDMR1(0x0000 0914) & IDMR2(0x0000 091C) */

	AD   = 0
	DONE = 0
	OB   = 0