Last user of this option went away in commit:
fdc7718999
("board: usb_a9263: Update to support DT and DM")
Signed-off-by: Tuomas Tynkkynen <tuomas.tynkkynen@iki.fi>
master
parent
95688de311
commit
c68c03f52b
@ -1,26 +0,0 @@ |
||||
/*
|
||||
* (C) Copyright 2008 |
||||
* Ulf Samuelsson <ulf@atmel.com> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
#include <common.h> |
||||
#include <config.h> |
||||
#include <asm/hardware.h> |
||||
#include <dataflash.h> |
||||
|
||||
AT91S_DATAFLASH_INFO dataflash_info[CONFIG_SYS_MAX_DATAFLASH_BANKS]; |
||||
|
||||
struct dataflash_addr cs[CONFIG_SYS_MAX_DATAFLASH_BANKS] = { |
||||
{CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */ |
||||
{CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS1, 1} |
||||
}; |
||||
|
||||
/*define the area offsets*/ |
||||
dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { |
||||
{0x00000000, 0x000041FF, FLAG_PROTECT_SET, 0, "Bootstrap"}, |
||||
{0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"}, |
||||
{0x00008400, 0x00083FFF, FLAG_PROTECT_SET, 0, "U-Boot"}, |
||||
{0x00084000, 0x00293FFF, FLAG_PROTECT_CLEAR, 0, "Kernel"}, |
||||
{0x00294000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, "FS"}, |
||||
}; |
@ -1,26 +0,0 @@ |
||||
/*
|
||||
* (C) Copyright 2008 |
||||
* Ulf Samuelsson <ulf@atmel.com> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
#include <common.h> |
||||
#include <config.h> |
||||
#include <asm/hardware.h> |
||||
#include <dataflash.h> |
||||
|
||||
AT91S_DATAFLASH_INFO dataflash_info[CONFIG_SYS_MAX_DATAFLASH_BANKS]; |
||||
|
||||
struct dataflash_addr cs[CONFIG_SYS_MAX_DATAFLASH_BANKS] = { |
||||
{CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */ |
||||
{CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS3, 3} |
||||
}; |
||||
|
||||
/*define the area offsets*/ |
||||
dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { |
||||
{0x00000000, 0x000041FF, FLAG_PROTECT_SET, 0, "Bootstrap"}, |
||||
{0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"}, |
||||
{0x00008400, 0x00083FFF, FLAG_PROTECT_SET, 0, "U-Boot"}, |
||||
{0x00084000, 0x00293FFF, FLAG_PROTECT_CLEAR, 0, "Kernel"}, |
||||
{0x00294000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, "FS"}, |
||||
}; |
@ -1,25 +0,0 @@ |
||||
/*
|
||||
* (C) Copyright 2008 |
||||
* Ulf Samuelsson <ulf@atmel.com> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
#include <common.h> |
||||
#include <config.h> |
||||
#include <asm/hardware.h> |
||||
#include <dataflash.h> |
||||
|
||||
AT91S_DATAFLASH_INFO dataflash_info[CONFIG_SYS_MAX_DATAFLASH_BANKS]; |
||||
|
||||
struct dataflash_addr cs[CONFIG_SYS_MAX_DATAFLASH_BANKS] = { |
||||
{CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */ |
||||
}; |
||||
|
||||
/*define the area offsets*/ |
||||
dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { |
||||
{0x00000000, 0x000041FF, FLAG_PROTECT_SET, 0, "Bootstrap"}, |
||||
{0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"}, |
||||
{0x00008400, 0x00083FFF, FLAG_PROTECT_SET, 0, "U-Boot"}, |
||||
{0x00084000, 0x00293FFF, FLAG_PROTECT_CLEAR, 0, "Kernel"}, |
||||
{0x00294000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, "FS"}, |
||||
}; |
@ -1,25 +0,0 @@ |
||||
/*
|
||||
* (C) Copyright 2008 |
||||
* Ulf Samuelsson <ulf@atmel.com> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
#include <common.h> |
||||
#include <config.h> |
||||
#include <asm/hardware.h> |
||||
#include <dataflash.h> |
||||
|
||||
AT91S_DATAFLASH_INFO dataflash_info[CONFIG_SYS_MAX_DATAFLASH_BANKS]; |
||||
|
||||
struct dataflash_addr cs[CONFIG_SYS_MAX_DATAFLASH_BANKS] = { |
||||
{CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */ |
||||
}; |
||||
|
||||
/*define the area offsets*/ |
||||
dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { |
||||
{0x00000000, 0x000041FF, FLAG_PROTECT_SET, 0, "Bootstrap"}, |
||||
{0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"}, |
||||
{0x00008400, 0x00083FFF, FLAG_PROTECT_SET, 0, "U-Boot"}, |
||||
{0x00084000, 0x00293FFF, FLAG_PROTECT_CLEAR, 0, "Kernel"}, |
||||
{0x00294000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, "FS"}, |
||||
}; |
@ -1,23 +0,0 @@ |
||||
/*
|
||||
* (C) Copyright 2008 |
||||
* Ulf Samuelsson <ulf@atmel.com> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
#include <common.h> |
||||
#include <config.h> |
||||
#include <asm/hardware.h> |
||||
#include <dataflash.h> |
||||
|
||||
AT91S_DATAFLASH_INFO dataflash_info[CONFIG_SYS_MAX_DATAFLASH_BANKS]; |
||||
|
||||
struct dataflash_addr cs[CONFIG_SYS_MAX_DATAFLASH_BANKS] = { |
||||
{CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */ |
||||
}; |
||||
|
||||
/* define the area offsets */ |
||||
dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { |
||||
{0x00000000, 0x000041FF, FLAG_PROTECT_SET, 0, "Bootstrap"}, |
||||
{0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"}, |
||||
{0x00008400, 0x00041FFF, FLAG_PROTECT_SET, 0, "U-Boot"}, |
||||
}; |
@ -1,33 +0,0 @@ |
||||
/*
|
||||
* (C) Copyright 2008 |
||||
* Ulf Samuelsson <ulf@atmel.com> |
||||
* Ilko Iliev <www.ronetix.at> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
#include <common.h> |
||||
#include <config.h> |
||||
#include <asm/hardware.h> |
||||
#include <dataflash.h> |
||||
|
||||
AT91S_DATAFLASH_INFO dataflash_info[CONFIG_SYS_MAX_DATAFLASH_BANKS]; |
||||
|
||||
struct dataflash_addr cs[CONFIG_SYS_MAX_DATAFLASH_BANKS] = { |
||||
{CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */ |
||||
}; |
||||
|
||||
/*define the area offsets*/ |
||||
#ifdef CONFIG_SYS_USE_DATAFLASH |
||||
dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { |
||||
{0x00000000, 0x000041FF, FLAG_PROTECT_SET, 0, "Bootstrap"}, |
||||
{0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"}, |
||||
{0x00008400, 0x00041FFF, FLAG_PROTECT_SET, 0, "U-Boot"}, |
||||
{0x00042000, 0x00251FFF, FLAG_PROTECT_CLEAR, 0, "Kernel"}, |
||||
{0x00252000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, "FS"}, |
||||
}; |
||||
#else |
||||
dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { |
||||
{0x00000000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, ""}, |
||||
}; |
||||
|
||||
#endif |
@ -1,33 +0,0 @@ |
||||
/*
|
||||
* (C) Copyright 2008 |
||||
* Ulf Samuelsson <ulf@atmel.com> |
||||
* Ilko Iliev <www.ronetix.at> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
#include <common.h> |
||||
#include <config.h> |
||||
#include <asm/hardware.h> |
||||
#include <dataflash.h> |
||||
|
||||
AT91S_DATAFLASH_INFO dataflash_info[CONFIG_SYS_MAX_DATAFLASH_BANKS]; |
||||
|
||||
struct dataflash_addr cs[CONFIG_SYS_MAX_DATAFLASH_BANKS] = { |
||||
{CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */ |
||||
}; |
||||
|
||||
/*define the area offsets*/ |
||||
#ifdef CONFIG_SYS_USE_DATAFLASH |
||||
dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { |
||||
{0x00000000, 0x000041FF, FLAG_PROTECT_SET, 0, "Bootstrap"}, |
||||
{0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"}, |
||||
{0x00008400, 0x00041FFF, FLAG_PROTECT_SET, 0, "U-Boot"}, |
||||
{0x00042000, 0x00251FFF, FLAG_PROTECT_CLEAR, 0, "Kernel"}, |
||||
{0x00252000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, "FS"}, |
||||
}; |
||||
#else |
||||
dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { |
||||
{0x00000000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, ""}, |
||||
}; |
||||
|
||||
#endif |
@ -1,545 +0,0 @@ |
||||
/* Driver for ATMEL DataFlash support
|
||||
* Author : Hamid Ikdoumi (Atmel) |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <config.h> |
||||
#include <common.h> |
||||
#include <dataflash.h> |
||||
|
||||
/*
|
||||
* spi.c API |
||||
*/ |
||||
extern unsigned int AT91F_SpiWrite(AT91PS_DataflashDesc pDesc); |
||||
extern void AT91F_SpiEnable(int cs); |
||||
|
||||
#define AT91C_TIMEOUT_WRDY 200000 |
||||
|
||||
/*----------------------------------------------------------------------*/ |
||||
/* \fn AT91F_DataFlashSendCommand */ |
||||
/* \brief Generic function to send a command to the dataflash */ |
||||
/*----------------------------------------------------------------------*/ |
||||
AT91S_DataFlashStatus AT91F_DataFlashSendCommand(AT91PS_DataFlash pDataFlash, |
||||
unsigned char OpCode, |
||||
unsigned int CmdSize, |
||||
unsigned int DataflashAddress) |
||||
{ |
||||
unsigned int adr; |
||||
|
||||
if ((pDataFlash->pDataFlashDesc->state) != IDLE) |
||||
return DATAFLASH_BUSY; |
||||
|
||||
/* 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)); |
||||
|
||||
/* fill the command buffer */ |
||||
pDataFlash->pDataFlashDesc->command[0] = OpCode; |
||||
if (pDataFlash->pDevice->pages_number >= 16384) { |
||||
pDataFlash->pDataFlashDesc->command[1] = |
||||
(unsigned char)((adr & 0x0F000000) >> 24); |
||||
pDataFlash->pDataFlashDesc->command[2] = |
||||
(unsigned char)((adr & 0x00FF0000) >> 16); |
||||
pDataFlash->pDataFlashDesc->command[3] = |
||||
(unsigned char)((adr & 0x0000FF00) >> 8); |
||||
pDataFlash->pDataFlashDesc->command[4] = |
||||
(unsigned char)(adr & 0x000000FF); |
||||
} else { |
||||
pDataFlash->pDataFlashDesc->command[1] = |
||||
(unsigned char)((adr & 0x00FF0000) >> 16); |
||||
pDataFlash->pDataFlashDesc->command[2] = |
||||
(unsigned char)((adr & 0x0000FF00) >> 8); |
||||
pDataFlash->pDataFlashDesc->command[3] = |
||||
(unsigned char)(adr & 0x000000FF); |
||||
pDataFlash->pDataFlashDesc->command[4] = 0; |
||||
} |
||||
pDataFlash->pDataFlashDesc->command[5] = 0; |
||||
pDataFlash->pDataFlashDesc->command[6] = 0; |
||||
pDataFlash->pDataFlashDesc->command[7] = 0; |
||||
|
||||
/* Initialize the SpiData structure for the spi write fuction */ |
||||
pDataFlash->pDataFlashDesc->tx_cmd_pt = |
||||
pDataFlash->pDataFlashDesc->command; |
||||
pDataFlash->pDataFlashDesc->tx_cmd_size = CmdSize; |
||||
pDataFlash->pDataFlashDesc->rx_cmd_pt = |
||||
pDataFlash->pDataFlashDesc->command; |
||||
pDataFlash->pDataFlashDesc->rx_cmd_size = CmdSize; |
||||
|
||||
/* send the command and read the data */ |
||||
return AT91F_SpiWrite(pDataFlash->pDataFlashDesc); |
||||
} |
||||
|
||||
/*----------------------------------------------------------------------*/ |
||||
/* \fn AT91F_DataFlashGetStatus */ |
||||
/* \brief Read the status register of the dataflash */ |
||||
/*----------------------------------------------------------------------*/ |
||||
AT91S_DataFlashStatus AT91F_DataFlashGetStatus(AT91PS_DataflashDesc pDesc) |
||||
{ |
||||
AT91S_DataFlashStatus status; |
||||
|
||||
/* if a transfert is in progress ==> return 0 */ |
||||
if ((pDesc->state) != IDLE) |
||||
return DATAFLASH_BUSY; |
||||
|
||||
/* first send the read status command (D7H) */ |
||||
pDesc->command[0] = DB_STATUS; |
||||
pDesc->command[1] = 0; |
||||
|
||||
pDesc->DataFlash_state = GET_STATUS; |
||||
pDesc->tx_data_size = 0; /* Transmit the command */ |
||||
/* and receive response */ |
||||
pDesc->tx_cmd_pt = pDesc->command; |
||||
pDesc->rx_cmd_pt = pDesc->command; |
||||
pDesc->rx_cmd_size = 2; |
||||
pDesc->tx_cmd_size = 2; |
||||
status = AT91F_SpiWrite(pDesc); |
||||
|
||||
pDesc->DataFlash_state = *((unsigned char *)(pDesc->rx_cmd_pt) + 1); |
||||
|
||||
return status; |
||||
} |
||||
|
||||
/*----------------------------------------------------------------------*/ |
||||
/* \fn AT91F_DataFlashWaitReady */ |
||||
/* \brief wait for dataflash ready (bit7 of the status register == 1) */ |
||||
/*----------------------------------------------------------------------*/ |
||||
AT91S_DataFlashStatus AT91F_DataFlashWaitReady(AT91PS_DataflashDesc |
||||
pDataFlashDesc, |
||||
unsigned int timeout) |
||||
{ |
||||
pDataFlashDesc->DataFlash_state = IDLE; |
||||
|
||||
do { |
||||
AT91F_DataFlashGetStatus(pDataFlashDesc); |
||||
timeout--; |
||||
} while (((pDataFlashDesc->DataFlash_state & 0x80) != 0x80) && |
||||
(timeout > 0)); |
||||
|
||||
if ((pDataFlashDesc->DataFlash_state & 0x80) != 0x80) |
||||
return DATAFLASH_ERROR; |
||||
|
||||
return DATAFLASH_OK; |
||||
} |
||||
|
||||
/*--------------------------------------------------------------------------*/ |
||||
/* Function Name : AT91F_DataFlashContinuousRead */ |
||||
/* Object : Continuous stream Read */ |
||||
/* Input Parameters : DataFlash Service */ |
||||
/* : <src> = dataflash address */ |
||||
/* : <*dataBuffer> = data buffer pointer */ |
||||
/* : <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 status; |
||||
/* Test the size to read in the device */ |
||||
if ((src + sizeToRead) > |
||||
(pDataFlash->pDevice->pages_size * |
||||
(pDataFlash->pDevice->pages_number))) |
||||
return DATAFLASH_MEMORY_OVERFLOW; |
||||
|
||||
pDataFlash->pDataFlashDesc->rx_data_pt = dataBuffer; |
||||
pDataFlash->pDataFlashDesc->rx_data_size = sizeToRead; |
||||
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 (status); |
||||
} |
||||
|
||||
/*---------------------------------------------------------------------------*/ |
||||
/* Function Name : AT91F_DataFlashPagePgmBuf */ |
||||
/* Object : Main memory page program thru buffer 1 or buffer 2 */ |
||||
/* Input Parameters : DataFlash Service */ |
||||
/* : <*src> = Source buffer */ |
||||
/* : <dest> = dataflash destination address */ |
||||
/* : <SizeToWrite> = data buffer size */ |
||||
/* Return value : State of the dataflash */ |
||||
/*---------------------------------------------------------------------------*/ |
||||
AT91S_DataFlashStatus AT91F_DataFlashPagePgmBuf(AT91PS_DataFlash pDataFlash, |
||||
unsigned char *src, |
||||
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 */ |
||||
if (pDataFlash->pDevice->pages_number >= 16384) |
||||
cmdsize = 5; |
||||
return (AT91F_DataFlashSendCommand( |
||||
pDataFlash, DB_PAGE_PGM_BUF1, cmdsize, dest)); |
||||
} |
||||
|
||||
/*---------------------------------------------------------------------------*/ |
||||
/* Function Name : AT91F_MainMemoryToBufferTransfert */ |
||||
/* Object : Read a page in the SRAM Buffer 1 or 2 */ |
||||
/* Input Parameters : DataFlash Service */ |
||||
/* : Page concerned */ |
||||
/* : */ |
||||
/* Return value : State of the dataflash */ |
||||
/*---------------------------------------------------------------------------*/ |
||||
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)) { |
||||
return DATAFLASH_BAD_COMMAND; |
||||
} |
||||
|
||||
/* 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, BufferCommand, cmdsize, |
||||
page * pDataFlash->pDevice->pages_size)); |
||||
} |
||||
|
||||
/*-------------------------------------------------------------------------- */ |
||||
/* Function Name : AT91F_DataFlashWriteBuffer */ |
||||
/* Object : Write data to the internal sram buffer 1 or 2 */ |
||||
/* Input Parameters : DataFlash Service */ |
||||
/* : <BufferCommand> = command to write buffer1 or 2 */ |
||||
/* : <*dataBuffer> = data buffer to write */ |
||||
/* : <bufferAddress> = address in the internal buffer */ |
||||
/* : <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) |
||||
{ |
||||
int cmdsize; |
||||
/* Test if the buffer command is legal */ |
||||
if ((BufferCommand != DB_BUF1_WRITE) && |
||||
(BufferCommand != DB_BUF2_WRITE)) { |
||||
return DATAFLASH_BAD_COMMAND; |
||||
} |
||||
|
||||
/* buffer address must be lower than page size */ |
||||
if (bufferAddress > pDataFlash->pDevice->pages_size) |
||||
return DATAFLASH_BAD_ADDRESS; |
||||
|
||||
if ((pDataFlash->pDataFlashDesc->state) != IDLE) |
||||
return DATAFLASH_BUSY; |
||||
|
||||
/* Send first Write Command */ |
||||
pDataFlash->pDataFlashDesc->command[0] = BufferCommand; |
||||
pDataFlash->pDataFlashDesc->command[1] = 0; |
||||
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 = cmdsize; |
||||
pDataFlash->pDataFlashDesc->rx_cmd_pt = |
||||
pDataFlash->pDataFlashDesc->command; |
||||
pDataFlash->pDataFlashDesc->rx_cmd_size = cmdsize; |
||||
|
||||
pDataFlash->pDataFlashDesc->rx_data_pt = dataBuffer; |
||||
pDataFlash->pDataFlashDesc->tx_data_pt = dataBuffer; |
||||
pDataFlash->pDataFlashDesc->rx_data_size = SizeToWrite; |
||||
pDataFlash->pDataFlashDesc->tx_data_size = SizeToWrite; |
||||
|
||||
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 */ |
||||
/* Object : Write buffer to the main memory */ |
||||
/* Input Parameters : DataFlash Service */ |
||||
/* : <BufferCommand> = command to send to buffer1 or buffer2 */ |
||||
/* : <dest> = main memory address */ |
||||
/* Return value : State of the dataflash */ |
||||
/*---------------------------------------------------------------------------*/ |
||||
AT91S_DataFlashStatus AT91F_WriteBufferToMain(AT91PS_DataFlash pDataFlash, |
||||
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)) |
||||
return DATAFLASH_BAD_COMMAND; |
||||
|
||||
/* 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, |
||||
cmdsize, dest)); |
||||
} |
||||
|
||||
/*---------------------------------------------------------------------------*/ |
||||
/* Function Name : AT91F_PartialPageWrite */ |
||||
/* Object : Erase partielly a page */ |
||||
/* Input Parameters : <page> = page number */ |
||||
/* : <AdrInpage> = adr to begin the fading */ |
||||
/* : <length> = Number of bytes to erase */ |
||||
/*---------------------------------------------------------------------------*/ |
||||
AT91S_DataFlashStatus AT91F_PartialPageWrite(AT91PS_DataFlash pDataFlash, |
||||
unsigned char *src, |
||||
unsigned int dest, |
||||
unsigned int size) |
||||
{ |
||||
unsigned int page; |
||||
unsigned int AdrInPage; |
||||
|
||||
page = dest / (pDataFlash->pDevice->pages_size); |
||||
AdrInPage = dest % (pDataFlash->pDevice->pages_size); |
||||
|
||||
/* Read the contents of the page in the Sram Buffer */ |
||||
AT91F_MainMemoryToBufferTransfert(pDataFlash, DB_PAGE_2_BUF1_TRF, page); |
||||
AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, |
||||
AT91C_TIMEOUT_WRDY); |
||||
/*Update the SRAM buffer */ |
||||
AT91F_DataFlashWriteBuffer(pDataFlash, DB_BUF1_WRITE, src, |
||||
AdrInPage, size); |
||||
|
||||
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))); |
||||
} |
||||
|
||||
/*---------------------------------------------------------------------------*/ |
||||
/* Function Name : AT91F_DataFlashWrite */ |
||||
/* Object : */ |
||||
/* Input Parameters : <*src> = Source buffer */ |
||||
/* : <dest> = dataflash adress */ |
||||
/* : <size> = data buffer size */ |
||||
/*---------------------------------------------------------------------------*/ |
||||
AT91S_DataFlashStatus AT91F_DataFlashWrite(AT91PS_DataFlash pDataFlash, |
||||
unsigned char *src, |
||||
int dest, int size) |
||||
{ |
||||
unsigned int length; |
||||
unsigned int page; |
||||
unsigned int status; |
||||
|
||||
AT91F_SpiEnable(pDataFlash->pDevice->cs); |
||||
|
||||
if ((dest + size) > (pDataFlash->pDevice->pages_size * |
||||
(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))); |
||||
|
||||
if (size < length) |
||||
length = size; |
||||
|
||||
if (!AT91F_PartialPageWrite(pDataFlash, src, dest, length)) |
||||
return DATAFLASH_ERROR; |
||||
|
||||
AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, |
||||
AT91C_TIMEOUT_WRDY); |
||||
|
||||
/* Update size, source and destination pointers */ |
||||
size -= length; |
||||
dest += length; |
||||
src += length; |
||||
} |
||||
|
||||
while ((size - pDataFlash->pDevice->pages_size) >= 0) { |
||||
/* program dataflash page */ |
||||
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, |
||||
AT91C_TIMEOUT_WRDY); |
||||
|
||||
/* Update size, source and destination pointers */ |
||||
size -= pDataFlash->pDevice->pages_size; |
||||
dest += pDataFlash->pDevice->pages_size; |
||||
src += pDataFlash->pDevice->pages_size; |
||||
} |
||||
|
||||
/* If still some bytes to read */ |
||||
if (size > 0) { |
||||
/* program dataflash page */ |
||||
if (!AT91F_PartialPageWrite(pDataFlash, src, dest, size)) |
||||
return DATAFLASH_ERROR; |
||||
|
||||
AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, |
||||
AT91C_TIMEOUT_WRDY); |
||||
} |
||||
return DATAFLASH_OK; |
||||
} |
||||
|
||||
/*---------------------------------------------------------------------------*/ |
||||
/* Function Name : AT91F_DataFlashRead */ |
||||
/* Object : Read a block in dataflash */ |
||||
/* Input Parameters : */ |
||||
/* Return value : */ |
||||
/*---------------------------------------------------------------------------*/ |
||||
int AT91F_DataFlashRead(AT91PS_DataFlash pDataFlash, |
||||
unsigned long addr, unsigned long size, char *buffer) |
||||
{ |
||||
unsigned long SizeToRead; |
||||
|
||||
AT91F_SpiEnable(pDataFlash->pDevice->cs); |
||||
|
||||
if (AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, |
||||
AT91C_TIMEOUT_WRDY) != DATAFLASH_OK) |
||||
return -1; |
||||
|
||||
while (size) { |
||||
SizeToRead = (size < 0x8000) ? size : 0x8000; |
||||
|
||||
if (AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, |
||||
AT91C_TIMEOUT_WRDY) != |
||||
DATAFLASH_OK) |
||||
return -1; |
||||
|
||||
if (AT91F_DataFlashContinuousRead(pDataFlash, addr, |
||||
(uchar *) buffer, |
||||
SizeToRead) != DATAFLASH_OK) |
||||
return -1; |
||||
|
||||
size -= SizeToRead; |
||||
addr += SizeToRead; |
||||
buffer += SizeToRead; |
||||
} |
||||
|
||||
return DATAFLASH_OK; |
||||
} |
||||
|
||||
/*---------------------------------------------------------------------------*/ |
||||
/* Function Name : AT91F_DataflashProbe */ |
||||
/* Object : */ |
||||
/* Input Parameters : */ |
||||
/* Return value : Dataflash status register */ |
||||
/*---------------------------------------------------------------------------*/ |
||||
int AT91F_DataflashProbe(int cs, AT91PS_DataflashDesc pDesc) |
||||
{ |
||||
AT91F_SpiEnable(cs); |
||||
AT91F_DataFlashGetStatus(pDesc); |
||||
return ((pDesc->command[1] == 0xFF) ? 0 : pDesc->command[1] & 0x3C); |
||||
} |
@ -1,448 +0,0 @@ |
||||
/*
|
||||
* LowLevel function for ATMEL DataFlash support |
||||
* Author : Hamid Ikdoumi (Atmel) |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
#include <common.h> |
||||
#include <config.h> |
||||
#include <asm/hardware.h> |
||||
#include <dataflash.h> |
||||
|
||||
static AT91S_DataFlash DataFlashInst; |
||||
|
||||
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 dfcode; |
||||
int part; |
||||
int found[CONFIG_SYS_MAX_DATAFLASH_BANKS]; |
||||
unsigned char protected; |
||||
|
||||
AT91F_SpiInit (); |
||||
|
||||
for (i = 0; i < CONFIG_SYS_MAX_DATAFLASH_BANKS; i++) { |
||||
found[i] = 0; |
||||
dataflash_info[i].Desc.state = IDLE; |
||||
dataflash_info[i].id = 0; |
||||
dataflash_info[i].Device.pages_number = 0; |
||||
dfcode = AT91F_DataflashProbe (cs[i].cs, |
||||
&dataflash_info[i].Desc); |
||||
|
||||
switch (dfcode) { |
||||
case AT45DB021: |
||||
dataflash_info[i].Device.pages_number = 1024; |
||||
dataflash_info[i].Device.pages_size = 264; |
||||
dataflash_info[i].Device.page_offset = 9; |
||||
dataflash_info[i].Device.byte_mask = 0x300; |
||||
dataflash_info[i].Device.cs = cs[i].cs; |
||||
dataflash_info[i].Desc.DataFlash_state = IDLE; |
||||
dataflash_info[i].logical_address = cs[i].addr; |
||||
dataflash_info[i].id = dfcode; |
||||
found[i] += dfcode; |
||||
break; |
||||
|
||||
case AT45DB081: |
||||
dataflash_info[i].Device.pages_number = 4096; |
||||
dataflash_info[i].Device.pages_size = 264; |
||||
dataflash_info[i].Device.page_offset = 9; |
||||
dataflash_info[i].Device.byte_mask = 0x300; |
||||
dataflash_info[i].Device.cs = cs[i].cs; |
||||
dataflash_info[i].Desc.DataFlash_state = IDLE; |
||||
dataflash_info[i].logical_address = cs[i].addr; |
||||
dataflash_info[i].id = dfcode; |
||||
found[i] += dfcode; |
||||
break; |
||||
|
||||
case AT45DB161: |
||||
dataflash_info[i].Device.pages_number = 4096; |
||||
dataflash_info[i].Device.pages_size = 528; |
||||
dataflash_info[i].Device.page_offset = 10; |
||||
dataflash_info[i].Device.byte_mask = 0x300; |
||||
dataflash_info[i].Device.cs = cs[i].cs; |
||||
dataflash_info[i].Desc.DataFlash_state = IDLE; |
||||
dataflash_info[i].logical_address = cs[i].addr; |
||||
dataflash_info[i].id = dfcode; |
||||
found[i] += dfcode; |
||||
break; |
||||
|
||||
case AT45DB321: |
||||
dataflash_info[i].Device.pages_number = 8192; |
||||
dataflash_info[i].Device.pages_size = 528; |
||||
dataflash_info[i].Device.page_offset = 10; |
||||
dataflash_info[i].Device.byte_mask = 0x300; |
||||
dataflash_info[i].Device.cs = cs[i].cs; |
||||
dataflash_info[i].Desc.DataFlash_state = IDLE; |
||||
dataflash_info[i].logical_address = cs[i].addr; |
||||
dataflash_info[i].id = dfcode; |
||||
found[i] += dfcode; |
||||
break; |
||||
|
||||
case AT45DB642: |
||||
dataflash_info[i].Device.pages_number = 8192; |
||||
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].cs; |
||||
dataflash_info[i].Desc.DataFlash_state = IDLE; |
||||
dataflash_info[i].logical_address = cs[i].addr; |
||||
dataflash_info[i].id = dfcode; |
||||
found[i] += 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].cs; |
||||
dataflash_info[i].Desc.DataFlash_state = IDLE; |
||||
dataflash_info[i].logical_address = cs[i].addr; |
||||
dataflash_info[i].id = dfcode; |
||||
found[i] += dfcode; |
||||
break; |
||||
|
||||
default: |
||||
dfcode = 0; |
||||
break; |
||||
} |
||||
/* set the last area end to the dataflash size*/ |
||||
dataflash_info[i].end_address = |
||||
(dataflash_info[i].Device.pages_number * |
||||
dataflash_info[i].Device.pages_size) - 1; |
||||
|
||||
part = 0; |
||||
/* set the area addresses */ |
||||
for(j = 0; j < NB_DATAFLASH_AREA; j++) { |
||||
if(found[i]!=0) { |
||||
dataflash_info[i].Device.area_list[j].start = |
||||
area_list[part].start + |
||||
dataflash_info[i].logical_address; |
||||
if(area_list[part].end == 0xffffffff) { |
||||
dataflash_info[i].Device.area_list[j].end = |
||||
dataflash_info[i].end_address + |
||||
dataflash_info[i].logical_address; |
||||
} else { |
||||
dataflash_info[i].Device.area_list[j].end = |
||||
area_list[part].end + |
||||
dataflash_info[i].logical_address; |
||||
} |
||||
protected = area_list[part].protected; |
||||
/* Set the environment according to the label...*/ |
||||
if(protected == FLAG_PROTECT_INVALID) { |
||||
dataflash_info[i].Device.area_list[j].protected = |
||||
FLAG_PROTECT_INVALID; |
||||
} else { |
||||
dataflash_info[i].Device.area_list[j].protected = |
||||
protected; |
||||
} |
||||
strcpy((char*)(dataflash_info[i].Device.area_list[j].label), |
||||
(const char *)area_list[part].label); |
||||
} |
||||
part++; |
||||
} |
||||
} |
||||
return found[0]; |
||||
} |
||||
|
||||
void AT91F_Dataflashenv_set(void) |
||||
{ |
||||
int i, j; |
||||
int part; |
||||
unsigned char env; |
||||
unsigned char s[32]; /* Will fit a long int in hex */ |
||||
unsigned long start; |
||||
|
||||
for (i = 0, part= 0; i < CONFIG_SYS_MAX_DATAFLASH_BANKS; i++) { |
||||
for(j = 0; j < NB_DATAFLASH_AREA; j++) { |
||||
env = area_list[part].setenv; |
||||
/* Set the environment according to the label...*/ |
||||
if((env & FLAG_SETENV) == FLAG_SETENV) { |
||||
start = dataflash_info[i].Device.area_list[j].start; |
||||
sprintf((char *)s, "%lX", start); |
||||
env_set((char *)area_list[part].label, |
||||
(char *)s); |
||||
} |
||||
part++; |
||||
} |
||||
} |
||||
} |
||||
|
||||
void dataflash_print_info (void) |
||||
{ |
||||
int i, j; |
||||
|
||||
for (i = 0; i < CONFIG_SYS_MAX_DATAFLASH_BANKS; i++) { |
||||
if (dataflash_info[i].id != 0) { |
||||
printf("DataFlash:"); |
||||
switch (dataflash_info[i].id) { |
||||
case AT45DB021: |
||||
printf("AT45DB021\n"); |
||||
break; |
||||
case AT45DB161: |
||||
printf("AT45DB161\n"); |
||||
break; |
||||
|
||||
case AT45DB321: |
||||
printf("AT45DB321\n"); |
||||
break; |
||||
|
||||
case AT45DB642: |
||||
printf("AT45DB642\n"); |
||||
break; |
||||
case AT45DB128: |
||||
printf("AT45DB128\n"); |
||||
break; |
||||
} |
||||
|
||||
printf("Nb pages: %6d\n" |
||||
"Page Size: %6d\n" |
||||
"Size=%8d bytes\n" |
||||
"Logical address: 0x%08X\n", |
||||
(unsigned int) dataflash_info[i].Device.pages_number, |
||||
(unsigned int) dataflash_info[i].Device.pages_size, |
||||
(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++) { |
||||
switch(dataflash_info[i].Device.area_list[j].protected) { |
||||
case FLAG_PROTECT_SET: |
||||
case FLAG_PROTECT_CLEAR: |
||||
printf("Area %i:\t%08lX to %08lX %s", 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)" : " "); |
||||
printf(" %s\n", dataflash_info[i].Device.area_list[j].label); |
||||
break; |
||||
case FLAG_PROTECT_INVALID: |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/*---------------------------------------------------------------------------*/ |
||||
/* Function Name : AT91F_DataflashSelect */ |
||||
/* Object : Select the correct device */ |
||||
/*---------------------------------------------------------------------------*/ |
||||
AT91PS_DataFlash AT91F_DataflashSelect (AT91PS_DataFlash pFlash, |
||||
unsigned long *addr) |
||||
{ |
||||
char addr_valid = 0; |
||||
int i; |
||||
|
||||
for (i = 0; i < CONFIG_SYS_MAX_DATAFLASH_BANKS; i++) |
||||
if ( dataflash_info[i].id |
||||
&& ((((int) *addr) & 0xFF000000) == |
||||
dataflash_info[i].logical_address)) { |
||||
addr_valid = 1; |
||||
break; |
||||
} |
||||
if (!addr_valid) { |
||||
pFlash = (AT91PS_DataFlash) 0; |
||||
return pFlash; |
||||
} |
||||
pFlash->pDataFlashDesc = &(dataflash_info[i].Desc); |
||||
pFlash->pDevice = &(dataflash_info[i].Device); |
||||
*addr -= dataflash_info[i].logical_address; |
||||
return (pFlash); |
||||
} |
||||
|
||||
/*---------------------------------------------------------------------------*/ |
||||
/* Function Name : addr_dataflash */ |
||||
/* Object : Test if address is valid */ |
||||
/*---------------------------------------------------------------------------*/ |
||||
int addr_dataflash (unsigned long addr) |
||||
{ |
||||
int addr_valid = 0; |
||||
int i; |
||||
|
||||
for (i = 0; i < CONFIG_SYS_MAX_DATAFLASH_BANKS; i++) { |
||||
if ((((int) addr) & 0xFF000000) == |
||||
dataflash_info[i].logical_address) { |
||||
addr_valid = 1; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
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; |
||||
if (pdataFlash->pDevice->area_list[area].protected == FLAG_PROTECT_INVALID) |
||||
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 < CONFIG_SYS_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(dataflash_info[i].Device.area_list[j].protected |
||||
!= FLAG_PROTECT_INVALID) { |
||||
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 */ |
||||
/* Object : dataflash memory read */ |
||||
/*---------------------------------------------------------------------------*/ |
||||
int read_dataflash (unsigned long addr, unsigned long size, char *result) |
||||
{ |
||||
unsigned long AddrToRead = addr; |
||||
AT91PS_DataFlash pFlash = &DataFlashInst; |
||||
|
||||
pFlash = AT91F_DataflashSelect (pFlash, &AddrToRead); |
||||
|
||||
if (pFlash == 0) |
||||
return ERR_UNKNOWN_FLASH_TYPE; |
||||
|
||||
if (size_dataflash(pFlash,addr,size) == 0) |
||||
return ERR_INVAL; |
||||
|
||||
return (AT91F_DataFlashRead (pFlash, AddrToRead, size, result)); |
||||
} |
||||
|
||||
/*---------------------------------------------------------------------------*/ |
||||
/* Function Name : write_dataflash */ |
||||
/* Object : write a block in dataflash */ |
||||
/*---------------------------------------------------------------------------*/ |
||||
int write_dataflash (unsigned long addr_dest, unsigned long addr_src, |
||||
unsigned long size) |
||||
{ |
||||
unsigned long 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, (uchar *)addr_src, |
||||
AddrToWrite, size); |
||||
} |
||||
|
||||
void dataflash_perror (int err) |
||||
{ |
||||
switch (err) { |
||||
case ERR_OK: |
||||
break; |
||||
case ERR_TIMOUT: |
||||
printf("Timeout writing to DataFlash\n"); |
||||
break; |
||||
case ERR_PROTECTED: |
||||
printf("Can't write to protected/invalid DataFlash sectors\n"); |
||||
break; |
||||
case ERR_INVAL: |
||||
printf("Outside available DataFlash\n"); |
||||
break; |
||||
case ERR_UNKNOWN_FLASH_TYPE: |
||||
printf("Unknown Type of DataFlash\n"); |
||||
break; |
||||
case ERR_PROG_ERROR: |
||||
printf("General DataFlash Programming Error\n"); |
||||
break; |
||||
default: |
||||
printf("%s[%d] FIXME: rc=%d\n", __FILE__, __LINE__, err); |
||||
break; |
||||
} |
||||
} |
@ -1,205 +0,0 @@ |
||||
/*
|
||||
* (C) Copyright 2003 |
||||
* Data Flash Atmel Description File |
||||
* Author : Hamid Ikdoumi (Atmel) |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
/* File Name : dataflash.h */ |
||||
/* Object : Data Flash Atmel Description File */ |
||||
/* Translator : */ |
||||
/* */ |
||||
/* 1.0 03/04/01 HI : Creation */ |
||||
/* 1.2 20/10/02 FB : Adapatation Service and Lib v3 */ |
||||
/*----------------------------------------------------------------------*/ |
||||
|
||||
#ifndef _DataFlash_h |
||||
#define _DataFlash_h |
||||
|
||||
|
||||
#include "config.h" |
||||
|
||||
/*number of protected area*/ |
||||
#define NB_DATAFLASH_AREA 5 |
||||
|
||||
#ifndef CONFIG_MTD_NOR_FLASH |
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* return codes from flash_write(): |
||||
*/ |
||||
# define ERR_OK 0 |
||||
# define ERR_TIMOUT 1 |
||||
# define ERR_NOT_ERASED 2 |
||||
# define ERR_PROTECTED 4 |
||||
# define ERR_INVAL 8 |
||||
# define ERR_ALIGN 16 |
||||
# define ERR_UNKNOWN_FLASH_VENDOR 32 |
||||
# define ERR_UNKNOWN_FLASH_TYPE 64 |
||||
# define ERR_PROG_ERROR 128 |
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Protection Flags for flash_protect(): |
||||
*/ |
||||
# define FLAG_PROTECT_SET 0x01 |
||||
# define FLAG_PROTECT_CLEAR 0x02 |
||||
# define FLAG_PROTECT_INVALID 0x03 |
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Set Environment according to label: |
||||
*/ |
||||
# define FLAG_SETENV 0x80 |
||||
#endif /* CONFIG_MTD_NOR_FLASH */ |
||||
|
||||
/*define the area structure*/ |
||||
typedef struct { |
||||
unsigned long start; |
||||
unsigned long end; |
||||
unsigned char protected; |
||||
unsigned char setenv; |
||||
unsigned char label[20]; |
||||
} dataflash_protect_t; |
||||
|
||||
typedef unsigned int AT91S_DataFlashStatus; |
||||
|
||||
/*----------------------------------------------------------------------*/ |
||||
/* DataFlash Structures */ |
||||
/*----------------------------------------------------------------------*/ |
||||
|
||||
/*---------------------------------------------*/ |
||||
/* DataFlash Descriptor Structure Definition */ |
||||
/*---------------------------------------------*/ |
||||
typedef struct _AT91S_DataflashDesc { |
||||
unsigned char *tx_cmd_pt; |
||||
unsigned int tx_cmd_size; |
||||
unsigned char *rx_cmd_pt; |
||||
unsigned int rx_cmd_size; |
||||
unsigned char *tx_data_pt; |
||||
unsigned int tx_data_size; |
||||
unsigned char *rx_data_pt; |
||||
unsigned int rx_data_size; |
||||
volatile unsigned char state; |
||||
volatile unsigned char DataFlash_state; |
||||
unsigned char command[8]; |
||||
} AT91S_DataflashDesc, *AT91PS_DataflashDesc; |
||||
|
||||
/*---------------------------------------------*/ |
||||
/* DataFlash device definition structure */ |
||||
/*---------------------------------------------*/ |
||||
typedef struct _AT91S_Dataflash { |
||||
int pages_number; /* dataflash page number */ |
||||
int pages_size; /* dataflash page size */ |
||||
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; |
||||
|
||||
/*---------------------------------------------*/ |
||||
/* DataFlash Structure Definition */ |
||||
/*---------------------------------------------*/ |
||||
typedef struct _AT91S_DataFlash { |
||||
AT91PS_DataflashDesc pDataFlashDesc; /* dataflash descriptor */ |
||||
AT91PS_DataflashFeatures pDevice; /* Pointer on a dataflash features array */ |
||||
} 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 long end_address; |
||||
unsigned int id; /* device id */ |
||||
} AT91S_DATAFLASH_INFO, *AT91PS_DATAFLASH_INFO; |
||||
|
||||
struct dataflash_addr { |
||||
unsigned long addr; |
||||
int cs; |
||||
}; |
||||
/*-------------------------------------------------------------------------------------------------*/ |
||||
#define AT45DB161 0x2c |
||||
#define AT45DB021 0x14 |
||||
#define AT45DB081 0x24 |
||||
#define AT45DB321 0x34 |
||||
#define AT45DB642 0x3c |
||||
#define AT45DB128 0x10 |
||||
#define PAGES_PER_BLOCK 8 |
||||
|
||||
#define AT91C_DATAFLASH_TIMEOUT 10000 /* For AT91F_DataFlashWaitReady */ |
||||
|
||||
/* DataFlash return value */ |
||||
#define DATAFLASH_BUSY 0x00 |
||||
#define DATAFLASH_OK 0x01 |
||||
#define DATAFLASH_ERROR 0x02 |
||||
#define DATAFLASH_MEMORY_OVERFLOW 0x03 |
||||
#define DATAFLASH_BAD_COMMAND 0x04 |
||||
#define DATAFLASH_BAD_ADDRESS 0x05 |
||||
|
||||
|
||||
/* Driver State */ |
||||
#define IDLE 0x0 |
||||
#define BUSY 0x1 |
||||
#define ERROR 0x2 |
||||
|
||||
/* DataFlash Driver State */ |
||||
#define GET_STATUS 0x0F |
||||
|
||||
/*-------------------------------------------------------------------------------------------------*/ |
||||
/* Command Definition */ |
||||
/*-------------------------------------------------------------------------------------------------*/ |
||||
|
||||
/* READ COMMANDS */ |
||||
#define DB_CONTINUOUS_ARRAY_READ 0xE8 /* Continuous array read */ |
||||
#define DB_BURST_ARRAY_READ 0xE8 /* Burst array read */ |
||||
#define DB_PAGE_READ 0xD2 /* Main memory page read */ |
||||
#define DB_BUF1_READ 0xD4 /* Buffer 1 read */ |
||||
#define DB_BUF2_READ 0xD6 /* Buffer 2 read */ |
||||
#define DB_STATUS 0xD7 /* Status Register */ |
||||
|
||||
/* PROGRAM and ERASE COMMANDS */ |
||||
#define DB_BUF1_WRITE 0x84 /* Buffer 1 write */ |
||||
#define DB_BUF2_WRITE 0x87 /* Buffer 2 write */ |
||||
#define DB_BUF1_PAGE_ERASE_PGM 0x83 /* Buffer 1 to main memory page program with built-In erase */ |
||||
#define DB_BUF1_PAGE_ERASE_FASTPGM 0x93 /* Buffer 1 to main memory page program with built-In erase, Fast program */ |
||||
#define DB_BUF2_PAGE_ERASE_PGM 0x86 /* Buffer 2 to main memory page program with built-In erase */ |
||||
#define DB_BUF2_PAGE_ERASE_FASTPGM 0x96 /* Buffer 1 to main memory page program with built-In erase, Fast program */ |
||||
#define DB_BUF1_PAGE_PGM 0x88 /* Buffer 1 to main memory page program without built-In erase */ |
||||
#define DB_BUF1_PAGE_FASTPGM 0x98 /* Buffer 1 to main memory page program without built-In erase, Fast program */ |
||||
#define DB_BUF2_PAGE_PGM 0x89 /* Buffer 2 to main memory page program without built-In erase */ |
||||
#define DB_BUF2_PAGE_FASTPGM 0x99 /* Buffer 1 to main memory page program without built-In erase, Fast program */ |
||||
#define DB_PAGE_ERASE 0x81 /* Page Erase */ |
||||
#define DB_BLOCK_ERASE 0x50 /* Block Erase */ |
||||
#define DB_PAGE_PGM_BUF1 0x82 /* Main memory page through buffer 1 */ |
||||
#define DB_PAGE_FASTPGM_BUF1 0x92 /* Main memory page through buffer 1, Fast program */ |
||||
#define DB_PAGE_PGM_BUF2 0x85 /* Main memory page through buffer 2 */ |
||||
#define DB_PAGE_FastPGM_BUF2 0x95 /* Main memory page through buffer 2, Fast program */ |
||||
|
||||
/* ADDITIONAL COMMANDS */ |
||||
#define DB_PAGE_2_BUF1_TRF 0x53 /* Main memory page to buffer 1 transfert */ |
||||
#define DB_PAGE_2_BUF2_TRF 0x55 /* Main memory page to buffer 2 transfert */ |
||||
#define DB_PAGE_2_BUF1_CMP 0x60 /* Main memory page to buffer 1 compare */ |
||||
#define DB_PAGE_2_BUF2_CMP 0x61 /* Main memory page to buffer 2 compare */ |
||||
#define DB_AUTO_PAGE_PGM_BUF1 0x58 /* Auto page rewrite throught buffer 1 */ |
||||
#define DB_AUTO_PAGE_PGM_BUF2 0x59 /* Auto page rewrite throught buffer 2 */ |
||||
|
||||
/*-------------------------------------------------------------------------------------------------*/ |
||||
|
||||
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 addr2ram(ulong 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_dest, unsigned long addr_src, |
||||
unsigned long size); |
||||
extern int AT91F_DataflashInit(void); |
||||
|
||||
extern void dataflash_print_info (void); |
||||
extern void dataflash_perror (int err); |
||||
extern void AT91F_Dataflashenv_set(void); |
||||
|
||||
extern struct dataflash_addr cs[CONFIG_SYS_MAX_DATAFLASH_BANKS]; |
||||
extern dataflash_protect_t area_list[NB_DATAFLASH_AREA]; |
||||
extern AT91S_DATAFLASH_INFO dataflash_info[]; |
||||
#endif |
Loading…
Reference in new issue