# 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