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

📄 fdi_mpll.c

📁 Flash file system
💻 C
📖 第 1 页 / 共 5 页
字号:

#if (FLASH_PAIRED != TRUE)
#define FLASH_PR_64BIT_SIZE   ((64 >> 3) >> (sizeof(FLASH_DATA) >> 1))
#define FLASH_PR_128BIT_SIZE  ((128 >> 3) >> (sizeof(FLASH_DATA) >> 1))
#else /* FLASH_PAIRED == TRUE */
#define FLASH_PR_64BIT_SIZE   (((64 >> 3) >> (sizeof(FLASH_DATA) >> 1)) << 1)
#define FLASH_PR_128BIT_SIZE  (((128 >> 3) >> (sizeof(FLASH_DATA) >> 1)) << 1)
#endif /* FLASH_PAIRED */

#define FLASH_PR_LOCK0_VALUE        CREATE_COMMAND(0xFFFD)
#define FLASH_PR_LOCK1_VALUE        CREATE_COMMAND(0xFFFE)
#define FLASH_PR_LOCK2_VALUE        CREATE_COMMAND(0xFFFD)
#define FLASH_PR_LOCK3_VALUE        CREATE_COMMAND(0xFFFB)
#define FLASH_PR_LOCK4_VALUE        CREATE_COMMAND(0xFFF7)
#define FLASH_PR_LOCK5_VALUE        CREATE_COMMAND(0xFFEF)
#define FLASH_PR_LOCK6_VALUE        CREATE_COMMAND(0xFFDF)
#define FLASH_PR_LOCK7_VALUE        CREATE_COMMAND(0xFFBF)
#define FLASH_PR_LOCK8_VALUE        CREATE_COMMAND(0xFF7F)
#define FLASH_PR_LOCK9_VALUE        CREATE_COMMAND(0xFEFF)
#define FLASH_PR_LOCK10_VALUE       CREATE_COMMAND(0xFDFF)
#define FLASH_PR_LOCK11_VALUE       CREATE_COMMAND(0xFBFF)
#define FLASH_PR_LOCK12_VALUE       CREATE_COMMAND(0xF7FF)
#define FLASH_PR_LOCK13_VALUE       CREATE_COMMAND(0xEFFF)
#define FLASH_PR_LOCK14_VALUE       CREATE_COMMAND(0xDFFF)
#define FLASH_PR_LOCK15_VALUE       CREATE_COMMAND(0xBFFF)
#define FLASH_PR_LOCK16_VALUE       CREATE_COMMAND(0x7FFF)

#define GET_PR_LOCK_REG(reg)  ((reg) ? FLASH_PR_LOCK_REG1 : FLASH_PR_LOCK_REG0)
#endif /* ENABLE_PR */


/*#############################################################################
 *# Function Pointers
 *###########################################################################*/

#if (((BLOCK_LOCK_SUPPORT == TRUE) && (ENABLE_NONFDI_BLOCKLOCKING == TRUE)) \
    || (ENABLE_PR != FDI_NONE))
typedef FLASH_DATA (*LLREADSTAT_FUNCPTR)(volatile FLASH_DATA_PTR);
extern FLASH_DATA LowLvlReadStat(volatile FLASH_DATA_PTR);
static LLREADSTAT_FUNCPTR PtrLowLvlReadStat;
#endif /* (BLOCK_LOCK_SUPPORT && ENABLE_NONFDI_BLOCKLOCKING) || ENABLE_PR */

#if (BLOCK_LOCK_SUPPORT == TRUE)
typedef HW_ERROR (*LLLOCK_FUNCPTR)(volatile FLASH_DATA_PTR, FLASH_DATA_PTR,
                                   HW_CMD);
extern HW_ERROR LowLvlLock(volatile FLASH_DATA_PTR, FLASH_DATA_PTR, HW_CMD);
static LLLOCK_FUNCPTR PtrLowLvlLock;
#endif /* BLOCK_LOCK_SUPPORT */

#if (ENABLE_PR != FDI_NONE)
typedef HW_ERROR (*LLPR_FUNCPTR)(volatile FLASH_DATA_PTR, FLASH_DATA_PTR,
                                 HW_CMD);
extern HW_ERROR LowLvlProtectReg(volatile FLASH_DATA_PTR, FLASH_DATA_PTR,
                                 HW_CMD);
static LLPR_FUNCPTR PtrLowLvlProtectReg;
#endif /* ENABLE_PR */

#if (RELOCATE_CODE == TRUE)
extern HW_ERROR LowLvlEnd(void);
#endif /* RELOCATE_CODE */
/* Flash Device Semaphores */
extern SEM_MTX_ID SEM_FlashWrite;
#if (DIRECT_ACCESS_VOLUME == TRUE)
extern SEM_MTX_ID SEM_FlashErase;
#endif /* DIRECT_ACCESS_VOLUME */

#if (CONSISTENT_ACCESS_TIME == TRUE)
extern DATA_LOOKUP_PTR FDI_DataLookupPtrTable[];
#endif /* CONSISTENT_ACCESS_TIME */
/* extern SEM_MTX_ID  SEM_LookupTable; */
extern LOGICAL_BLOCK FDI_LogicalBlockTable[];
extern SEM_MTX_ID  SEM_BlockTable;



/*#############################################################################
 *# Dual/Multi Partition Macros
 *###########################################################################*/

/* partition states */
/*typedef enum
{
   HW_STATE_READ   = 0,
   HW_STATE_STATUS = 1
} HW_STATE;*/
enum
{
   HW_STATE_READ   = 0,
   HW_STATE_STATUS = 1
};


/* sets partition state */
#define SET_PARTITION_STATE(addr, state) \
   (((addr) & (-sizeof(FLASH_DATA))) | ((DWORD) (state)))

/* gets partition state */
#define GET_PARTITION_STATE(ps) \
   (((ps) & HW_STATE_STATUS) ? HW_STATE_STATUS : HW_STATE_READ)

/* gets partition address */
#define GET_PARTITION_ADDRESS(ps) \
   ((ps) & (-sizeof(FLASH_DATA)))


/* Checks if the partition is ready to be read from */
#if (PARTITIONS != MULTI)
#define CUI_FLASH_STATUS_PARTITION_READY        0x80
#else  /* PARTITIONS == MULTI */
#define CUI_FLASH_STATUS_PARTITION_READY        0x81
#endif /* PARTITIONS */

#define FLASH_STATUS_PARTITION_READY \
   CREATE_COMMAND(CUI_FLASH_STATUS_PARTITION_READY)

/* E5.0.480 START */
#if (FLASH_PAIRED == TRUE)
#define SHIFT_FACTOR (sizeof(FLASH_DATA) << 2)
#define DEVICE0_MASK ((FLASH_DATA) (ALL_F >> SHIFT_FACTOR))
#define DEVICE1_MASK ((FLASH_DATA) ((ALL_F >> SHIFT_FACTOR) << SHIFT_FACTOR))

#define IS_PARTITION_BUSY(fp) \
   ((((*(fp) & DEVICE0_MASK) & FLASH_STATUS_PARTITION_READY) == 0) || \
    (((*(fp) & DEVICE1_MASK) & FLASH_STATUS_PARTITION_READY) == 0))
#define RESUME_WRITE_SUSPENDED_FLASH(fp) \
   if ((*(fp) & DEVICE0_MASK) & FLASH_STATUS_WRITE_SUSPENDED) \
   { \
      *(fp) = ((FLASH_COMMAND_STATUS & DEVICE1_MASK) | \
               (FLASH_COMMAND_RESUME & DEVICE0_MASK)); \
   } \
   if ((*(fp) & DEVICE1_MASK) & FLASH_STATUS_WRITE_SUSPENDED) \
   { \
      *(fp) = ((FLASH_COMMAND_STATUS & DEVICE0_MASK) | \
               (FLASH_COMMAND_RESUME & DEVICE1_MASK)); \
   } \
   *(fp) = FLASH_COMMAND_STATUS

#else  /* FLASH_PAIRED != TRUE */
#define IS_PARTITION_BUSY(fp) \
   ((*(fp) & FLASH_STATUS_PARTITION_READY) == 0)
#define RESUME_WRITE_SUSPENDED_FLASH(fp) \
   *(fp) = FLASH_COMMAND_RESUME; \
   *(fp) = FLASH_COMMAND_STATUS
#endif /* FLASH_PAIRED */
/* E5.0.480 END */

/* Stores the current block address and the state of the partition */
static DWORD CurrentFlashState =
   SET_PARTITION_STATE(LOWLVL_DATA_START_ADDRESS, HW_STATE_READ);



/*
 *### Local Functions
 *#########################
 */

#if (BUFFER_SIZE > 0)
/*#############################################################################
  ### WriteToFlash (Buffered Version)
  ###
  ### DESCRIPTION:
  ###   Writes data to flash and performs error checking before returning.
  ###
  ### PARAMETERS:
  ###    IN:  dst_ptr (FLASH_DATA_PTR) - A pointer to the data destination.
  ###         src_ptr (FLASH_DATA_PTR) - A pointer to the data source.
  ###         size (DWORD) - The number of FLASH_DATA units to write.
  ###    OUT:
  ###
  ### RETURNS:
  ###   If any portion of the data is not written successfully, the function
  ###   returns HW_ERR_WRITE; otherwise, the function returns HW_ERR_NONE.
  ###
 */

static HW_ERROR WriteToFlash(volatile FLASH_DATA *flash_ptr,
                             const    FLASH_DATA *ram_ptr,
                             DWORD size)
{
   FLASH_DATA buffer_size;
   DWORD size_to_write;
   DWORD i;

   DWORD key0, key1;
   HW_ERROR status = HW_ERR_NONE;


   while (size > 0)
   {
      /* not enough data, use single data program */
      if (size == 1)
      {
         DISABLE_INTERRUPTS(key0, key1);
         UNLOCK_BLOCK(flash_ptr);
         *flash_ptr = FLASH_COMMAND_WRITE;
         *flash_ptr = *ram_ptr;
         mDEBUG_RESET_WRITE();
         ENABLE_INTERRUPTS(key0, key1);

         /* increment ram pointer and decrement size */
         ram_ptr++;
         size--;
      }

      /* enough data is present, use hardware buffer */
      else
      {
         /* determine the size of the buffer */
         size_to_write = GET_MIN(size, BUFFER_SIZE / sizeof(FLASH_DATA));
         buffer_size = BUFFER_SIZE_TO_WRITE(size_to_write);

         /* wait until buffer is ready */
         DISABLE_INTERRUPTS(key0, key1);
         UNLOCK_BLOCK(flash_ptr);
         do
         {
            *flash_ptr = FLASH_COMMAND_WRITE_BUFFER;
         } while ((*flash_ptr & FLASH_STATUS_READY) != FLASH_STATUS_READY);

         /* send size of data and fill buffer */
         *flash_ptr = buffer_size;
         for (i = 0; i < size_to_write; i++)
         {
            *flash_ptr = *ram_ptr;
            flash_ptr++;
            ram_ptr++;
         }

         /* make sure pointer is in the same block and commit buffer */
         flash_ptr--;
         *flash_ptr = FLASH_COMMAND_CONFIRM;
         mDEBUG_RESET_WRITE();
         ENABLE_INTERRUPTS(key0, key1);

         /* decrement size */
         size -= size_to_write;
      }

      /* wait until flash is done */
      while ((*flash_ptr & FLASH_STATUS_READY) != FLASH_STATUS_READY)
      {
      }

      /* Lock the block */
#if ((BLOCK_LOCK_SUPPORT == TRUE) && (ENABLE_FDI_BLOCKLOCKING == TRUE))
      DISABLE_INTERRUPTS(key0, key1);
      LOCK_BLOCK(flash_ptr);
      ENABLE_INTERRUPTS(key0, key1);
#endif

      /* check for errors */
      if (*flash_ptr & FLASH_STATUS_ERROR)
      {
         *flash_ptr = FLASH_COMMAND_CLEAR;
         status = HW_ERR_WRITE;
         break;
      }

      /*
       * if a write is allowed to span blocks, uncomment the following
       * line of code to guarantee that the data, not status, will be read
       * on future reads
       */
      /* *flash_ptr = FLASH_COMMAND_READ; */

      /* increment flash pointer */
      flash_ptr++;
   }

   return status;
}



#else /* BUFFER_SIZE == 0 */
/*#############################################################################
  ### WriteToFlash (Non-Buffered Version)
  ###
  ### DESCRIPTION:
  ###   Writes data to flash and performs error checking before returning.
  ###
  ### PARAMETERS:
  ###    IN:  dst_ptr (FLASH_DATA_PTR) - A pointer to the data destination.
  ###         src_ptr (FLASH_DATA_PTR) - A pointer to the data source.
  ###         size (DWORD) - The number of FLASH_DATA units to write.
  ###    OUT:
  ###
  ### RETURNS:
  ###   If any portion of the data is not written successfully, the function
  ###   returns HW_ERR_WRITE; otherwise, the function returns HW_ERR_NONE.
  ###
 */

static HW_ERROR WriteToFlash(volatile FLASH_DATA *flash_ptr,
                             const    FLASH_DATA *ram_ptr,
                             DWORD size)
{
   DWORD key0, key1;
   HW_ERROR status = HW_ERR_NONE;


   while (size > 0)
   {
      /* program flash */
      DISABLE_INTERRUPTS(key0, key1);
      UNLOCK_BLOCK(flash_ptr);
      *flash_ptr = FLASH_COMMAND_WRITE;
      *flash_ptr = *ram_ptr;
      mDEBUG_RESET_WRITE();
      ENABLE_INTERRUPTS(key0, key1);

      /* wait until flash is done */
      while ((*flash_ptr & FLASH_STATUS_READY) != FLASH_STATUS_READY)
      {
      }

      /* lock the block */
#if ((BLOCK_LOCK_SUPPORT == TRUE) && (ENABLE_FDI_BLOCKLOCKING == TRUE))
      DISABLE_INTERRUPTS(key0, key1);
      LOCK_BLOCK(flash_ptr);
      ENABLE_INTERRUPTS(key0, key1);
#endif

      /* check for errors */
      if (*flash_ptr & FLASH_STATUS_ERROR)
      {
         *flash_ptr = FLASH_COMMAND_CLEAR;
         status = HW_ERR_WRITE;
         break;
      }

      /*
       * if a write is allowed to span blocks, uncomment the following
       * line of code to guarantee that the data, not status, will be read
       * on future reads
       */
      /* *flash_ptr = FLASH_COMMAND_READ; */

      /* update pointers */
      flash_ptr++;
      ram_ptr++;
      size--;
   }

   return status;
}
#endif /* BUFFER_SIZE */



/*### Global Declarations
 *######################### */



/*### Global Functions
 *######################### */

#if (RELOCATE_CODE == TRUE)
/*#############################################################################
  ### FlashDevInit (Relocate Version)
  ###
  ### DESCRIPTION:
  ###   Initializes the pointers used by the flash device functions.  Though
  ###   the flash device functions do not check, this function must be
  ###   called before any of the flash device functions can be called.
  ###
  ### PARAMETERS:
  ###    IN:  address (DWORD) - The physical address to where the low-level
  ###          functions will be relocated.
  ###    OUT:
  ###
  ### RETURNS:
  ###   HW_ERR_NONE.
  ###
 */

HW_ERROR FlashDevInit(DWORD address)
{
#if (((BLOCK_LOCK_SUPPORT == TRUE) && (ENABLE_NONFDI_BLOCKLOCKING == TRUE)) \
    || (ENABLE_PR != FDI_NONE))
   BYTE_PTR dst_ptr = (BYTE_PTR) address;
   BYTE_PTR src_ptr;
   WORD size;
#endif /* OPTIONAL_FEATURES */

⌨️ 快捷键说明

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