⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lld_bdsxxx_asp.c

📁 Spansion 公司(原AMD flash 部门 / 富士通 闪存部门) FLASH 访问的参考函数
💻 C
📖 第 1 页 / 共 2 页
字号:
/* lld_bdsxxx_asp.c - Source Code for Spansion's Low Level Driver */
/* v7.2.0 */
/**************************************************************************
* Copyright (C)2007 Spansion LLC. All Rights Reserved. 
*
* This software is owned and published by: 
* Spansion Inc, 915 DeGuigne Dr. Sunnyvale, CA  94088-3453 ("Spansion").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND 
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software constitutes driver source code for use in programming Spansion's 
* Flash memory components. This software is licensed by Spansion to be adapted only 
* for use in systems utilizing Spansion's Flash memories. Spansion is not be 
* responsible for misuse or illegal use of this software for devices not 
* supported herein.  Spansion is providing this source code "AS IS" and will 
* not be responsible for issues arising from incorrect user implementation 
* of the source code herein.  
*
* SPANSION MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE, 
* REGARDING THE SOFTWARE, ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED 
* USE, INCLUDING, WITHOUT LIMITATION, NO IMPLIED WARRANTY OF MERCHANTABILITY, 
* FITNESS FOR A  PARTICULAR PURPOSE OR USE, OR NONINFRINGEMENT.  SPANSION WILL 
* HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT, NEGLIGENCE OR 
* OTHERWISE) FOR ANY DAMAGES ARISING FROM USE OR INABILITY TO USE THE SOFTWARE, 
* INCLUDING, WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, 
* SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA, SAVINGS OR PROFITS, 
* EVEN IF SPANSION HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.  
*
* This software may be replicated in part or whole for the licensed use, 
* with the restriction that this Copyright notice must be included with 
* this software, whether used in part or whole, at all times.  
*/
#include "lld.h"

/* Protection Addresses */
#define LLD_PUV7_OW_ADDR (0x001A)
#define LLD_PUV7_PL_ADDR (0x000A)
#define LLD_PUV7_SL_ADDR (0x0012)
#define LLD_PUV7_WP_ADDR (0x003A)

/*  Dynamic Protection Bit Commands */
#define LLD_PUV7_DYB_STATUS_CMD  ((LLD_DEV_MULTIPLIER) * (0x58))
#define LLD_PUV7_DYB_WRITE_CMD   ((LLD_DEV_MULTIPLIER) * (0x48))
#define LLD_PUV7_DYB_ERASE_CMD   ((LLD_DEV_MULTIPLIER) * (0x48))
#define LLD_PUV7_DYB_WRITE_DATA  ((LLD_DEV_MULTIPLIER) * (0x01))
#define LLD_PUV7_DYB_ERASE_DATA  ((LLD_DEV_MULTIPLIER) * (0x00))

/*  SecSi Sector Protect Commands */
#define LLD_PUV7_SECSI_SEC_LOCK_SETUP_CMD   ((LLD_DEV_MULTIPLIER) * (0x60))
#define LLD_PUV7_SECSI_SEC_LOCK_CMD         ((LLD_DEV_MULTIPLIER) * (0x68))
#define LLD_PUV7_SECSI_SEC_LOCK_PGM_VER_CMD ((LLD_DEV_MULTIPLIER) * (0x48))

/* Persistent Protection Bit Commands */
#define LLD_PUV7_PPB_SETUP_CMD        ((LLD_DEV_MULTIPLIER) * (0x60))
#define LLD_PUV7_PPB_PGM_CMD          ((LLD_DEV_MULTIPLIER) * (0x68))
#define LLD_PUV7_PPB_PGM_VER_CMD      ((LLD_DEV_MULTIPLIER) * (0x48))
#define LLD_PUV7_PPB_ERASE_CMD        ((LLD_DEV_MULTIPLIER) * (0x60))
#define LLD_PUV7_PPB_ERASE_VER_CMD    ((LLD_DEV_MULTIPLIER) * (0x40))

#define LLD_PUV7_PPB_LOCK_BIT_SET_CMD     ((LLD_DEV_MULTIPLIER) * (0x78))
#define LLD_PUV7_PPB_LOCK_BIT_STATUS_CMD  ((LLD_DEV_MULTIPLIER) * (0x58))

/* Password Protection Commands */
#define LLD_PUV7_PASSWD_PGM_CMD       ((LLD_DEV_MULTIPLIER) * (0x38))
#define LLD_PUV7_PASSWD_VERIFY_CMD    ((LLD_DEV_MULTIPLIER) * (0xC8))
#define LLD_PUV7_PASSWD_UNLOCK_CMD    ((LLD_DEV_MULTIPLIER) * (0x28))

#define PPB_PROTECTED     (1*LLD_DEV_MULTIPLIER)
#define PPB_UNPROTECTED   (0*LLD_DEV_MULTIPLIER)

#define	DQ0_BIT_MASK	(0x01)		/* select DQ0 */
#define	DQ1_BIT_MASK	(0x02)		/* select DQ1 */
#define	DQ2_BIT_MASK	(0x04)		/* select DQ2 */
#define	DQ5_BIT_MASK	(0x20)		/* select DQ5 */
#define	DQ6_BIT_MASK	(0x40)		/* select DQ6 */
#define	DQ7_BIT_MASK	(0x80)		/* select DQ7 */

#define LLD_DEV_DQ0_MASK	 ((LLD_DEV_MULTIPLIER) * (DQ0_BIT_MASK))
#define LLD_DEV_DQ1_MASK	 ((LLD_DEV_MULTIPLIER) * (DQ1_BIT_MASK))
#define LLD_DEV_DQ6_MASK	 ((LLD_DEV_MULTIPLIER) * (DQ6_BIT_MASK))
#define LLD_DEV_DQ7_MASK	 ((LLD_DEV_MULTIPLIER) * (DQ7_BIT_MASK))
/*
*
*
*
*
*/
DEVSTATUS lld_PasswordProtectionProgramOp
(
FLASHDATA * base_addr,
FLASHDATA pwd0,
FLASHDATA pwd1,
FLASHDATA pwd2,
FLASHDATA pwd3
)
{
  FLASHDATA act_data_ptr;
  DEVSTATUS status;
  int attempts = 0;

  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, NOR_UNLOCK_DATA1);
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR2, NOR_UNLOCK_DATA2);
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, LLD_PUV7_PASSWD_PGM_CMD);
  FLASH_WR(base_addr, 0, pwd0); 
  status = lld_Poll(base_addr, 0, &pwd0, &act_data_ptr, LLD_P_POLL_PGM);
  if (status != DEV_NOT_BUSY)
  {
    FLASH_WR(base_addr, 0x00, NOR_RESET_CMD); /* go back to read array mode */
    return(status);
  }

  attempts = 0;
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, NOR_UNLOCK_DATA1);       
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR2, NOR_UNLOCK_DATA2);       
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, LLD_PUV7_PASSWD_PGM_CMD);
  FLASH_WR(base_addr, 1, pwd1);
  status = lld_Poll(base_addr, 1, &pwd1, &act_data_ptr, LLD_P_POLL_PGM);
  if (status != DEV_NOT_BUSY)
  {
    FLASH_WR(base_addr, 0x00, NOR_RESET_CMD); /* go back to read array mode */
    return(status);
  }

  attempts = 0;
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, NOR_UNLOCK_DATA1);       
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR2, NOR_UNLOCK_DATA2);       
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, LLD_PUV7_PASSWD_PGM_CMD);
  FLASH_WR(base_addr, 2, pwd2);
  status = lld_Poll(base_addr, 2, &pwd2, &act_data_ptr, LLD_P_POLL_PGM);
  if (status != DEV_NOT_BUSY)
  {
    FLASH_WR(base_addr, 0x00, NOR_RESET_CMD); /* go back to read array mode */
    return(status);
  }

  attempts = 0;
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, NOR_UNLOCK_DATA1);       
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR2, NOR_UNLOCK_DATA2);       
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, LLD_PUV7_PASSWD_PGM_CMD);
  FLASH_WR(base_addr, 3, pwd3);
  status = lld_Poll(base_addr, 3, &pwd3, &act_data_ptr, LLD_P_POLL_PGM);

  FLASH_WR(base_addr, 0x00, NOR_RESET_CMD); /* go back to read array mode */
  return(status);
}

/*
*
*
*
*
*/
void lld_PasswordProtectionPasswordVerify
( 
FLASHDATA * base_addr,
FLASHDATA *pd0,
FLASHDATA *pd1,
FLASHDATA *pd2,
FLASHDATA *pd3
)
{
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, NOR_UNLOCK_DATA1);
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR2, NOR_UNLOCK_DATA2);
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, LLD_PUV7_PASSWD_VERIFY_CMD);
  *pd0 = FLASH_RD(base_addr, 0x0000);

  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, NOR_UNLOCK_DATA1);
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR2, NOR_UNLOCK_DATA2);
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, LLD_PUV7_PASSWD_VERIFY_CMD);
  *pd1 = FLASH_RD(base_addr, 0x0000);

  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, NOR_UNLOCK_DATA1);
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR2, NOR_UNLOCK_DATA2);
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, LLD_PUV7_PASSWD_VERIFY_CMD);
  *pd2 = FLASH_RD(base_addr, 0x0000);

  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, NOR_UNLOCK_DATA1);
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR2, NOR_UNLOCK_DATA2);
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, LLD_PUV7_PASSWD_VERIFY_CMD);
  *pd3 = FLASH_RD(base_addr, 0x0000);

  FLASH_WR(base_addr, 0x00, NOR_RESET_CMD); /* go back to read array mode */
}

/*
*
*
*
*
*/
void lld_PasswordProtectionPasswordUnlock
(
FLASHDATA * base_addr,
FLASHDATA pd0,
FLASHDATA pd1,
FLASHDATA pd2,
FLASHDATA pd3
)
{
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, NOR_UNLOCK_DATA1);           
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR2, NOR_UNLOCK_DATA2);           
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, LLD_PUV7_PASSWD_UNLOCK_CMD); 
  FLASH_WR(base_addr, 0, pd0);
  FLASH_WR(base_addr, 1, pd1);
  FLASH_WR(base_addr, 2, pd2);
  FLASH_WR(base_addr, 3, pd3);

  FLASH_WR(base_addr, 0x00, NOR_RESET_CMD); /* go back to read array mode */
}

/*
*
*
*
*
*/
FLASHDATA PPB_Status
(
FLASHDATA * base_addr,
ADDRESS   offset
)
{
  FLASHDATA retval;

  /* Write command Sequence */
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, NOR_UNLOCK_DATA1);             /* *(xxx555) = 0xAA */
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR2, NOR_UNLOCK_DATA2);             /* *(xxx2AA) = 0x55 */
  FLASH_WR(base_addr, offset + LLD_UNLOCK_ADDR1, NOR_AUTOSELECT_CMD);  /* *(sax555) = 0x90 */
  retval = (FLASH_RD(base_addr, offset + 2) );                         /* read ppb */

  /* Exit Mode */
  FLASH_WR(base_addr, 0, NOR_RESET_CMD);
  return(retval);
}

/*
*
*
*
*
*/
FLASHDATA PPB_Program
(
FLASHDATA * base_addr,
ADDRESS   offset
)
{
  FLASHDATA retval = PPB_UNPROTECTED;
  int plscnt = 0;

  /* if PPB already protected, don't over program it */
  if (PPB_Status(base_addr, offset) == PPB_PROTECTED)
  {
    return(PPB_PROTECTED);
  }

  /* Write command Sequence */
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, NOR_UNLOCK_DATA1);       /* *(xxx555) = 0xAA */
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR2, NOR_UNLOCK_DATA2);       /* *(xxx2AA) = 0x55 */
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, LLD_PUV7_PPB_SETUP_CMD); /* *(xxx2AA) = 0x60 */

  while ((plscnt++ < 25) && (retval != PPB_PROTECTED) )
  {
    FLASH_WR(base_addr, offset + 2, LLD_PUV7_PPB_PGM_CMD);     /* *(sa+2) = 0x68  */
    DelayMicroseconds(150);                                    /* datasheet p. 22 */
    FLASH_WR(base_addr, offset + 2, LLD_PUV7_PPB_PGM_VER_CMD); /* *(sa+2) = 0x48  */
    retval  = (FLASH_RD(base_addr, offset + 2) );              /* return verify information */

  }

  /* Exit Mode */
  FLASH_WR(base_addr, offset + 2, NOR_RESET_CMD);

  return(retval);
}

/*
*
*
*
*
*/
FLASHDATA PPB_AllErase
(
FLASHDATA * base_addr,
ADDRESS   offset
)
{
  FLASHDATA retval = PPB_PROTECTED;
  int plscnt = 0;

  /* pre-program the protect bits */
/*  for (i = 0; i < number_of_sector_groups; i++)
  {
    if ( lld_ppb(i) == PPB_UNPROTECTED)
    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -