?? patch-u-boot-at91rm9200-dataflash.dat
字號:
dataflash_info[i].logical_address = cs[i][0]; dataflash_info[i].id = dfcode; break;+ case AT45DB128:+ dataflash_info[i].Device.pages_number = 16384;+ dataflash_info[i].Device.pages_size = 1056;+ dataflash_info[i].Device.page_offset = 11;+ dataflash_info[i].Device.byte_mask = 0x700;+ dataflash_info[i].Device.cs = cs[i][1];+ dataflash_info[i].Desc.DataFlash_state = IDLE;+ dataflash_info[i].logical_address = cs[i][0];+ dataflash_info[i].id = dfcode;+ break; default: break; }-- for (j = 0; j < dataflash_info[i].Device.pages_number; j++)- dataflash_info[i].protect[j] = FLAG_PROTECT_SET;-- }+ /* set the last area end to the dataflash size*/+ area_list[NB_DATAFLASH_AREA -1].end =+ (dataflash_info[i].Device.pages_number *+ dataflash_info[i].Device.pages_size)-1;+ + /* set the area addresses */+ for(j = 0; j<NB_DATAFLASH_AREA; j++){+ dataflash_info[i].Device.area_list[j].start = area_list[j].start + dataflash_info[i].logical_address;+ dataflash_info[i].Device.area_list[j].end = area_list[j].end + dataflash_info[i].logical_address;+ dataflash_info[i].Device.area_list[j].protected = area_list[j].protected;+ }+ } return (1); } void dataflash_print_info (void) {- int i;+ int i,j; for (i = 0; i < CFG_MAX_DATAFLASH_BANKS; i++) { if (dataflash_info[i].id != 0) {@@ -116,6 +144,9 @@ void dataflash_print_info (void) case AT45DB642: printf ("AT45DB642\n"); break;+ case AT45DB128: + printf ("AT45DB128\n");+ break; } printf ("Nb pages: %6d\n"@@ -127,6 +158,13 @@ void dataflash_print_info (void) (unsigned int) dataflash_info[i].Device.pages_number * dataflash_info[i].Device.pages_size, (unsigned int) dataflash_info[i].logical_address);+ for (j=0; j< NB_DATAFLASH_AREA; j++){ + printf ("Area %i:\t%08X to %08X %s\n", j,+ dataflash_info[i].Device.area_list[j].start,+ dataflash_info[i].Device.area_list[j].end,+ (dataflash_info[i].Device.area_list[j].protected ==+ FLAG_PROTECT_SET) ? "(RO)" : "");+ } } } }@@ -176,6 +214,76 @@ int addr_dataflash (unsigned long addr) return addr_valid; }+/*-----------------------------------------------------------------------------*/+/* Function Name : size_dataflash */+/* Object : Test if address is valid regarding the size */+/*-----------------------------------------------------------------------------*/+int size_dataflash (AT91PS_DataFlash pdataFlash, unsigned long addr, unsigned long size)+{+ /* is outside the dataflash */+ if (((int)addr & 0x0FFFFFFF) > (pdataFlash->pDevice->pages_size * + pdataFlash->pDevice->pages_number)) return 0;+ /* is too large for the dataflash */+ if (size > ((pdataFlash->pDevice->pages_size * + pdataFlash->pDevice->pages_number) - ((int)addr & 0x0FFFFFFF))) return 0;+ + return 1;+}+/*-----------------------------------------------------------------------------*/+/* Function Name : prot_dataflash */+/* Object : Test if destination area is protected */+/*-----------------------------------------------------------------------------*/+int prot_dataflash (AT91PS_DataFlash pdataFlash, unsigned long addr)+{+int area;+ /* find area */+ for (area=0; area < NB_DATAFLASH_AREA; area++){+ if ((addr >= pdataFlash->pDevice->area_list[area].start) && + (addr < pdataFlash->pDevice->area_list[area].end)) + break;+ } + if (area == NB_DATAFLASH_AREA) return -1;+ /*test protection value*/+ if (pdataFlash->pDevice->area_list[area].protected == FLAG_PROTECT_SET) return 0;+ + return 1;+}+/*-----------------------------------------------------------------------------*/+/* Function Name : dataflash_real_protect */+/* Object : protect/unprotect area */+/*-----------------------------------------------------------------------------*/+int dataflash_real_protect (int flag, unsigned long start_addr, unsigned long end_addr)+{+int i,j, area1, area2, addr_valid = 0;+ /* find dataflash */ + for (i = 0; i < CFG_MAX_DATAFLASH_BANKS; i++) {+ if ((((int) start_addr) & 0xF0000000) ==+ dataflash_info[i].logical_address){+ addr_valid = 1;+ break;+ }+ }+ if (!addr_valid) {+ return -1;+ }+ /* find start area */+ for (area1=0; area1 < NB_DATAFLASH_AREA; area1++){+ if (start_addr == dataflash_info[i].Device.area_list[area1].start) break;+ } + if (area1 == NB_DATAFLASH_AREA) return -1;+ /* find end area */+ for (area2=0; area2 < NB_DATAFLASH_AREA; area2++){+ if (end_addr == dataflash_info[i].Device.area_list[area2].end) break;+ } + if (area2 == NB_DATAFLASH_AREA) return -1;++ /*set protection value*/+ for(j = area1; j < area2+1 ; j++)+ if (flag == 0) dataflash_info[i].Device.area_list[j].protected = FLAG_PROTECT_CLEAR;+ else dataflash_info[i].Device.area_list[j].protected = FLAG_PROTECT_SET;+ + return (area2-area1+1);+} /*------------------------------------------------------------------------------*/ /* Function Name : read_dataflash */@@ -187,10 +295,15 @@ int read_dataflash (unsigned long addr, AT91PS_DataFlash pFlash = &DataFlashInst; pFlash = AT91F_DataflashSelect (pFlash, &AddrToRead);+ if (pFlash == 0)- return -1;+ return ERR_UNKNOWN_FLASH_TYPE;++ if (size_dataflash(pFlash,addr,size) == 0)+ return ERR_INVAL; return (AT91F_DataFlashRead (pFlash, AddrToRead, size, result));+ } @@ -201,17 +314,25 @@ int read_dataflash (unsigned long addr, int write_dataflash (unsigned long addr_dest, unsigned long addr_src, unsigned long size) {- extern AT91S_DataFlashStatus AT91F_DataFlashWrite(- AT91PS_DataFlash, uchar *, int, int); int AddrToWrite = addr_dest; AT91PS_DataFlash pFlash = &DataFlashInst; pFlash = AT91F_DataflashSelect (pFlash, &AddrToWrite);++ if (pFlash == 0)+ return ERR_UNKNOWN_FLASH_TYPE;++ if (size_dataflash(pFlash,addr_dest,size) == 0)+ return ERR_INVAL;++ if (prot_dataflash(pFlash,addr_dest) == 0)+ return ERR_PROTECTED;+ if (AddrToWrite == -1) return -1; - return AT91F_DataFlashWrite (pFlash, (char *) addr_src, AddrToWrite,- size);+ return AT91F_DataFlashWrite (pFlash, (char *) addr_src, AddrToWrite, size);+ } @@ -242,3 +363,4 @@ void dataflash_perror (int err) } #endif+ diff -purN u-boot-1.0.0.orig/include/configs/at91rm9200dk.h u-boot-1.0.0.test/include/configs/at91rm9200dk.h--- u-boot-1.0.0.orig/include/configs/at91rm9200dk.h Fri Jun 27 23:32:45 2003+++ u-boot-1.0.0.test/include/configs/at91rm9200dk.h Fri Nov 7 20:09:16 2003@@ -105,7 +105,7 @@ #define CONFIG_NET_RETRY_COUNT 20 #define CONFIG_HAS_DATAFLASH 1-#define CFG_SPI_WRITE_TOUT CFG_HZ+#define CFG_SPI_WRITE_TOUT (5*CFG_HZ) #define CFG_MAX_DATAFLASH_BANKS 2 #define CFG_MAX_DATAFLASH_PAGES 16384 #define CFG_DATAFLASH_LOGIC_ADDR_CS0 0xC0000000 /* Logical adress for CS0 */@@ -118,9 +118,20 @@ #define CFG_MAX_FLASH_SECT 40 #define CFG_FLASH_ERASE_TOUT (2*CFG_HZ) /* Timeout for Flash Erase */ #define CFG_FLASH_WRITE_TOUT (2*CFG_HZ) /* Timeout for Flash Write */++#undef CFG_ENV_IS_IN_DATAFLASH++#ifdef CFG_ENV_IS_IN_DATAFLASH+#define CFG_ENV_OFFSET 0x20000 +#define CFG_ENV_ADDR (CFG_DATAFLASH_LOGIC_ADDR_CS0 + CFG_ENV_OFFSET)+#define CFG_ENV_SIZE 0x2000 /* 0x8000 */+#else #define CFG_ENV_IS_IN_FLASH 1 #define CFG_ENV_ADDR (PHYS_FLASH_1 + 0xe000) /* 0x10000 */ #define CFG_ENV_SIZE 0x2000 /* 0x8000 */+#endif++ #define CFG_LOAD_ADDR 0x21000000 /* default load address */ #define CFG_BOOT_SIZE 0x6000 /* 24 KBytes */diff -purN u-boot-1.0.0.orig/include/dataflash.h u-boot-1.0.0.test/include/dataflash.h--- u-boot-1.0.0.orig/include/dataflash.h Fri Jun 27 23:32:40 2003+++ u-boot-1.0.0.test/include/dataflash.h Fri Nov 7 15:46:59 2003@@ -37,16 +37,15 @@ #include <asm/arch/hardware.h> #include "config.h" +/*number of protected area*/+#define NB_DATAFLASH_AREA 4 +/*define the area structure*/ typedef struct {- unsigned long base; /* logical base address for a bank */- unsigned long size; /* total bank size */- unsigned long page_count;- unsigned long page_size;- unsigned long id; /* device id */- unsigned char protect[CFG_MAX_DATAFLASH_PAGES]; /* page protection status */-} dataflash_info_t;-+ unsigned long start;+ unsigned long end;+ unsigned char protected;+} dataflash_protect_t; typedef unsigned int AT91S_DataFlashStatus; @@ -80,6 +79,7 @@ typedef struct _AT91S_Dataflash { int page_offset; /* page offset in command */ int byte_mask; /* byte mask in command */ int cs;+ dataflash_protect_t area_list[NB_DATAFLASH_AREA]; /* area protection status */ } AT91S_DataflashFeatures, *AT91PS_DataflashFeatures; /*---------------------------------------------*/@@ -91,13 +91,13 @@ typedef struct _AT91S_DataFlash { } AT91S_DataFlash, *AT91PS_DataFlash; + typedef struct _AT91S_DATAFLASH_INFO { AT91S_DataflashDesc Desc; AT91S_DataflashFeatures Device; /* Pointer on a dataflash features array */ unsigned long logical_address; unsigned int id; /* device id */- unsigned char protect[CFG_MAX_DATAFLASH_PAGES]; /* page protection status */ } AT91S_DATAFLASH_INFO, *AT91PS_DATAFLASH_INFO; @@ -106,6 +106,7 @@ typedef struct _AT91S_DATAFLASH_INFO { #define AT45DB161 0x2c #define AT45DB321 0x34 #define AT45DB642 0x3c+#define AT45DB128 0x10 #define AT91C_DATAFLASH_TIMEOUT 10000 /* For AT91F_DataFlashWaitReady */ @@ -166,6 +167,9 @@ typedef struct _AT91S_DATAFLASH_INFO { /*-------------------------------------------------------------------------------------------------*/ +extern int size_dataflash (AT91PS_DataFlash pdataFlash, unsigned long addr, unsigned long size);+extern int prot_dataflash (AT91PS_DataFlash pdataFlash, unsigned long addr);+extern int dataflash_real_protect (int flag, unsigned long start_addr, unsigned long end_addr); extern int addr_dataflash (unsigned long addr); extern int read_dataflash (unsigned long addr, unsigned long size, char *result); extern int write_dataflash (unsigned long addr, unsigned long dest, unsigned long size);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -