?? patch-u-boot-at91rm9200-dataflash.dat
字號:
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 + -