⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 patch-u-boot-at91rm9200-dataflash.dat

📁 使用DataFlash自动引导U-boot的程序源码
💻 DAT
📖 第 1 页 / 共 3 页
字号:
 			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 + -