summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorJustin Waters <justin@justin-linux.(none)>2008-01-21 13:46:21 -0500
committerJustin Waters <justin@justin-linux.(none)>2008-01-21 13:46:21 -0500
commit037af3481edfb2b7a3fbed1dffd277df25f677b9 (patch)
tree2c39b8891b4494298b7ee447c480645d96e13bdb /common
parentba999c531ed16ec749b2b6f4b0133cee38842b91 (diff)
Add Atmel AT91 patch version 1.5
This patch adds support for the following boards: AT91RM9200-EK AT91SAM9260-EK AT91SAM9261-EK AT91SAM9263-EK AT91SAM9RL-EK It was downloaded from http://www.linux4sam.org/twiki/pub/Linux4SAM/U-Boot/u-boot-1.1.5_atmel_1.5.diff.bz2 Signed-off-by: Justin Waters <justin.waters@timesys.com>
Diffstat (limited to 'common')
-rw-r--r--common/cmd_flash.c27
-rw-r--r--common/cmd_mem.c6
-rw-r--r--common/env_nand.c49
-rw-r--r--common/lcd.c112
4 files changed, 171 insertions, 23 deletions
diff --git a/common/cmd_flash.c b/common/cmd_flash.c
index cb1c5bb432..5d6fffb9d1 100644
--- a/common/cmd_flash.c
+++ b/common/cmd_flash.c
@@ -43,6 +43,7 @@ int find_dev_and_part(const char *id, struct mtd_device **dev,
u8 *part_num, struct part_info **part);
#endif
+#ifndef CFG_NO_FLASH
extern flash_info_t flash_info[]; /* info for FLASH chips */
/*
@@ -277,6 +278,7 @@ flash_fill_sect_ranges (ulong addr_first, ulong addr_last,
return rcode;
}
+#endif /* CFG_NO_FLASH */
int do_flinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
@@ -285,7 +287,7 @@ int do_flinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
#ifdef CONFIG_HAS_DATAFLASH
dataflash_print_info();
#endif
-
+#ifndef CFG_NO_FLASH
if (argc == 1) { /* print info for all FLASH banks */
for (bank=0; bank <CFG_MAX_FLASH_BANKS; ++bank) {
printf ("\nBank # %ld: ", bank+1);
@@ -303,11 +305,13 @@ int do_flinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
}
printf ("\nBank # %ld: ", bank);
flash_print_info (&flash_info[bank-1]);
+#endif /* CFG_NO_FLASH */
return 0;
}
int do_flerase (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
+#ifndef CFG_NO_FLASH
flash_info_t *info;
ulong bank, addr_first, addr_last;
int n, sect_first, sect_last;
@@ -399,8 +403,13 @@ int do_flerase (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
rcode = flash_sect_erase(addr_first, addr_last);
return rcode;
+#else
+ return 0;
+#endif /* CFG_NO_FLASH */
+
}
+#ifndef CFG_NO_FLASH
int flash_sect_erase (ulong addr_first, ulong addr_last)
{
flash_info_t *info;
@@ -441,12 +450,19 @@ int flash_sect_erase (ulong addr_first, ulong addr_last)
}
return rcode;
}
+#endif /* CFG_NO_FLASH */
int do_protect (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
+#ifndef CFG_NO_FLASH
flash_info_t *info;
ulong bank, addr_first, addr_last;
- int i, p, n, sect_first, sect_last;
+ int i, p, n, sect_first, sect_last;
+#else
+ ulong addr_first, addr_last;
+ int p;
+#endif
+
#if (CONFIG_COMMANDS & CFG_CMD_JFFS2) && defined(CONFIG_JFFS2_CMDLINE)
struct mtd_device *dev;
struct part_info *part;
@@ -488,7 +504,7 @@ int do_protect (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
}
}
#endif
-
+#ifndef CFG_NO_FLASH
if (strcmp(argv[2], "all") == 0) {
for (bank=1; bank<=CFG_MAX_FLASH_BANKS; ++bank) {
info = &flash_info[bank-1];
@@ -613,10 +629,11 @@ int do_protect (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
return 1;
}
rcode = flash_sect_protect (p, addr_first, addr_last);
+#endif /* CFG_NO_FLASH */
return rcode;
}
-
+#ifndef CFG_NO_FLASH
int flash_sect_protect (int p, ulong addr_first, ulong addr_last)
{
flash_info_t *info;
@@ -669,7 +686,7 @@ int flash_sect_protect (int p, ulong addr_first, ulong addr_last)
}
return rcode;
}
-
+#endif /* CFG_NO_FLASH */
/**************************************************/
#if (CONFIG_COMMANDS & CFG_CMD_JFFS2) && defined(CONFIG_JFFS2_CMDLINE)
diff --git a/common/cmd_mem.c b/common/cmd_mem.c
index d0fae6b24c..b4cc64d54b 100644
--- a/common/cmd_mem.c
+++ b/common/cmd_mem.c
@@ -498,7 +498,11 @@ int do_mem_cp ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
}
/* Check if we are copying from DataFlash to RAM */
- if (addr_dataflash(addr) && !addr_dataflash(dest) && (addr2info(dest)==NULL) ){
+ if (addr_dataflash(addr) && !addr_dataflash(dest)
+#ifndef CFG_NO_FLASH
+ && (addr2info(dest)==NULL)
+#endif
+ ){
int rc;
rc = read_dataflash(addr, count * size, (char *) dest);
if (rc != 1) {
diff --git a/common/env_nand.c b/common/env_nand.c
index 67c4a4e011..a36d2ccd97 100644
--- a/common/env_nand.c
+++ b/common/env_nand.c
@@ -38,6 +38,7 @@
#include <linux/stddef.h>
#include <malloc.h>
#include <nand.h>
+#include <asm/errno.h>
#if ((CONFIG_COMMANDS&(CFG_CMD_ENV|CFG_CMD_NAND)) == (CFG_CMD_ENV|CFG_CMD_NAND))
#define CMD_SAVEENV
@@ -156,28 +157,39 @@ int saveenv(void)
{
ulong total;
int ret = 0;
+ int use_redund = 1;
env_ptr->flags++;
total = CFG_ENV_SIZE;
+save_env_retry:
if(gd->env_valid == 1) {
puts ("Erasing redundant Nand...");
if (nand_erase(&nand_info[0],
CFG_ENV_OFFSET_REDUND, CFG_ENV_SIZE))
- return 1;
- puts ("Writing to redundant Nand... ");
- ret = nand_write(&nand_info[0], CFG_ENV_OFFSET_REDUND, &total,
- (u_char*) env_ptr);
+ ret = -EIO;
+ else {
+ puts ("Writing to redundant Nand... ");
+ ret = nand_write(&nand_info[0], CFG_ENV_OFFSET_REDUND, &total,
+ (u_char*) env_ptr);
+ }
} else {
puts ("Erasing Nand...");
if (nand_erase(&nand_info[0],
CFG_ENV_OFFSET, CFG_ENV_SIZE))
- return 1;
-
- puts ("Writing to Nand... ");
- ret = nand_write(&nand_info[0], CFG_ENV_OFFSET, &total,
- (u_char*) env_ptr);
+ ret = -EIO;
+ else {
+ puts ("Writing to Nand... ");
+ ret = nand_write(&nand_info[0], CFG_ENV_OFFSET, &total,
+ (u_char*) env_ptr);
+ }
+ }
+ if ((ret || total != CFG_ENV_SIZE) && use_redund) {
+ gd->env_valid = (gd->env_valid == 2 ? 1 : 2);
+ use_redund = 0;
+ goto save_env_retry;
}
+
if (ret || total != CFG_ENV_SIZE)
return 1;
@@ -214,19 +226,26 @@ void env_relocate_spec (void)
ulong total;
int crc1_ok = 0, crc2_ok = 0;
env_t *tmp_env1, *tmp_env2;
+ int ret;
total = CFG_ENV_SIZE;
tmp_env1 = (env_t *) malloc(CFG_ENV_SIZE);
tmp_env2 = (env_t *) malloc(CFG_ENV_SIZE);
- nand_read(&nand_info[0], CFG_ENV_OFFSET, &total,
- (u_char*) tmp_env1);
- nand_read(&nand_info[0], CFG_ENV_OFFSET_REDUND, &total,
- (u_char*) tmp_env2);
+ ret = nand_block_isbad(&nand_info[0], CFG_ENV_OFFSET);
+ if (!ret) {
+ nand_read(&nand_info[0], CFG_ENV_OFFSET, &total,
+ (u_char*) tmp_env1);
+ crc1_ok = (crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc);
+ }
- crc1_ok = (crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc);
- crc2_ok = (crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc);
+ ret = nand_block_isbad(&nand_info[0], CFG_ENV_OFFSET_REDUND);
+ if (!ret) {
+ nand_read(&nand_info[0], CFG_ENV_OFFSET_REDUND, &total,
+ (u_char*) tmp_env2);
+ crc2_ok = (crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc);
+ }
if(!crc1_ok && !crc2_ok)
return use_default();
diff --git a/common/lcd.c b/common/lcd.c
index eaed2abd80..d0b130938e 100644
--- a/common/lcd.c
+++ b/common/lcd.c
@@ -50,6 +50,11 @@
#include <lcdvideo.h>
#endif
+#if defined(CONFIG_AT91SAM9261EK) || defined(CONFIG_AT91SAM9263EK) || \
+ defined(CONFIG_AT91SAM9RLEK)
+#define CONFIG_AT91_LCD
+#endif
+
#ifdef CONFIG_LCD
/************************************************************************/
@@ -354,7 +359,11 @@ int drv_lcd_init (void)
strcpy (lcddev.name, "lcd");
lcddev.ext = 0; /* No extensions */
+#ifdef CFG_CONSOLE_IS_SERIAL
+ lcddev.flags = 0;
+#else
lcddev.flags = DEV_FLAGS_OUTPUT; /* Output only */
+#endif
lcddev.putc = lcd_putc; /* 'putc' function */
lcddev.puts = lcd_puts; /* 'puts' function */
@@ -474,14 +483,22 @@ ulong lcd_setmem (ulong addr)
static void lcd_setfgcolor (int color)
{
- lcd_color_fg = color & 0x0F;
+#if defined(CONFIG_AT91SAM9261EK) || defined(CONFIG_AT91SAM9263EK)
+ lcd_color_fg = color;
+#else
+ lcd_color_fg = color & 0x0F;
+#endif
}
/*----------------------------------------------------------------------*/
static void lcd_setbgcolor (int color)
{
- lcd_color_bg = color & 0x0F;
+#if defined(CONFIG_AT91SAM9261EK) || defined(CONFIG_AT91SAM9263EK)
+ lcd_color_bg = color;
+#else
+ lcd_color_bg = color & 0x0F;
+#endif
}
/*----------------------------------------------------------------------*/
@@ -508,7 +525,11 @@ static int lcd_getbgcolor (void)
#ifdef CONFIG_LCD_LOGO
void bitmap_plot (int x, int y)
{
+#if defined(CONFIG_AT91_LCD)
+ uint *cmap;
+#else
ushort *cmap;
+#endif
ushort i, j;
uchar *bmap;
uchar *fb;
@@ -533,21 +554,43 @@ void bitmap_plot (int x, int y)
cmap = (ushort *)fbi->palette;
#elif defined(CONFIG_MPC823)
cmap = (ushort *)&(cp->lcd_cmap[BMP_LOGO_OFFSET*sizeof(ushort)]);
+#elif defined(CONFIG_AT91_LCD)
+ cmap = (uint *) panel_info.controller.lcdc->LCDC_LUT_ENTRY;
#endif
+#if !defined(CONFIG_AT91_LCD)
WATCHDOG_RESET();
+#endif
/* Set color map */
for (i=0; i<(sizeof(bmp_logo_palette)/(sizeof(ushort))); ++i) {
ushort colreg = bmp_logo_palette[i];
+ ushort lcdc_lut_entry;
#ifdef CFG_INVERT_COLORS
*cmap++ = 0xffff - colreg;
#else
+#if defined(CONFIG_AT91_LCD)
+#if defined(CONFIG_AT91SAM9261EK) || defined(CONFIG_AT91SAM9263EK)
+ lcdc_lut_entry = ((colreg & 0x0F) << 11); /* get the blue color */
+ lcdc_lut_entry |= ((colreg & 0xF0) << 2); /* get the green color */
+ lcdc_lut_entry |= ((colreg & 0xF00) >> 7); /* get the red color */
+#elif defined(CONFIG_AT91SAM9RLEK)
+ lcdc_lut_entry = ((colreg & 0x0F) << 1); /* get the blue color */
+ lcdc_lut_entry |= ((colreg & 0xF0) << 3); /* get the green color */
+ lcdc_lut_entry |= ((colreg & 0xF00)<< 4); /* get the red color */
+#endif
+
+ *(cmap + BMP_LOGO_OFFSET) = lcdc_lut_entry;
+ cmap++;
+#else
*cmap++ = colreg;
#endif
+#endif
}
+#if !defined(CONFIG_AT91_LCD)
WATCHDOG_RESET();
+#endif
for (i=0; i<BMP_LOGO_HEIGHT; ++i) {
memcpy (fb, bmap, BMP_LOGO_WIDTH);
@@ -566,7 +609,10 @@ void bitmap_plot (int x, int y)
}
}
+#if !defined(CONFIG_AT91_LCD)
WATCHDOG_RESET();
+#endif
+
}
#endif /* CONFIG_LCD_LOGO */
@@ -578,9 +624,15 @@ void bitmap_plot (int x, int y)
*/
int lcd_display_bitmap(ulong bmp_image, int x, int y)
{
+#if defined(CONFIG_AT91_LCD)
+ uint *cmap;
+#else
+
#if !defined(CONFIG_MCC200)
ushort *cmap;
#endif
+
+#endif
ushort i, j;
uchar *fb;
bmp_image_t *bmp=(bmp_image_t *)bmp_image;
@@ -633,6 +685,8 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
cmap = (ushort *)fbi->palette;
#elif defined(CONFIG_MPC823)
cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]);
+#elif defined(CONFIG_AT91_LCD)
+ cmap = (uint *) panel_info.controller.lcdc->LCDC_LUT_ENTRY;
#else
# error "Don't know location of color map"
#endif
@@ -765,6 +819,60 @@ static void *lcd_logo (void)
# endif /* CONFIG_LCD_INFO */
#endif /* CONFIG_MPC823 */
+#if defined(CONFIG_AT91_LCD)
+#ifdef CONFIG_LCD_INFO
+ sprintf (info, "%s %s", U_BOOT_VERSION, __DATE__);
+ lcd_drawchars (LCD_INFO_X, LCD_INFO_Y, info, strlen(info));
+
+ sprintf (info, "(C) 2006 ATMEL Corp");
+ lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT,
+ info, strlen(info));
+
+ sprintf (info, "at91support@atmel.com");
+ lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 2,
+ info, strlen(info));
+
+#ifdef CONFIG_LCD_INFO_BELOW_LOGO
+
+#ifdef CONFIG_AT91SAM9261EK
+ sprintf (info, "AT91SAM9261 CPU at %s MHz", "200");
+#elif CONFIG_AT91SAM9263EK
+ sprintf (info, "AT91SAM9263 CPU at %s MHz", "200");
+#elif CONFIG_AT91SAM9RLEK
+ sprintf (info, "AT91SAM9RL CPU at %s MHz", "200");
+#endif
+ lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 3,
+ info, strlen(info));
+ sprintf (info, "%ld MB SDRAM,%ld MB NandFlash",
+ 64,
+ 256);
+ lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 4,
+ info, strlen(info));
+#else
+ /* leave one blank line */
+#ifdef CONFIG_AT91SAM9261EK
+ sprintf (info, "AT91SAM9261 CPU at %s MHz, %ld MB SDRAM, %ld MB NandFlash",
+ "200",
+ 64,
+ 256);
+#elif CONFIG_AT91SAM9263EK
+ sprintf (info, "AT91SAM9263 CPU at %s MHz, %ld MB SDRAM, %ld MB NandFlash",
+ "200",
+ 64,
+ 256);
+#elif CONFIG_AT91SAM9RLEK
+ sprintf (info, "AT91SAM9RL CPU at %s MHz, %ld MB SDRAM, %ld MB NandFlash",
+ "200",
+ 64,
+ 256);
+#endif
+ lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 4,
+ info, strlen(info));
+
+#endif /* CONFIG_LCD_INFO_BELOW_LOGO */
+#endif /* CONFIG_LCD_INFO */
+#endif /* CONFIG_AT91_LCD */
+
#if defined(CONFIG_LCD_LOGO) && !defined(CONFIG_LCD_INFO_BELOW_LOGO)
return ((void *)((ulong)lcd_base + BMP_LOGO_HEIGHT * lcd_line_length));
#else