@ -48,28 +48,27 @@ AT91S_DataFlashStatus AT91F_DataFlashSendCommand(AT91PS_DataFlash pDataFlash,
/* process the address to obtain page address and byte address */
adr = ( ( DataflashAddress / ( pDataFlash - > pDevice - > pages_size ) ) < <
pDataFlash - > pDevice - > page_offset ) + ( DataflashAddress %
( pDataFlash - > pDevice - >
pages_size ) ) ;
pDataFlash - > pDevice - > page_offset ) +
( DataflashAddress % ( pDataFlash - > pDevice - > pages_size ) ) ;
/* fill the command buffer */
/* fill the command buffer */
pDataFlash - > pDataFlashDesc - > command [ 0 ] = OpCode ;
if ( pDataFlash - > pDevice - > pages_number > = 16384 ) {
pDataFlash - > pDataFlashDesc - > command [ 1 ] =
( unsigned char ) ( ( adr & 0x0F000000 ) > > 24 ) ;
( unsigned char ) ( ( adr & 0x0F000000 ) > > 24 ) ;
pDataFlash - > pDataFlashDesc - > command [ 2 ] =
( unsigned char ) ( ( adr & 0x00FF0000 ) > > 16 ) ;
( unsigned char ) ( ( adr & 0x00FF0000 ) > > 16 ) ;
pDataFlash - > pDataFlashDesc - > command [ 3 ] =
( unsigned char ) ( ( adr & 0x0000FF00 ) > > 8 ) ;
( unsigned char ) ( ( adr & 0x0000FF00 ) > > 8 ) ;
pDataFlash - > pDataFlashDesc - > command [ 4 ] =
( unsigned char ) ( adr & 0x000000FF ) ;
( unsigned char ) ( adr & 0x000000FF ) ;
} else {
pDataFlash - > pDataFlashDesc - > command [ 1 ] =
( unsigned char ) ( ( adr & 0x00FF0000 ) > > 16 ) ;
( unsigned char ) ( ( adr & 0x00FF0000 ) > > 16 ) ;
pDataFlash - > pDataFlashDesc - > command [ 2 ] =
( unsigned char ) ( ( adr & 0x0000FF00 ) > > 8 ) ;
( unsigned char ) ( ( adr & 0x0000FF00 ) > > 8 ) ;
pDataFlash - > pDataFlashDesc - > command [ 3 ] =
( unsigned char ) ( adr & 0x000000FF ) ;
( unsigned char ) ( adr & 0x000000FF ) ;
pDataFlash - > pDataFlashDesc - > command [ 4 ] = 0 ;
}
pDataFlash - > pDataFlashDesc - > command [ 5 ] = 0 ;
@ -78,10 +77,10 @@ AT91S_DataFlashStatus AT91F_DataFlashSendCommand(AT91PS_DataFlash pDataFlash,
/* Initialize the SpiData structure for the spi write fuction */
pDataFlash - > pDataFlashDesc - > tx_cmd_pt =
pDataFlash - > pDataFlashDesc - > command ;
pDataFlash - > pDataFlashDesc - > command ;
pDataFlash - > pDataFlashDesc - > tx_cmd_size = CmdSize ;
pDataFlash - > pDataFlashDesc - > rx_cmd_pt =
pDataFlash - > pDataFlashDesc - > command ;
pDataFlash - > pDataFlashDesc - > command ;
pDataFlash - > pDataFlashDesc - > rx_cmd_size = CmdSize ;
/* send the command and read the data */
@ -123,8 +122,8 @@ AT91S_DataFlashStatus AT91F_DataFlashGetStatus(AT91PS_DataflashDesc pDesc)
/* \brief wait for dataflash ready (bit7 of the status register == 1) */
/*----------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_DataFlashWaitReady ( AT91PS_DataflashDesc
pDataFlashDesc ,
unsigned int timeout )
pDataFlashDesc ,
unsigned int timeout )
{
pDataFlashDesc - > DataFlash_state = IDLE ;
@ -149,16 +148,17 @@ AT91S_DataFlashStatus AT91F_DataFlashWaitReady(AT91PS_DataflashDesc
/* : <sizeToRead> = data buffer size */
/* Return value : State of the dataflash */
/*--------------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_DataFlashContinuousRead ( AT91PS_DataFlash pDataFlash ,
int src ,
unsigned char * dataBuffer ,
int sizeToRead )
AT91S_DataFlashStatus AT91F_DataFlashContinuousRead (
AT91PS_DataFlash pDataFlash ,
int src ,
unsigned char * dataBuffer ,
int sizeToRead )
{
AT91S_DataFlashStatus status ;
/* Test the size to read in the device */
if ( ( src + sizeToRead ) >
( pDataFlash - > pDevice - > pages_size *
( pDataFlash - > pDevice - > pages_number ) ) )
( pDataFlash - > pDevice - > pages_size *
( pDataFlash - > pDevice - > pages_number ) ) )
return DATAFLASH_MEMORY_OVERFLOW ;
pDataFlash - > pDataFlashDesc - > rx_data_pt = dataBuffer ;
@ -166,8 +166,8 @@ AT91S_DataFlashStatus AT91F_DataFlashContinuousRead(AT91PS_DataFlash pDataFlash,
pDataFlash - > pDataFlashDesc - > tx_data_pt = dataBuffer ;
pDataFlash - > pDataFlashDesc - > tx_data_size = sizeToRead ;
status = AT91F_DataFlashSendCommand
( pDataFlash , DB_CONTINUOUS_ARRAY_READ , 8 , src ) ;
status = AT91F_DataFlashSendCommand (
pDataFlash , DB_CONTINUOUS_ARRAY_READ , 8 , src ) ;
/* Send the command to the dataflash */
return ( status ) ;
}
@ -196,8 +196,8 @@ AT91S_DataFlashStatus AT91F_DataFlashPagePgmBuf(AT91PS_DataFlash pDataFlash,
/* Send the command to the dataflash */
if ( pDataFlash - > pDevice - > pages_number > = 16384 )
cmdsize = 5 ;
return ( AT91F_DataFlashSendCommand ( pDataFlash , DB_PAGE_PGM_BUF1 ,
cmdsize , dest ) ) ;
return ( AT91F_DataFlashSendCommand (
pDataFlash , DB_PAGE_PGM_BUF1 , cmdsize , dest ) ) ;
}
/*---------------------------------------------------------------------------*/
@ -208,16 +208,17 @@ AT91S_DataFlashStatus AT91F_DataFlashPagePgmBuf(AT91PS_DataFlash pDataFlash,
/* : */
/* Return value : State of the dataflash */
/*---------------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_MainMemoryToBufferTransfert ( AT91PS_DataFlash
pDataFlash ,
unsigned char
BufferCommand ,
unsigned int page )
AT91S_DataFlashStatus AT91F_MainMemoryToBufferTransfert (
AT91PS_DataFlash
pDataFlash ,
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 ) )
if ( ( BufferCommand ! = DB_PAGE_2_BUF1_TRF ) & &
( BufferCommand ! = DB_PAGE_2_BUF2_TRF ) )
return DATAFLASH_BAD_COMMAND ;
/* no data to transmit or receive */
@ -225,9 +226,9 @@ AT91S_DataFlashStatus AT91F_MainMemoryToBufferTransfert(AT91PS_DataFlash
cmdsize = 4 ;
if ( pDataFlash - > pDevice - > pages_number > = 16384 )
cmdsize = 5 ;
return ( AT91F_DataFlashSendCommand ( pDataFlash , BufferCommand , cmdsize ,
page *
pDataFlash - > pDevice - > pages_size ) ) ;
return ( AT91F_DataFlashSendCommand (
pDataFlash , BufferCommand , cmdsize ,
page * pDataFlash - > pDevice - > pages_size ) ) ;
}
/*-------------------------------------------------------------------------- */
@ -240,16 +241,17 @@ AT91S_DataFlashStatus AT91F_MainMemoryToBufferTransfert(AT91PS_DataFlash
/* : <SizeToWrite> = data buffer size */
/* Return value : State of the dataflash */
/*---------------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_DataFlashWriteBuffer ( AT91PS_DataFlash pDataFlash ,
unsigned char BufferCommand ,
unsigned char * dataBuffer ,
unsigned int bufferAddress ,
int SizeToWrite )
AT91S_DataFlashStatus AT91F_DataFlashWriteBuffer (
AT91PS_DataFlash pDataFlash ,
unsigned char BufferCommand ,
unsigned char * dataBuffer ,
unsigned int bufferAddress ,
int SizeToWrite )
{
int cmdsize ;
/* Test if the buffer command is legal */
if ( ( BufferCommand ! = DB_BUF1_WRITE )
& & ( BufferCommand ! = DB_BUF2_WRITE ) )
if ( ( BufferCommand ! = DB_BUF1_WRITE ) & &
( BufferCommand ! = DB_BUF2_WRITE ) )
return DATAFLASH_BAD_COMMAND ;
/* buffer address must be lower than page size */
@ -265,28 +267,28 @@ AT91S_DataFlashStatus AT91F_DataFlashWriteBuffer(AT91PS_DataFlash pDataFlash,
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 ) ;
( unsigned char ) ( ( ( unsigned int ) ( bufferAddress &
pDataFlash - > pDevice - >
byte_mask ) ) > > 8 ) ;
pDataFlash - > pDataFlashDesc - > command [ 4 ] =
( unsigned char ) ( ( unsigned int ) bufferAddress & 0x00FF ) ;
( unsigned char ) ( ( unsigned int ) bufferAddress & 0x00FF ) ;
cmdsize = 5 ;
} else {
pDataFlash - > pDataFlashDesc - > command [ 2 ] =
( unsigned char ) ( ( ( unsigned int ) ( bufferAddress &
pDataFlash - > pDevice - >
byte_mask ) ) > > 8 ) ;
( unsigned char ) ( ( ( unsigned int ) ( bufferAddress &
pDataFlash - > pDevice - >
byte_mask ) ) > > 8 ) ;
pDataFlash - > pDataFlashDesc - > command [ 3 ] =
( unsigned char ) ( ( unsigned int ) bufferAddress & 0x00FF ) ;
( unsigned char ) ( ( unsigned int ) bufferAddress & 0x00FF ) ;
pDataFlash - > pDataFlashDesc - > command [ 4 ] = 0 ;
cmdsize = 4 ;
}
pDataFlash - > pDataFlashDesc - > tx_cmd_pt =
pDataFlash - > pDataFlashDesc - > command ;
pDataFlash - > pDataFlashDesc - > command ;
pDataFlash - > pDataFlashDesc - > tx_cmd_size = cmdsize ;
pDataFlash - > pDataFlashDesc - > rx_cmd_pt =
pDataFlash - > pDataFlashDesc - > command ;
pDataFlash - > pDataFlashDesc - > command ;
pDataFlash - > pDataFlashDesc - > rx_cmd_size = cmdsize ;
pDataFlash - > pDataFlashDesc - > rx_data_pt = dataBuffer ;
@ -305,8 +307,9 @@ AT91S_DataFlashStatus AT91F_DataFlashWriteBuffer(AT91PS_DataFlash pDataFlash,
/* : */
/* Return value : State of the dataflash */
/*---------------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_PageErase ( AT91PS_DataFlash pDataFlash ,
unsigned int page )
AT91S_DataFlashStatus AT91F_PageErase (
AT91PS_DataFlash pDataFlash ,
unsigned int page )
{
int cmdsize ;
/* Test if the buffer command is legal */
@ -316,9 +319,9 @@ AT91S_DataFlashStatus AT91F_PageErase(AT91PS_DataFlash pDataFlash,
cmdsize = 4 ;
if ( pDataFlash - > pDevice - > pages_number > = 16384 )
cmdsize = 5 ;
return ( AT91F_DataFlashSendCommand ( pDataFlash , DB_PAGE_ERASE , cmdsize ,
page *
pDataFlash - > pDevice - > pages_size ) ) ;
return ( AT91F_DataFlashSendCommand ( pDataFlash ,
DB_PAGE_ERASE , cmdsize ,
page * pDataFlash - > pDevice - > pages_size ) ) ;
}
/*---------------------------------------------------------------------------*/
@ -329,8 +332,9 @@ AT91S_DataFlashStatus AT91F_PageErase(AT91PS_DataFlash pDataFlash,
/* : */
/* Return value : State of the dataflash */
/*---------------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_BlockErase ( AT91PS_DataFlash pDataFlash ,
unsigned int block )
AT91S_DataFlashStatus AT91F_BlockErase (
AT91PS_DataFlash pDataFlash ,
unsigned int block )
{
int cmdsize ;
/* Test if the buffer command is legal */
@ -340,8 +344,8 @@ AT91S_DataFlashStatus AT91F_BlockErase(AT91PS_DataFlash pDataFlash,
if ( pDataFlash - > pDevice - > pages_number > = 16384 )
cmdsize = 5 ;
return ( AT91F_DataFlashSendCommand ( pDataFlash , DB_BLOCK_ERASE , cmdsize ,
block * 8 *
pDataFlash - > pDevice - > pages_size ) ) ;
block * 8 *
pDataFlash - > pDevice - > pages_size ) ) ;
}
/*---------------------------------------------------------------------------*/
@ -353,15 +357,15 @@ AT91S_DataFlashStatus AT91F_BlockErase(AT91PS_DataFlash pDataFlash,
/* Return value : State of the dataflash */
/*---------------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_WriteBufferToMain ( AT91PS_DataFlash pDataFlash ,
unsigned char BufferCommand ,
unsigned int dest )
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 ) & &
( BufferCommand ! = DB_BUF2_PAGE_PGM ) & &
( BufferCommand ! = DB_BUF2_PAGE_ERASE_PGM ) )
( BufferCommand ! = DB_BUF1_PAGE_ERASE_PGM ) & &
( BufferCommand ! = DB_BUF2_PAGE_PGM ) & &
( BufferCommand ! = DB_BUF2_PAGE_ERASE_PGM ) )
return DATAFLASH_BAD_COMMAND ;
/* no data to transmit or receive */
@ -371,8 +375,8 @@ AT91S_DataFlashStatus AT91F_WriteBufferToMain(AT91PS_DataFlash pDataFlash,
if ( pDataFlash - > pDevice - > pages_number > = 16384 )
cmdsize = 5 ;
/* Send the command to the dataflash */
return ( AT91F_DataFlashSendCommand ( pDataFlash , BufferCommand , cmdsize ,
dest ) ) ;
return ( AT91F_DataFlashSendCommand ( pDataFlash , BufferCommand ,
cmdsize , dest ) ) ;
}
/*---------------------------------------------------------------------------*/
@ -383,9 +387,9 @@ AT91S_DataFlashStatus AT91F_WriteBufferToMain(AT91PS_DataFlash pDataFlash,
/* : <length> = Number of bytes to erase */
/*---------------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_PartialPageWrite ( AT91PS_DataFlash pDataFlash ,
unsigned char * src ,
unsigned int dest ,
unsigned int size )
unsigned char * src ,
unsigned int dest ,
unsigned int size )
{
unsigned int page ;
unsigned int AdrInPage ;
@ -399,10 +403,10 @@ AT91S_DataFlashStatus AT91F_PartialPageWrite(AT91PS_DataFlash pDataFlash,
AT91C_TIMEOUT_WRDY ) ;
/*Update the SRAM buffer */
AT91F_DataFlashWriteBuffer ( pDataFlash , DB_BUF1_WRITE , src ,
AdrInPage , size ) ;
AdrInPage , size ) ;
AT91F_DataFlashWaitReady ( pDataFlash - > pDataFlashDesc ,
AT91C_TIMEOUT_WRDY ) ;
AT91C_TIMEOUT_WRDY ) ;
/* Erase page if a 128 Mbits device */
if ( pDataFlash - > pDevice - > pages_number > = 16384 ) {
@ -426,8 +430,8 @@ AT91S_DataFlashStatus AT91F_PartialPageWrite(AT91PS_DataFlash pDataFlash,
/* : <size> = data buffer size */
/*---------------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_DataFlashWrite ( AT91PS_DataFlash pDataFlash ,
unsigned char * src ,
int dest , int size )
unsigned char * src ,
int dest , int size )
{
unsigned int length ;
unsigned int page ;
@ -436,14 +440,14 @@ AT91S_DataFlashStatus AT91F_DataFlashWrite(AT91PS_DataFlash pDataFlash,
AT91F_SpiEnable ( pDataFlash - > pDevice - > cs ) ;
if ( ( dest + size ) > ( pDataFlash - > pDevice - > pages_size *
( pDataFlash - > pDevice - > pages_number ) ) )
( pDataFlash - > pDevice - > pages_number ) ) )
return DATAFLASH_MEMORY_OVERFLOW ;
/* If destination does not fit a page start address */
if ( ( dest % ( ( unsigned int ) ( pDataFlash - > pDevice - > pages_size ) ) ) ! = 0 ) {
length = pDataFlash - > pDevice - > pages_size -
( dest % ( ( unsigned int )
( pDataFlash - > pDevice - > pages_size ) ) ) ;
length =
pDataFlash - > pDevice - > pages_size -
( dest % ( ( unsigned int ) ( pDataFlash - > pDevice - > pages_size ) ) ) ;
if ( size < length )
length = size ;
@ -465,9 +469,9 @@ AT91S_DataFlashStatus AT91F_DataFlashWrite(AT91PS_DataFlash pDataFlash,
page = ( unsigned int ) dest / ( pDataFlash - > pDevice - > pages_size ) ;
status = AT91F_DataFlashWriteBuffer ( pDataFlash ,
DB_BUF1_WRITE , src , 0 ,
pDataFlash - > pDevice - >
pages_size ) ;
DB_BUF1_WRITE , src , 0 ,
pDataFlash - > pDevice - >
pages_size ) ;
AT91F_DataFlashWaitReady ( pDataFlash - > pDataFlashDesc ,
AT91C_TIMEOUT_WRDY ) ;
@ -478,7 +482,7 @@ AT91S_DataFlashStatus AT91F_DataFlashWrite(AT91PS_DataFlash pDataFlash,
return DATAFLASH_ERROR ;
status = AT91F_WriteBufferToMain ( pDataFlash ,
DB_BUF1_PAGE_PGM , dest ) ;
DB_BUF1_PAGE_PGM , dest ) ;
if ( ! status )
return DATAFLASH_ERROR ;
@ -517,20 +521,20 @@ int AT91F_DataFlashRead(AT91PS_DataFlash pDataFlash,
AT91F_SpiEnable ( pDataFlash - > pDevice - > cs ) ;
if ( AT91F_DataFlashWaitReady ( pDataFlash - > pDataFlashDesc ,
AT91C_TIMEOUT_WRDY ) ! = DATAFLASH_OK )
AT91C_TIMEOUT_WRDY ) ! = DATAFLASH_OK )
return - 1 ;
while ( size ) {
SizeToRead = ( size < 0x8000 ) ? size : 0x8000 ;
if ( AT91F_DataFlashWaitReady ( pDataFlash - > pDataFlashDesc ,
AT91C_TIMEOUT_WRDY ) ! =
DATAFLASH_OK )
AT91C_TIMEOUT_WRDY ) ! =
DATAFLASH_OK )
return - 1 ;
if ( AT91F_DataFlashContinuousRead ( pDataFlash , addr ,
( uchar * ) buffer ,
SizeToRead ) ! = DATAFLASH_OK )
( uchar * ) buffer ,
SizeToRead ) ! = DATAFLASH_OK )
return - 1 ;
size - = SizeToRead ;