]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/trab/trab.c
Merge branch 'master' of git://git.denx.de/u-boot-ti
[karo-tx-uboot.git] / board / trab / trab.c
index e3e8553eb79930e0af021cf64286cf63210f9d8d..828facd763e1db4b7aae667b333194c25a431300 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright 2002
- * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
+ * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
  *
  * See file CREDITS for list of people who contributed to this
  * project.
 /* #define DEBUG */
 
 #include <common.h>
-#include <cmd_bsp.h>
+#include <netdev.h>
 #include <malloc.h>
-#include <s3c2400.h>
+#include <asm/arch/s3c24x0_cpu.h>
+#include <command.h>
 
-/* ------------------------------------------------------------------------- */
+DECLARE_GLOBAL_DATA_PTR;
 
-#ifdef CFG_BRIGHTNESS
+#ifdef CONFIG_SYS_BRIGHTNESS
 static void spi_init(void);
 static void wait_transmit_done(void);
-static void tsc2000_write(unsigned int page, unsigned int reg, 
+static void tsc2000_write(unsigned int page, unsigned int reg,
                                                  unsigned int data);
 static void tsc2000_set_brightness(void);
 #endif
@@ -52,12 +53,10 @@ extern int do_mdm_init; /* defined in common/main.c */
 #define KBD_MDELAY     5000
 static void udelay_no_timer (int usec)
 {
-       DECLARE_GLOBAL_DATA_PTR;
-
        int i;
        int delay = usec * 3;
 
-       for (i = 0; i < delay; i ++) gd->bd->bi_arch_number = 145;
+       for (i = 0; i < delay; i ++) gd->bd->bi_arch_number = MACH_TYPE_TRAB;
 }
 #endif /* CONFIG_MODEM_SUPPORT */
 
@@ -70,50 +69,53 @@ int board_init ()
 #if defined(CONFIG_VFD)
        extern int vfd_init_clocks(void);
 #endif
-       DECLARE_GLOBAL_DATA_PTR;
+       struct s3c24x0_clock_power * const clk_power =
+                                       s3c24x0_get_base_clock_power();
+       struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio();
 
        /* memory and cpu-speed are setup before relocation */
 #ifdef CONFIG_TRAB_50MHZ
        /* change the clock to be 50 MHz 1:1:1 */
        /* MDIV:0x5c PDIV:4 SDIV:2 */
-       rMPLLCON = 0x5c042;
-       rCLKDIVN = 0;
+       clk_power->MPLLCON = 0x5c042;
+       clk_power->CLKDIVN = 0;
 #else
        /* change the clock to be 133 MHz 1:2:4 */
        /* MDIV:0x7d PDIV:4 SDIV:1 */
-       rMPLLCON = 0x7d041;
-       rCLKDIVN = 3;
+       clk_power->MPLLCON = 0x7d041;
+       clk_power->CLKDIVN = 3;
 #endif
 
        /* set up the I/O ports */
-       rPACON = 0x3ffff;
-       rPBCON = 0xaaaaaaaa;
-       rPBUP  = 0xffff;
+       gpio->PACON = 0x3ffff;
+       gpio->PBCON = 0xaaaaaaaa;
+       gpio->PBUP  = 0xffff;
        /* INPUT nCTS0 nRTS0 TXD[1] TXD[0] RXD[1] RXD[0]        */
-       /*  00,    10,      10,      10,      10,      10,      10      */
-       rPFCON = (2<<0) | (2<<2) | (2<<4) | (2<<6) | (2<<8) | (2<<10);
+       /*  00,    10,      10,      10,      10,      10,      10      */
+       gpio->PFCON = (2<<0) | (2<<2) | (2<<4) | (2<<6) | (2<<8) | (2<<10);
 #ifdef CONFIG_HWFLOW
        /* do not pull up RXD0, RXD1, TXD0, TXD1, CTS0, RTS0 */
-       rPFUP  = (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4) | (1<<5);
+       gpio->PFUP  = (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4) | (1<<5);
 #else
        /* do not pull up RXD0, RXD1, TXD0, TXD1 */
-       rPFUP  = (1<<0) | (1<<1) | (1<<2) | (1<<3);
+       gpio->PFUP  = (1<<0) | (1<<1) | (1<<2) | (1<<3);
 #endif
-       rPGCON = 0x0;
-       rPGUP  = 0x0;
-       rOPENCR= 0x0;
+       gpio->PGCON = 0x0;
+       gpio->PGUP  = 0x0;
+       gpio->OPENCR= 0x0;
+
+       /* suppress flicker of the VFDs */
+       gpio->MISCCR = 0x40;
+       gpio->PFCON |= (2<<12);
 
-       /* arch number of SAMSUNG-Board */
-       /* MACH_TYPE_SMDK2400 */
-       /* XXX this isn't really correct, but keep it for now */
-       gd->bd->bi_arch_number = 145;
+       gd->bd->bi_arch_number = MACH_TYPE_TRAB;
 
        /* adress of boot parameters */
        gd->bd->bi_boot_params = 0x0c000100;
 
        /* Make sure both buzzers are turned off */
-       rPDCON |= 0x5400;
-       rPDDAT &= ~0xE0;
+       gpio->PDCON |= 0x5400;
+       gpio->PDDAT &= ~0xE0;
 
 #ifdef CONFIG_VFD
        vfd_init_clocks();
@@ -128,13 +130,16 @@ int board_init ()
        }
 #endif /* CONFIG_MODEM_SUPPORT */
 
+#ifdef CONFIG_DRIVER_S3C24X0_I2C
+       /* Configure I/O ports PG5 und PG6 for I2C */
+       gpio->PGCON = (gpio->PGCON & 0x003c00) | 0x003c00;
+#endif /* CONFIG_DRIVER_S3C24X0_I2C */
+
        return 0;
 }
 
 int dram_init (void)
 {
-       DECLARE_GLOBAL_DATA_PTR;
-
        gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
        gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
        return 0;
@@ -149,15 +154,36 @@ int dram_init (void)
 
 #define KBD_DATA       (((*(volatile ulong *)0x04020000) >> 16) & 0xF)
 
-static uchar *key_match (ulong);
+static char *key_match (ulong);
 
 int misc_init_r (void)
 {
        ulong kbd_data = KBD_DATA;
-       uchar keybd_env[KEYBD_KEY_NUM + 1];
-       uchar *str;
+       char *str;
+       char keybd_env[KEYBD_KEY_NUM + 1];
        int i;
 
+#ifdef CONFIG_VERSION_VARIABLE
+       {
+               /* Set version variable. Please note, that this variable is
+                * also set in main_loop() later in the boot process. The
+                * version variable has to be set this early, because so it
+                * could be used in script files on an usb stick, which
+                * might be called during do_auto_update() */
+               extern char version_string[];
+
+               setenv ("ver", version_string);
+       }
+#endif /* CONFIG_VERSION_VARIABLE */
+
+#ifdef CONFIG_AUTO_UPDATE
+       {
+               extern int do_auto_update(void);
+               /* this has priority over all else */
+               do_auto_update();
+       }
+#endif
+
        for (i = 0; i < KEYBD_KEY_NUM; ++i) {
                keybd_env[i] = '0' + ((kbd_data >> i) & 1);
        }
@@ -175,7 +201,7 @@ int misc_init_r (void)
                free (str);
        }
 
-#ifdef CFG_BRIGHTNESS
+#ifdef CONFIG_SYS_BRIGHTNESS
        tsc2000_set_brightness();
 #endif
        return (0);
@@ -186,7 +212,7 @@ int misc_init_r (void)
 static uchar kbd_magic_prefix[] = "key_magic";
 static uchar kbd_command_prefix[] = "key_cmd";
 
-static int compare_magic (ulong kbd_data, uchar *str)
+static int compare_magic (ulong kbd_data, char *str)
 {
        uchar key_mask;
 
@@ -232,12 +258,12 @@ static int compare_magic (ulong kbd_data, uchar *str)
  * Note: the string points to static environment data and must be
  * saved before you call any function that modifies the environment.
  */
-static uchar *key_match (ulong kbd_data)
+static char *key_match (ulong kbd_data)
 {
-       uchar magic[sizeof (kbd_magic_prefix) + 1];
-       uchar cmd_name[sizeof (kbd_command_prefix) + 1];
-       uchar *suffix;
-       uchar *kbd_magic_keys;
+       char magic[sizeof (kbd_magic_prefix) + 1];
+       char cmd_name[sizeof (kbd_command_prefix) + 1];
+       char *suffix;
+       char *kbd_magic_keys;
 
        /*
         * The following string defines the characters that can pe appended
@@ -279,10 +305,10 @@ static uchar *key_match (ulong kbd_data)
 #endif                                                 /* CONFIG_PREBOOT */
 
 /* Read Keyboard status */
-int do_kbd (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+int do_kbd (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
 {
        ulong kbd_data = KBD_DATA;
-       uchar keybd_env[KEYBD_KEY_NUM + 1];
+       char keybd_env[KEYBD_KEY_NUM + 1];
        int i;
 
        puts ("Keys:");
@@ -296,6 +322,12 @@ int do_kbd (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
        return 0;
 }
 
+U_BOOT_CMD(
+       kbd,    1,      1,      do_kbd,
+       "read keyboard status",
+       ""
+);
+
 #ifdef CONFIG_MODEM_SUPPORT
 static int key_pressed(void)
 {
@@ -303,73 +335,101 @@ static int key_pressed(void)
 }
 #endif /* CONFIG_MODEM_SUPPORT */
 
-#ifdef CFG_BRIGHTNESS
+#ifdef CONFIG_SYS_BRIGHTNESS
+
+static inline void SET_CS_TOUCH(void)
+{
+       struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio();
+
+       gpio->PDDAT &= 0x5FF;
+}
 
-#define SET_CS_TOUCH        (rPDDAT &= 0x5FF)
-#define CLR_CS_TOUCH        (rPDDAT |= 0x200)
+static inline void CLR_CS_TOUCH(void)
+{
+       struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio();
+
+       gpio->PDDAT |= 0x200;
+}
 
 static void spi_init(void)
 {
+       struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio();
+       struct s3c24x0_spi * const spi = s3c24x0_get_base_spi();
        int i;
 
        /* Configure I/O ports. */
-       rPDCON = (rPDCON & 0xF3FFFF) | 0x040000;
-       rPGCON = (rPGCON & 0x0F3FFF) | 0x008000;
-       rPGCON = (rPGCON & 0x0CFFFF) | 0x020000;
-       rPGCON = (rPGCON & 0x03FFFF) | 0x080000;
+       gpio->PDCON = (gpio->PDCON & 0xF3FFFF) | 0x040000;
+       gpio->PGCON = (gpio->PGCON & 0x0F3FFF) | 0x008000;
+       gpio->PGCON = (gpio->PGCON & 0x0CFFFF) | 0x020000;
+       gpio->PGCON = (gpio->PGCON & 0x03FFFF) | 0x080000;
 
-       CLR_CS_TOUCH;
+       CLR_CS_TOUCH();
 
-       rSPPRE = 0x1F; /* Baudrate ca. 514kHz */
-       rSPPIN = 0x01;  /* SPI-MOSI holds Level after last bit */
-       rSPCON = 0x1A;  /* Polling, Prescaler, Master, CPOL=0, CPHA=1 */
+       spi->ch[0].SPPRE = 0x1F; /* Baudrate ca. 514kHz */
+       spi->ch[0].SPPIN = 0x01;  /* SPI-MOSI holds Level after last bit */
+       spi->ch[0].SPCON = 0x1A;  /* Polling, Prescaler, Master, CPOL=0, CPHA=1 */
 
        /* Dummy byte ensures clock to be low. */
        for (i = 0; i < 10; i++) {
-               rSPTDAT = 0xFF;
+               spi->ch[0].SPTDAT = 0xFF;
        }
+       wait_transmit_done();
 }
 
 static void wait_transmit_done(void)
 {
-       while (!(rSPSTA & 0x01)); /* wait until transfer is done */
+       struct s3c24x0_spi * const spi = s3c24x0_get_base_spi();
+
+       while (!(spi->ch[0].SPSTA & 0x01)); /* wait until transfer is done */
 }
 
-static void tsc2000_write(unsigned int page, unsigned int reg, 
+static void tsc2000_write(unsigned int page, unsigned int reg,
                                                  unsigned int data)
 {
+       struct s3c24x0_spi * const spi = s3c24x0_get_base_spi();
        unsigned int command;
 
-       SET_CS_TOUCH;
+       SET_CS_TOUCH();
        command = 0x0000;
        command |= (page << 11);
        command |= (reg << 5);
 
-       rSPTDAT = (command & 0xFF00) >> 8;
+       spi->ch[0].SPTDAT = (command & 0xFF00) >> 8;
        wait_transmit_done();
-       rSPTDAT = (command & 0x00FF);
+       spi->ch[0].SPTDAT = (command & 0x00FF);
        wait_transmit_done();
-       rSPTDAT = (data & 0xFF00) >> 8;
+       spi->ch[0].SPTDAT = (data & 0xFF00) >> 8;
        wait_transmit_done();
-       rSPTDAT = (data & 0x00FF);
+       spi->ch[0].SPTDAT = (data & 0x00FF);
        wait_transmit_done();
 
-       CLR_CS_TOUCH;
+       CLR_CS_TOUCH();
 }
 
 static void tsc2000_set_brightness(void)
 {
-       uchar tmp[10];
+       char tmp[10];
        int i, br;
 
        spi_init();
        tsc2000_write(1, 2, 0x0); /* Power up DAC */
 
-       i = getenv_r("brightness", tmp, sizeof(tmp));
+       i = getenv_f("brightness", tmp, sizeof(tmp));
        br = (i > 0)
                ? (int) simple_strtoul (tmp, NULL, 10)
-               : CFG_BRIGHTNESS;
+               : CONFIG_SYS_BRIGHTNESS;
 
        tsc2000_write(0, 0xb, br & 0xff);
 }
 #endif
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+       int rc = 0;
+#ifdef CONFIG_CS8900
+       rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+       return rc;
+}
+#endif