?? bfsa_nandflash.c
字號:
// ----------------------------------------------------------------------------
// ATMEL Microcontroller Software Support - ROUSSET -
// ----------------------------------------------------------------------------
// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
// DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// ----------------------------------------------------------------------------
//* File Name : bfsa_nandflash.c
//* Object : bfsa_nandflash routine
//* Creation :
//* Modif :
//*----------------------------------------------------------------------------
// Include Standard files
#include <assert.h>
#include <stdlib.h>
#include "board.h"
#include "po_types.h"
#include "flash.h"
#include "bfsa_flash.h"
#include "nand.h"
#include "nand_ids.h"
#include "jffs2.h"
#include "NandFlash.h"
// Backup Block
unsigned char bBlock[SIZEONESECTOR];
extern int nand_rw (struct nand_chip* nand, int cmd,
size_t start, size_t len,
size_t * retlen, u_char * buf);
//*----------------------------------------------------------------------------
//* \fn AT91F_ReadMedia
//* \brief Read in Flash size in byte
//* \input Start address (base=AT91C_IFLASH) size (in byte ) and buff address
//*----------------------------------------------------------------------------
void AT91F_ReadMedia(unsigned int Flash_Address, int size, unsigned char *buff)
{
size_t total, offset = (size_t)(Flash_Address - AT91_SMARTMEDIA_BASE);
unsigned int offset_block = offset & (NANDFLASH_PAGESIZE - 1);
// Read Page
nand_rw(nand_dev_desc + curr_device,
NANDRW_READ,
offset & ~(NANDFLASH_PAGESIZE-1),
NANDFLASH_PAGESIZE,
&total,
bBlock);
po_memcpy((void *)buff,(void *)&bBlock[offset_block], size);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_Nand_Erase_Needed
//* \brief Write in Flash size in byte
//* \input Start address (base=AT91C_IFLASH) size (in byte ) and buff address
//*----------------------------------------------------------------------------
int AT91F_Nand_Erase_Needed(unsigned char *bBuffer, int size, unsigned int value)
{
while (size){
if (*bBuffer++ != (unsigned char)value)
return TRUE;
size--;
}
return FALSE;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_Flash_Write_Address
//* \brief Write in Flash size in byte
//* \input Start address (base=AT91C_IFLASH) size (in byte ) and buff address
//*----------------------------------------------------------------------------
int AT91F_Flash_Write_Address(unsigned int Flash_Address, int size, unsigned char *buff, unsigned char MemSet)
{
size_t total, offset = Flash_Address - AT91_SMARTMEDIA_BASE;
int i, count;
int offset_buffer = offset & (SIZEONESECTOR - 1);
// Read Block
nand_rw(nand_dev_desc + curr_device,
NANDRW_READ,
offset & ~(SIZEONESECTOR-1),
SIZEONESECTOR,
&total,
bBlock);
if (AT91F_Nand_Erase_Needed(&bBlock[offset_buffer], size, 0xFFFFFFFF))
{
// Erase Block
nand_erase(nand_dev_desc + curr_device, offset & ~(SIZEONESECTOR-1), SIZEONESECTOR, 0);
// Modify Block
if (MemSet == FALSE) {
po_memcpy((void*)&bBlock[offset_buffer], (void*)buff, size);
} else {
i=offset_buffer;
// Modify Block
while (size)
{
bBlock[i++] = (unsigned char)*buff;
size--;
}
}
// Write Block
return nand_rw(nand_dev_desc + curr_device,
NANDRW_WRITE,
offset & ~(SIZEONESECTOR-1),
SIZEONESECTOR,
&total,
bBlock) ? FALSE : TRUE;
}
if (MemSet == FALSE) {
// Write Block
return nand_rw(nand_dev_desc + curr_device,
NANDRW_WRITE,
offset,
size,
&total,
buff) ? FALSE : TRUE;
} else {
i=offset_buffer;
count=size;
// Modify Block
while (count)
{
bBlock[i++] = (unsigned char)*buff;
count--;
}
// Write Block
return nand_rw(nand_dev_desc + curr_device,
NANDRW_WRITE,
offset,
size,
&total,
&bBlock[offset_buffer]) ? FALSE : TRUE;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -