commit
a941b83241
@ -0,0 +1,324 @@ |
||||
/*
|
||||
* Copyright 2006 Freescale Semiconductor |
||||
* Jeff Brown |
||||
* Srikanth Srinivasan (srikanth.srinivasan@freescale.com) |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <watchdog.h> |
||||
#include <command.h> |
||||
#include <asm/cache.h> |
||||
#include <mpc86xx.h> |
||||
|
||||
#include "pixis.h" |
||||
|
||||
|
||||
/*
|
||||
* Per table 27, page 58 of MPC8641HPCN spec. |
||||
*/ |
||||
int set_px_sysclk(ulong sysclk) |
||||
{ |
||||
u8 sysclk_s, sysclk_r, sysclk_v, vclkh, vclkl, sysclk_aux; |
||||
|
||||
switch (sysclk) { |
||||
case 33: |
||||
sysclk_s = 0x04; |
||||
sysclk_r = 0x04; |
||||
sysclk_v = 0x07; |
||||
sysclk_aux = 0x00; |
||||
break; |
||||
case 40: |
||||
sysclk_s = 0x01; |
||||
sysclk_r = 0x1F; |
||||
sysclk_v = 0x20; |
||||
sysclk_aux = 0x01; |
||||
break; |
||||
case 50: |
||||
sysclk_s = 0x01; |
||||
sysclk_r = 0x1F; |
||||
sysclk_v = 0x2A; |
||||
sysclk_aux = 0x02; |
||||
break; |
||||
case 66: |
||||
sysclk_s = 0x01; |
||||
sysclk_r = 0x04; |
||||
sysclk_v = 0x04; |
||||
sysclk_aux = 0x03; |
||||
break; |
||||
case 83: |
||||
sysclk_s = 0x01; |
||||
sysclk_r = 0x1F; |
||||
sysclk_v = 0x4B; |
||||
sysclk_aux = 0x04; |
||||
break; |
||||
case 100: |
||||
sysclk_s = 0x01; |
||||
sysclk_r = 0x1F; |
||||
sysclk_v = 0x5C; |
||||
sysclk_aux = 0x05; |
||||
break; |
||||
case 134: |
||||
sysclk_s = 0x06; |
||||
sysclk_r = 0x1F; |
||||
sysclk_v = 0x3B; |
||||
sysclk_aux = 0x06; |
||||
break; |
||||
case 166: |
||||
sysclk_s = 0x06; |
||||
sysclk_r = 0x1F; |
||||
sysclk_v = 0x4B; |
||||
sysclk_aux = 0x07; |
||||
break; |
||||
default: |
||||
printf("Unsupported SYSCLK frequency.\n"); |
||||
return 0; |
||||
} |
||||
|
||||
vclkh = (sysclk_s << 5) | sysclk_r ; |
||||
vclkl = sysclk_v; |
||||
|
||||
out8(PIXIS_BASE + PIXIS_VCLKH, vclkh); |
||||
out8(PIXIS_BASE + PIXIS_VCLKL, vclkl); |
||||
|
||||
out8(PIXIS_BASE + PIXIS_AUX,sysclk_aux); |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
|
||||
int set_px_mpxpll(ulong mpxpll) |
||||
{ |
||||
u8 tmp; |
||||
u8 val; |
||||
|
||||
switch (mpxpll) { |
||||
case 2: |
||||
case 4: |
||||
case 6: |
||||
case 8: |
||||
case 10: |
||||
case 12: |
||||
case 14: |
||||
case 16: |
||||
val = (u8)mpxpll; |
||||
break; |
||||
default: |
||||
printf("Unsupported MPXPLL ratio.\n"); |
||||
return 0; |
||||
} |
||||
|
||||
tmp = in8(PIXIS_BASE + PIXIS_VSPEED1); |
||||
tmp = (tmp & 0xF0) | (val & 0x0F); |
||||
out8(PIXIS_BASE + PIXIS_VSPEED1, tmp); |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
|
||||
int set_px_corepll(ulong corepll) |
||||
{ |
||||
u8 tmp; |
||||
u8 val; |
||||
|
||||
switch ((int)corepll) { |
||||
case 20: |
||||
val = 0x08; |
||||
break; |
||||
case 25: |
||||
val = 0x0C; |
||||
break; |
||||
case 30: |
||||
val = 0x10; |
||||
break; |
||||
case 35: |
||||
val = 0x1C; |
||||
break; |
||||
case 40: |
||||
val = 0x14; |
||||
break; |
||||
case 45: |
||||
val = 0x0E; |
||||
break; |
||||
default: |
||||
printf("Unsupported COREPLL ratio.\n"); |
||||
return 0; |
||||
} |
||||
|
||||
tmp = in8(PIXIS_BASE + PIXIS_VSPEED0); |
||||
tmp = (tmp & 0xE0) | (val & 0x1F); |
||||
out8(PIXIS_BASE + PIXIS_VSPEED0, tmp); |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
|
||||
void read_from_px_regs(int set) |
||||
{ |
||||
u8 mask = 0x1C; |
||||
u8 tmp = in8(PIXIS_BASE + PIXIS_VCFGEN0); |
||||
|
||||
if (set) |
||||
tmp = tmp | mask; |
||||
else |
||||
tmp = tmp & ~mask; |
||||
out8(PIXIS_BASE + PIXIS_VCFGEN0, tmp); |
||||
} |
||||
|
||||
|
||||
void read_from_px_regs_altbank(int set) |
||||
{ |
||||
u8 mask = 0x04; |
||||
u8 tmp = in8(PIXIS_BASE + PIXIS_VCFGEN1); |
||||
|
||||
if (set) |
||||
tmp = tmp | mask; |
||||
else |
||||
tmp = tmp & ~mask; |
||||
out8(PIXIS_BASE + PIXIS_VCFGEN1, tmp); |
||||
} |
||||
|
||||
|
||||
void set_altbank(void) |
||||
{ |
||||
u8 tmp; |
||||
|
||||
tmp = in8(PIXIS_BASE + PIXIS_VBOOT); |
||||
tmp ^= 0x40; |
||||
|
||||
out8(PIXIS_BASE + PIXIS_VBOOT, tmp); |
||||
} |
||||
|
||||
|
||||
void set_px_go(void) |
||||
{ |
||||
u8 tmp; |
||||
|
||||
tmp = in8(PIXIS_BASE + PIXIS_VCTL); |
||||
tmp = tmp & 0x1E; |
||||
out8(PIXIS_BASE + PIXIS_VCTL, tmp); |
||||
|
||||
tmp = in8(PIXIS_BASE + PIXIS_VCTL); |
||||
tmp = tmp | 0x01; |
||||
out8(PIXIS_BASE + PIXIS_VCTL, tmp); |
||||
} |
||||
|
||||
|
||||
void set_px_go_with_watchdog(void) |
||||
{ |
||||
u8 tmp; |
||||
|
||||
tmp = in8(PIXIS_BASE + PIXIS_VCTL); |
||||
tmp = tmp & 0x1E; |
||||
out8(PIXIS_BASE + PIXIS_VCTL, tmp); |
||||
|
||||
tmp = in8(PIXIS_BASE + PIXIS_VCTL); |
||||
tmp = tmp | 0x09; |
||||
out8(PIXIS_BASE + PIXIS_VCTL, tmp); |
||||
} |
||||
|
||||
|
||||
int disable_watchdog(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) |
||||
{ |
||||
u8 tmp; |
||||
|
||||
tmp = in8(PIXIS_BASE + PIXIS_VCTL); |
||||
tmp = tmp & 0x1E; |
||||
out8(PIXIS_BASE + PIXIS_VCTL, tmp); |
||||
|
||||
/* setting VCTL[WDEN] to 0 to disable watch dog */ |
||||
tmp = in8(PIXIS_BASE + PIXIS_VCTL); |
||||
tmp &= ~ 0x08; |
||||
out8(PIXIS_BASE + PIXIS_VCTL, tmp); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
|
||||
U_BOOT_CMD( |
||||
diswd, 1, 0, disable_watchdog, |
||||
"diswd - Disable watchdog timer \n", |
||||
NULL |
||||
); |
||||
|
||||
|
||||
/*
|
||||
* This function takes the non-integral cpu:mpx pll ratio |
||||
* and converts it to an integer that can be used to assign |
||||
* FPGA register values. |
||||
* input: strptr i.e. argv[2] |
||||
*/ |
||||
|
||||
ulong strfractoint(uchar *strptr) |
||||
{ |
||||
int i, j, retval; |
||||
int mulconst; |
||||
int intarr_len = 0, decarr_len = 0, no_dec = 0; |
||||
ulong intval = 0, decval = 0; |
||||
uchar intarr[3], decarr[3]; |
||||
|
||||
/* Assign the integer part to intarr[]
|
||||
* If there is no decimal point i.e. |
||||
* if the ratio is an integral value |
||||
* simply create the intarr. |
||||
*/ |
||||
i = 0; |
||||
while (strptr[i] != 46) { |
||||
if (strptr[i] == 0) { |
||||
no_dec = 1; |
||||
break; |
||||
} |
||||
intarr[i] = strptr[i]; |
||||
i++; |
||||
} |
||||
|
||||
/* Assign length of integer part to intarr_len. */ |
||||
intarr_len = i; |
||||
intarr[i] = '\0'; |
||||
|
||||
if (no_dec) { |
||||
/* Currently needed only for single digit corepll ratios */ |
||||
mulconst=10; |
||||
decval = 0; |
||||
} else { |
||||
j = 0; |
||||
i++; /* Skipping the decimal point */ |
||||
while ((strptr[i] > 47) && (strptr[i] < 58)) { |
||||
decarr[j] = strptr[i]; |
||||
i++; |
||||
j++; |
||||
} |
||||
|
||||
decarr_len = j; |
||||
decarr[j] = '\0'; |
||||
|
||||
mulconst = 1; |
||||
for (i = 0; i < decarr_len; i++) |
||||
mulconst *= 10; |
||||
decval = simple_strtoul(decarr, NULL, 10); |
||||
} |
||||
|
||||
intval = simple_strtoul(intarr, NULL, 10); |
||||
intval = intval * mulconst; |
||||
|
||||
retval = intval + decval; |
||||
|
||||
return retval; |
||||
} |
@ -0,0 +1,33 @@ |
||||
/*
|
||||
* Copyright 2006 Freescale Semiconductor |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
extern int set_px_sysclk(ulong sysclk); |
||||
extern int set_px_mpxpll(ulong mpxpll); |
||||
extern int set_px_corepll(ulong corepll); |
||||
extern void read_from_px_regs(int set); |
||||
extern void read_from_px_regs_altbank(int set); |
||||
extern void set_altbank(void); |
||||
extern void set_px_go(void); |
||||
extern void set_px_go_with_watchdog(void); |
||||
extern int disable_watchdog(cmd_tbl_t *cmdtp, |
||||
int flag, int argc, char *argv[]); |
||||
extern ulong strfractoint(uchar *strptr); |
@ -0,0 +1,123 @@ |
||||
Freescale MPC8641HPCN board |
||||
=========================== |
||||
|
||||
Created 05/24/2006 Haiying Wang |
||||
------------------------------- |
||||
|
||||
1. Building U-Boot |
||||
------------------ |
||||
The 86xx HPCN code base is known to compile using: |
||||
Binutils 2.15, Gcc 3.4.3, Glibc 2.3.3 |
||||
|
||||
$ make MPC8641HPCN_config |
||||
Configuring for MPC8641HPCN board... |
||||
|
||||
$ make |
||||
|
||||
|
||||
2. Switch and Jumper Setting |
||||
---------------------------- |
||||
Jumpers: |
||||
J14 Pins 1-2 (near plcc32 socket) |
||||
|
||||
Switches: |
||||
SW1(1-5) = 01100 CFG_COREPLL = 01000 :: CORE = 2:1 |
||||
01100 :: CORE = 2.5:1 |
||||
10000 :: CORE = 3:1 |
||||
11100 :: CORE = 3.5:1 |
||||
10100 :: CORE = 4:1 |
||||
01110 :: CORE = 4.5:1 |
||||
SW1(6-8) = 001 CFG_SYSCLK = 000 :: SYSCLK = 33MHz |
||||
001 :: SYSCLK = 40MHz |
||||
|
||||
SW2(1-4) = 1100 CFG_CCBPLL = 0010 :: 2X |
||||
0100 :: 4X |
||||
0110 :: 6X |
||||
1000 :: 8X |
||||
1010 :: 10X |
||||
1100 :: 12X |
||||
1110 :: 14X |
||||
0000 :: 16X |
||||
SW2(5-8) = 1110 CFG_BOOTLOC = 1110 :: boot 16-bit localbus |
||||
|
||||
SW3(1-7) = 0011000 CFG_VID = 0011000 :: VCORE = 1.2V |
||||
0100000 :: VCORE = 1.11V |
||||
SW3(8) = 0 VCC_PLAT = 0 :: VCC_PLAT = 1.2V |
||||
1 :: VCC_PLAT = 1.0V |
||||
|
||||
SW4(1-2) = 11 CFG_HOSTMODE = 11 :: both prots host/root |
||||
SW4(3-4) = 11 CFG_BOOTSEQ = 11 :: no boot seq |
||||
SW4(5-8) = 0011 CFG_IOPORT = 0011 :: both PEX |
||||
|
||||
SW5(1) = 1 CFG_FLASHMAP = 1 :: boot from flash |
||||
0 :: boot from PromJet |
||||
SW5(2) = 1 CFG_FLASHBANK = 1 :: swap upper/lower |
||||
halves (virtual banks) |
||||
0 :: normal |
||||
SW5(3) = 0 CFG_FLASHWP = 0 :: not protected |
||||
SW5(4) = 0 CFG_PORTDIV = 1 :: 2:1 for PD4 |
||||
1:1 for PD6 |
||||
SW5(5-6) = 11 CFG_PIXISOPT = 11 :: s/w determined |
||||
SW5(7-8) = 11 CFG_LADOPT = 11 :: s/w determined |
||||
|
||||
SW6(1) = 1 CFG_CPUBOOT = 1 :: no boot holdoff |
||||
SW6(2) = 1 CFG_BOOTADDR = 1 :: no traslation |
||||
SW6(3-5) = 000 CFG_REFCLKSEL = 000 :: 100MHZ |
||||
SW6(6) = 1 CFG_SERROM_ADDR= 1 :: |
||||
SW6(7) = 1 CFG_MEMDEBUG = 1 :: |
||||
SW6(8) = 1 CFG_DDRDEBUG = 1 :: |
||||
|
||||
SW8(1) = 1 ACZ_SYNC = 1 :: 48MHz on TP49 |
||||
SW8(2) = 1 ACB_SYNC = 1 :: THRMTRIP disabled |
||||
SW8(3) = 1 ACZ_SDOUT = 1 :: p4 mode |
||||
SW8(4) = 1 ACB_SDOUT = 1 :: PATA freq. = 133MHz |
||||
SW8(5) = 0 SUSLED = 0 :: SouthBridge Mode |
||||
SW8(6) = 0 SPREAD = 0 :: REFCLK SSCG Disabled |
||||
SW8(7) = 1 ACPWR = 1 :: non-battery |
||||
SW8(8) = 0 CFG_IDWP = 0 :: write enable |
||||
|
||||
|
||||
3. Flash U-Boot |
||||
--------------- |
||||
The flash range 0xFF800000 to 0xFFFFFFFF can be divided into 2 halves. |
||||
It is possible to use either half to boot using u-boot. Switch 5 bit 2 |
||||
is used for this purpose. |
||||
|
||||
0xFF800000 to 0xFFBFFFFF - 4MB |
||||
0xFFC00000 to 0xFFFFFFFF - 4MB |
||||
When this bit is 0, U-Boot is at 0xFFF00000. |
||||
When this bit is 1, U-Boot is at 0xFFB00000. |
||||
|
||||
Use the above mentioned flash commands to program the other half, and |
||||
use switch 5, bit 2 to alternate between the halves. Note: The booting |
||||
version of U-Boot will always be at 0xFFF00000. |
||||
|
||||
To Flash U-Boot into the booting bank (0xFFC00000 - 0xFFFFFFFF): |
||||
|
||||
tftp 1000000 u-boot.bin |
||||
protect off all |
||||
erase fff00000 ffffffff |
||||
cp.b 1000000 fff00100 80000 |
||||
|
||||
To Flash U-boot into the alternative bank (0xFF800000 - 0xFFBFFFFF): |
||||
|
||||
tftp 1000000 u-boot.bin |
||||
erase ffb00000 ffbfffff |
||||
cp.b 1000000 ffb00100 80000 |
||||
|
||||
|
||||
4. Memory Map |
||||
------------- |
||||
|
||||
Memory Range Device Size |
||||
------------ ------ ---- |
||||
0x0000_0000 0x7fff_ffff DDR 2G |
||||
0x8000_0000 0x9fff_ffff PCI1/PEX1 MEM 512M |
||||
0xa000_0000 0xafff_ffff PCI2/PEX2 MEM 512M |
||||
0xf800_0000 0xf80f_ffff CCSR 1M |
||||
0xf810_0000 0xf81f_ffff PIXIS 1M |
||||
0xf840_0000 0xf840_3fff Stack space 32K |
||||
0xe200_0000 0xe2ff_ffff PCI1/PEX1 IO 512M |
||||
0xe300_0000 0xe3ff_ffff PCI2/PEX2 IO 512M |
||||
0xfe00_0000 0xfeff_ffff Flash(alternate)16M |
||||
0xff00_0000 0xffff_ffff Flash(boot bank)16M |
Loading…
Reference in new issue