* Make sure Block Lock Bits get cleared in R360MPI flash driver
* MPC823 LCD driver: Fill color map backwards, to allow for steady
display when Linux takes over
* Patch by Erwin Rol, 27 Feb 2003:
Add support for RTEMS (this time for real).
* Add support for "bmp info" and "bmp display" commands to load
bitmap images; this can be used (for example in a "preboot"
command) to display a splash screen very quickly after poweron.
* Add support for 133 MHz clock on INCA-IP board
diff --git a/CHANGELOG b/CHANGELOG
index 1993072..e9ab66f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,20 @@
Changes since U-Boot 0.3.0:
======================================================================
+* Make sure Block Lock Bits get cleared in R360MPI flash driver
+
+* MPC823 LCD driver: Fill color map backwards, to allow for steady
+ display when Linux takes over
+
+* Patch by Erwin Rol, 27 Feb 2003:
+ Add support for RTEMS (this time for real).
+
+* Add support for "bmp info" and "bmp display" commands to load
+ bitmap images; this can be used (for example in a "preboot"
+ command) to display a splash screen very quickly after poweron.
+
+* Add support for 133 MHz clock on INCA-IP board
+
* Patch by Lutz Dennig, 10 Apr 2003:
Update for R360MPI board
diff --git a/CREDITS b/CREDITS
index 8959ff5f..74b0f9e 100644
--- a/CREDITS
+++ b/CREDITS
@@ -238,6 +238,10 @@
E: stefan.roese@esd-electronics.com
D: IBM PPC401/403/405GP Support; Windows environment support
+N: Erwin Rol
+E: erwin@muffin.org
+D: boot support for RTEMS
+
N: Neil Russell
E: caret@c-side.com
D: Author of LiMon-1.4.2, which contributed some ideas
diff --git a/README b/README
index ca5c047..dcc4a7a 100644
--- a/README
+++ b/README
@@ -789,6 +789,18 @@
Normally display is black on white background; define
CFG_WHITE_ON_BLACK to get it inverted.
+- Spash Screen Support: CONFIG_SPLASH_SCREEN
+
+ If this option is set, the environment is checked for
+ a variable "splashimage". If found, the usual display
+ of logo, copyright and system information on the LCD
+ is supressed and the BMP image at the address
+ specified in "splashimage" is loaded instead. The
+ console is redirected to the "nulldev", too. This
+ allows for a "silent" boot where a splash screen is
+ loaded very quickly after power-on.
+
+
- Ethernet address:
CONFIG_ETHADDR
CONFIG_ETH2ADDR
diff --git a/board/incaip/memsetup.S b/board/incaip/memsetup.S
index 0d4de5a..f1afb5c 100644
--- a/board/incaip/memsetup.S
+++ b/board/incaip/memsetup.S
@@ -49,13 +49,11 @@
#define MC_LATENCY(value) 0x1038(value)
#define MC_TREFRESH(value) 0x1040(value)
-#if CPU_CLOCK_RATE==150000000 /* 150 MHz clock for the MIPS core */
#define CGU_MODUL_BASE 0xBF107000
#define CGU_PLL1CR(value) 0x0008(value)
#define CGU_DIVCR(value) 0x0010(value)
#define CGU_MUXCR(value) 0x0014(value)
#define CGU_PLL1SR(value) 0x000C(value)
-#endif
.globl memsetup
memsetup:
@@ -67,12 +65,12 @@
li t1, 0xA0000041
sw t1, EBU_ADDSEL0(t0)
-#if CPU_CLOCK_RATE==150000000 /* 150 MHz clock for the MIPS core */
- li t1, 0xA841417E
- sw t1, EBU_BUSCON0(t0) /* value set up by magic flash word */
+#if CPU_CLOCK_RATE==100000000 /* 100 MHz clock for the MIPS core */
+ lw t1, EBU_BUSCON0(t0) /* value set up by magic flash word */
sw t1, EBU_BUSCON2(t0)
-#else /* 100 MHz */
- lw t1, EBU_BUSCON0(t0) /* value set up by magic flash word */
+#else /* 150 MHz or 133 MHz */
+ li t1, 0x8841417E
+ sw t1, EBU_BUSCON0(t0)
sw t1, EBU_BUSCON2(t0)
#endif
@@ -85,10 +83,10 @@
li t1, 0xBE0000F1
sw t1, EBU_ADDSEL1(t0)
-#if CPU_CLOCK_RATE==150000000 /* 150 MHz clock for the MIPS core */
- li t1, 0x684143FD
-#else /* 100 MHz */
+#if CPU_CLOCK_RATE==100000000 /* 100 MHz clock for the MIPS core */
li t1, 0x684142BD
+#else /* 150 MHz or 133 MHz */
+ li t1, 0x684143FD
#endif
sw t1, EBU_BUSCON1(t0)
@@ -105,6 +103,14 @@
beq t1, zero, b1
li t1, 0x80000001
sw t1, CGU_MUXCR(t0)
+#elif CPU_CLOCK_RATE==133000000 /* 133 MHz clock for the MIPS core */
+ li t0, CGU_MODUL_BASE
+ li t1, 0x80000054
+ sw t1, CGU_DIVCR(t0)
+ li t1, 0x80000000
+ sw t1, CGU_MUXCR(t0)
+ li t1, 0x800B0001
+ sw t1, CGU_PLL1CR(t0)
#endif
/* SDRAM Initialization.
diff --git a/board/r360mpi/flash.c b/board/r360mpi/flash.c
index e38dfcc..fef483c 100644
--- a/board/r360mpi/flash.c
+++ b/board/r360mpi/flash.c
@@ -206,6 +206,12 @@
{
FPW value;
+ /* Make sure Block Lock Bits get cleared */
+ addr[0] = (FPW) 0x00FF00FF;
+ addr[0] = (FPW) 0x00600060;
+ addr[0] = (FPW) 0x00D000D0;
+ addr[0] = (FPW) 0x00FF00FF;
+
/* Write auto select command: read Manufacturer ID */
addr[0x5555] = (FPW) 0x00AA00AA;
addr[0x2AAA] = (FPW) 0x00550055;
diff --git a/board/r360mpi/r360mpi.c b/board/r360mpi/r360mpi.c
index 91e3234..d7b8873 100644
--- a/board/r360mpi/r360mpi.c
+++ b/board/r360mpi/r360mpi.c
@@ -126,12 +126,12 @@
memctl->memc_mar = 0x00000088;
/*
- * Map controller bank 2 to the SDRAM bank at
+ * Map controller bank 1 to the SDRAM bank at
* preliminary address - these have to be modified after the
* SDRAM size has been determined.
*/
- memctl->memc_or2 = CFG_OR2_PRELIM;
- memctl->memc_br2 = CFG_BR2_PRELIM;
+ memctl->memc_or1 = CFG_OR1_PRELIM;
+ memctl->memc_br1 = CFG_BR1_PRELIM;
memctl->memc_mamr = CFG_MAMR_8COL & (~(MAMR_PTAE)); /* no refresh yet */
@@ -139,9 +139,9 @@
/* perform SDRAM initializsation sequence */
- memctl->memc_mcr = 0x80004105; /* SDRAM bank 0 */
+ memctl->memc_mcr = 0x80002105; /* SDRAM bank 0 */
udelay (200);
- memctl->memc_mcr = 0x80004230; /* SDRAM bank 0 - execute twice */
+ memctl->memc_mcr = 0x80002230; /* SDRAM bank 0 - execute twice */
udelay (200);
memctl->memc_mamr |= MAMR_PTAE; /* enable refresh */
@@ -153,7 +153,7 @@
*
* try 8 column mode
*/
- size8 = dram_size (CFG_MAMR_8COL, (ulong *) SDRAM_BASE2_PRELIM,
+ size8 = dram_size (CFG_MAMR_8COL, (ulong *) SDRAM_BASE1_PRELIM,
SDRAM_MAX_SIZE);
udelay (1000);
@@ -161,13 +161,13 @@
/*
* try 9 column mode
*/
- size9 = dram_size (CFG_MAMR_9COL, (ulong *) SDRAM_BASE2_PRELIM,
+ size9 = dram_size (CFG_MAMR_9COL, (ulong *) SDRAM_BASE1_PRELIM,
SDRAM_MAX_SIZE);
if (size8 < size9) { /* leave configuration at 9 columns */
size_b0 = size9;
/* debug ("SDRAM Bank 0 in 9 column mode: %ld MB\n", size >> 20); */
- } else { /* back to 8 columns */
+ } else { /* back to 8 columns */
size_b0 = size8;
memctl->memc_mamr = CFG_MAMR_8COL;
udelay (500);
@@ -200,47 +200,6 @@
udelay (10000);
-#ifdef CONFIG_CAN_DRIVER
- /* Initialize OR3 / BR3 */
- memctl->memc_or3 = CFG_OR3_CAN; /* switch GPLB_5 to GPLA_5 */
- memctl->memc_br3 = CFG_BR3_CAN;
-
- /* Initialize MBMR */
- memctl->memc_mbmr = MAMR_GPL_B4DIS; /* GPL_B4 works as UPWAITB */
-
- /* Initialize UPMB for CAN: single read */
- memctl->memc_mdr = 0xFFFFC004;
- memctl->memc_mcr = 0x0100 | UPMB;
-
- memctl->memc_mdr = 0x0FFFD004;
- memctl->memc_mcr = 0x0101 | UPMB;
-
- memctl->memc_mdr = 0x0FFFC000;
- memctl->memc_mcr = 0x0102 | UPMB;
-
- memctl->memc_mdr = 0x3FFFC004;
- memctl->memc_mcr = 0x0103 | UPMB;
-
- memctl->memc_mdr = 0xFFFFDC05;
- memctl->memc_mcr = 0x0104 | UPMB;
-
- /* Initialize UPMB for CAN: single write */
- memctl->memc_mdr = 0xFFFCC004;
- memctl->memc_mcr = 0x0118 | UPMB;
-
- memctl->memc_mdr = 0xCFFCD004;
- memctl->memc_mcr = 0x0119 | UPMB;
-
- memctl->memc_mdr = 0x0FFCC000;
- memctl->memc_mcr = 0x011A | UPMB;
-
- memctl->memc_mdr = 0x7FFCC004;
- memctl->memc_mcr = 0x011B | UPMB;
-
- memctl->memc_mdr = 0xFFFDCC05;
- memctl->memc_mcr = 0x011C | UPMB;
-#endif
-
return (size_b0);
}
@@ -254,8 +213,8 @@
* - short between data lines
*/
-static long int dram_size (long int mamr_value,
- long int *base, long int maxsize)
+static long int dram_size (long int mamr_value, long int *base,
+ long int maxsize)
{
volatile immap_t *immap = (immap_t *) CFG_IMMR;
volatile memctl8xx_t *memctl = &immap->im_memctl;
@@ -298,10 +257,10 @@
/* ------------------------------------------------------------------------- */
-void r360_i2c_lcd_write (uchar data0, uchar data1)
+void r360_pwm_write (uchar reg, uchar val)
{
- if (i2c_write (CFG_I2C_LCD_ADDR, data0, 1, &data1, 1)) {
- printf("Can't write lcd data 0x%02X 0x%02X.\n", data0, data1);
+ if (i2c_write (CFG_I2C_PWM_ADDR, reg, 1, &val, 1)) {
+ printf ("Can't write PWM register 0x%02X.\n", reg);
}
}
@@ -312,8 +271,10 @@
*/
/* Number of bytes returned from Keyboard Controller */
-#define KEYBD_KEY_MAX 16 /* maximum key number */
-#define KEYBD_DATALEN ((KEYBD_KEY_MAX + 7) / 8) /* normal key scan data */
+#define KEYBD_KEY_MAX 20 /* maximum key number */
+#define KEYBD_DATALEN ((KEYBD_KEY_MAX + 7) / 8) /* normal key scan data */
+
+static uchar kbd_addr = CFG_I2C_KBD_ADDR;
static uchar *key_match (uchar *);
@@ -326,14 +287,14 @@
i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE);
- i2c_read (CFG_I2C_KEY_ADDR, 0, 0, kbd_data, KEYBD_DATALEN);
+ i2c_read (kbd_addr, 0, 0, kbd_data, KEYBD_DATALEN);
for (i = 0; i < KEYBD_DATALEN; ++i) {
sprintf (keybd_env + i + i, "%02X", kbd_data[i]);
}
setenv ("keybd", keybd_env);
- str = strdup (key_match (keybd_env)); /* decode keys */
+ str = strdup (key_match (kbd_data)); /* decode keys */
#ifdef CONFIG_PREBOOT /* automatically configure "preboot" command on key match */
setenv ("preboot", str); /* set or delete definition */
@@ -363,13 +324,16 @@
static uchar kbd_magic_prefix[] = "key_magic";
static uchar kbd_command_prefix[] = "key_cmd";
-static uchar *key_match (uchar * kbd_str)
+static uchar *key_match (uchar * kbd_data)
{
+ uchar compare[KEYBD_DATALEN];
uchar magic[sizeof (kbd_magic_prefix) + 1];
uchar cmd_name[sizeof (kbd_command_prefix) + 1];
- uchar *str, *suffix;
+ uchar key_mask;
+ uchar *str, *nxt, *suffix;
uchar *kbd_magic_keys;
char *cmd;
+ int i;
/*
* The following string defines the characters that can pe appended
@@ -379,48 +343,62 @@
* "key_magic" is checked (old behaviour); the string "125" causes
* checks for "key_magic1", "key_magic2" and "key_magic5", etc.
*/
- if ((kbd_magic_keys = getenv ("magic_keys")) != NULL) {
- /* loop over all magic keys;
- * use '\0' suffix in case of empty string
- */
- for (suffix = kbd_magic_keys;
- *suffix || suffix == kbd_magic_keys;
- ++suffix) {
- sprintf (magic, "%s%c", kbd_magic_prefix, *suffix);
+ if ((kbd_magic_keys = getenv ("magic_keys")) == NULL)
+ kbd_magic_keys = "";
+ /* loop over all magic keys;
+ * use '\0' suffix in case of empty string
+ */
+ for (suffix=kbd_magic_keys; *suffix || suffix==kbd_magic_keys; ++suffix) {
+ sprintf (magic, "%s%c", kbd_magic_prefix, *suffix);
#if 0
- printf ("### Check magic \"%s\"\n", magic);
+ printf ("### Check magic \"%s\"\n", magic);
#endif
- if ((str = getenv (magic)) != 0) {
+ memcpy(compare, kbd_data, KEYBD_DATALEN);
-#if 0
- printf ("### Compare \"%s\" \"%s\"\n",
- kbd_str, str);
-#endif
- if (strcmp (kbd_str, str) == 0) {
- sprintf (cmd_name, "%s%c",
- kbd_command_prefix,
- *suffix);
+ for (str = getenv(magic); str != NULL; str = (*nxt) ? nxt+1 : nxt) {
+ uchar c;
+
+ c = (uchar) simple_strtoul (str, (char **) (&nxt), 16);
+
+ if (str == nxt) /* invalid character */
+ break;
+
+ if (c >= KEYBD_KEY_MAX) /* bad key number */
+ goto next_magic;
+
+ key_mask = 0x80 >> (c % 8);
- if ((cmd = getenv (cmd_name)) != 0) {
+ if (!(compare[c / 8] & key_mask)) /* key not pressed */
+ goto next_magic;
+
+ compare[c / 8] &= ~key_mask;
+ }
+
+ for (i=0; i<KEYBD_DATALEN; i++)
+ if (compare[i]) /* key(s) not released */
+ goto next_magic;
+
+ sprintf (cmd_name, "%s%c", kbd_command_prefix, *suffix);
+
+ cmd = getenv (cmd_name);
#if 0
- printf ("### Set PREBOOT to $(%s): \"%s\"\n",
- cmd_name, cmd);
+ printf ("### Set PREBOOT to $(%s): \"%s\"\n",
+ cmd_name, cmd ? cmd : "<<NULL>>");
#endif
- return (cmd);
- }
- }
- }
- }
+ *kbd_data = *suffix;
+ return (cmd);
+
+ next_magic:;
}
#if 0
printf ("### Delete PREBOOT\n");
#endif
- *kbd_str = '\0';
+ *kbd_data = '\0';
return (NULL);
}
-#endif /* CONFIG_PREBOOT */
+#endif /* CONFIG_PREBOOT */
/* Read Keyboard status */
int do_kbd (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
@@ -432,7 +410,7 @@
i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE);
/* Read keys */
- i2c_read (CFG_I2C_KEY_ADDR, 0, 0, kbd_data, KEYBD_DATALEN);
+ i2c_read (kbd_addr, 0, 0, kbd_data, KEYBD_DATALEN);
puts ("Keys:");
for (i = 0; i < KEYBD_DATALEN; ++i) {
diff --git a/common/Makefile b/common/Makefile
index 123871c..6f95d4f 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -28,7 +28,7 @@
AOBJS =
COBJS = main.o altera.o bedbug.o \
- cmd_autoscript.o cmd_bedbug.o cmd_boot.o \
+ cmd_autoscript.o cmd_bedbug.o cmd_bmp.o cmd_boot.o \
cmd_bootm.o cmd_cache.o cmd_console.o cmd_date.o \
cmd_dcr.o cmd_diag.o cmd_doc.o cmd_nand.o cmd_dtt.o \
cmd_eeprom.o cmd_elf.o cmd_fdc.o cmd_fdos.o cmd_flash.o \
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 8b32f1c..c3d62cb 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -98,6 +98,7 @@
extern boot_os_Fcn do_bootm_linux;
#endif
static boot_os_Fcn do_bootm_netbsd;
+static boot_os_Fcn do_bootm_rtems;
#if (CONFIG_COMMANDS & CFG_CMD_ELF)
static boot_os_Fcn do_bootm_vxworks;
static boot_os_Fcn do_bootm_qnxelf;
@@ -321,6 +322,12 @@
do_bootm_netbsd (cmdtp, flag, argc, argv,
addr, len_ptr, verify);
break;
+
+ case IH_OS_RTEMS:
+ do_bootm_rtems (cmdtp, flag, argc, argv,
+ addr, len_ptr, verify);
+ break;
+
#if (CONFIG_COMMANDS & CFG_CMD_ELF)
case IH_OS_VXWORKS:
do_bootm_vxworks (cmdtp, flag, argc, argv,
@@ -831,6 +838,7 @@
case IH_OS_VXWORKS: os = "VxWorks"; break;
case IH_OS_QNX: os = "QNX"; break;
case IH_OS_U_BOOT: os = "U-Boot"; break;
+ case IH_OS_RTEMS: os = "RTEMS"; break;
default: os = "Unknown OS"; break;
}
@@ -953,6 +961,29 @@
return (0);
}
+static void
+do_bootm_rtems (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
+ ulong addr, ulong *len_ptr, int verify)
+{
+ DECLARE_GLOBAL_DATA_PTR;
+ image_header_t *hdr = &header;
+ void (*entry_point)(bd_t *);
+
+ entry_point = (void (*)(bd_t *)) hdr->ih_ep;
+
+ printf ("## Transferring control to RTEMS (at address %08lx) ...\n",
+ (ulong)entry_point);
+
+ SHOW_BOOT_PROGRESS (15);
+
+ /*
+ * RTEMS Parameters:
+ * r3: ptr to board info data
+ */
+
+ (*entry_point ) ( gd->bd );
+}
+
#if (CONFIG_COMMANDS & CFG_CMD_ELF)
static void
do_bootm_vxworks (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
diff --git a/common/command.c b/common/command.c
index 1008925..dc2fcb1 100644
--- a/common/command.c
+++ b/common/command.c
@@ -72,6 +72,7 @@
#include <cmd_vfd.h> /* load a bitmap to the VFDs on TRAB */
#include <cmd_log.h>
#include <cmd_fdos.h>
+#include <cmd_bmp.h>
#ifdef CONFIG_AMIGAONEG3SE
#include <cmd_menu.h>
@@ -231,6 +232,7 @@
CMD_TBL_AUTOSCRIPT
CMD_TBL_BASE
CMD_TBL_BDINFO
+ CMD_TBL_BMP
#ifdef CONFIG_AMIGAONEG3SE
CMD_TBL_BOOTA
#endif
diff --git a/common/console.c b/common/console.c
index 13ba63b..86ed584 100644
--- a/common/console.c
+++ b/common/console.c
@@ -355,7 +355,7 @@
return (0);
}
-#ifdef CFG_CONSOLE_IS_IN_ENV
+#if defined(CFG_CONSOLE_IS_IN_ENV) || defined(CONFIG_SPLASH_SCREEN)
/* search a device */
device_t *search_device (int flags, char *name)
{
@@ -374,7 +374,7 @@
}
return dev;
}
-#endif /* CFG_CONSOLE_IS_IN_ENV */
+#endif /* CFG_CONSOLE_IS_IN_ENV || CONFIG_SPLASH_SCREEN */
#ifdef CFG_CONSOLE_IS_IN_ENV
/* Called after the relocation - use desired console functions */
@@ -469,6 +469,11 @@
device_t *inputdev = NULL, *outputdev = NULL;
int i, items = ListNumItems (devlist);
+#ifdef CONFIG_SPLASH_SCREEN
+ /* suppress all output if splash screen is enabled */
+ outputdev = search_device (DEV_FLAGS_OUTPUT, "nulldev");
+#endif
+
/* Scan devices looking for input and output devices */
for (i = 1;
(i <= items) && ((inputdev == NULL) || (outputdev == NULL));
diff --git a/common/devices.c b/common/devices.c
index 8bd0e64..615b217 100644
--- a/common/devices.c
+++ b/common/devices.c
@@ -37,6 +37,11 @@
device_t *stdio_devices[] = { NULL, NULL, NULL };
char *stdio_names[MAX_FILES] = { "stdin", "stdout", "stderr" };
+#if defined(CONFIG_SPLASH_SCREEN) && !defined(CFG_DEVICE_NULLDEV)
+#define CFG_DEVICE_NULLDEV 1
+#endif
+
+
#ifdef CFG_DEVICE_NULLDEV
void nulldev_putc(const char c)
{
diff --git a/cpu/mpc8xx/lcd.c b/cpu/mpc8xx/lcd.c
index 4ef1513..1c3fb23 100644
--- a/cpu/mpc8xx/lcd.c
+++ b/cpu/mpc8xx/lcd.c
@@ -39,12 +39,10 @@
/************************************************************************/
/* ** CONFIG STUFF -- should be moved to board config file */
/************************************************************************/
-#ifndef CONFIG_EDT32F10
#define CONFIG_LCD_LOGO
#define LCD_INFO /* Display Logo, (C) and system info */
-#endif
-#ifdef CONFIG_V37
+#if defined(CONFIG_V37) || defined(CONFIG_EDT32F10)
#undef CONFIG_LCD_LOGO
#undef LCD_INFO
#endif
@@ -52,6 +50,14 @@
/* #define LCD_TEST_PATTERN */ /* color backgnd for frame/color adjust */
/* #define CFG_INVERT_COLORS */ /* Not needed - adjust vl_dp instead */
/************************************************************************/
+
+/************************************************************************/
+/* ** BITMAP DISPLAY SUPPORT -- should probably be moved elsewhere */
+/************************************************************************/
+
+#if (CONFIG_COMMANDS & CFG_CMD_BMP)
+#include <bmp_layout.h>
+#endif /* (CONFIG_COMMANDS & CFG_CMD_BMP) */
/************************************************************************/
/* ** FONT AND LOGO DATA */
@@ -992,6 +998,102 @@
}
#endif /* CONFIG_R360MPI */
}
+
+/*----------------------------------------------------------------------*/
+
+#if (CONFIG_COMMANDS & CFG_CMD_BMP)
+/*
+ Display the BMP file located at address bmp_image.
+ Only uncompressed
+*/
+int lcd_display_bitmap(ulong bmp_image)
+{
+ volatile immap_t *immr = (immap_t *) CFG_IMMR;
+ volatile cpm8xx_t *cp = &(immr->im_cpm);
+ ushort *cmap;
+ ushort i, j;
+ uchar *fb;
+ bmp_image_t *bmp=(bmp_image_t *)bmp_image;
+ uchar *bmap;
+ ushort padded_line;
+ unsigned long width, height;
+ unsigned colors,bpix;
+ unsigned long compression;
+
+ if (!((bmp->header.signature[0]=='B') &&
+ (bmp->header.signature[1]=='M'))) {
+ printf ("Error: no valid bmp image at %lx\n", bmp_image);
+ return 1;
+ }
+
+ width = le32_to_cpu (bmp->header.width);
+ height = le32_to_cpu (bmp->header.height);
+ colors = 1<<le16_to_cpu (bmp->header.bit_count);
+ compression = le32_to_cpu (bmp->header.compression);
+
+ bpix = NBITS(panel_info.vl_bpix);
+
+ if ((bpix != 1) && (bpix != 8)) {
+ printf ("Error: %d bit/pixel mode not supported by U-Boot\n",
+ bpix);
+ return 1;
+ }
+
+ if (bpix != le16_to_cpu(bmp->header.bit_count)) {
+ printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n",
+ bpix,
+ le16_to_cpu(bmp->header.bit_count));
+ return 1;
+ }
+
+ if (compression!=BMP_BI_RGB) {
+ printf ("Error: compression type %ld not supported\n",
+ compression);
+ return 1;
+ }
+
+ debug ("Display-bmp: %d x %d with %d colors\n",
+ width, height, colors);
+
+ if (bpix==8) {
+ /* Fill the entire color map */
+ cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]);
+
+ /* Set color map */
+ for (i = 0; i < colors; ++i) {
+ bmp_color_table_entry_t cte = bmp->color_table[i];
+ ushort colreg =
+ ((cte.red>>4) << 8) |
+ ((cte.green>>4) << 4) |
+ (cte.blue>>4) ;
+#ifdef CFG_INVERT_COLORS
+ colreg ^= 0xFFF;
+#endif
+ *cmap-- = colreg;
+ }
+ }
+
+ padded_line = (width&0x3) ? ((width&~0x3)+4) : (width);
+ if (width>panel_info.vl_col)
+ width = panel_info.vl_col;
+ if (height>panel_info.vl_row)
+ height = panel_info.vl_row;
+
+ bmap = (uchar *)bmp + le32_to_cpu (bmp->header.data_offset);
+ fb = (uchar *)
+ (lcd_base +
+ (((height>=panel_info.vl_row) ? panel_info.vl_row : height)-1)
+ * lcd_line_length);
+ for (i = 0; i < height; ++i) {
+ for (j = 0; j < width ; j++)
+ *(fb++)=255-*(bmap++);
+ bmap += (width - padded_line);
+ fb -= (width + lcd_line_length);
+ }
+
+ return (0);
+}
+#endif /* (CONFIG_COMMANDS & CFG_CMD_BMP) */
/*----------------------------------------------------------------------*/
@@ -1066,6 +1168,100 @@
}
#endif /* CONFIG_LCD_LOGO */
+#if (CONFIG_COMMANDS & CFG_CMD_BMP)
+/*
+ Display the BMP file located at address bmp_image.
+ Only uncompressed
+*/
+int lcd_display_bitmap(ulong bmp_image)
+{
+ volatile immap_t *immr = (immap_t *) CFG_IMMR;
+ volatile cpm8xx_t *cp = &(immr->im_cpm);
+ ushort *cmap;
+ ushort i, j;
+ uchar *fb;
+ bmp_image_t *bmp=(bmp_image_t *)bmp_image;
+ uchar *bmap;
+ ushort padded_line;
+ unsigned long width, height;
+ unsigned colors,bpix;
+ unsigned long compression;
+
+ if (!((bmp->header.signature[0]=='B') &&
+ (bmp->header.signature[1]=='M'))) {
+ printf ("Error: no valid bmp image at %lx\n", bmp_image);
+ return 1;
+ }
+
+ width = le32_to_cpu (bmp->header.width);
+ height = le32_to_cpu (bmp->header.height);
+ colors = 1<<le16_to_cpu (bmp->header.bit_count);
+ compression = le32_to_cpu (bmp->header.compression);
+
+ bpix = NBITS(panel_info.vl_bpix);
+
+ if ((bpix != 1) && (bpix != 8)) {
+ printf ("Error: %d bit/pixel mode not supported by U-Boot\n",
+ bpix);
+ return 1;
+ }
+
+ if (bpix != le16_to_cpu(bmp->header.bit_count)) {
+ printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n",
+ bpix,
+ le16_to_cpu(bmp->header.bit_count));
+ return 1;
+ }
+
+ if (compression!=BMP_BI_RGB) {
+ printf ("Error: compression type %ld not supported\n",
+ compression);
+ return 1;
+ }
+
+ debug ("Display-bmp: %d x %d with %d colors\n",
+ width, height, colors);
+
+ if (bpix==8) {
+ /* Fill the entire color map */
+ cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]);
+
+ /* Set color map */
+ for (i = 0; i < colors; ++i) {
+ bmp_color_table_entry_t cte = bmp->color_table[i];
+ ushort colreg =
+ ((cte.red>>4) << 8) |
+ ((cte.green>>4) << 4) |
+ (cte.blue>>4) ;
+#ifdef CFG_INVERT_COLORS
+ colreg ^= 0xFFF;
+#endif
+ *cmap-- = colreg;
+ }
+ }
+
+ padded_line = (width&0x3) ? ((width&~0x3)+4) : (width);
+ if (width>panel_info.vl_col)
+ width = panel_info.vl_col;
+ if (height>panel_info.vl_row)
+ height = panel_info.vl_row;
+
+ bmap = (uchar *)bmp + le32_to_cpu (bmp->header.data_offset);
+ fb = (uchar *)
+ (lcd_base +
+ (((height>=panel_info.vl_row) ? panel_info.vl_row : height)-1)
+ * lcd_line_length);
+ for (i = 0; i < height; ++i) {
+ for (j = 0; j < width ; j++)
+ *(fb++)=255-*(bmap++);
+ bmap += (width - padded_line);
+ fb -= (width + lcd_line_length);
+ }
+
+ return (0);
+}
+#endif /* (CONFIG_COMMANDS & CFG_CMD_BMP) */
+
/*----------------------------------------------------------------------*/
static void *lcd_logo (void)
@@ -1077,6 +1273,19 @@
char temp[32];
#endif /* LCD_INFO */
+#ifdef CONFIG_SPLASH_SCREEN
+ char *s;
+ ulong addr;
+
+ if ((s = getenv("splashimage")) != NULL) {
+ addr = simple_strtoul(s, NULL, 16);
+
+ if (lcd_display_bitmap (addr) == 0) {
+ return ((void *)lcd_base);
+ }
+ }
+#endif /* CONFIG_SPLASH_SCREEN */
+
#ifdef CONFIG_LCD_LOGO
bitmap_plot (0, 0);
#endif /* CONFIG_LCD_LOGO */
@@ -1086,7 +1295,7 @@
sprintf (info, "%s (%s - %s) ", U_BOOT_VERSION, __DATE__, __TIME__);
lcd_drawchars (LCD_INFO_X, LCD_INFO_Y, info, strlen(info));
- sprintf (info, "(C) 2002 DENX Software Engineering");
+ sprintf (info, "(C) 2003 DENX Software Engineering");
lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT,
info, strlen(info));
diff --git a/doc/README.commands b/doc/README.commands
index 07825b9..d848db0 100644
--- a/doc/README.commands
+++ b/doc/README.commands
@@ -15,6 +15,7 @@
autoscr 5
base 2
bdinfo 2
+bmp 3
bootelf 7
bootm 5
bootp 5
diff --git a/include/cmd_confdefs.h b/include/cmd_confdefs.h
index 4e7ab9b..170c38f 100644
--- a/include/cmd_confdefs.h
+++ b/include/cmd_confdefs.h
@@ -79,6 +79,7 @@
#define CFG_CMD_FDOS 0x0000200000000000 /* Floppy DOS support */
#define CFG_CMD_VFD 0x0000400000000000 /* VFD support (TRAB) */
#define CFG_CMD_NAND 0x0000800000000000 /* NAND support */
+#define CFG_CMD_BMP 0x0001000000000000 /* BMP support */
#define CFG_CMD_ALL 0xFFFFFFFFFFFFFFFF /* ALL commands */
@@ -87,6 +88,7 @@
*/
#define CFG_CMD_NONSTD (CFG_CMD_ASKENV | \
CFG_CMD_BEDBUG | \
+ CFG_CMD_BMP | \
CFG_CMD_BSP | \
CFG_CMD_CACHE | \
CFG_CMD_DATE | \
diff --git a/include/commproc.h b/include/commproc.h
index d02dea4..e9b0ab7 100644
--- a/include/commproc.h
+++ b/include/commproc.h
@@ -1365,7 +1365,7 @@
/*** TQM855L, TQM860L, TQM862L **************************************/
#if defined(CONFIG_TQM855L) || \
- defined(CONFIG_TQM860L)
+ defined(CONFIG_TQM860L) || \
defined(CONFIG_TQM862L)
# ifdef CONFIG_SCC1_ENET /* use SCC for 10Mbps Ethernet */
diff --git a/include/configs/R360MPI.h b/include/configs/R360MPI.h
index c7cf8a4..8aba25e 100644
--- a/include/configs/R360MPI.h
+++ b/include/configs/R360MPI.h
@@ -40,6 +40,8 @@
#undef CONFIG_EDT32F10
#define CONFIG_SHARP_LQ057Q3DC02
+#define CONFIG_SPLASH_SCREEN
+
#define MPC8XX_FACT 1 /* Multiply by 1 */
#define MPC8XX_XIN 50000000 /* 50 MHz in */
#define CONFIG_8xx_GCLK_FREQ 50000000 /* define if can't use get_gclk_freq */
@@ -118,6 +120,7 @@
#define CFG_I2C_TEM_ADDR 0x49 /* Temperature Sensors */
#define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
+ CFG_CMD_BMP | \
CFG_CMD_DHCP | \
CFG_CMD_DATE | \
CFG_CMD_I2C | \
diff --git a/include/configs/incaip.h b/include/configs/incaip.h
index 3b648c1..027f319 100644
--- a/include/configs/incaip.h
+++ b/include/configs/incaip.h
@@ -31,8 +31,8 @@
#define CONFIG_MIPS32 1 /* MIPS 4Kc CPU core */
#define CONFIG_INCA_IP 1 /* on a INCA-IP Board */
-/* allowed values: 100000000 and 150000000 */
-#define CPU_CLOCK_RATE 150000000 /* 150 MHz clock for the MIPS core */
+/* allowed values: 100000000, 133000000, and 150000000 */
+#define CPU_CLOCK_RATE 133000000 /* 133 MHz clock for the MIPS core */
#if CPU_CLOCK_RATE == 100000000
#define INFINEON_EBU_BOOTCFG 0x20C4 /* CMULT = 4 for 100 MHz */
diff --git a/include/configs/lwmon.h b/include/configs/lwmon.h
index 30e7882..f80e134 100644
--- a/include/configs/lwmon.h
+++ b/include/configs/lwmon.h
@@ -153,6 +153,7 @@
CFG_CMD_EEPROM | \
CFG_CMD_IDE | \
CFG_CMD_BSP | \
+ CFG_CMD_BMP | \
CFG_CMD_POST_DIAG )
#else
#define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
@@ -162,6 +163,7 @@
CFG_CMD_EEPROM | \
CFG_CMD_IDE | \
CFG_CMD_BSP | \
+ CFG_CMD_BMP | \
CFG_CMD_POST_DIAG )
#endif
#define CONFIG_MAC_PARTITION
diff --git a/include/image.h b/include/image.h
index 72781dc..f9b769e 100644
--- a/include/image.h
+++ b/include/image.h
@@ -45,6 +45,7 @@
#define IH_OS_PSOS 15 /* pSOS */
#define IH_OS_QNX 16 /* QNX */
#define IH_OS_U_BOOT 17 /* Firmware */
+#define IH_OS_RTEMS 18 /* RTEMS */
/*
* CPU Architecture Codes (supported by Linux)
diff --git a/tools/env/fw_env.h b/tools/env/fw_env.h
index 7d7be04..2cc7724 100644
--- a/tools/env/fw_env.h
+++ b/tools/env/fw_env.h
@@ -27,7 +27,7 @@
* See included "fw_env.config" sample file (TRAB board)
* for notes on configuration.
*/
-/*#define CONFIG_FILE "/etc/fw_env.config" */
+#define CONFIG_FILE "/etc/fw_env.config"
#define HAVE_REDUND /* For systems with 2 env sectors */
#define DEVICE1_NAME "/dev/mtd1"
diff --git a/tools/mkimage.c b/tools/mkimage.c
index 095880e..1504ef8 100644
--- a/tools/mkimage.c
+++ b/tools/mkimage.c
@@ -92,6 +92,7 @@
{ IH_OS_PSOS, "psos", "pSOS", },
{ IH_OS_QNX, "qnx", "QNX", },
{ IH_OS_U_BOOT, "u-boot", "U-Boot", },
+ { IH_OS_RTEMS, "rtems", "RTEMS", },
{ -1, "", "", },
};