Allows earlier indication of boot progress by initialising the LEDs and
Serial Port while the CPU is still in 16-bit (Real) mode

Signed-off-by: Graeme Russ <graeme.r...@gmail.com>
---
 board/eNET/eNET.c           |   24 --------
 board/eNET/eNET_start.S     |    7 ++-
 board/eNET/eNET_start16.S   |  130 ++++++++++++++++++++++++++++++++++++++++++-
 board/eNET/hardware.h       |   16 +++++
 include/asm-i386/ic/sc520.h |   20 ++++++-
 5 files changed, 167 insertions(+), 30 deletions(-)

diff --git a/board/eNET/eNET.c b/board/eNET/eNET.c
index 29cf295..3dc63a8 100644
--- a/board/eNET/eNET.c
+++ b/board/eNET/eNET.c
@@ -46,14 +46,6 @@ unsigned long monitor_flash_len = CONFIG_SYS_MONITOR_LEN;
 void init_sc520_enet (void)
 {
        /* Set CPU Speed to 100MHz */
-       sc520_mmcr->cpuctl = 0x01;
-       gd->cpu_clk = 100000000;
-
-       /* wait at least one millisecond */
-       asm("movl       $0x2000,%%ecx\n"
-           "0: pushl %%ecx\n"
-           "popl       %%ecx\n"
-           "loop 0b\n": : : "ecx");
 
        /* turn on the SDRAM write buffer */
        sc520_mmcr->dbctl = 0x11;
@@ -79,14 +71,6 @@ int board_init(void)
        sc520_mmcr->gpwrw = 0x05;               /* GP Write pulse width */
        sc520_mmcr->gpwroff = 0x01;             /* GP Write offset */
 
-       sc520_mmcr->piodata15_0 = 0x0630;       /* PIO15_PIO0 Data */
-       sc520_mmcr->piodata31_16 = 0x2000;      /* PIO31_PIO16 Data */
-       sc520_mmcr->piodir31_16 = 0x2000;       /* GPIO Direction */
-       sc520_mmcr->piodir15_0 = 0x87b5;        /* GPIO Direction */
-       sc520_mmcr->piopfs31_16 = 0x0dfe;       /* GPIO pin function 31-16 reg 
*/
-       sc520_mmcr->piopfs15_0 = 0x200a;        /* GPIO pin function 15-0 reg */
-       sc520_mmcr->cspfs = 0x00f8;             /* Chip Select Pin Function 
Select */
-
        sc520_mmcr->par[2] = 0x200713f8;        /* Uart A (GPCS0, 0x013f8, 8 
Bytes) */
        sc520_mmcr->par[3] = 0x2c0712f8;        /* Uart B (GPCS3, 0x012f8, 8 
Bytes) */
        sc520_mmcr->par[4] = 0x300711f8;        /* Uart C (GPCS4, 0x011f8, 8 
Bytes) */
@@ -102,18 +86,10 @@ int board_init(void)
 /*     sc520_mmcr->par14 = 0x8bfff800; */      /* BOOTCS at  0x18000000 */
 /*     sc520_mmcr->par15 = 0x38201000; */      /* LEDs etc (GPCS6, 0x1000, 20 
Bytes */
 
-       /* Disable Watchdog */
-       sc520_mmcr->wdtmrctl = 0x3333;
-       sc520_mmcr->wdtmrctl = 0xcccc;
-       sc520_mmcr->wdtmrctl = 0x0000;
-
        /* Chip Select Configuration */
-       sc520_mmcr->bootcsctl = 0x0033;
        sc520_mmcr->romcs1ctl = 0x0615;
        sc520_mmcr->romcs2ctl = 0x0615;
 
-       sc520_mmcr->adddecctl = 0x02;
-       sc520_mmcr->uart1ctl = 0x07;
        sc520_mmcr->sysarbctl = 0x06;
        sc520_mmcr->sysarbmenb = 0x0003;
 
diff --git a/board/eNET/eNET_start.S b/board/eNET/eNET_start.S
index 1b07d62..9052935 100644
--- a/board/eNET/eNET_start.S
+++ b/board/eNET/eNET_start.S
@@ -21,12 +21,17 @@
  * MA 02111-1307 USA
  */
 
+#include <asm/ic/sc520.h>
 #include "hardware.h"
 
 /* board early intialization */
 .globl early_board_init
 early_board_init:
-       /* No 32-bit board specific initialisation */
+       /* Light up the LEDs */
+       movw    $LED_LATCH_ADDRESS, %dx
+       movb    $LED_1_BITMASK | LED_2_BITMASK, %al
+       outb    %al, %dx
+
        jmp     *%ebp           /* return to caller */
 
 .globl show_boot_progress_asm
diff --git a/board/eNET/eNET_start16.S b/board/eNET/eNET_start16.S
index 48e4d83..31b33ec 100644
--- a/board/eNET/eNET_start16.S
+++ b/board/eNET/eNET_start16.S
@@ -27,8 +27,7 @@
  * that is used by U-boot to its final destination.
  */
 
-/* #include <asm/ic/sc520_defs.h> */
-
+#include <asm/ic/sc520.h>
 #include "hardware.h"
 
 .text
@@ -45,6 +44,65 @@ board_init16:
        movw    $0xdf00, %ax
        movw    %ax, %ds
 
+       /* Disable Watchdog */
+       movl    $SC520_WDTMRCTL, %edi
+       movw    $0x3333, %ax
+       movw    %ax, (%di)
+       movw    $0xcccc, %ax
+       movw    %ax, (%di)
+       movw    $0x3333, %ax
+       movw    %ax, (%di)
+
+       /* Set CPU to 100MHz Speed */
+       movb    $0x01, %al
+       movl    $SC520_CPUCTL, %edi
+       movb    %al, (%di)
+
+       /* wait at least one millisecond */
+       movl    $0x1000,%ecx
+cpuspddelay:
+       loop    cpuspddelay
+
+       /* PIO15_PIO0 Data */
+       movl    $SC520_PIODATA15_0, %edi
+       movw    $0x0630, %ax
+       movw    %ax, (%di)
+
+       /* PIO31_PIO16 Data */
+       movl    $SC520_PIODATA31_16, %edi
+       movw    $0x2000, %ax
+       movw    %ax, (%di)
+
+       /* PIO Direction */
+       movl    $SC520_PIODIR31_16, %edi
+       movw    $0x2000, %ax
+       movw    %ax, (%di)
+
+       /* PIO Direction */
+       movl    $SC520_PIODIR15_0, %edi
+       movw    $0x87b5, %ax
+       movw    %ax, (%di)
+
+       /* PIO pin function 31-16 reg */
+       movl    $SC520_PIOPFS31_16, %edi
+       movw    $0x0dfe, %ax
+       movw    %ax, (%di)
+
+       /* PIO pin function 15-0 reg */
+       movl    $SC520_PIOPFS15_0, %edi
+       movw    $0x200a, %ax
+       movw    %ax, (%di)
+
+       /* Chip Select Pin Function Select */
+       movl    $SC520_CSPFS, %edi
+       movw    $0x00f8, %ax
+       movw    %ax, (%di)
+
+       /* Setup Chip Select for Boot Flash */
+       movl    $SC520_BOOTCSCTL, %edi
+       movw    $0x0033, %ax
+       movl    %eax, (%di)
+
        /* Map PAR for Boot Flash (BOOTCS, 512kB @ 0x380000000) */
        movl    $0x00c0, %edi           /* SC520_PAR14 */
        movl    $0x8bfff800, %eax       /* TODO: Check this */
@@ -60,6 +118,74 @@ board_init16:
        xorw    %ax, %ax
        movb    %al, (%di)
 
+       /* Enable UART 1 */
+       movl    $SC520_ADDDECCTL, %edi
+       movb    $0x02, %al
+       movb    %al, (%di)
+
+       /* Configure UART 1 - 9600 Baud 8N1 */
+       movl    $SC520_UART1CTL, %edi
+       movb    $0x07, %al
+       movb    %al, (%di)
+
+       /* Set DLAB bit */
+       movw    $(UART0_BASE + UART_LCR), %dx
+       movb    $0x80, %al
+       outb    %al, %dx
+
+       /* Set baudrate divisor (LSB) */
+       movw    $(UART0_BASE + UART_DLL), %dx
+       movb    $0x0c, %al
+       outb    %al, %dx
+
+       /* Set baudrate divisor (MSB) */
+       movw    $(UART0_BASE + UART_DLM), %dx
+       movb    $0x00, %al
+       outb    %al, %dx
+
+       /* clear DLAB; set 8 bits, no parity */
+       movw    $(UART0_BASE + UART_LCR), %dx
+       movb    $0x03, %al
+       outb    %al, %dx
+
+       /* enable FIFO */
+       movw    $(UART0_BASE + UART_FCR), %dx
+       movb    $0x01, %al
+       outb    %al, %dx
+
+       /* Set DTR and RTS active */
+       movw    $(UART0_BASE + UART_MCR), %dx
+       movb    $0x0b, %al
+       outb    %al, %dx
+
+       /* clear line status */
+       movw    $(UART0_BASE + UART_LSR), %dx
+       inb     %dx, %al
+
+       /* read receive buffer */
+       movw    $(UART0_BASE + UART_RBR), %dx
+       inb     %dx, %al
+
+       /* set scratchpad */
+       movw    $(UART0_BASE + UART_SCR), %dx
+       movb    $0x00, %al
+       outb    %al, %dx
+
+       /* Disable Interrupts */
+       movw    $(UART0_BASE + UART_IER), %dx
+       movb    $0x00, %al
+       outb    %al, %dx
+
+       /* wait for the UART clock to settle */
+       movl    $0x10000,%ecx
+uartdelay:
+       loop    uartdelay
+
+       /* Light up the LEDs */
+       movw    $LED_LATCH_ADDRESS, %dx
+       movb    $LED_1_BITMASK, %al
+       outb    %al, %dx
+
        /* Disabe MMCR alias */
        movw    $0xfffc, %dx
        movl    $0x000000cb, %eax
diff --git a/board/eNET/hardware.h b/board/eNET/hardware.h
index 42474a6..5a8ae40 100644
--- a/board/eNET/hardware.h
+++ b/board/eNET/hardware.h
@@ -32,4 +32,20 @@
 #define LED_TX_BITMASK         0x10
 #define LED_ERR_BITMASK                0x20
 
+/* Serial Port Definitions */
+#define UART0_BASE             0x3f8
+
+#define UART_RBR               0x00
+#define UART_THR               0x00
+#define UART_IER               0x01
+#define UART_IIR               0x02
+#define UART_FCR               0x02
+#define UART_LCR               0x03
+#define UART_MCR               0x04
+#define UART_LSR               0x05
+#define UART_MSR               0x06
+#define UART_SCR               0x07
+#define UART_DLL               0x00
+#define UART_DLM               0x01
+
 #endif /* HARDWARE_H_ */
diff --git a/include/asm-i386/ic/sc520.h b/include/asm-i386/ic/sc520.h
index 57c9904..723e38f 100644
--- a/include/asm-i386/ic/sc520.h
+++ b/include/asm-i386/ic/sc520.h
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright 2002
- * Daniel Engström, Omicron Ceti AB <dan...@omicron.se>.
+ * Daniel Engstr�m, Omicron Ceti AB <dan...@omicron.se>.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -134,7 +134,8 @@ typedef struct sc520_mmcr {
        u16 gptmr0cnt;          /* GP timer 0 count */
        u16 gptmr0maxcmpa;      /* GP timer 0 maxcount compare A */
        u16 gptmr0maxcmpb;      /* GP timer 0 maxcount compare B */
-       u16 gptmr1ctl;          /* GP timer 1 mode/control */
+       u16 gptmr1ctl;          /*#define SC520_SWTMRMILLI      0x
+        GP timer 1 mode/control */
        u16 gptmr1cnt;          /* GP timer 1 count */
        u16 gptmr1maxcmpa;      /* GP timer 1 maxcount compare A */
        u16 gptmr1maxcmpb;      /* GP timer 1 maxcount compare B*/
@@ -223,7 +224,8 @@ typedef struct sc520_mmcr {
        u8  pad_0xd8d[0x03];
        u8  gpdmaexttc3;        /* GP-DMA channel 3 extender transfer count */
        u8  gpdmaexttc5;        /* GP-DMA channel 5 extender transfer count */
-       u8  gpdmaexttc6;        /* GP-DMA channel 6 extender transfer count */
+       u8  gpdmaexttc6;        /* GP-DMA ch+#define SC520_CPUCTL               
0x0001
+       annel 6 extender transfer count */
        u8  gpdmaexttc7;        /* GP-DMA channel 7 extender transfer count */
        u8  pad_0xd94[0x4];
        u8  gpdmabcctl;         /* buffer chaining control */
@@ -256,11 +258,23 @@ extern volatile sc520_mmcr_t *sc520_mmcr;
 #endif
 
 /* MMCR Offsets (required for assembler code */
+#define SC520_CPUCTL           0x0001  /* CPU Control */
 #define SC520_DBCTL            0x0040  /* SDRAM Buffer Control Register */
+#define SC520_BOOTCSCTL                0x0050  /* BOOT Flaash Chip Select 
Control */
+#define SC520_ADDDECCTL                0x0080  /* Address Decode Control */
 #define SC520_PAR14            0x00c0  /* Programmable Address Region 14 
Register */
 #define SC520_PAR15            0x00c4  /* Programmable Address Region 15 
Register */
+#define SC520_PIOPFS15_0       0x0c20  /* GPIO pin function 15-0 reg */
+#define SC520_PIOPFS31_16      0x0c22  /* GPIO pin function 31-16 reg */
+#define SC520_CSPFS            0x0c24  /* Chip Select Pin Function Select */
+#define SC520_PIODIR15_0       0x0c2a  /* GPIO Direction */
+#define SC520_PIODIR31_16      0x0c2c  /* GPIO Direction */
+#define SC520_PIODATA15_0      0x0c30  /* PIO15_PIO0 Data */
+#define SC520_PIODATA31_16     0x0c32  /* PIO31_PIO16 Data */
 #define SC520_SWTMRMILLI       0x0c60  /* Software Timer Millisecond Count */
 #define SC520_SWTMRMICRO       0x0c62  /* Software Timer Microsecond Count */
+#define SC520_WDTMRCTL         0x0cb0  /* Watchdog Timer Control */
+#define SC520_UART1CTL         0x0cc0  /* UART 1 Control */
 
 /* MMCR Register bits (not all of them :) ) */
 
-- 
1.6.0.2.GIT

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to