Update bwio for TS-7800
authorMichael Spang <mspang@csclub.uwaterloo.ca>
Wed, 10 Nov 2010 13:10:42 +0000 (08:10 -0500)
committerMichael Spang <mspang@csclub.uwaterloo.ca>
Mon, 14 Mar 2011 04:08:25 +0000 (00:08 -0400)
bwio.c
include/ts7200.h [deleted file]
include/ts7800.h [new file with mode: 0644]
ts7800.S
ts7800.ld

diff --git a/bwio.c b/bwio.c
index 897a588..ada64f4 100644 (file)
--- a/bwio.c
+++ b/bwio.c
@@ -1,87 +1,40 @@
 /*
  * bwio.c - busy-wait I/O routines for diagnosis
  *
- * Specific to the TS-7200 ARM evaluation board
+ * Specific to the TS-7800 ARM evaluation board
  *
  */
 
 #include <stdarg.h>
-#include <ts7200.h>
+#include <ts7800.h>
 #include <bwio.h>
 
-void raise(void) {}
+void raise() {}
 
 /*
- * The UARTs are initialized by RedBoot to the following state
- *     115,200 bps
- *     8 bits
- *     no parity
- *     fifos enabled
+ * UART 0 is initialized by TS-BOOTROM to the following state:
+ *      115,200 bps
+ *      8 bits
+ *      no parity
+ *      fifos enabled
  */
-int bwsetfifo(int channel, int state) {
-    volatile int *line, buf;
-    switch (channel) {
-    case COM1:
-        line = (int *)(UART1_BASE + UART_LCRH_OFFSET);
-        break;
-    case COM2:
-        line = (int *)(UART2_BASE + UART_LCRH_OFFSET);
-        break;
-    default:
-        return -1;
-        break;
-    }
-    buf = *line;
-    buf = state ? buf | FEN_MASK : buf & ~FEN_MASK;
-    *line = buf;
-    return 0;
-}
-
-int bwsetspeed(int channel, int speed) {
-    volatile int *high, *low;
-    switch (channel) {
-    case COM1:
-        high = (int *)(UART1_BASE + UART_LCRM_OFFSET);
-        low = (int *)(UART1_BASE + UART_LCRL_OFFSET);
-        break;
-    case COM2:
-        high = (int *)(UART2_BASE + UART_LCRM_OFFSET);
-        low = (int *)(UART2_BASE + UART_LCRL_OFFSET);
-        break;
-    default:
-        return -1;
-        break;
-    }
-    switch (speed) {
-    case 115200:
-        *high = 0x0;
-        *low = 0x3;
-        return 0;
-    case 2400:
-        *high = 0x0;
-        *low = 0x90;
-        return 0;
-    default:
-        return -1;
-    }
-}
 
 int bwputc(int channel, char c) {
     volatile int *flags, *data;
     switch (channel) {
     case COM1:
-        flags = (int *)(UART1_BASE + UART_FLAG_OFFSET);
-        data = (int *)(UART1_BASE + UART_DATA_OFFSET);
+        flags = (int *)(UART1_PHYS_BASE + UART_LSR_OFFSET);
+        data = (int *)(UART1_PHYS_BASE + UART_THR_OFFSET);
         break;
     case COM2:
-        flags = (int *)(UART2_BASE + UART_FLAG_OFFSET);
-        data = (int *)(UART2_BASE + UART_DATA_OFFSET);
+        flags = (int *)(UART2_PHYS_BASE + UART_LSR_OFFSET);
+        data = (int *)(UART2_PHYS_BASE + UART_THR_OFFSET);
         break;
     default:
         return -1;
         break;
     }
-    while ((*flags & TXFF_MASK)) ;
+    while (!(*flags & UART_THRE_MASK));
     *data = c;
     return 0;
 }
@@ -111,6 +64,8 @@ int bwputr(int channel, unsigned int reg) {
 }
 
 int bwputstr(int channel, char *str) {
+  bwputc(COM1, '!');
+
     while (*str) {
         if (bwputc(channel, *str) < 0)
             return -1;
@@ -137,18 +92,18 @@ int bwgetc(int channel) {
 
     switch (channel) {
     case COM1:
-        flags = (int *)(UART1_BASE + UART_FLAG_OFFSET);
-        data = (int *)(UART1_BASE + UART_DATA_OFFSET);
+        flags = (int *)(UART1_PHYS_BASE + UART_LSR_OFFSET);
+        data = (int *)(UART1_PHYS_BASE + UART_RBR_OFFSET);
         break;
     case COM2:
-        flags = (int *)(UART2_BASE + UART_FLAG_OFFSET);
-        data = (int *)(UART2_BASE + UART_DATA_OFFSET);
+        flags = (int *)(UART2_PHYS_BASE + UART_LSR_OFFSET);
+        data = (int *)(UART2_PHYS_BASE + UART_RBR_OFFSET);
         break;
     default:
         return -1;
         break;
     }
-    while (!(*flags & RXFF_MASK)) ;
+    while (!(*flags & UART_DRS_MASK)) ;
     c = *data;
     return c;
 }
diff --git a/include/ts7200.h b/include/ts7200.h
deleted file mode 100644 (file)
index 1d1196d..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * ts7200.h - definitions describing the ts7200 peripheral registers
- *
- * Specific to the TS-7200 ARM evaluation board
- *
- */
-
-#define        TIMER1_BASE     0x80810000
-#define        TIMER2_BASE     0x80810020
-#define        TIMER3_BASE     0x80810080
-
-#define        LDR_OFFSET      0x00000000      // 16/32 bits, RW
-#define        VAL_OFFSET      0x00000004      // 16/32 bits, RO
-#define CRTL_OFFSET    0x00000008      // 3 bits, RW
-#define        ENABLE_MASK     0x00000080
-#define        MODE_MASK       0x00000040
-#define        CLKSEL_MASK     0x00000008
-#define CLR_OFFSET     0x0000000c      // no data, WO
-
-#define LED_ADDRESS    0x80840020
-#define LED_NONE       0x0
-#define LED_GREEN      0x1
-#define LED_RED                0x2
-#define LED_BOTH       0x3
-
-#define COM1   0
-#define COM2   1
-
-#define IRDA_BASE      0x808b0000
-#define UART1_BASE     0x808c0000
-#define UART2_BASE     0x808d0000
-
-// All the below registers for UART1
-// First nine registers (up to Ox28) for UART 2
-
-#define UART_DATA_OFFSET       0x0     // low 8 bits
-#define DATA_MASK      0xff
-#define UART_RSR_OFFSET                0x4     // low 4 bits
-#define FE_MASK                0x1
-#define PE_MASK                0x2
-#define BE_MASK                0x4
-#define OE_MASK                0x8
-#define UART_LCRH_OFFSET       0x8     // low 7 bits
-#define BRK_MASK       0x1
-#define PEN_MASK       0x2     // parity enable
-#define EPS_MASK       0x4     // even parity
-#define STP2_MASK      0x8     // 2 stop bits
-#define FEN_MASK       0x10    // fifo
-#define WLEN_MASK      0x60    // word length
-#define UART_LCRM_OFFSET       0xc     // low 8 bits
-#define BRDH_MASK      0xff    // MSB of baud rate divisor
-#define UART_LCRL_OFFSET       0x10    // low 8 bits
-#define BRDL_MASK      0xff    // LSB of baud rate divisor
-#define UART_CTLR_OFFSET       0x14    // low 8 bits
-#define UARTEN_MASK    0x1
-#define MSIEN_MASK     0x8     // modem status int
-#define RIEN_MASK      0x10    // receive int
-#define TIEN_MASK      0x20    // transmit int
-#define RTIEN_MASK     0x40    // receive timeout int
-#define LBEN_MASK      0x80    // loopback
-#define UART_FLAG_OFFSET       0x18    // low 8 bits
-#define CTS_MASK       0x1
-#define DCD_MASK       0x2
-#define DSR_MASK       0x4
-#define TXBUSY_MASK    0x8
-#define RXFE_MASK      0x10    // Receive buffer empty
-#define TXFF_MASK      0x20    // Transmit buffer full
-#define RXFF_MASK      0x40    // Receive buffer full
-#define TXFE_MASK      0x80    // Transmit buffer empty
-#define UART_INTR_OFFSET       0x1c
-#define UART_DMAR_OFFSET       0x28
-
-// Specific to UART1
-
-#define UART_MDMCTL_OFFSET     0x100
-#define UART_MDMSTS_OFFSET     0x104
-#define UART_HDLCCTL_OFFSET    0x20c
-#define UART_HDLCAMV_OFFSET    0x210
-#define UART_HDLCAM_OFFSET     0x214
-#define UART_HDLCRIB_OFFSET    0x218
-#define UART_HDLCSTS_OFFSET    0x21c
diff --git a/include/ts7800.h b/include/ts7800.h
new file mode 100644 (file)
index 0000000..98b9fe4
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef TS7800_H
+#define TS7800_H
+
+#define UART1_PHYS_BASE 0xf1012000
+#define UART2_PHYS_BASE 0xf1012100
+
+#define UART_RBR_OFFSET 0x00
+#define UART_THR_OFFSET 0x00
+#define UART_DLL_OFFSET 0x00
+#define UART_IER_OFFSET 0x04
+#define UART_DLH_OFFSET 0x04
+#define UART_IIR_OFFSET 0x08
+#define UART_FCR_OFFSET 0x08
+#define UART_LCR_OFFSET 0x0C
+#define UART_MCR_OFFSET 0x10
+#define UART_LSR_OFFSET 0x14
+#define UART_MSR_OFFSET 0x18
+#define UART_SCR_OFFSET 0x1C
+
+/* Line Status Register */
+#define UART_DRS_MASK  0x01 /* DataRxStat */
+#define UART_ORE_MASK  0x02 /* OverRunErr */
+#define UART_PE_MASK   0x04 /* ParErr */
+#define UART_FE_MASK   0x08 /* FrameErr */
+#define UART_BI_MASK   0x10 /* BI */
+#define UART_THRE_MASK 0x20 /* THRE */
+#define UART_TE_MASK   0x40 /* TxEmpty */
+#define UART_RFE_MASK  0x80 /* RxFIFOErr */
+
+#endif
index 1b9efa6..9530a1e 100644 (file)
--- a/ts7800.S
+++ b/ts7800.S
@@ -1,5 +1,6 @@
 .global ts7800_start
 ts7800_start:
+  ldr sp, =init_stack
   bl zero_bss
   bl main
   b reboot
index 989713c..1103ddb 100644 (file)
--- a/ts7800.ld
+++ b/ts7800.ld
@@ -4,7 +4,7 @@ SECTIONS
 {
   . = 0x8000;
 
-  .text 0x8000 : /* The actual instructions. */
+  .text : /* The actual instructions. */
   {
     obj/ts7800.o(.text)
     *(.text)
@@ -31,4 +31,6 @@ SECTIONS
     *(COMMON)
     __bss_end__ = .;
   }
+
+  init_stack = 0x8000000;
 }