|
@@ -1,1476 +0,0 @@
|
|
-/*
|
|
|
|
- * (C) Copyright 2001 ELTEC Elektronik AG
|
|
|
|
- * Frank Gottschling <fgottschling@eltec.de>
|
|
|
|
- *
|
|
|
|
- * ELTEC BAB PPC RAM initialization
|
|
|
|
- *
|
|
|
|
- * 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 <config.h>
|
|
|
|
-#include <asm/processor.h>
|
|
|
|
-#include <74xx_7xx.h>
|
|
|
|
-#include <mpc106.h>
|
|
|
|
-#include <version.h>
|
|
|
|
-
|
|
|
|
-#include <ppc_asm.tmpl>
|
|
|
|
-#include <ppc_defs.h>
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * This following contains the entry code for the initialization code
|
|
|
|
- * for the MPC 106, a PCI Bridge/Memory Controller.
|
|
|
|
- * Register usage:
|
|
|
|
- * r0 = ramtest scratch register, toggleError loop counter
|
|
|
|
- * r1 = 0xfec0 0cf8 CONFIG_ADDRESS
|
|
|
|
- * r2 = 0xfee0 0cfc CONFIG_DATA
|
|
|
|
- * r3 = scratch register, subroutine argument and return value, ramtest size
|
|
|
|
- * r4 = scratch register, spdRead clock mask, OutHex loop count
|
|
|
|
- * r5 = ramtest scratch register
|
|
|
|
- * r6 = toggleError 1st value, spdRead port mask
|
|
|
|
- * r7 = toggleError 2nd value, ramtest scratch register,
|
|
|
|
- * spdRead scratch register (0x00)
|
|
|
|
- * r8 = ramtest scratch register, spdRead scratch register (0x80)
|
|
|
|
- * r9 = ramtest scratch register, toggleError loop end, OutHex digit
|
|
|
|
- * r10 = ramtest scratch register, spdWriteByte parameter,
|
|
|
|
- * spdReadByte return value, printf pointer to COM1
|
|
|
|
- * r11 = startType
|
|
|
|
- * r12 = ramtest scratch register, spdRead data mask
|
|
|
|
- * r13 = pointer to message block
|
|
|
|
- * r14 = pointer to GOT
|
|
|
|
- * r15 = scratch register, SPD save
|
|
|
|
- * r16 = bank0 size, total memory size
|
|
|
|
- * r17 = bank1 size
|
|
|
|
- * r18 = bank2 size
|
|
|
|
- * r19 = bank3 size
|
|
|
|
- * r20 = MCCR1, MSAR1
|
|
|
|
- * r21 = MCCR3, MEAR1
|
|
|
|
- * r22 = MCCR4, MBER
|
|
|
|
- * r23 = EMSAR1
|
|
|
|
- * r24 = EMEAR1
|
|
|
|
- * r25 = save link register 1st level
|
|
|
|
- * r26 = save link register 2nd level
|
|
|
|
- * r27 = save link register 3rd level
|
|
|
|
- * r30 = pointer to GPIO for spdRead
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-.globl board_asm_init
|
|
|
|
-board_asm_init:
|
|
|
|
-/*
|
|
|
|
- * setup pointer to message block
|
|
|
|
- */
|
|
|
|
- mflr r25 /* save away link register */
|
|
|
|
- bl get_lnk_reg /* r3=addr of next instruction */
|
|
|
|
- subi r4, r3, 8 /* r4=board_asm_init addr */
|
|
|
|
- addi r13, r4, (MessageBlock-board_asm_init)
|
|
|
|
-/*
|
|
|
|
- * dcache_disable
|
|
|
|
- */
|
|
|
|
- mfspr r3, HID0
|
|
|
|
- li r4, HID0_DCE
|
|
|
|
- andc r3, r3, r4
|
|
|
|
- mr r2, r3
|
|
|
|
- ori r3, r3, HID0_DCI
|
|
|
|
- sync
|
|
|
|
- mtspr HID0, r3
|
|
|
|
- mtspr HID0, r2
|
|
|
|
- isync
|
|
|
|
- sync
|
|
|
|
-/*
|
|
|
|
- * icache_disable
|
|
|
|
- */
|
|
|
|
- mfspr r3, HID0
|
|
|
|
- li r4, 0
|
|
|
|
- ori r4, r4, HID0_ICE
|
|
|
|
- andc r3, r3, r4
|
|
|
|
- sync
|
|
|
|
- mtspr HID0, r3
|
|
|
|
-/*
|
|
|
|
- * invalidate caches
|
|
|
|
- */
|
|
|
|
- ori r3, r3, (HID0_ICE | HID0_ICFI | HID0_DCI | HID0_DCE)
|
|
|
|
- or r4, r4, r3
|
|
|
|
- isync
|
|
|
|
- mtspr HID0, r4
|
|
|
|
- andc r4, r4, r3
|
|
|
|
- isync
|
|
|
|
- mtspr HID0, r4
|
|
|
|
- isync
|
|
|
|
-/*
|
|
|
|
- * icache_enable
|
|
|
|
- */
|
|
|
|
- mfspr r3, HID0
|
|
|
|
- ori r3, r3, (HID0_ICE | HID0_ICFI)
|
|
|
|
- sync
|
|
|
|
- mtspr HID0, r3
|
|
|
|
-
|
|
|
|
- lis r1, 0xfec0
|
|
|
|
- ori r1, r1, 0x0cf8
|
|
|
|
- lis r2, 0xfee0
|
|
|
|
- ori r2, r2, 0xcfc
|
|
|
|
-
|
|
|
|
-#ifdef CONFIG_SYS_ADDRESS_MAP_A
|
|
|
|
-/*
|
|
|
|
- * Switch to address map A if necessary.
|
|
|
|
- */
|
|
|
|
- lis r3, MPC106_REG@h
|
|
|
|
- ori r3, r3, PCI_PICR1
|
|
|
|
- stwbrx r3, 0, r1
|
|
|
|
- sync
|
|
|
|
- lwbrx r4, 0, r2
|
|
|
|
- sync
|
|
|
|
- lis r0, PICR1_XIO_MODE@h
|
|
|
|
- ori r0, r0, PICR1_XIO_MODE@l
|
|
|
|
- andc r4, r4, r0
|
|
|
|
- lis r0, PICR1_ADDRESS_MAP@h
|
|
|
|
- ori r0, r0, PICR1_ADDRESS_MAP@l
|
|
|
|
- or r4, r4, r0
|
|
|
|
- stwbrx r4, 0, r2
|
|
|
|
- sync
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Do the init for the SIO.
|
|
|
|
- */
|
|
|
|
- bl .sioInit
|
|
|
|
-
|
|
|
|
- addi r3, r13, (MinitLogo-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
-
|
|
|
|
- addi r3, r13, (Mspd01-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
-/*
|
|
|
|
- * Memory cofiguration using SPD information stored on the SODIMMs
|
|
|
|
- */
|
|
|
|
- li r17, 0
|
|
|
|
- li r18, 0
|
|
|
|
- li r19, 0
|
|
|
|
-
|
|
|
|
- li r3, 0x0002 /* get RAM type from spd for bank0/1 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- cmpi 0, 0, r3, -1 /* error ? */
|
|
|
|
- bne noSpdError
|
|
|
|
-
|
|
|
|
- addi r3, r13, (Mfail-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
-
|
|
|
|
- li r6, 0xe0 /* error codes in r6 and r7 */
|
|
|
|
- li r7, 0x00
|
|
|
|
- b toggleError /* fail - loop forever */
|
|
|
|
-
|
|
|
|
-noSpdError:
|
|
|
|
- mr r15, r3 /* save r3 */
|
|
|
|
-
|
|
|
|
- addi r3, r13, (Mok-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
-
|
|
|
|
- cmpli 0, 0, r15, 0x0001 /* FPM ? */
|
|
|
|
- beq configFPM
|
|
|
|
- cmpli 0, 0, r15, 0x0002 /* EDO ? */
|
|
|
|
- beq configEDO
|
|
|
|
- cmpli 0, 0, r15, 0x0004 /* SDRAM ? */
|
|
|
|
- beq configSDRAM
|
|
|
|
-
|
|
|
|
- li r6, 0xe0 /* error codes in r6 and r7 */
|
|
|
|
- li r7, 0x01
|
|
|
|
- b toggleError /* fail - loop forever */
|
|
|
|
-
|
|
|
|
-configSDRAM:
|
|
|
|
- addi r3, r13, (MsdRam-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
-/*
|
|
|
|
- * set the Memory Configuration Reg. 1
|
|
|
|
- */
|
|
|
|
- li r3, 0x001f /* get bank size from spd bank0/1 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- andi. r3, r3, 0x0038
|
|
|
|
- beq SD16MB2B
|
|
|
|
-
|
|
|
|
- li r3, 0x0011 /* get number of internal banks */
|
|
|
|
- /* from spd for bank0/1 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- cmpli 0, 0, r3, 0x02
|
|
|
|
- beq SD64MB2B
|
|
|
|
-
|
|
|
|
- cmpli 0, 0, r3, 0x04
|
|
|
|
- beq SD64MB4B
|
|
|
|
-
|
|
|
|
- li r6, 0xe0 /* error codes in r6 and r7 */
|
|
|
|
- li r7, 0x02
|
|
|
|
- b toggleError /* fail - loop forever */
|
|
|
|
-
|
|
|
|
-SD64MB2B:
|
|
|
|
- li r20, 0x0005 /* 64-Mbit SDRAM 2 banks */
|
|
|
|
- b SDRow2nd
|
|
|
|
-
|
|
|
|
-SD64MB4B:
|
|
|
|
- li r20, 0x0000 /* 64-Mbit SDRAM 4 banks */
|
|
|
|
- b SDRow2nd
|
|
|
|
-
|
|
|
|
-SD16MB2B:
|
|
|
|
- li r20, 0x000f /* 16-Mbit SDRAM 2 banks */
|
|
|
|
-
|
|
|
|
-SDRow2nd:
|
|
|
|
- li r3, 0x0102 /* get RAM type spd for bank2/3 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- cmpli 0, 0, r3, 0x0004
|
|
|
|
- bne S2D64MB4B /* bank2/3 isn't present or no SDRAM */
|
|
|
|
-
|
|
|
|
- li r3, 0x011f /* get bank size from spd bank2/3 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- andi. r3, r3, 0x0038
|
|
|
|
- beq S2D16MB2B
|
|
|
|
-/*
|
|
|
|
- * set the Memory Configuration Reg. 2
|
|
|
|
- */
|
|
|
|
- li r3, 0x0111 /* get number of internal banks */
|
|
|
|
- /* from spd for bank2/3 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- cmpli 0, 0, r3, 0x02
|
|
|
|
- beq S2D64MB2B
|
|
|
|
-
|
|
|
|
- cmpli 0, 0, r3, 0x04
|
|
|
|
- beq S2D64MB4B
|
|
|
|
-
|
|
|
|
- li r6, 0xe0 /* error codes in r6 and r7 */
|
|
|
|
- li r7, 0x03
|
|
|
|
- b toggleError /* fail - loop forever */
|
|
|
|
-
|
|
|
|
-S2D64MB2B:
|
|
|
|
- ori r20, r20, 0x0050 /* 64-Mbit SDRAM 2 banks */
|
|
|
|
- b S2D64MB4B
|
|
|
|
-
|
|
|
|
-S2D16MB2B:
|
|
|
|
- ori r20, r20, 0x00f0 /* 16-Mbit SDRAM 2 banks */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * set the Memory Configuration Reg. 3
|
|
|
|
- */
|
|
|
|
-S2D64MB4B:
|
|
|
|
- lis r21, 0x8630 /* BSTOPRE = 0x80, REFREC = 6, */
|
|
|
|
- /* RDLAT = 3 */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * set the Memory Configuration Reg. 4
|
|
|
|
- */
|
|
|
|
- lis r22, 0x2430 /* PRETOACT = 2, ACTOPRE = 4, */
|
|
|
|
- /* WCBUF = 1, RCBUF = 1 */
|
|
|
|
- ori r22, r22, 0x2220 /* SDMODE = 0x022, ACTORW = 2 */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * get the size of bank 0-3
|
|
|
|
- */
|
|
|
|
- li r3, 0x001f /* get bank size from spd bank0/1 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- rlwinm r16, r3, 2, 24, 29 /* calculate size in MByte */
|
|
|
|
- /* (128 MB max.) */
|
|
|
|
-
|
|
|
|
- li r3, 0x0005 /* get number of banks from spd */
|
|
|
|
- /* for bank0/1 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- cmpi 0, 0, r3, 2 /* 2 banks ? */
|
|
|
|
- bne SDRAMnobank1
|
|
|
|
-
|
|
|
|
- mr r17, r16
|
|
|
|
-
|
|
|
|
-SDRAMnobank1:
|
|
|
|
- addi r3, r13, (Mspd23-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
-
|
|
|
|
- li r3, 0x0102 /* get RAM type spd for bank2/3 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- cmpli 0, 0, r3, 0x0001 /* FPM ? */
|
|
|
|
- bne noFPM23 /* handle as EDO */
|
|
|
|
- addi r3, r13, (Mok-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- addi r3, r13, (MfpmRam-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- b configRAMcommon
|
|
|
|
-noFPM23:
|
|
|
|
- cmpli 0, 0, r3, 0x0002 /* EDO ? */
|
|
|
|
- bne noEDO23
|
|
|
|
- addi r3, r13, (Mok-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- addi r3, r13, (MedoRam-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- b configRAMcommon
|
|
|
|
-noEDO23:
|
|
|
|
- cmpli 0, 0, r3, 0x0004 /* SDRAM ? */
|
|
|
|
- bne noSDRAM23
|
|
|
|
- addi r3, r13, (Mok-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- addi r3, r13, (MsdRam-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- b configSDRAM23
|
|
|
|
-noSDRAM23:
|
|
|
|
- addi r3, r13, (Mna-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- b configRAMcommon /* bank2/3 isn't present or no SDRAM */
|
|
|
|
-
|
|
|
|
-configSDRAM23:
|
|
|
|
- li r3, 0x011f /* get bank size from spd bank2/3 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- rlwinm r18, r3, 2, 24, 29 /* calculate size in MByte */
|
|
|
|
- /* (128 MB max.) */
|
|
|
|
-
|
|
|
|
- li r3, 0x0105 /* get number of banks from */
|
|
|
|
- /* spd bank0/1 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- cmpi 0, 0, r3, 2 /* 2 banks ? */
|
|
|
|
- bne SDRAMnobank3
|
|
|
|
-
|
|
|
|
- mr r19, r18
|
|
|
|
-
|
|
|
|
-SDRAMnobank3:
|
|
|
|
- b configRAMcommon
|
|
|
|
-
|
|
|
|
-configFPM:
|
|
|
|
- addi r3, r13, (MfpmRam-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- b configEDO0
|
|
|
|
-/*
|
|
|
|
- * set the Memory Configuration Reg. 1
|
|
|
|
- */
|
|
|
|
-configEDO:
|
|
|
|
- addi r3, r13, (MedoRam-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
-configEDO0:
|
|
|
|
- lis r20, MCCR1_TYPE_EDO@h
|
|
|
|
-
|
|
|
|
-getSpdRowBank01:
|
|
|
|
- li r3, 0x0003 /* get number of row bits from */
|
|
|
|
- /* spd from bank0/1 */
|
|
|
|
- bl spdRead
|
|
|
|
- ori r20, r20, (MCCR1_BK0_9BITS | MCCR1_BK1_9BITS)
|
|
|
|
- cmpli 0, 0, r3, 0x0009 /* bank0 - 9 row bits */
|
|
|
|
- beq getSpdRowBank23
|
|
|
|
-
|
|
|
|
- ori r20, r20, (MCCR1_BK0_10BITS | MCCR1_BK1_10BITS)
|
|
|
|
- cmpli 0, 0, r3, 0x000a /* bank0 - 10 row bits */
|
|
|
|
- beq getSpdRowBank23
|
|
|
|
-
|
|
|
|
- ori r20, r20, (MCCR1_BK0_11BITS | MCCR1_BK1_11BITS)
|
|
|
|
- cmpli 0, 0, r3, 0x000b /* bank0 - 11 row bits */
|
|
|
|
- beq getSpdRowBank23
|
|
|
|
-
|
|
|
|
- ori r20, r20, (MCCR1_BK0_12BITS | MCCR1_BK1_12BITS)
|
|
|
|
- cmpli 0, 0, r3, 0x000c /* bank0 - 12 row bits */
|
|
|
|
- beq getSpdRowBank23
|
|
|
|
-
|
|
|
|
- cmpli 0, 0, r3, 0x000d /* bank0 - 13 row bits */
|
|
|
|
- beq getSpdRowBank23
|
|
|
|
-
|
|
|
|
- li r6, 0xe0 /* error codes in r6 and r7 */
|
|
|
|
- li r7, 0x10
|
|
|
|
- b toggleError /* fail - loop forever */
|
|
|
|
-
|
|
|
|
-getSpdRowBank23:
|
|
|
|
- li r3, 0x0103 /* get number of row bits from */
|
|
|
|
- /* spd for bank2/3 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- ori r20, r20, (MCCR1_BK2_9BITS | MCCR1_BK3_9BITS)
|
|
|
|
- cmpli 0, 0, r3, 0x0009 /* bank0 - 9 row bits */
|
|
|
|
- beq writeRowBits
|
|
|
|
-
|
|
|
|
- ori r20, r20, (MCCR1_BK2_10BITS | MCCR1_BK3_10BITS)
|
|
|
|
- cmpli 0, 0, r3, 0x000a /* bank0 - 10 row bits */
|
|
|
|
- beq writeRowBits
|
|
|
|
-
|
|
|
|
- ori r20, r20, (MCCR1_BK2_11BITS | MCCR1_BK3_11BITS)
|
|
|
|
- cmpli 0, 0, r3, 0x000b /* bank0 - 11 row bits */
|
|
|
|
- beq writeRowBits
|
|
|
|
-
|
|
|
|
- ori r20, r20, (MCCR1_BK2_12BITS | MCCR1_BK3_12BITS)
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * set the Memory Configuration Reg. 3
|
|
|
|
- */
|
|
|
|
-writeRowBits:
|
|
|
|
- lis r21, 0x000a /* CPX = 1, RAS6P = 4 */
|
|
|
|
- ori r21, r21, 0x2293 /* CAS5 = 2, CP4 = 1, */
|
|
|
|
- /* CAS3 = 2, RCD2 = 2, RP = 3 */
|
|
|
|
-/*
|
|
|
|
- * set the Memory Configuration Reg. 4
|
|
|
|
- */
|
|
|
|
- lis r22, 0x0010 /* all SDRAM parameter 0, */
|
|
|
|
- /* WCBUF flow through, */
|
|
|
|
- /* RCBUF registered */
|
|
|
|
-/*
|
|
|
|
- * get the size of bank 0-3
|
|
|
|
- */
|
|
|
|
- li r3, 0x0003 /* get row bits from spd bank0/1 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- li r16, 0 /* bank size is: */
|
|
|
|
- /* (8*2^row*2^column)/0x100000 MB */
|
|
|
|
- ori r16, r16, 0x8000
|
|
|
|
- rlwnm r16, r16, r3, 0, 31
|
|
|
|
-
|
|
|
|
- li r3, 0x0004 /* get column bits from spd bank0/1 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- rlwnm r16, r16, r3, 0, 31
|
|
|
|
-
|
|
|
|
- li r3, 0x0005 /* get number of banks from */
|
|
|
|
- /* spd for bank0/1 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- cmpi 0, 0, r3, 2 /* 2 banks ? */
|
|
|
|
- bne EDOnobank1
|
|
|
|
-
|
|
|
|
- mr r17, r16
|
|
|
|
-
|
|
|
|
-EDOnobank1:
|
|
|
|
- addi r3, r13, (Mspd23-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
-
|
|
|
|
- li r3, 0x0102 /* get RAM type spd for bank2/3 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- cmpli 0, 0, r3, 0x0001 /* FPM ? */
|
|
|
|
- bne noFPM231 /* handle as EDO */
|
|
|
|
- addi r3, r13, (Mok-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- addi r3, r13, (MfpmRam-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- b EDObank2
|
|
|
|
-noFPM231:
|
|
|
|
- cmpli 0, 0, r3, 0x0002 /* EDO ? */
|
|
|
|
- bne noEDO231
|
|
|
|
- addi r3, r13, (Mok-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- addi r3, r13, (MedoRam-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- b EDObank2
|
|
|
|
-noEDO231:
|
|
|
|
- cmpli 0, 0, r3, 0x0004 /* SDRAM ? */
|
|
|
|
- bne noSDRAM231
|
|
|
|
- addi r3, r13, (Mok-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- addi r3, r13, (MsdRam-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- b configRAMcommon
|
|
|
|
-noSDRAM231:
|
|
|
|
- addi r3, r13, (Mfail-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- b configRAMcommon /* bank2/3 isn't present or no SDRAM */
|
|
|
|
-
|
|
|
|
-EDObank2:
|
|
|
|
- li r3, 0x0103 /* get row bits from spd for bank2/3 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- li r18, 0 /* bank size is: */
|
|
|
|
- /* (8*2^row*2^column)/0x100000 MB */
|
|
|
|
- ori r18, r18, 0x8000
|
|
|
|
- rlwnm r18, r18, r3, 0, 31
|
|
|
|
-
|
|
|
|
- li r3, 0x0104 /* get column bits from spd bank2/3 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- rlwnm r18, r18, r3, 0, 31
|
|
|
|
-
|
|
|
|
- li r3, 0x0105 /* get number of banks from */
|
|
|
|
- /* spd for bank2/3 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- cmpi 0, 0, r3, 2 /* 2 banks ? */
|
|
|
|
- bne configRAMcommon
|
|
|
|
-
|
|
|
|
- mr r19, r18
|
|
|
|
-
|
|
|
|
-configRAMcommon:
|
|
|
|
- lis r1, MPC106_REG_ADDR@h
|
|
|
|
- ori r1, r1, MPC106_REG_ADDR@l
|
|
|
|
- lis r2, MPC106_REG_DATA@h
|
|
|
|
- ori r2, r2, MPC106_REG_DATA@l
|
|
|
|
-
|
|
|
|
- li r0, 0
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * If we are already running in RAM (debug mode), we should
|
|
|
|
- * NOT reset the MEMGO flag. Otherwise we will stop all memory
|
|
|
|
- * accesses.
|
|
|
|
- */
|
|
|
|
-#ifdef IN_RAM
|
|
|
|
- lis r4, MCCR1_MEMGO@h
|
|
|
|
- ori r4, r4, MCCR1_MEMGO@l
|
|
|
|
- or r20, r20, r4
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * set the Memory Configuration Reg. 1
|
|
|
|
- */
|
|
|
|
- lis r3, MPC106_REG@h /* start building new reg number */
|
|
|
|
- ori r3, r3, MPC106_MCCR1 /* register number 0xf0 */
|
|
|
|
- stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
|
|
|
|
- eieio /* make sure mem. access is complete */
|
|
|
|
- stwbrx r20, r0, r2 /* write data to CONFIG_DATA */
|
|
|
|
-/*
|
|
|
|
- * set the Memory Configuration Reg. 3
|
|
|
|
- */
|
|
|
|
- lis r3, MPC106_REG@h /* start building new reg number */
|
|
|
|
- ori r3, r3, MPC106_MCCR3 /* register number 0xf8 */
|
|
|
|
- stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
|
|
|
|
- eieio /* make sure mem. access is complete */
|
|
|
|
- stwbrx r21, r0, r2 /* write data to CONFIG_DATA */
|
|
|
|
-/*
|
|
|
|
- * set the Memory Configuration Reg. 4
|
|
|
|
- */
|
|
|
|
- lis r3, MPC106_REG@h /* start building new reg number */
|
|
|
|
- ori r3, r3, MPC106_MCCR4 /* register number 0xfc */
|
|
|
|
- stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
|
|
|
|
- eieio /* make sure mem. access is complete */
|
|
|
|
- stwbrx r22, r0, r2 /* write data to CONFIG_DATA */
|
|
|
|
-/*
|
|
|
|
- * set the memory boundary registers for bank 0-3
|
|
|
|
- */
|
|
|
|
- li r20, 0
|
|
|
|
- li r23, 0
|
|
|
|
- li r24, 0
|
|
|
|
- subi r21, r16, 1 /* calculate end address bank0 */
|
|
|
|
- li r22, (MBER_BANK0)
|
|
|
|
-
|
|
|
|
- cmpi 0, 0, r17, 0 /* bank1 present ? */
|
|
|
|
- beq nobank1
|
|
|
|
-
|
|
|
|
- rlwinm r3, r16, 8, 16, 23 /* calculate start address of bank1 */
|
|
|
|
- or r20, r20, r3
|
|
|
|
- add r16, r16, r17 /* add to total memory size */
|
|
|
|
- subi r3, r16, 1 /* calculate end address of bank1 */
|
|
|
|
- rlwinm r3, r3, 8, 16, 23
|
|
|
|
- or r21, r21, r3
|
|
|
|
- ori r22, r22, (MBER_BANK1) /* enable bank1 */
|
|
|
|
- b bank2
|
|
|
|
-
|
|
|
|
-nobank1:
|
|
|
|
- ori r23, r23, 0x0300 /* set bank1 start to unused area */
|
|
|
|
- ori r24, r24, 0x0300 /* set bank1 end to unused area */
|
|
|
|
-
|
|
|
|
-bank2:
|
|
|
|
- cmpi 0, 0, r18, 0 /* bank2 present ? */
|
|
|
|
- beq nobank2
|
|
|
|
-
|
|
|
|
- andi. r3, r16, 0x00ff /* calculate start address of bank2 */
|
|
|
|
- andi. r4, r16, 0x0300
|
|
|
|
- rlwinm r3, r3, 16, 8, 15
|
|
|
|
- or r20, r20, r3
|
|
|
|
- rlwinm r3, r4, 8, 8, 15
|
|
|
|
- or r23, r23, r3
|
|
|
|
- add r16, r16, r18 /* add to total memory size */
|
|
|
|
- subi r3, r16, 1 /* calculate end address of bank2 */
|
|
|
|
- andi. r4, r3, 0x0300
|
|
|
|
- andi. r3, r3, 0x00ff
|
|
|
|
- rlwinm r3, r3, 16, 8, 15
|
|
|
|
- or r21, r21, r3
|
|
|
|
- rlwinm r3, r4, 8, 8, 15
|
|
|
|
- or r24, r24, r3
|
|
|
|
- ori r22, r22, (MBER_BANK2) /* enable bank2 */
|
|
|
|
- b bank3
|
|
|
|
-
|
|
|
|
-nobank2:
|
|
|
|
- lis r3, 0x0003
|
|
|
|
- or r23, r23, r3 /* set bank2 start to unused area */
|
|
|
|
- or r24, r24, r3 /* set bank2 end to unused area */
|
|
|
|
-
|
|
|
|
-bank3:
|
|
|
|
- cmpi 0, 0, r19, 0 /* bank3 present ? */
|
|
|
|
- beq nobank3
|
|
|
|
-
|
|
|
|
- andi. r3, r16, 0x00ff /* calculate start address of bank3 */
|
|
|
|
- andi. r4, r16, 0x0300
|
|
|
|
- rlwinm r3, r3, 24, 0, 7
|
|
|
|
- or r20, r20, r3
|
|
|
|
- rlwinm r3, r4, 16, 0, 7
|
|
|
|
- or r23, r23, r3
|
|
|
|
- add r16, r16, r19 /* add to total memory size */
|
|
|
|
- subi r3, r16, 1 /* calculate end address of bank3 */
|
|
|
|
- andi. r4, r3, 0x0300
|
|
|
|
- andi. r3, r3, 0x00ff
|
|
|
|
- rlwinm r3, r3, 24, 0, 7
|
|
|
|
- or r21, r21, r3
|
|
|
|
- rlwinm r3, r4, 16, 0, 7
|
|
|
|
- or r24, r24, r3
|
|
|
|
- ori r22, r22, (MBER_BANK3) /* enable bank3 */
|
|
|
|
- b writebound
|
|
|
|
-
|
|
|
|
-nobank3:
|
|
|
|
- lis r3, 0x0300
|
|
|
|
- or r23, r23, r3 /* set bank3 start to unused area */
|
|
|
|
- or r24, r24, r3 /* set bank3 end to unused area */
|
|
|
|
-
|
|
|
|
-writebound:
|
|
|
|
- lis r3, MPC106_REG@h /* start building new reg number */
|
|
|
|
- ori r3, r3, MPC106_MSAR1 /* register number 0x80 */
|
|
|
|
- stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
|
|
|
|
- eieio /* make sure mem. access is complete */
|
|
|
|
- stwbrx r20, r0, r2 /* write data to CONFIG_DATA */
|
|
|
|
-
|
|
|
|
- lis r3, MPC106_REG@h /* start building new reg number */
|
|
|
|
- ori r3, r3, MPC106_MEAR1 /* register number 0x90 */
|
|
|
|
- stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
|
|
|
|
- eieio /* make sure mem. access is complete */
|
|
|
|
- stwbrx r21, r0, r2 /* write data to CONFIG_DATA */
|
|
|
|
-
|
|
|
|
- lis r3, MPC106_REG@h /* start building new reg number */
|
|
|
|
- ori r3, r3, MPC106_EMSAR1 /* register number 0x88 */
|
|
|
|
- stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
|
|
|
|
- eieio /* make sure mem. access is complete */
|
|
|
|
- stwbrx r23, r0, r2 /* write data to CONFIG_DATA */
|
|
|
|
-
|
|
|
|
- lis r3, MPC106_REG@h /* start building new reg number */
|
|
|
|
- ori r3, r3, MPC106_EMEAR1 /* register number 0x98 */
|
|
|
|
- stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
|
|
|
|
- eieio /* make sure mem. access is complete */
|
|
|
|
- stwbrx r24, r0, r2 /* write data to CONFIG_DATA */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * set boundaries of unused banks to unused address space
|
|
|
|
- */
|
|
|
|
- lis r4, 0x0303
|
|
|
|
- ori r4, r4, 0x0303 /* bank 4-7 start and end adresses */
|
|
|
|
- lis r3, MPC106_REG@h /* start building new reg number */
|
|
|
|
- ori r3, r3, MPC106_EMSAR2 /* register number 0x8C */
|
|
|
|
- stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
|
|
|
|
- eieio /* make sure mem. access is complete */
|
|
|
|
- stwbrx r4, r0, r2 /* write data to CONFIG_DATA */
|
|
|
|
-
|
|
|
|
- lis r3, MPC106_REG@h /* start building new reg number */
|
|
|
|
- ori r3, r3, MPC106_EMEAR2 /* register number 0x9C */
|
|
|
|
- stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
|
|
|
|
- eieio /* make sure mem. access is complete */
|
|
|
|
- stwbrx r4, r0, r2 /* write data to CONFIG_DATA */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * set the Memory Configuration Reg. 2
|
|
|
|
- */
|
|
|
|
- lis r3, MPC106_REG@h /* start building new reg number */
|
|
|
|
- ori r3, r3, MPC106_MCCR2 /* register number 0xf4 */
|
|
|
|
- stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
|
|
|
|
- eieio /* make sure mem. access is complete */
|
|
|
|
-
|
|
|
|
- li r3, 0x000c /* get refresh from spd for bank0/1 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- cmpi 0, 0, r3, -1 /* error ? */
|
|
|
|
- bne common1
|
|
|
|
-
|
|
|
|
- li r6, 0xe0 /* error codes in r6 and r7 */
|
|
|
|
- li r7, 0x20
|
|
|
|
- b toggleError /* fail - loop forever */
|
|
|
|
-
|
|
|
|
-common1:
|
|
|
|
- andi. r15, r3, 0x007f /* mask selfrefresh bit */
|
|
|
|
- li r3, 0x010c /* get refresh from spd for bank2/3 */
|
|
|
|
- bl spdRead
|
|
|
|
-
|
|
|
|
- cmpi 0, 0, r3, -1 /* error ? */
|
|
|
|
- beq common2
|
|
|
|
- andi. r3, r3, 0x007f /* mask selfrefresh bit */
|
|
|
|
- cmp 0, 0, r3, r15 /* find the lower */
|
|
|
|
- blt common3
|
|
|
|
-
|
|
|
|
-common2:
|
|
|
|
- mr r3, r15
|
|
|
|
-
|
|
|
|
-common3:
|
|
|
|
- li r4, 0x1010 /* refesh cycle 1028 clocks */
|
|
|
|
- /* left shifted 2 */
|
|
|
|
- cmpli 0, 0, r3, 0x0000 /* 15.6 us ? */
|
|
|
|
- beq writeRefresh
|
|
|
|
-
|
|
|
|
- li r4, 0x0808 /* refesh cycle 514 clocks */
|
|
|
|
- /* left shifted 2 */
|
|
|
|
- cmpli 0, 0, r3, 0x0002 /* 7.8 us ? */
|
|
|
|
- beq writeRefresh
|
|
|
|
-
|
|
|
|
- li r4, 0x2020 /* refesh cycle 2056 clocks */
|
|
|
|
- /* left shifted 2 */
|
|
|
|
- cmpli 0, 0, r3, 0x0003 /* 31.3 us ? */
|
|
|
|
- beq writeRefresh
|
|
|
|
-
|
|
|
|
- li r4, 0x4040 /* refesh cycle 4112 clocks */
|
|
|
|
- /* left shifted 2 */
|
|
|
|
- cmpli 0, 0, r3, 0x0004 /* 62.5 us ? */
|
|
|
|
- beq writeRefresh
|
|
|
|
-
|
|
|
|
- li r4, 0
|
|
|
|
- ori r4, r4, 0x8080 /* refesh cycle 8224 clocks */
|
|
|
|
- /* left shifted 2 */
|
|
|
|
- cmpli 0, 0, r3, 0x0005 /* 125 us ? */
|
|
|
|
- beq writeRefresh
|
|
|
|
-
|
|
|
|
- li r6, 0xe0 /* error codes in r6 and r7 */
|
|
|
|
- li r7, 0x21
|
|
|
|
- b toggleError /* fail - loop forever */
|
|
|
|
-
|
|
|
|
-writeRefresh:
|
|
|
|
- stwbrx r4, r0, r2 /* write data to CONFIG_DATA */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * DRAM BANKS SHOULD BE ENABLED
|
|
|
|
- */
|
|
|
|
- addi r3, r13, (Mactivate-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
- mr r3, r16
|
|
|
|
- bl OutDec
|
|
|
|
- addi r3, r13, (Mmbyte-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
-
|
|
|
|
- lis r3, MPC106_REG@h /* start building new reg number */
|
|
|
|
- ori r3, r3, MPC106_MBER /* register number 0xa0 */
|
|
|
|
- stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
|
|
|
|
- eieio /* make sure mem. access is complete */
|
|
|
|
- stb r22, 0(r2) /* write data to CONFIG_DATA */
|
|
|
|
- li r8, 0x63 /* PGMAX = 99 */
|
|
|
|
- stb r8, 3(r2) /* write data to CONFIG_DATA */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * DRAM SHOULD NOW BE CONFIGURED AND ENABLED
|
|
|
|
- * MUST WAIT 200us BEFORE ACCESSING
|
|
|
|
- */
|
|
|
|
- li r0, 0x7800
|
|
|
|
- mtctr r0
|
|
|
|
-
|
|
|
|
-wait200us:
|
|
|
|
- bdnz wait200us
|
|
|
|
-
|
|
|
|
- lis r3, MPC106_REG@h /* start building new reg number */
|
|
|
|
- ori r3, r3, MPC106_MCCR1 /* register number 0xf0 */
|
|
|
|
- stwbrx r3, r0, r1 /* write this value to CONFIG_ADDR */
|
|
|
|
- eieio /* make sure mem. access is complete */
|
|
|
|
-
|
|
|
|
- lwbrx r4, r0, r2 /* load r4 from CONFIG_DATA */
|
|
|
|
-
|
|
|
|
- lis r0, MCCR1_MEMGO@h /* MEMGO=1 */
|
|
|
|
- ori r0, r0, MCCR1_MEMGO@l
|
|
|
|
- or r4, r4, r0 /* set the MEMGO bit */
|
|
|
|
- stwbrx r4, r0, r2 /* write mdfd data to CONFIG_DATA */
|
|
|
|
-
|
|
|
|
- li r0, 0x7000
|
|
|
|
- mtctr r0
|
|
|
|
-
|
|
|
|
-wait8ref:
|
|
|
|
- bdnz wait8ref
|
|
|
|
-
|
|
|
|
- addi r3, r13, (Mok-MessageBlock)
|
|
|
|
- bl Printf
|
|
|
|
-
|
|
|
|
- mtlr r25
|
|
|
|
- blr
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Infinite loop called in case of an error during RAM initialisation.
|
|
|
|
- * error codes in r6 and r7.
|
|
|
|
- */
|
|
|
|
-toggleError:
|
|
|
|
- li r0, 0
|
|
|
|
- lis r9, 127
|
|
|
|
- ori r9, r9, 65535
|
|
|
|
-toggleError1:
|
|
|
|
- addic r0, r0, 1
|
|
|
|
- cmpw cr1, r0, r9
|
|
|
|
- ble cr1, toggleError1
|
|
|
|
- li r0, 0
|
|
|
|
- lis r9, 127
|
|
|
|
- ori r9, r9, 65535
|
|
|
|
-toggleError2:
|
|
|
|
- addic r0, r0, 1
|
|
|
|
- cmpw cr1, r0, r9
|
|
|
|
- ble cr1, toggleError2
|
|
|
|
- b toggleError
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-/******************************************************************************
|
|
|
|
- * This function performs a basic initialisation of the superio chip
|
|
|
|
- * to enable basic console output and SPD access during RAM initialisation.
|
|
|
|
- *
|
|
|
|
- * Upon completion, SIO resource registers are mapped as follows:
|
|
|
|
- * Resource Enabled Address
|
|
|
|
- * UART1 Yes 3F8-3FF COM1
|
|
|
|
- * UART2 Yes 2F8-2FF COM2
|
|
|
|
- * GPIO Yes 220-227
|
|
|
|
- */
|
|
|
|
-.set SIO_LUNINDEX, 0x07 /* SIO LUN index register */
|
|
|
|
-.set SIO_CNFG1, 0x21 /* SIO configuration #1 register */
|
|
|
|
-.set SIO_PCSCI, 0x23 /* SIO PCS configuration index reg */
|
|
|
|
-.set SIO_PCSCD, 0x24 /* SIO PCS configuration data reg */
|
|
|
|
-.set SIO_ACTIVATE, 0x30 /* SIO activate register */
|
|
|
|
-.set SIO_IOBASEHI, 0x60 /* SIO I/O port base address, 15:8 */
|
|
|
|
-.set SIO_IOBASELO, 0x61 /* SIO I/O port base address, 7:0 */
|
|
|
|
-.set SIO_LUNENABLE, 0x01 /* SIO LUN enable */
|
|
|
|
-
|
|
|
|
-.sioInit:
|
|
|
|
- mfspr r7, 8 /* save link register */
|
|
|
|
-
|
|
|
|
-.sioInit_87308:
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Get base addr of ISA I/O space
|
|
|
|
- */
|
|
|
|
- lis r6, CONFIG_SYS_ISA_IO@h
|
|
|
|
- ori r6, r6, CONFIG_SYS_ISA_IO@l
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Set offset to base address for config registers.
|
|
|
|
- */
|
|
|
|
-#if defined(CONFIG_SYS_NS87308_BADDR_0x)
|
|
|
|
- addi r4, r0, 0x0279
|
|
|
|
-#elif defined(CONFIG_SYS_NS87308_BADDR_10)
|
|
|
|
- addi r4, r0, 0x015C
|
|
|
|
-#elif defined(CONFIG_SYS_NS87308_BADDR_11)
|
|
|
|
- addi r4, r0, 0x002E
|
|
|
|
-#endif
|
|
|
|
- add r6, r6, r4 /* add offset to base */
|
|
|
|
- or r3, r6, r6 /* make a copy */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * PMC (LUN 8)
|
|
|
|
- */
|
|
|
|
- addi r4, r0, SIO_LUNINDEX /* select PMC LUN */
|
|
|
|
- addi r5, r0, 0x8
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_IOBASEHI /* initialize PMC address to 0x460 */
|
|
|
|
- addi r5, r0, 0x04
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_IOBASELO
|
|
|
|
- addi r5, r0, 0x60
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_ACTIVATE /* enable PMC */
|
|
|
|
- addi r5, r0, SIO_LUNENABLE
|
|
|
|
- bl .sio_bw
|
|
|
|
-
|
|
|
|
- lis r8, CONFIG_SYS_ISA_IO@h
|
|
|
|
- ori r8, r8, 0x0460
|
|
|
|
- li r9, 0x03
|
|
|
|
- stb r9, 0(r8) /* select PMC2 register */
|
|
|
|
- eieio
|
|
|
|
- li r9, 0x00
|
|
|
|
- stb r9, 1(r8) /* SuperI/O clock src: 24MHz via X1 */
|
|
|
|
- eieio
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * map UART1 (LUN 6) or UART2 (LUN 5) to COM1 (0x3F8)
|
|
|
|
- */
|
|
|
|
- addi r4, r0, SIO_LUNINDEX /* select COM1 LUN */
|
|
|
|
- addi r5, r0, 0x6
|
|
|
|
- bl .sio_bw
|
|
|
|
-
|
|
|
|
- addi r4, r0, SIO_IOBASEHI /* initialize COM1 address to 0x3F8 */
|
|
|
|
- addi r5, r0, 0x03
|
|
|
|
- bl .sio_bw
|
|
|
|
-
|
|
|
|
- addi r4, r0, SIO_IOBASELO
|
|
|
|
- addi r5, r0, 0xF8
|
|
|
|
- bl .sio_bw
|
|
|
|
-
|
|
|
|
- addi r4, r0, SIO_ACTIVATE /* enable COM1 */
|
|
|
|
- addi r5, r0, SIO_LUNENABLE
|
|
|
|
- bl .sio_bw
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Init COM1 for polled output
|
|
|
|
- */
|
|
|
|
- lis r8, CONFIG_SYS_ISA_IO@h
|
|
|
|
- ori r8, r8, 0x03f8
|
|
|
|
- li r9, 0x00
|
|
|
|
- stb r9, 1(r8) /* int disabled */
|
|
|
|
- eieio
|
|
|
|
- li r9, 0x00
|
|
|
|
- stb r9, 4(r8) /* modem ctrl */
|
|
|
|
- eieio
|
|
|
|
- li r9, 0x80
|
|
|
|
- stb r9, 3(r8) /* link ctrl, bank select */
|
|
|
|
- eieio
|
|
|
|
- li r9, 115200/CONFIG_BAUDRATE
|
|
|
|
- stb r9, 0(r8) /* baud rate (LSB)*/
|
|
|
|
- eieio
|
|
|
|
- rotrwi r9, r9, 8
|
|
|
|
- stb r9, 1(r8) /* baud rate (MSB) */
|
|
|
|
- eieio
|
|
|
|
- li r9, 0x03
|
|
|
|
- stb r9, 3(r8) /* 8 data bits, 1 stop bit, */
|
|
|
|
- /* no parity */
|
|
|
|
- eieio
|
|
|
|
- li r9, 0x0b
|
|
|
|
- stb r9, 4(r8) /* enable the receiver and transmitter */
|
|
|
|
- eieio
|
|
|
|
-
|
|
|
|
-waitEmpty:
|
|
|
|
- lbz r9, 5(r8) /* transmit empty */
|
|
|
|
- andi. r9, r9, 0x40
|
|
|
|
- beq waitEmpty
|
|
|
|
- li r9, 0x47
|
|
|
|
- stb r9, 3(r8) /* send break, 8 data bits, */
|
|
|
|
- /* 2 stop bits, no parity */
|
|
|
|
- eieio
|
|
|
|
-
|
|
|
|
- lis r0, 0x0001
|
|
|
|
- mtctr r0
|
|
|
|
-
|
|
|
|
-waitCOM1:
|
|
|
|
- lwz r0, 5(r8) /* load from port for delay */
|
|
|
|
- bdnz waitCOM1
|
|
|
|
-
|
|
|
|
-waitEmpty1:
|
|
|
|
- lbz r9, 5(r8) /* transmit empty */
|
|
|
|
- andi. r9, r9, 0x40
|
|
|
|
- beq waitEmpty1
|
|
|
|
- li r9, 0x07
|
|
|
|
- stb r9, 3(r8) /* 8 data bits, 2 stop bits, */
|
|
|
|
- /* no parity */
|
|
|
|
- eieio
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * GPIO (LUN 7)
|
|
|
|
- */
|
|
|
|
- addi r4, r0, SIO_LUNINDEX /* select GPIO LUN */
|
|
|
|
- addi r5, r0, 0x7
|
|
|
|
- bl .sio_bw
|
|
|
|
-
|
|
|
|
- addi r4, r0, SIO_IOBASEHI /* initialize GPIO address to 0x220 */
|
|
|
|
- addi r5, r0, 0x02
|
|
|
|
- bl .sio_bw
|
|
|
|
-
|
|
|
|
- addi r4, r0, SIO_IOBASELO
|
|
|
|
- addi r5, r0, 0x20
|
|
|
|
- bl .sio_bw
|
|
|
|
-
|
|
|
|
- addi r4, r0, SIO_ACTIVATE /* enable GPIO */
|
|
|
|
- addi r5, r0, SIO_LUNENABLE
|
|
|
|
- bl .sio_bw
|
|
|
|
-
|
|
|
|
-.sioInit_done:
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Get base addr of ISA I/O space
|
|
|
|
- */
|
|
|
|
- lis r3, CONFIG_SYS_ISA_IO@h
|
|
|
|
- ori r3, r3, CONFIG_SYS_ISA_IO@l
|
|
|
|
-
|
|
|
|
- addi r3, r3, 0x015C /* adjust to superI/O 87308 base */
|
|
|
|
- or r6, r3, r3 /* make a copy */
|
|
|
|
-/*
|
|
|
|
- * CS0
|
|
|
|
- */
|
|
|
|
- addi r4, r0, SIO_PCSCI /* select PCSCIR */
|
|
|
|
- addi r5, r0, 0x00
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_PCSCD /* select PCSCDR */
|
|
|
|
- addi r5, r0, 0x00
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_PCSCI /* select PCSCIR */
|
|
|
|
- addi r5, r0, 0x01
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_PCSCD /* select PCSCDR */
|
|
|
|
- addi r5, r0, 0x76
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_PCSCI /* select PCSCIR */
|
|
|
|
- addi r5, r0, 0x02
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_PCSCD /* select PCSCDR */
|
|
|
|
- addi r5, r0, 0x40
|
|
|
|
- bl .sio_bw
|
|
|
|
-/*
|
|
|
|
- * CS1
|
|
|
|
- */
|
|
|
|
- addi r4, r0, SIO_PCSCI /* select PCSCIR */
|
|
|
|
- addi r5, r0, 0x05
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_PCSCD /* select PCSCDR */
|
|
|
|
- addi r5, r0, 0x00
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_PCSCI /* select PCSCIR */
|
|
|
|
- addi r5, r0, 0x05
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_PCSCD /* select PCSCDR */
|
|
|
|
- addi r5, r0, 0x70
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_PCSCI /* select PCSCIR */
|
|
|
|
- addi r5, r0, 0x06
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_PCSCD /* select PCSCDR */
|
|
|
|
- addi r5, r0, 0x1C
|
|
|
|
- bl .sio_bw
|
|
|
|
-/*
|
|
|
|
- * CS2
|
|
|
|
- */
|
|
|
|
- addi r4, r0, SIO_PCSCI /* select PCSCIR */
|
|
|
|
- addi r5, r0, 0x08
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_PCSCD /* select PCSCDR */
|
|
|
|
- addi r5, r0, 0x00
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_PCSCI /* select PCSCIR */
|
|
|
|
- addi r5, r0, 0x09
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_PCSCD /* select PCSCDR */
|
|
|
|
- addi r5, r0, 0x71
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_PCSCI /* select PCSCIR */
|
|
|
|
- addi r5, r0, 0x0A
|
|
|
|
- bl .sio_bw
|
|
|
|
- addi r4, r0, SIO_PCSCD /* select PCSCDR */
|
|
|
|
- addi r5, r0, 0x1C
|
|
|
|
- bl .sio_bw
|
|
|
|
-
|
|
|
|
- mtspr 8, r7 /* restore link register */
|
|
|
|
- bclr 20, 0 /* return to caller */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * this function writes a register to the SIO chip
|
|
|
|
- */
|
|
|
|
-.sio_bw:
|
|
|
|
- stb r4, 0(r3) /* write index register with register offset */
|
|
|
|
- eieio
|
|
|
|
- sync
|
|
|
|
- stb r5, 1(r3) /* 1st write */
|
|
|
|
- eieio
|
|
|
|
- sync
|
|
|
|
- stb r5, 1(r3) /* 2nd write */
|
|
|
|
- eieio
|
|
|
|
- sync
|
|
|
|
- bclr 20, 0 /* return to caller */
|
|
|
|
-/*
|
|
|
|
- * this function reads a register from the SIO chip
|
|
|
|
- */
|
|
|
|
-.sio_br:
|
|
|
|
- stb r4, 0(r3) /* write index register with register offset */
|
|
|
|
- eieio
|
|
|
|
- sync
|
|
|
|
- lbz r3, 1(r3) /* retrieve specified reg offset contents */
|
|
|
|
- eieio
|
|
|
|
- sync
|
|
|
|
- bclr 20, 0 /* return to caller */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Print a message to COM1 in polling mode
|
|
|
|
- * r10=COM1 port, r3=(char*)string
|
|
|
|
- */
|
|
|
|
-.globl Printf
|
|
|
|
-Printf:
|
|
|
|
- lis r10, CONFIG_SYS_ISA_IO@h /* COM1 port */
|
|
|
|
- ori r10, r10, 0x03f8
|
|
|
|
-
|
|
|
|
-WaitChr:
|
|
|
|
- lbz r0, 5(r10) /* read link status */
|
|
|
|
- eieio
|
|
|
|
- andi. r0, r0, 0x40 /* mask transmitter empty bit */
|
|
|
|
- beq cr0, WaitChr /* wait till empty */
|
|
|
|
- lbzx r0, r0, r3 /* get char */
|
|
|
|
- stb r0, 0(r10) /* write to transmit reg */
|
|
|
|
- eieio
|
|
|
|
- addi r3, r3, 1 /* next char */
|
|
|
|
- lbzx r0, r0, r3 /* get char */
|
|
|
|
- cmpwi cr1, r0, 0 /* end of string ? */
|
|
|
|
- bne cr1, WaitChr
|
|
|
|
- blr
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Print 8/4/2 digits hex value to COM1 in polling mode
|
|
|
|
- * r10=COM1 port, r3=val
|
|
|
|
- */
|
|
|
|
-OutHex2:
|
|
|
|
- li r9, 4 /* shift reg for 2 digits */
|
|
|
|
- b OHstart
|
|
|
|
-OutHex4:
|
|
|
|
- li r9, 12 /* shift reg for 4 digits */
|
|
|
|
- b OHstart
|
|
|
|
- .globl OutHex
|
|
|
|
-OutHex:
|
|
|
|
- li r9, 28 /* shift reg for 8 digits */
|
|
|
|
-OHstart:
|
|
|
|
- lis r10, CONFIG_SYS_ISA_IO@h /* COM1 port */
|
|
|
|
- ori r10, r10, 0x03f8
|
|
|
|
-OutDig:
|
|
|
|
- lbz r0, 5(r10) /* read link status */
|
|
|
|
- eieio
|
|
|
|
- andi. r0, r0, 0x40 /* mask transmitter empty bit */
|
|
|
|
- beq cr0, OutDig
|
|
|
|
- sraw r0, r3, r9
|
|
|
|
- clrlwi r0, r0, 28
|
|
|
|
- cmpwi cr1, r0, 9
|
|
|
|
- ble cr1, digIsNum
|
|
|
|
- addic r0, r0, 55
|
|
|
|
- b nextDig
|
|
|
|
-digIsNum:
|
|
|
|
- addic r0, r0, 48
|
|
|
|
-nextDig:
|
|
|
|
- stb r0, 0(r10) /* write to transmit reg */
|
|
|
|
- eieio
|
|
|
|
- addic. r9, r9, -4
|
|
|
|
- bge OutDig
|
|
|
|
- blr
|
|
|
|
-/*
|
|
|
|
- * Print 3 digits hdec value to COM1 in polling mode
|
|
|
|
- * r10=COM1 port, r3=val, r7=x00, r8=x0, r9=x, r0, r6=scratch
|
|
|
|
- */
|
|
|
|
-.globl OutDec
|
|
|
|
-OutDec:
|
|
|
|
- li r6, 10
|
|
|
|
- divwu r0, r3, r6 /* r0 = r3 / 10, r9 = r3 mod 10 */
|
|
|
|
- mullw r10, r0, r6
|
|
|
|
- subf r9, r10, r3
|
|
|
|
-
|
|
|
|
- mr r3, r0
|
|
|
|
- divwu r0, r3, r6 /* r0 = r3 / 10, r8 = r3 mod 10 */
|
|
|
|
- mullw r10, r0, r6
|
|
|
|
- subf r8, r10, r3
|
|
|
|
-
|
|
|
|
- mr r3, r0
|
|
|
|
- divwu r0, r3, r6 /* r0 = r3 / 10, r7 = r3 mod 10 */
|
|
|
|
- mullw r10, r0, r6
|
|
|
|
- subf r7, r10, r3
|
|
|
|
-
|
|
|
|
- lis r10, CONFIG_SYS_ISA_IO@h /* COM1 port */
|
|
|
|
- ori r10, r10, 0x03f8
|
|
|
|
-
|
|
|
|
- or. r7, r7, r7
|
|
|
|
- bne noblank1
|
|
|
|
- li r3, 0x20
|
|
|
|
- b OutDec4
|
|
|
|
-
|
|
|
|
-noblank1:
|
|
|
|
- addi r3, r7, 48 /* convert to ASCII */
|
|
|
|
-
|
|
|
|
-OutDec4:
|
|
|
|
- lbz r0, 0(r13) /* slow down dummy read */
|
|
|
|
- lbz r0, 5(r10) /* read link status */
|
|
|
|
- eieio
|
|
|
|
- andi. r0, r0, 0x40 /* mask transmitter empty bit */
|
|
|
|
- beq cr0, OutDec4
|
|
|
|
- stb r3, 0(r10) /* x00 to transmit */
|
|
|
|
- eieio
|
|
|
|
-
|
|
|
|
- or. r7, r7, r8
|
|
|
|
- beq OutDec5
|
|
|
|
-
|
|
|
|
- addi r3, r8, 48 /* convert to ASCII */
|
|
|
|
-OutDec5:
|
|
|
|
- lbz r0, 0(r13) /* slow down dummy read */
|
|
|
|
- lbz r0, 5(r10) /* read link status */
|
|
|
|
- eieio
|
|
|
|
- andi. r0, r0, 0x40 /* mask transmitter empty bit */
|
|
|
|
- beq cr0, OutDec5
|
|
|
|
- stb r3, 0(r10) /* x0 to transmit */
|
|
|
|
- eieio
|
|
|
|
-
|
|
|
|
- addi r3, r9, 48 /* convert to ASCII */
|
|
|
|
-OutDec6:
|
|
|
|
- lbz r0, 0(r13) /* slow down dummy read */
|
|
|
|
- lbz r0, 5(r10) /* read link status */
|
|
|
|
- eieio
|
|
|
|
- andi. r0, r0, 0x40 /* mask transmitter empty bit */
|
|
|
|
- beq cr0, OutDec6
|
|
|
|
- stb r3, 0(r10) /* x to transmit */
|
|
|
|
- eieio
|
|
|
|
- blr
|
|
|
|
-/*
|
|
|
|
- * Print a char to COM1 in polling mode
|
|
|
|
- * r10=COM1 port, r3=char
|
|
|
|
- */
|
|
|
|
-.globl OutChr
|
|
|
|
-OutChr:
|
|
|
|
- lis r10, CONFIG_SYS_ISA_IO@h /* COM1 port */
|
|
|
|
- ori r10, r10, 0x03f8
|
|
|
|
-
|
|
|
|
-OutChr1:
|
|
|
|
- lbz r0, 5(r10) /* read link status */
|
|
|
|
- eieio
|
|
|
|
- andi. r0, r0, 0x40 /* mask transmitter empty bit */
|
|
|
|
- beq cr0, OutChr1 /* wait till empty */
|
|
|
|
- stb r3, 0(r10) /* write to transmit reg */
|
|
|
|
- eieio
|
|
|
|
- blr
|
|
|
|
-/*
|
|
|
|
- * Input: r3 adr to read
|
|
|
|
- * Output: r3 val or -1 for error
|
|
|
|
- */
|
|
|
|
-spdRead:
|
|
|
|
- mfspr r26, 8 /* save link register */
|
|
|
|
-
|
|
|
|
- lis r30, CONFIG_SYS_ISA_IO@h
|
|
|
|
- ori r30, r30, 0x220 /* GPIO Port 1 */
|
|
|
|
- li r7, 0x00
|
|
|
|
- li r8, 0x100
|
|
|
|
- and. r5, r3, r8
|
|
|
|
- beq spdbank0
|
|
|
|
- li r12, 0x08
|
|
|
|
- li r4, 0x10
|
|
|
|
- li r6, 0x18
|
|
|
|
- b spdRead1
|
|
|
|
-
|
|
|
|
-spdbank0:
|
|
|
|
- li r12, 0x20 /* set I2C data */
|
|
|
|
- li r4, 0x40 /* set I2C clock */
|
|
|
|
- li r6, 0x60 /* set I2C clock and data */
|
|
|
|
-
|
|
|
|
-spdRead1:
|
|
|
|
- li r8, 0x80
|
|
|
|
-
|
|
|
|
- bl spdStart /* access I2C bus as master */
|
|
|
|
- li r10, 0xa0 /* write to SPD */
|
|
|
|
- bl spdWriteByte
|
|
|
|
- bl spdReadAck /* ACK returns in r10 */
|
|
|
|
- cmpw cr0, r10, r7
|
|
|
|
- bne AckErr /* r10 must be 0, if ACK received */
|
|
|
|
- mr r10, r3 /* adr to read */
|
|
|
|
- bl spdWriteByte
|
|
|
|
- bl spdReadAck
|
|
|
|
- cmpw cr0, r10, r7
|
|
|
|
- bne AckErr
|
|
|
|
- bl spdStart
|
|
|
|
- li r10, 0xa1 /* read from SPD */
|
|
|
|
- bl spdWriteByte
|
|
|
|
- bl spdReadAck
|
|
|
|
- cmpw cr0, r10, r7
|
|
|
|
- bne AckErr
|
|
|
|
- bl spdReadByte /* return val in r10 */
|
|
|
|
- bl spdWriteAck
|
|
|
|
- bl spdStop /* release I2C bus */
|
|
|
|
- mr r3, r10
|
|
|
|
- mtspr 8, r26 /* restore link register */
|
|
|
|
- blr
|
|
|
|
-/*
|
|
|
|
- * ACK error occurred
|
|
|
|
- */
|
|
|
|
-AckErr:
|
|
|
|
- bl spdStop
|
|
|
|
- orc r3, r0, r0 /* return -1 */
|
|
|
|
- mtspr 8, r26 /* restore link register */
|
|
|
|
- blr
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Routines to read from RAM spd.
|
|
|
|
- * r30 - GPIO Port1 address in all cases.
|
|
|
|
- * r4 - clock mask for SPD
|
|
|
|
- * r6 - port mask for SPD
|
|
|
|
- * r12 - data mask for SPD
|
|
|
|
- */
|
|
|
|
-waitSpd:
|
|
|
|
- li r0, 0x1000
|
|
|
|
- mtctr r0
|
|
|
|
-wSpd:
|
|
|
|
- bdnz wSpd
|
|
|
|
- bclr 20, 0 /* return to caller */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * establish START condition on I2C bus
|
|
|
|
- */
|
|
|
|
-spdStart:
|
|
|
|
- mfspr r27, 8 /* save link register */
|
|
|
|
- stb r6, 0(r30) /* set SDA and SCL */
|
|
|
|
- eieio
|
|
|
|
- stb r6, 1(r30) /* switch GPIO to output */
|
|
|
|
- eieio
|
|
|
|
- bl waitSpd
|
|
|
|
- stb r4, 0(r30) /* reset SDA */
|
|
|
|
- eieio
|
|
|
|
- bl waitSpd
|
|
|
|
- stb r7, 0(r30) /* reset SCL */
|
|
|
|
- eieio
|
|
|
|
- bl waitSpd
|
|
|
|
- mtspr 8, r27
|
|
|
|
- bclr 20, 0 /* return to caller */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * establish STOP condition on I2C bus
|
|
|
|
- */
|
|
|
|
-spdStop:
|
|
|
|
- mfspr r27, 8 /* save link register */
|
|
|
|
- stb r7, 0(r30) /* reset SCL and SDA */
|
|
|
|
- eieio
|
|
|
|
- stb r6, 1(r30) /* switch GPIO to output */
|
|
|
|
- eieio
|
|
|
|
- bl waitSpd
|
|
|
|
- stb r4, 0(r30) /* set SCL */
|
|
|
|
- eieio
|
|
|
|
- bl waitSpd
|
|
|
|
- stb r6, 0(r30) /* set SDA and SCL */
|
|
|
|
- eieio
|
|
|
|
- bl waitSpd
|
|
|
|
- stb r7, 1(r30) /* switch GPIO to input */
|
|
|
|
- eieio
|
|
|
|
- mtspr 8, r27
|
|
|
|
- bclr 20, 0 /* return to caller */
|
|
|
|
-
|
|
|
|
-spdReadByte:
|
|
|
|
- mfspr r27, 8
|
|
|
|
- stb r4, 1(r30) /* set GPIO for SCL output */
|
|
|
|
- eieio
|
|
|
|
- li r9, 0x08
|
|
|
|
- li r10, 0x00
|
|
|
|
-loopRB:
|
|
|
|
- stb r7, 0(r30) /* reset SDA and SCL */
|
|
|
|
- eieio
|
|
|
|
- bl waitSpd
|
|
|
|
- stb r4, 0(r30) /* set SCL */
|
|
|
|
- eieio
|
|
|
|
- bl waitSpd
|
|
|
|
- lbz r5, 0(r30) /* read from GPIO Port1 */
|
|
|
|
- rlwinm r10, r10, 1, 0, 31
|
|
|
|
- and. r5, r5, r12
|
|
|
|
- beq clearBit
|
|
|
|
- ori r10, r10, 0x01 /* append _1_ */
|
|
|
|
-clearBit:
|
|
|
|
- stb r7, 0(r30) /* reset SCL */
|
|
|
|
- eieio
|
|
|
|
- bl waitSpd
|
|
|
|
- addic. r9, r9, -1
|
|
|
|
- bne loopRB
|
|
|
|
- mtspr 8, r27
|
|
|
|
- bclr 20, 0 /* return (r10) to caller */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * spdWriteByte writes bits 24 - 31 of r10 to I2C.
|
|
|
|
- * r8 contains bit mask 0x80
|
|
|
|
- */
|
|
|
|
-spdWriteByte:
|
|
|
|
- mfspr r27, 8 /* save link register */
|
|
|
|
- li r9, 0x08 /* write octet */
|
|
|
|
- and. r5, r10, r8
|
|
|
|
- bne sWB1
|
|
|
|
- stb r7, 0(r30) /* set SDA to _0_ */
|
|
|
|
- eieio
|
|
|
|
- b sWB2
|
|
|
|
-sWB1:
|
|
|
|
- stb r12, 0(r30) /* set SDA to _1_ */
|
|
|
|
- eieio
|
|
|
|
-sWB2:
|
|
|
|
- stb r6, 1(r30) /* set GPIO to output */
|
|
|
|
- eieio
|
|
|
|
-loopWB:
|
|
|
|
- and. r5, r10, r8
|
|
|
|
- bne sWB3
|
|
|
|
- stb r7, 0(r30) /* set SDA to _0_ */
|
|
|
|
- eieio
|
|
|
|
- b sWB4
|
|
|
|
-sWB3:
|
|
|
|
- stb r12, 0(r30) /* set SDA to _1_ */
|
|
|
|
- eieio
|
|
|
|
-sWB4:
|
|
|
|
- bl waitSpd
|
|
|
|
- and. r5, r10, r8
|
|
|
|
- bne sWB5
|
|
|
|
- stb r4, 0(r30) /* set SDA to _0_ and SCL */
|
|
|
|
- eieio
|
|
|
|
- b sWB6
|
|
|
|
-sWB5:
|
|
|
|
- stb r6, 0(r30) /* set SDA to _1_ and SCL */
|
|
|
|
- eieio
|
|
|
|
-sWB6:
|
|
|
|
- bl waitSpd
|
|
|
|
- and. r5, r10, r8
|
|
|
|
- bne sWB7
|
|
|
|
- stb r7, 0(r30) /* set SDA to _0_ and reset SCL */
|
|
|
|
- eieio
|
|
|
|
- b sWB8
|
|
|
|
-sWB7:
|
|
|
|
- stb r12, 0(r30) /* set SDA to _1_ and reset SCL */
|
|
|
|
- eieio
|
|
|
|
-sWB8:
|
|
|
|
- bl waitSpd
|
|
|
|
- rlwinm r10, r10, 1, 0, 31 /* next bit */
|
|
|
|
- addic. r9, r9, -1
|
|
|
|
- bne loopWB
|
|
|
|
- mtspr 8, r27
|
|
|
|
- bclr 20, 0 /* return to caller */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Read ACK from SPD, return value in r10
|
|
|
|
- */
|
|
|
|
-spdReadAck:
|
|
|
|
- mfspr r27, 8 /* save link register */
|
|
|
|
- stb r4, 1(r30) /* set GPIO to output */
|
|
|
|
- eieio
|
|
|
|
- stb r7, 0(r30) /* reset SDA and SCL */
|
|
|
|
- eieio
|
|
|
|
- bl waitSpd
|
|
|
|
- stb r4, 0(r30) /* set SCL */
|
|
|
|
- eieio
|
|
|
|
- bl waitSpd
|
|
|
|
- lbz r10, 0(r30) /* read GPIO Port 1 and mask SDA */
|
|
|
|
- and r10, r10, r12
|
|
|
|
- bl waitSpd
|
|
|
|
- stb r7, 0(r30) /* reset SDA and SCL */
|
|
|
|
- eieio
|
|
|
|
- bl waitSpd
|
|
|
|
- mtspr 8, r27
|
|
|
|
- bclr 20, 0 /* return (r10) to caller */
|
|
|
|
-
|
|
|
|
-spdWriteAck:
|
|
|
|
- mfspr r27, 8
|
|
|
|
- stb r12, 0(r30) /* set SCL */
|
|
|
|
- eieio
|
|
|
|
- stb r6, 1(r30) /* set GPIO to output */
|
|
|
|
- eieio
|
|
|
|
- bl waitSpd
|
|
|
|
- stb r6, 0(r30) /* SDA and SCL */
|
|
|
|
- eieio
|
|
|
|
- bl waitSpd
|
|
|
|
- stb r12, 0(r30) /* reset SCL */
|
|
|
|
- eieio
|
|
|
|
- bl waitSpd
|
|
|
|
- mtspr 8, r27
|
|
|
|
- bclr 20, 0 /* return to caller */
|
|
|
|
-
|
|
|
|
-get_lnk_reg:
|
|
|
|
- mflr r3 /* return link reg */
|
|
|
|
- blr
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Messages for console output
|
|
|
|
- */
|
|
|
|
-.globl MessageBlock
|
|
|
|
-MessageBlock:
|
|
|
|
-Mok:
|
|
|
|
- .ascii "OK\015\012\000"
|
|
|
|
-Mfail:
|
|
|
|
- .ascii "FAILED\015\012\000"
|
|
|
|
-Mna:
|
|
|
|
- .ascii "NA\015\012\000"
|
|
|
|
-MinitLogo:
|
|
|
|
- .ascii "\015\012*** ELTEC Elektronik, Mainz ***\015\012"
|
|
|
|
- .ascii "\015\012Initialising RAM\015\012\000"
|
|
|
|
-Mspd01:
|
|
|
|
- .ascii " Reading SPD of bank0/1 ..... \000"
|
|
|
|
-Mspd23:
|
|
|
|
- .ascii " Reading SPD of bank2/3 ..... \000"
|
|
|
|
-MfpmRam:
|
|
|
|
- .ascii " RAM-Type: FPM \015\012\000"
|
|
|
|
-MedoRam:
|
|
|
|
- .ascii " RAM-Type: EDO \015\012\000"
|
|
|
|
-MsdRam:
|
|
|
|
- .ascii " RAM-Type: SDRAM \015\012\000"
|
|
|
|
-Mactivate:
|
|
|
|
- .ascii " Activating \000"
|
|
|
|
-Mmbyte:
|
|
|
|
- .ascii " MB .......... \000"
|
|
|
|
- .align 4
|
|
|