diff options
author | Justin Waters <justin@justin-linux.(none)> | 2008-01-21 15:11:54 -0500 |
---|---|---|
committer | Justin Waters <justin@justin-linux.(none)> | 2008-01-21 16:34:01 -0500 |
commit | 584432a4e4bfea64e689e241d5be36f23fa2b781 (patch) | |
tree | 3ebb97422c830bc4f348902aea41329ee07fe02e /common | |
parent | 9a337ddc154a10a26f117fd147b009abcdeba75a (diff) | |
parent | 2a43bc1f85618a6fb291dc26b0461857898515f7 (diff) |
Merge branch 'u-boot-1.1.5-at91' into u-boot-1.3.0-at91
Conflicts:
MAKEALL
board/at91rm9200dk/at45.c
common/cmd_flash.c
drivers/Makefile
drivers/at45.c
drivers/dataflash.c
drivers/dm9000x.c
drivers/nand/nand.c
drivers/nand/nand_base.c
drivers/nand/nand_ids.c
drivers/nand/nand_util.c
examples/Makefile
include/asm-arm/mach-types.h
Diffstat (limited to 'common')
-rw-r--r-- | common/cmd_flash.c | 20 | ||||
-rw-r--r-- | common/cmd_mem.c | 6 | ||||
-rw-r--r-- | common/env_nand.c | 49 | ||||
-rw-r--r-- | common/lcd.c | 112 |
4 files changed, 165 insertions, 22 deletions
diff --git a/common/cmd_flash.c b/common/cmd_flash.c index 11c8857313..817157c1c3 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,9 +450,11 @@ 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; @@ -488,7 +499,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 +624,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 +681,7 @@ int flash_sect_protect (int p, ulong addr_first, ulong addr_last) } return rcode; } - +#endif /* CFG_NO_FLASH */ /**************************************************/ #if defined(CONFIG_CMD_JFFS2) && defined(CONFIG_JFFS2_CMDLINE) diff --git a/common/cmd_mem.c b/common/cmd_mem.c index a994211138..c1f83af69a 100644 --- a/common/cmd_mem.c +++ b/common/cmd_mem.c @@ -462,7 +462,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 38a07f8993..5374166f16 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 defined(CONFIG_CMD_ENV) && defined(CONFIG_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 914dc2ef7c..82feca331c 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 |