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

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

📁 使用DataFlash自动引导U-boot的程序源码
💻 DAT
📖 第 1 页 / 共 3 页
字号:
 	pDataFlash->pDataFlashDesc->tx_data_pt = dataBuffer; 	pDataFlash->pDataFlashDesc->tx_data_size = sizeToRead; +	status = AT91F_DataFlashSendCommand (pDataFlash, DB_CONTINUOUS_ARRAY_READ, 8, src); 	/* Send the command to the dataflash */-	return(AT91F_DataFlashSendCommand (pDataFlash, DB_CONTINUOUS_ARRAY_READ, 8, src));+	return(status); }  @@ -259,13 +272,17 @@ AT91S_DataFlashStatus AT91F_DataFlashPag 	unsigned int dest, 	unsigned int SizeToWrite) {+	int cmdsize; 	pDataFlash->pDataFlashDesc->tx_data_pt = src ; 	pDataFlash->pDataFlashDesc->tx_data_size = SizeToWrite ; 	pDataFlash->pDataFlashDesc->rx_data_pt = src; 	pDataFlash->pDataFlashDesc->rx_data_size = SizeToWrite; +	cmdsize = 4; 	/* Send the command to the dataflash */-	return(AT91F_DataFlashSendCommand (pDataFlash, DB_PAGE_PGM_BUF1, 4, dest));+	if (pDataFlash->pDevice->pages_number >= 16384)+		cmdsize = 5;+	return(AT91F_DataFlashSendCommand (pDataFlash, DB_PAGE_PGM_BUF1, cmdsize, dest)); }  @@ -282,14 +299,17 @@ AT91S_DataFlashStatus AT91F_MainMemoryTo 	unsigned char BufferCommand, 	unsigned int page) {+	int cmdsize; 	/* Test if the buffer command is legal */ 	if ((BufferCommand != DB_PAGE_2_BUF1_TRF) && (BufferCommand != DB_PAGE_2_BUF2_TRF)) 		return DATAFLASH_BAD_COMMAND;  	/* no data to transmit or receive */ 	pDataFlash->pDataFlashDesc->tx_data_size = 0;--	return(AT91F_DataFlashSendCommand (pDataFlash, BufferCommand, 4, page*pDataFlash->pDevice->pages_size));+	cmdsize = 4;+	if (pDataFlash->pDevice->pages_number >= 16384)+		cmdsize = 5;+	return(AT91F_DataFlashSendCommand (pDataFlash, BufferCommand, cmdsize, page*pDataFlash->pDevice->pages_size)); }  @@ -310,6 +330,7 @@ AT91S_DataFlashStatus AT91F_DataFlashWri 	unsigned int bufferAddress, 	int SizeToWrite ) {+	int cmdsize; 	/* Test if the buffer command is legal */ 	if ((BufferCommand != DB_BUF1_WRITE) && (BufferCommand != DB_BUF2_WRITE)) 		return DATAFLASH_BAD_COMMAND;@@ -324,14 +345,25 @@ AT91S_DataFlashStatus AT91F_DataFlashWri 	/* Send first Write Command */ 	pDataFlash->pDataFlashDesc->command[0] = BufferCommand; 	pDataFlash->pDataFlashDesc->command[1] = 0;-	pDataFlash->pDataFlashDesc->command[2] = (unsigned char)(((unsigned int)(bufferAddress &  pDataFlash->pDevice->byte_mask)) >> 8) ;-	pDataFlash->pDataFlashDesc->command[3] = (unsigned char)((unsigned int)bufferAddress  & 0x00FF) ;-+	if (pDataFlash->pDevice->pages_number >= 16384)+	{+	    	pDataFlash->pDataFlashDesc->command[2] = 0;+	    	pDataFlash->pDataFlashDesc->command[3] = (unsigned char)(((unsigned int)(bufferAddress &  pDataFlash->pDevice->byte_mask)) >> 8) ;+	    	pDataFlash->pDataFlashDesc->command[4] = (unsigned char)((unsigned int)bufferAddress  & 0x00FF) ;+		cmdsize = 5;+	}+	else+	{+	    	pDataFlash->pDataFlashDesc->command[2] = (unsigned char)(((unsigned int)(bufferAddress &  pDataFlash->pDevice->byte_mask)) >> 8) ;+	    	pDataFlash->pDataFlashDesc->command[3] = (unsigned char)((unsigned int)bufferAddress  & 0x00FF) ;+	    	pDataFlash->pDataFlashDesc->command[4] = 0;+		cmdsize = 4;+	}  	pDataFlash->pDataFlashDesc->tx_cmd_pt 	 = pDataFlash->pDataFlashDesc->command ;-	pDataFlash->pDataFlashDesc->tx_cmd_size = 4 ;+	pDataFlash->pDataFlashDesc->tx_cmd_size = cmdsize ; 	pDataFlash->pDataFlashDesc->rx_cmd_pt 	 = pDataFlash->pDataFlashDesc->command ;-	pDataFlash->pDataFlashDesc->rx_cmd_size = 4 ;+	pDataFlash->pDataFlashDesc->rx_cmd_size = cmdsize ;  	pDataFlash->pDataFlashDesc->rx_data_pt 	= dataBuffer ; 	pDataFlash->pDataFlashDesc->tx_data_pt 	= dataBuffer ;@@ -341,6 +373,51 @@ AT91S_DataFlashStatus AT91F_DataFlashWri 	return AT91F_SpiWrite(pDataFlash->pDataFlashDesc); } +/*------------------------------------------------------------------------------*/+/* Function Name       : AT91F_PageErase                                        */             +/* Object              : Erase a page 						*/+/* Input Parameters    : DataFlash Service					*/+/*                     : Page concerned						*/+/*                     : 							*/+/* Return value		: State of the dataflash				*/+/*------------------------------------------------------------------------------*/+AT91S_DataFlashStatus AT91F_PageErase(+	AT91PS_DataFlash pDataFlash,+	unsigned int page)+{+	int cmdsize;+	/* Test if the buffer command is legal */	+	/* no data to transmit or receive */+    	pDataFlash->pDataFlashDesc->tx_data_size = 0;+	+	cmdsize = 4;+	if (pDataFlash->pDevice->pages_number >= 16384)+		cmdsize = 5;+	return(AT91F_DataFlashSendCommand (pDataFlash, DB_PAGE_ERASE, cmdsize, page*pDataFlash->pDevice->pages_size));+}+++/*------------------------------------------------------------------------------*/+/* Function Name       : AT91F_BlockErase                                       */             +/* Object              : Erase a Block 						*/+/* Input Parameters    : DataFlash Service					*/+/*                     : Page concerned						*/+/*                     : 							*/+/* Return value		: State of the dataflash				*/+/*------------------------------------------------------------------------------*/+AT91S_DataFlashStatus AT91F_BlockErase(+	AT91PS_DataFlash pDataFlash,+	unsigned int block)+{+	int cmdsize;+	/* Test if the buffer command is legal */	+	/* no data to transmit or receive */+    	pDataFlash->pDataFlashDesc->tx_data_size = 0;+	cmdsize = 4;+	if (pDataFlash->pDevice->pages_number >= 16384)+		cmdsize = 5;+	return(AT91F_DataFlashSendCommand (pDataFlash, DB_BLOCK_ERASE,cmdsize, block*8*pDataFlash->pDevice->pages_size));+}  /*------------------------------------------------------------------------------*/ /* Function Name       : AT91F_WriteBufferToMain				*/@@ -355,6 +432,7 @@ AT91S_DataFlashStatus AT91F_WriteBufferT 	unsigned char BufferCommand, 	unsigned int dest ) {+	int cmdsize; 	/* Test if the buffer command is correct */ 	if ((BufferCommand != DB_BUF1_PAGE_PGM) && 	    (BufferCommand != DB_BUF1_PAGE_ERASE_PGM) &&@@ -365,8 +443,11 @@ AT91S_DataFlashStatus AT91F_WriteBufferT 	/* no data to transmit or receive */ 	pDataFlash->pDataFlashDesc->tx_data_size = 0; +	cmdsize = 4;+	if (pDataFlash->pDevice->pages_number >= 16384)+		cmdsize = 5; 	/* Send the command to the dataflash */-	return(AT91F_DataFlashSendCommand (pDataFlash, BufferCommand, 4, dest));+	return(AT91F_DataFlashSendCommand (pDataFlash, BufferCommand, cmdsize, dest)); }  @@ -391,10 +472,19 @@ AT91S_DataFlashStatus AT91F_PartialPageW  	/* Read the contents of the page in the Sram Buffer */ 	AT91F_MainMemoryToBufferTransfert(pDataFlash, DB_PAGE_2_BUF1_TRF, page);-	AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, 1000);+	AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_TIMEOUT_WRDY); 	/*Update the SRAM buffer */ 	AT91F_DataFlashWriteBuffer(pDataFlash, DB_BUF1_WRITE, src, AdrInPage, size);-	AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, 1000);++	AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_TIMEOUT_WRDY);+	+	/* Erase page if a 128 Mbits device */+	if (pDataFlash->pDevice->pages_number >= 16384)+	{+		AT91F_PageErase(pDataFlash, page);+		/* Rewrite the modified Sram Buffer in the main memory */+		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_TIMEOUT_WRDY);+	}  	/* Rewrite the modified Sram Buffer in the main memory */ 	return(AT91F_WriteBufferToMain(pDataFlash, DB_BUF1_PAGE_ERASE_PGM, (page*pDataFlash->pDevice->pages_size)));@@ -402,7 +492,7 @@ AT91S_DataFlashStatus AT91F_PartialPageW   /*------------------------------------------------------------------------------*/-/* Function Name       : AT91F_DataFlashWrite_Overloaded			*/+/* Function Name       : AT91F_DataFlashWrite					*/ /* Object              :							*/ /* Input Parameters    : <*src> = Source buffer					*/ /*                     : <dest> = dataflash adress				*/@@ -415,6 +505,8 @@ AT91S_DataFlashStatus AT91F_DataFlashWri 	int size ) { 	unsigned int length;+	unsigned int page;+	unsigned int status;  	AT91F_SpiEnable(pDataFlash->pDevice->cs); @@ -431,7 +523,7 @@ AT91S_DataFlashStatus AT91F_DataFlashWri 		if(!AT91F_PartialPageWrite(pDataFlash,src, dest, length)) 			return DATAFLASH_ERROR; -		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, 1000);+		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_TIMEOUT_WRDY);  		/* Update size, source and destination pointers */ 		size -= length;@@ -441,10 +533,21 @@ AT91S_DataFlashStatus AT91F_DataFlashWri  	while (( size - pDataFlash->pDevice->pages_size ) >= 0 ) { 		/* program dataflash page */-		if(!AT91F_DataFlashPagePgmBuf(pDataFlash, src, dest, pDataFlash->pDevice->pages_size ))+		page = (unsigned int)dest / (pDataFlash->pDevice->pages_size);++		status = AT91F_DataFlashWriteBuffer(pDataFlash, DB_BUF1_WRITE, src, 0, pDataFlash->pDevice->pages_size);+		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_TIMEOUT_WRDY);++		status = AT91F_PageErase(pDataFlash, page);+		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_TIMEOUT_WRDY);+		if (!status)+			return DATAFLASH_ERROR;+	+		status = AT91F_WriteBufferToMain (pDataFlash, DB_BUF1_PAGE_PGM, dest);+		if(!status) 			return DATAFLASH_ERROR; -		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, 1000);+		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_TIMEOUT_WRDY);  		/* Update size, source and destination pointers */ 		size -= pDataFlash->pDevice->pages_size ;@@ -458,7 +561,7 @@ AT91S_DataFlashStatus AT91F_DataFlashWri 		if(!AT91F_PartialPageWrite(pDataFlash, src, dest, size) ) 			return DATAFLASH_ERROR; -		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, 1000);+		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_TIMEOUT_WRDY); 	} 	return DATAFLASH_OK; }@@ -480,13 +583,13 @@ int AT91F_DataFlashRead(  	AT91F_SpiEnable(pDataFlash->pDevice->cs); -	if(AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, 1000) != DATAFLASH_OK)+	if(AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_TIMEOUT_WRDY) != DATAFLASH_OK) 		return -1;  	while (size) { 		SizeToRead = (size < 0x8000)? size:0x8000; -		if (AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, 1000) != DATAFLASH_OK)+		if (AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_TIMEOUT_WRDY) != DATAFLASH_OK) 			return -1;  		if (AT91F_DataFlashContinuousRead (pDataFlash, addr, buffer, SizeToRead) != DATAFLASH_OK)diff -purN u-boot-1.0.0.orig/drivers/dataflash.c u-boot-1.0.0.test/drivers/dataflash.c--- u-boot-1.0.0.orig/drivers/dataflash.c	Fri Jun 27 23:32:37 2003+++ u-boot-1.0.0.test/drivers/dataflash.c	Fri Nov  7 15:46:59 2003@@ -31,22 +31,33 @@ int cs[][CFG_MAX_DATAFLASH_BANKS] = { 	{CFG_DATAFLASH_LOGIC_ADDR_CS3, 3} }; +/*define the area offsets*/	+dataflash_protect_t area_list[NB_DATAFLASH_AREA]={+{0, 0x7fff, FLAG_PROTECT_SET},		/* ROM code */+{0x8000, 0x1ffff, FLAG_PROTECT_SET},	/* u-boot code*/+{0x20000, 0x27fff, FLAG_PROTECT_CLEAR},	/* u-boot environment */+{0x28000, 0x1fffff, FLAG_PROTECT_CLEAR},/* data area size to tune */+};+ extern void AT91F_SpiInit (void); extern int AT91F_DataflashProbe (int i, AT91PS_DataflashDesc pDesc); extern int AT91F_DataFlashRead (AT91PS_DataFlash pDataFlash, 				unsigned long addr, 				unsigned long size, char *buffer);-+extern int AT91F_DataFlashWrite( AT91PS_DataFlash pDataFlash,+				    unsigned char *src,+			            int dest,+				    int size );  int AT91F_DataflashInit (void) {-	int i, j;+	int i,j; 	int dfcode;-+		 	AT91F_SpiInit ();  	for (i = 0; i < CFG_MAX_DATAFLASH_BANKS; i++) {-+		dataflash_info[i].Desc.state = IDLE; 		dataflash_info[i].id = 0; 		dataflash_info[i].Device.pages_number = 0; 		dfcode = AT91F_DataflashProbe (cs[i][1], &dataflash_info[i].Desc);@@ -84,22 +95,39 @@ int AT91F_DataflashInit (void)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -