?? norflashintel.c
字號:
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2008, 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:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the disclaimer below.
*
* Atmel's name may not be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* 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.
* ----------------------------------------------------------------------------
*/
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include "NorFlashCFI.h"
#include "NorFlashCommon.h"
#include <utility/trace.h>
#include <string.h>
//------------------------------------------------------------------------------
// Local defination
//------------------------------------------------------------------------------
/// Command for vendor command set CMD_SET_INTEL. Device commands are written
/// to the Command User Interface (CUI) to control all flash memory device operations.
#define INTEL_CMD_IDIN 0x0090
#define INTEL_CMD_BLOCK_ERASE_1 0x0020
#define INTEL_CMD_BLOCK_ERASE_2 0x00D0
#define INTEL_CMD_READ_STATUS 0x0070
#define INTEL_CMD_CLEAR_STATUS 0x0050
#define INTEL_CMD_BLOCK_LOCKSTART 0x0060
#define INTEL_CMD_BLOCK_LOCK 0x0001
#define INTEL_CMD_BLOCK_UNLOCK 0x00D0
#define INTEL_CMD_BLOCK_LOCKDOWN 0x002F
#define INTEL_CMD_PROGRAM_WORD 0x0010
#define INTEL_CMD_RESET 0x00FF
/// Intel norflash status resgister
#define INTEL_STATUS_DWS 0x80
#define INTEL_STATUS_ESS 0x40
#define INTEL_STATUS_ES 0x20
#define INTEL_STATUS_PS 0x10
#define INTEL_STATUS_VPPS 0x08
#define INTEL_STATUS_PSS 0x04
#define INTEL_STATUS_BLS 0x02
#define INTEL_STATUS_BWS 0x01
/// Intel norflash device Identifier infomation address offset.
#define INTEL_MANU_ID 0x00
#define INTEL_DEVIDE_ID 0x01
#define INTEL_LOCKSTATUS 0x02
/// Intel norflash device lock status.
#define INTEL_LOCKSTATUS_LOCKED 0x01
#define INTEL_LOCKSTATUS_LOCKDOWNED 0x02
//------------------------------------------------------------------------------
// Local functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// It implements a RESET command.
/// \param pNorFlashInfo Pointer to an struct NorFlashInfo instance.
//------------------------------------------------------------------------------
void intel_Reset(struct NorFlashInfo *pNorFlashInfo, unsigned int address)
{
unsigned int busAddress;
unsigned int busWidth;
busWidth = NorFlash_GetDataBusWidth(pNorFlashInfo);
busAddress = NorFlash_GetAddressInChip(pNorFlashInfo, address);
WriteCommand(busWidth, busAddress, INTEL_CMD_RESET);
}
//------------------------------------------------------------------------------
/// The Read Device Identifier command instructs the device to output manufacturer
/// code, device identifier code, block-lock status, protection register data,
/// or configuration register data by giving offset.
/// \param pNorFlashInfo Pointer to an struct NorFlashInfo instance.
/// \param offset 0: Identifier address offset.
//------------------------------------------------------------------------------
unsigned int intel_ReadIdentification(
struct NorFlashInfo *pNorFlashInfo,
unsigned int offset)
{
unsigned int data;
unsigned char busWidth;
unsigned int address;
busWidth = NorFlash_GetDataBusWidth(pNorFlashInfo);
// Issue the Read Device Identifier command at specified address.
WriteCommand(busWidth,
NorFlash_GetByteAddressInChip(pNorFlashInfo, 0),
INTEL_CMD_IDIN);
if(offset >= INTEL_LOCKSTATUS) {
// Block base address.
address = NorFlash_GetAddressInChip (pNorFlashInfo, offset);
}
else {
address = NorFlash_GetByteAddressInChip (pNorFlashInfo, offset);
}
ReadRawData(busWidth, address, (unsigned char*)&data);
return data;
}
//------------------------------------------------------------------------------
/// Return the status register value.
/// \param pNorFlashInfo Pointer to an struct NorFlashInfo instance.
//------------------------------------------------------------------------------
unsigned char intel_ReadStatus(struct NorFlashInfo *pNorFlashInfo, unsigned int address)
{
unsigned int status;
unsigned char busWidth;
unsigned int budAddress;
busWidth = NorFlash_GetDataBusWidth(pNorFlashInfo);
// Issue the Read Status Register command at any address.
budAddress = NorFlash_GetAddressInChip(pNorFlashInfo, address),
WriteCommand(busWidth, budAddress, INTEL_CMD_READ_STATUS);
ReadRawData(busWidth, budAddress, (unsigned char*)&status);
return status;
}
//------------------------------------------------------------------------------
/// Clear the status register.
/// \param pNorFlashInfo Pointer to an struct NorFlashInfo instance.
//------------------------------------------------------------------------------
void intel_ClearStatus(struct NorFlashInfo *pNorFlashInfo)
{
unsigned char busWidth;
unsigned int address;
busWidth = NorFlash_GetDataBusWidth(pNorFlashInfo);
// Issue the Clear Status Register command at any address
address = NorFlash_GetAddressInChip(pNorFlashInfo, 0),
WriteCommand(busWidth, address, INTEL_CMD_CLEAR_STATUS);
}
//------------------------------------------------------------------------------
/// Unlocks the specified block of the device.
/// \param pNorFlashInfo Pointer to an struct NorFlashInfo instance.
/// \param address Address in sector.
//------------------------------------------------------------------------------
void intel_UnlockSector(struct NorFlashInfo *pNorFlashInfo, unsigned int address)
{
unsigned int busAddress;
unsigned char busWidth;
// Clear the status register first.
busWidth = NorFlash_GetDataBusWidth(pNorFlashInfo);
busAddress = NorFlash_GetAddressInChip(pNorFlashInfo,address);
WriteCommand(busWidth, busAddress, INTEL_CMD_BLOCK_LOCKSTART);
WriteCommand(busWidth, busAddress, INTEL_CMD_BLOCK_UNLOCK);
intel_Reset(pNorFlashInfo, 0);
}
//------------------------------------------------------------------------------
/// The Read Device Identifier command instructs the device to output block-lock
/// status.
/// \param pNorFlashInfo Pointer to an struct NorFlashInfo instance.
/// \param address 0: Address in sector/block.
//------------------------------------------------------------------------------
unsigned int intel_GetBlockLockStatus(struct NorFlashInfo *pNorFlashInfo, unsigned int address)
{
return intel_ReadIdentification(pNorFlashInfo, (address + NorFlash_GetByteAddress(pNorFlashInfo ,INTEL_LOCKSTATUS)));
}
//------------------------------------------------------------------------------
/// It implement a program word command. Returns 0 if the operation was
/// successful; otherwise returns an error code.
/// \param pNorFlashInfo Pointer to an struct NorFlashInfo instance.
/// \param address Start address offset to be wrote.
/// \param data word to be written.
//------------------------------------------------------------------------------
unsigned char intel_Program(
struct NorFlashInfo *pNorFlashInfo,
unsigned int address,
unsigned int data
)
{
unsigned int status;
unsigned int datain;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -