blob: 8e143fff03d348a76bc3fed9782be4fcd89531b2 [file] [log] [blame]
/*This file is prepared for Doxygen automatic documentation generation.*/
/*! \file ******************************************************************
*
* \brief Management of the nandflash memory.
*
* This file manages the nandflash memory.
*
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
* - Supported devices: All AVR32 devices with a USB module can be used.
* - AppNote:
*
* \author Atmel Corporation: http://www.atmel.com \n
* Support and FAQ: http://support.atmel.no/
*
***************************************************************************/
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The name of Atmel may not be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* 4. This software may only be redistributed and used in connection with an Atmel
* AVR product.
*
* 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
* EXPRESSLY AND SPECIFICALLY 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
*
*/
//_____ I N C L U D E S ___________________________________________________
#include "board.h"
#include "conf_access.h"
#include "conf_nandflash_mem.h"
#if NANDFLASH_MEM == ENABLE
#include "nandflash_mem.h"
#include <string.h>
#ifndef NANDFLASH_NB_SECTOR
# error Define NANDFLASH_NB_SECTOR in conf_nandflash_mem.h file
#endif
//_____ M A C R O S ________________________________________________________
#define VIRTUAL_MEM_TEST_CHANGE_STATE DISABLED//ENABLED
//_____ P R I V A T E D E C L A R A T I O N S ____________________________
//_____ D E F I N I T I O N S ______________________________________________
//_____ D E C L A R A T I O N S ____________________________________________
//! This function tests memory state, and starts memory initialization
//! @return Ctrl_status
//! It is ready -> CTRL_GOOD
//! Memory unplug -> CTRL_NO_PRESENT
//! Not initialized or changed -> CTRL_BUSY
//! An error occurred -> CTRL_FAIL
Ctrl_status nandflash_test_unit_ready(void)
{
return CTRL_NO_PRESENT;
//return CTRL_GOOD;
}
//! This function returns the address of the last valid sector
//! @param u32_nb_sector Pointer to number of sectors (sector = 512 bytes)
//! @return Ctrl_status
//! It is ready -> CTRL_GOOD
//! Memory unplug -> CTRL_NO_PRESENT
//! Not initialized or changed -> CTRL_BUSY
//! An error occurred -> CTRL_FAIL
Ctrl_status nandflash_read_capacity(U32 *u32_nb_sector)
{
// if (NANDFLASH_NB_SECTOR<8)
// *u32_nb_sector = 8-1;
// else
// *u32_nb_sector = NANDFLASH_NB_SECTOR- 1;
return CTRL_GOOD;
}
//! This function returns the write-protected mode
//! Only used by memory removal with a HARDWARE-SPECIFIC write-protected detection
//! @warning The customer must unplug the memory to change this write-protected mode.
//! @return TRUE if the memory is protected
Bool nandflash_wr_protect(void)
{
return FALSE;
}
//! This function informs about the memory type
//! @return TRUE if the memory is removable
Bool nandflash_removal(void)
{
return FALSE;
}
//------------ SPECIFIC FUNCTIONS FOR TRANSFER BY USB --------------------------
#if ACCESS_USB == ENABLED
#include "udi_msc.h"
//! This function transfers the memory data (programmed in sbc_read_10) directly to the USB interface
//! sector = 512 bytes
//! @param addr Sector address to start read
//! @param nb_sector Number of sectors to transfer
//! @return Ctrl_status
//! It is ready -> CTRL_GOOD
//! Memory unplug -> CTRL_NO_PRESENT
//! Not initialized or changed -> CTRL_BUSY
//! An error occurred -> CTRL_FAIL
Ctrl_status nandflash_usb_read_10(U32 addr, U16 nb_sector)
{
U8 *ptr_cram;
if ((addr > NANDFLASH_NB_SECTOR)
|| (addr + nb_sector > NANDFLASH_NB_SECTOR))
return CTRL_FAIL;
// while (nb_sector--)
// {
// // If overflow (possible with size nandflash mem < 8 sectors) then read the last sector
// addr = min(addr, NANDFLASH_NB_SECTOR - 1);
// ptr_cram = &vmem_data[addr++ * VMEM_SECTOR_SIZE];
// if (!udi_msc_trans_block( true, ptr_cram, VMEM_SECTOR_SIZE, NULL))
// return CTRL_FAIL; // transfert aborted
// }
return CTRL_GOOD;
}
//! This function transfers the USB data (programmed in sbc_write_10) directly to the memory interface
//! sector = 512 bytes
//! @param addr Sector address to start write
//! @param nb_sector Number of sectors to transfer
//! @return Ctrl_status
//! It is ready -> CTRL_GOOD
//! Memory unplug -> CTRL_NO_PRESENT
//! Not initialized or changed -> CTRL_BUSY
//! An error occurred -> CTRL_FAIL
Ctrl_status nandflash_usb_write_10(U32 addr, U16 nb_sector)
{
U8 *ptr_cram;
if ((addr > NANDFLASH_NB_SECTOR)
|| (addr + nb_sector > NANDFLASH_NB_SECTOR))
return CTRL_FAIL;
// while (nb_sector--)
// {
// // If overflow (possible with size nandflash mem < 8 sectors) then read the last sector
// addr = min(addr, NANDFLASH_NB_SECTOR - 1);
// ptr_cram = &vmem_data[addr++ * VMEM_SECTOR_SIZE];
// if (!udi_msc_trans_block( false, ptr_cram, VMEM_SECTOR_SIZE, NULL))
// return CTRL_FAIL; // transfert aborted
// }
return CTRL_GOOD;
}
#endif // ACCESS_USB == ENABLED
//------------ SPECIFIC FUNCTIONS FOR TRANSFER BY RAM --------------------------
#if ACCESS_MEM_TO_RAM == ENABLED
#include <string.h>
//! This function tranfers 1 data sector from memory to RAM
//! sector = 512 bytes
//! @param addr Sector address to start read
//! @param ram Address of RAM buffer
//! @return Ctrl_status
//! It is ready -> CTRL_GOOD
//! Memory unplug -> CTRL_NO_PRESENT
//! Not initialized or changed -> CTRL_BUSY
//! An error occurred -> CTRL_FAIL
Ctrl_status nandflash_mem_2_ram(U32 addr, void *ram)
{
if (addr + 1 > Max(NANDFLASH_NB_SECTOR, 8)) return CTRL_FAIL;
// If overflow (possible with size nandflash mem < 8 sectors) then read the last sector
// addr = min(addr, NANDFLASH_NB_SECTOR - 1);
//
// memcpy(ram, &vmem_data[addr * VMEM_SECTOR_SIZE], VMEM_SECTOR_SIZE);
return CTRL_GOOD;
}
//! This function tranfers 1 data sector from memory to RAM
//! sector = 512 bytes
//! @param addr Sector address to start write
//! @param ram Address of RAM buffer
//! @return Ctrl_status
//! It is ready -> CTRL_GOOD
//! Memory unplug -> CTRL_NO_PRESENT
//! Not initialized or changed -> CTRL_BUSY
//! An error occurred -> CTRL_FAIL
Ctrl_status nandflash_ram_2_mem(U32 addr, const void *ram)
{
if (addr + 1 > NANDFLASH_NB_SECTOR) return CTRL_FAIL;
//#if VIRTUAL_MEM_TEST_CHANGE_STATE == ENABLED
// if (addr + 1 > FILE_SECTOR && addr <= FILE_SECTOR)
// s_b_data_modify = TRUE;
//#endif
//
// memcpy(&vmem_data[addr * VMEM_SECTOR_SIZE], ram, VMEM_SECTOR_SIZE);
return CTRL_GOOD;
}
#endif // ACCESS_MEM_TO_RAM == ENABLED
#endif // nandflash_MEM == ENABLE