📄 lld_wsxxx_asp.c
字号:
/******************************************************************************
*
* lld_PpbLockBitReadCmd - Read the Ppb Lock Bit value.
* Note: Need to issue lld_PpbLockBitEntryCmd() before read.
* RETURNS:
*
*/
FLASHDATA lld_PpbLockBitReadCmd
(
FLASHDATA * base_addr /* device base address in system */
)
{
return(FLASH_RD(base_addr, 0));
}
/******************************************************************************
*
* lld_PpbLockBitExitCmd - Exit Ppb Lock Bit mode command.
*
* RETURNS: n/a
*
*/
void lld_PpbLockBitExitCmd
(
FLASHDATA * base_addr /* device base address in system */
)
{
FLASH_WR(base_addr, 0, NOR_SECSI_SECTOR_EXIT_SETUP_CMD);
FLASH_WR(base_addr, 0, NOR_SECSI_SECTOR_EXIT_CMD);
}
#endif /* REMOVE_ASP_PPB_LOCK */
#ifndef REMOVE_ASP_DYB
/******************************************************************************
*
* lld_DybEntryCmd - Dynamic (Volatile) Sector Protection Entry Command.
*
* RETURNS: n/a
*
*/
void lld_DybEntryCmd
(
FLASHDATA * base_addr /* device base address in system */
)
{
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, WSXXX_DYB_ENTRY);
}
/******************************************************************************
*
* lld_DybSetCmd - Dynamic (Volatile) Sector Protection Set Command.
* Note: Need to issue lld_DybEntryCmd() before issue this command.
* RETURNS: n/a
*
*/
void lld_DybSetCmd
(
FLASHDATA * base_addr, /* device base address in system */
ADDRESS offset /* sector offset address */
)
{
FLASH_WR(base_addr, 0, NOR_UNLOCK_BYPASS_PROGRAM_CMD);
FLASH_WR(base_addr, offset, 0x00000000);
}
/******************************************************************************
*
* lld_DybClrCmd - Dynamic (Volatile) Sector Protection Clear Command.
* Note: Need to issue lld_DybEntryCmd() before issue this command.
* RETURNS: n/a
*
*/
void lld_DybClrCmd
(
FLASHDATA * base_addr, /* device base address in system */
ADDRESS offset /* sector offset address */
)
{
FLASH_WR(base_addr, 0, NOR_UNLOCK_BYPASS_PROGRAM_CMD);
FLASH_WR(base_addr, offset, WSXXX_DYB_CLEAR);
}
/******************************************************************************
*
* lld_DybReadCmd - Dynamic (Volatile) Sector Protection Read Command.
* Note: Need to issue lld_DybEntryCmd() before issue this command.
* RETURNS:
*
*/
FLASHDATA lld_DybReadCmd
(
FLASHDATA * base_addr, /* device base address in system */
ADDRESS offset /* sector offset address */
)
{
return(FLASH_RD(base_addr, offset));
}
/******************************************************************************
*
* lld_DybExitCmd - Exit Dynamic (Volatile) Sector Protection Mode Command.
*
* RETURNS: n/a
*
*/
void lld_DybExitCmd
(
FLASHDATA * base_addr /* device base address in system */
)
{
FLASH_WR(base_addr, 0, NOR_SECSI_SECTOR_EXIT_SETUP_CMD);
FLASH_WR(base_addr, 0, NOR_SECSI_SECTOR_EXIT_CMD);
}
#endif /* REMOVE_ASP_DYB */
/****************************************************************************
* *
* Section below are example codes to do operations using Ppb commands. *
* *
******************************************************************************/
#ifndef REMOVE_ASP_PPB
/******************************************************************************
*
* lld_PpbAllEraseOp - Operation to clear protection for all sections.
*
* RETURNS: 0 Successful
* -1 Failed
*
*/
int lld_PpbAllEraseOp ( FLASHDATA * base_addr)
{
DEVSTATUS dev_status = DEV_STATUS_UNKNOWN;
unsigned long polling_counter = 0xFFFFFFFF;
if (lld_PpbLockBitReadOp(base_addr) == PPB_PROTECTED) /* if it is already locked */
{
return(-1); /* return an error cuz Lock Bit is locked */
}
lld_PpbEntryCmd(base_addr, 0);
lld_PpbAllEraseCmd(base_addr);
/* poll for completion */
do
{
polling_counter--;
/* no checking for interrupts */
dev_status = lld_StatusGet((FLASHDATA *)base_addr, 0);
} while ((dev_status == DEV_BUSY) && polling_counter);
/* if not done, then we have an error */
if (dev_status != DEV_NOT_BUSY)
{
lld_ResetCmd((FLASHDATA *)base_addr);
lld_PpbExitCmd(base_addr);
return (-1); /* return error */
}
lld_PpbExitCmd(base_addr); /* exit Ppb protection mode command */
return 0; /* successful */
}
/******************************************************************************
*
* lld_PpbStatusReadOp - Operation to read the Persistent Protection status register.
*
* RETURNS: FLASHDATA
*
*/
FLASHDATA lld_PpbStatusReadOp ( FLASHDATA *base_addr, ADDRESS offset)
{
FLASHDATA status;
lld_PpbEntryCmd(base_addr,offset);
status = (FLASH_RD(base_addr, offset));
lld_PpbExitCmd(base_addr);
return status;
}
/******************************************************************************
*
* lld_PpbProgramOp - Operation set the Persistent Protection for a sector.
*
* RETURNS: 0 Successful
* -1 Failed
*
*/
int lld_PpbProgramOp ( FLASHDATA *base_addr, ADDRESS offset)
{
DEVSTATUS dev_status = DEV_STATUS_UNKNOWN;
unsigned long polling_counter = 0xFFFFFFFF;
if (lld_PpbLockBitReadOp(base_addr) == PPB_PROTECTED) /* if it is already locked */
{
return(-1); /* return an error cuz Lock Bit is locked */
}
lld_PpbEntryCmd(base_addr,offset);
lld_PpbProgramCmd(base_addr, offset);
/* poll for completion */
do
{
polling_counter--;
/* no checking for interrupts */
/* poll Sector 0 for completion - workaround */
dev_status = lld_StatusGet((FLASHDATA *)base_addr, 0);
} while ((dev_status == DEV_BUSY) && polling_counter);
/* if not done, then we have an error */
if (dev_status != DEV_NOT_BUSY)
{
lld_ResetCmd((FLASHDATA *)base_addr);
lld_PpbExitCmd(base_addr);
return (-1); /* return error */
}
lld_PpbExitCmd(base_addr);
return 0; /* successful */
}
#endif /* REMOVE_ASP_PPB */
#ifndef REMOVE_ASP_PPB_LOCK_BIT
/******************************************************************************
*
* lld_PpbLockBitSetOp - Operation to set the global lock bit.
*
* RETURNS: 0 Successful
* -1 Failed
*
*/
int lld_PpbLockBitSetOp ( FLASHDATA * base_addr)
{
DEVSTATUS dev_status = DEV_STATUS_UNKNOWN;
unsigned long polling_counter = 0xFFFFFFFF;
lld_PpbLockBitEntryCmd(base_addr);
lld_PpbLockBitSetCmd(base_addr);
/* poll for completion */
do
{
polling_counter--;
/* no checking for interrupts */
dev_status = lld_StatusGet((FLASHDATA *)base_addr, 0);
} while ((dev_status == DEV_BUSY) && polling_counter);
/* if not done, then we have an error */
if (dev_status != DEV_NOT_BUSY)
{
lld_ResetCmd((FLASHDATA *)base_addr);
lld_PpbLockBitExitCmd(base_addr);
return (-1); /* return error */
}
lld_PpbLockBitExitCmd(base_addr);
return 0; /* successfull */
}
/******************************************************************************
*
* lld_PpbLockBitReadOp - Operation to read global lock bit.
*
* RETURNS: FLASHDATA
*
*/
FLASHDATA lld_PpbLockBitReadOp ( FLASHDATA *base_addr)
{
FLASHDATA retval;
(lld_PpbLockBitEntryCmd)(base_addr);
retval = (lld_PpbLockBitReadCmd)(base_addr);
lld_PpbLockBitExitCmd(base_addr);
return retval;
}
#endif /* REMOVE_ASP_PPB_LOCK_BIT */
/******************************************************************************
*
* lld_LockRegBitsReadOp - Operation to read the lock status register.
*
* RETURNS: FLASHDATA
*
*/
FLASHDATA lld_LockRegBitsReadOp ( FLASHDATA *base_addr)
{
FLASHDATA value;
lld_LockRegEntryCmd(base_addr);
value = lld_LockRegBitsReadCmd(base_addr);
lld_LockRegExitCmd(base_addr);
return(value);
}
/******************************************************************************
*
* lld_LockRegBitsProgramOp - Operation to program the lock register.
*
* RETURNS: 0 Successful
* -1 Failed
*
*/
int lld_LockRegBitsProgramOp ( FLASHDATA *base_addr, FLASHDATA value)
{
DEVSTATUS dev_status = DEV_STATUS_UNKNOWN;
unsigned long polling_counter = 0xFFFFFFFF;
lld_LockRegEntryCmd(base_addr);
lld_LockRegBitsProgramCmd(base_addr,value);
/* poll for completion */
do
{
polling_counter--;
/* no checking for interrupts */
dev_status = lld_StatusGet((FLASHDATA *)base_addr, 0);
} while ((dev_status == DEV_BUSY) && polling_counter);
/* if not done, then we have an error */
if (dev_status != DEV_NOT_BUSY)
{
lld_ResetCmd((FLASHDATA *)base_addr);
lld_LockRegExitCmd(base_addr);
return (-1); /* return error */
}
lld_LockRegExitCmd(base_addr);
return 0; /* successful */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -