📄 flash_drv_am29pdl128g.c
字号:
/*******************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2004
*
*******************************************************************************/
/*******************************************************************************
*
* Filename:
* ---------
* flash_drv_AM29PDL128G.c
*
* Project:
* --------
* FlashTool Download Agent
*
* Description:
* ------------
* This Module defines the AMD AM29PDL128G flash driver.
*
* Author:
* -------
* Amos Hsu
*
*==============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* $Revision: 1.1 $
* $Modtime: Nov 12 2004 22:11:14 $
* $Log: //mtkvs01/vmdata/flash_tool/archives/DA/SRC/flash_drv_AM29PDL128G.c-arc $
*
* Rev 1.1 Nov 22 2004 12:25:36 mtk00539
* 1. [DA][BUG FIX] Add data verification in status polling during erase or program operation.
* 2. [DA][BUG FIX] Fix two dies flash detection fail in INTEL_CheckDevID().
* 3. [DA][Change Behavior] When RX_BUFFER_FULL occurs, flush data queued in UART ring buffer til data is less than 512KB.
* 4. [DA][New] Support Buffered-Program method for INTEL family flashes.
* 5. [DA][New] Support new flashes [SHARP]LRS1828C and [RENESAS]M6MGB64BM34CDG.
* Resolution for 99: [BROM_DLL v2.4.1008][New] Support INTEL family flash Buffered-Program method.
*
* Rev 1.0 Aug 03 2004 10:39:54 mtk00539
* Initial revision.
*
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*==============================================================================
*******************************************************************************/
#include "flash_drv_AM29PDL128G.h"
const NOR_CMD_Callback_S AMD_AM29PDL128G_CMD_CB_UNLOCK_BYPASS_PGM = {
// AMD_AM29PDL128G_CheckDevID,
AMD_CheckDevID,
AMD_CheckDevIdle,
AMD_AM29PDL128G_Erase_CMD,
AMD_Erase_CheckDone_By_Polling,
DUMMY_Program_PreProcess,
DUMMY_Program_PostProcess,
AMD_AM29PDL128G_UnlockBypass_Enter_CMD,
AMD_AM29PDL128G_UnlockBypass_Exit_CMD,
AMD_AM29PDL128G_UnlockBypass_Program_CMD,
AMD_Program_CheckDone_By_Toggle,
NULL,
NULL
};
//------------------------------------------------------------------------------
// Check Device ID Callback Function
//------------------------------------------------------------------------------
/*bool AMD_AM29PDL128G_CheckDevID(const uint16 dev, volatile uint16 *die1_addr, volatile uint16 *die2_addr) {
uint16 manufacture_code;
uint16 dev_code;
uint16 ext_dev_code1;
uint16 ext_dev_code2;
// reset die1 to read mode
die1_addr[AMD_AM29PDL128G_SA_ADDR] = AMD_RESET_TO_READ_MODE_DATA1;
// enter auto-select mode on die1
die1_addr[AMD_AM29PDL128G_CMD_ADDR1] = AMD_ENTER_AUTOSELECT_MODE_DATA1;
die1_addr[AMD_AM29PDL128G_CMD_ADDR2] = AMD_ENTER_AUTOSELECT_MODE_DATA2;
die1_addr[AMD_AM29PDL128G_CMD_ADDR1] = AMD_ENTER_AUTOSELECT_MODE_DATA3;
// read manufacture id and device code from die1
manufacture_code = die1_addr[AMD_AM29PDL128G_MANUFACTURE_ID_ADDR]; dev_code = die1_addr[AMD_AM29PDL128G_DEVICE_CODE_ADDR];
ext_dev_code1 = die1_addr[AMD_AM29PDL128G_EXT_DEVICE_CODE1_ADDR];
ext_dev_code2 = die1_addr[AMD_AM29PDL128G_EXT_DEVICE_CODE2_ADDR];
// reset die1 to read mode
die1_addr[AMD_AM29PDL128G_SA_ADDR] = AMD_RESET_TO_READ_MODE_DATA1;
// compare id
if( g_FlashDevTbl[dev].m_hw_info.m_manufacture_code != manufacture_code ) return FALSE; if( g_FlashDevTbl[dev].m_hw_info.m_dev_code != dev_code )
return FALSE;
if( g_FlashDevTbl[dev].m_hw_info.m_ext_dev_code1 != ext_dev_code1 )
return FALSE;
if( g_FlashDevTbl[dev].m_hw_info.m_ext_dev_code2 != ext_dev_code2 )
return FALSE;
return TRUE;
}*/
//------------------------------------------------------------------------------
// Erase Relative Callback Function
//------------------------------------------------------------------------------
void AMD_AM29PDL128G_Erase_CMD(const uint32 blockaddr)
{
volatile uint16 *ba = (volatile uint16 *)blockaddr;
ba[AMD_AM29PDL128G_CMD_ADDR1] = AMD_SECTOR_ERASE_DATA1;
ba[AMD_AM29PDL128G_CMD_ADDR2] = AMD_SECTOR_ERASE_DATA2;
ba[AMD_AM29PDL128G_CMD_ADDR1] = AMD_SECTOR_ERASE_DATA3;
ba[AMD_AM29PDL128G_CMD_ADDR1] = AMD_SECTOR_ERASE_DATA4;
ba[AMD_AM29PDL128G_CMD_ADDR2] = AMD_SECTOR_ERASE_DATA5;
ba[AMD_AM29PDL128G_SA_ADDR] = AMD_SECTOR_ERASE_DATA6;
}
//------------------------------------------------------------------------------
// Program Relative Callback Function
//------------------------------------------------------------------------------
void AMD_AM29PDL128G_UnlockBypass_Enter_CMD(const uint32 blockaddr)
{
volatile uint16 *ba = (volatile uint16 *)blockaddr;
ba[AMD_AM29PDL128G_CMD_ADDR1] = AMD_ENTER_UNLOCK_BYPASS_DATA1;
ba[AMD_AM29PDL128G_CMD_ADDR2] = AMD_ENTER_UNLOCK_BYPASS_DATA2;
ba[AMD_AM29PDL128G_CMD_ADDR1] = AMD_ENTER_UNLOCK_BYPASS_DATA3;
}
void AMD_AM29PDL128G_UnlockBypass_Exit_CMD(const uint32 blockaddr)
{
volatile uint16 *ba = (volatile uint16 *)blockaddr;
ba[AMD_AM29PDL128G_CMD_ADDR1] = AMD_EXIT_UNLOCK_BYPASS_DATA1;
ba[AMD_AM29PDL128G_CMD_ADDR2] = AMD_EXIT_UNLOCK_BYPASS_DATA2;
}
void AMD_AM29PDL128G_UnlockBypass_Program_CMD(const uint32 blockaddr, const uint32 prog_addr, const uint16 data)
{
volatile uint16 *ba = (volatile uint16 *)blockaddr;
ba[AMD_AM29PDL128G_CMD_ADDR1] = AMD_UNLOCK_BYPASS_PGM_DATA1;
*(volatile uint16*)prog_addr = data;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -