亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? flashhw.c

?? nxp 3250 的nandflash的bootloader
?? C
字號:
/***********************************************************************/
/*  This file is part of the ARM Toolchain package                     */
/*  Copyright KEIL ELEKTRONIK GmbH 2003 - 2006                         */
/***********************************************************************/
/*                                                                     */
/*  FlashHW.C:   Hardware Layer of Flash Programming Functions         */
/*               adapted for the Philips LPC318x MLC NAND Controller   */
/***********************************************************************/

#include "LPC318x.H"                        // LPC318x definitions
#include "NAND_Error.h"                     // Error definitions

// NAND Controller Buffer Definition
#define MLC_DATA               (*(volatile unsigned long  *)(0x200B0000))
#define MLC_DATAX(x)           (*(volatile unsigned long  *)(0x200A8000+(x<<2)))

// NAND Flash Commands
#define NAND_CMD_READ0         0x00         // Read mode (1) command
#define NAND_CMD_READ1         0x01         // Read mode (2) command
#define NAND_CMD_PAGEPROG      0x10         // Auto program command
#define NAND_CMD_READSTART     0x30         // Read start command
#define NAND_CMD_READ2         0x50         // Read mode (3) command
#define NAND_CMD_ERASE1ST      0x60         // Auto block erase 1-st command
#define NAND_CMD_STATUS        0x70         // Status read (1) command
#define NAND_CMD_STATUS_MULTI  0x71         // Status read (2) command
#define NAND_CMD_SDIN          0x80         // Serial data input command
#define NAND_CMD_READID        0x90         // ID read (1) command
#define NAND_CMD_ERASE2ND      0xD0         // Auto block erase 2-nd command
#define NAND_CMD_RESET         0xFF         // Reset command

// Enumerated type names definitions
enum PAGE_TYPE {SMALL_PAGE = 0, LARGE_PAGE};
enum BOOL_TYPE {     FALSE = 0,       TRUE};

// Global variables that describe interface
static volatile unsigned char bus_width_hw; // Bus width
static volatile unsigned char adr_cycles_hw;// Address word count
static volatile unsigned char page_type_hw; // Page type (small or large)

// Buffer for spare area reading or writing
unsigned char spare_buf[64];

// Module's local functions prototypes
static int SetAddress_HW      (unsigned long adr);
static int SetBlockAddress_HW (unsigned long adr);


/************************* Module Exported Functions ***************************/

/*- InitFlashController_HW (...) -----------------------------------------------
 *
 *  Initialize Flash Controller
 *    Parameter:  bus_width:  Bus Width (8, 16 bit)
 *               adr_cycles:  Addressing Cycles (3, 4, 5)
 *                page_type:  Page Type (0 -Small Page, 1 - Large Page)
 *                      clk:  Clock Frequency (Hz)
 *    Return Value:           NAND_ERROR
 */

int InitFlashController_HW (unsigned char bus_width, unsigned char adr_cycles, unsigned char page_type, unsigned long clk) {
  static unsigned char first_run_f = TRUE;

  bus_width_hw    = bus_width;
  adr_cycles_hw   = adr_cycles;
  page_type_hw    = page_type;

  if (first_run_f == TRUE) {
    first_run_f = FALSE;

    // Enable programming with GPO_19 pin driven high
    PIO_OUTP_SET = (1 << 1) | (1 << 19);

    FLASHCLK_CTRL = 0x00000022;         // Setup NAND Flash Clock Control
    MLC_CEH       = 0;                  // Force nCE assert
    MLC_CMD       = NAND_CMD_RESET;     // Reset NAND Flash

    while (!(MLC_ISR & 0x01));
  }

  // 16 bit bus width is not supported by controller
  if (bus_width_hw != 8) return (NAND_NOT_ALLOWED_ERROR);

  MLC_LOCK_PR     = 0xA25E;             // Unlock access to MLC_ICR register
  MLC_ICR         =  (bus_width_hw  == 16)
                  | ((adr_cycles_hw ==  4) << 1)
                  | ((page_type_hw  ==  1) << 2);

  MLC_LOCK_PR     = 0xA25E;             // Unlock access to MLC_TIME register
  MLC_TIME_REG    = (3 << 24) | (11 << 19) | (4 << 16) | (2 << 12) | (4 << 8) | (3 << 4) | (4 << 0);

  while (!(MLC_ISR & 0x01));

  return (NAND_OK);
}


/*- EraseBlock_HW (...) --------------------------------------------------------
 *
 *  Erase whole Block
 *    Parameter:      adr:  Block Start Address
 *    Return Value:   NAND_ERROR
 */

int EraseBlock_HW (unsigned long adr) {

  while (!(MLC_ISR & 0x01));            // Wait for NAND ready
  MLC_CMD  = NAND_CMD_ERASE1ST;
  SetBlockAddress_HW(adr);
  MLC_CMD  = NAND_CMD_ERASE2ND;

  return (NAND_OK);
}


/*- ReadPage_HW (...) ----------------------------------------------------------
 *
 *  Initialize Flash Programming Functions
 *    Parameter:      adr:  Page Start Address
 *                     sz:  Page Size
 *                    buf:  Page Data
 *    Return Value:         NAND_ERROR
 */

int ReadPage_HW (unsigned long adr, unsigned long sz, unsigned char *buf) {
  int i;
  unsigned long *ptr_ul = (unsigned long *)buf;

  if (page_type_hw == SMALL_PAGE)  {    // Small Page Device
    while (!(MLC_ISR & 0x01));          // Wait for NAND ready
    MLC_CMD = NAND_CMD_READ0;
    SetAddress_HW(adr);
    MLC_ECC_AUTO_DEC_REG = 0x00;        // Auto Decode
    while (!(MLC_ISR & 0x02));          // Wait for controller ready
    while (!(MLC_ISR & 0x04));          // Wait for ECC ready
    if (MLC_ISR & 0x40)
      return (NAND_ECC_ERROR);          // Decode ECC error
    for (i=0; i<((sz+3)>>2); i++) {     // Read requested number of bytes
      *ptr_ul++ = MLC_DATAX(i);
    }
  }  
  else  {                               // Large Page Device
    return (NAND_NOT_IMPLEMENTED_ERROR);
  }

  return (NAND_OK);
}


/*- ProgramPage_HW (...) -------------------------------------------------------
 *
 *  Initialize Flash Programming Functions
 *    Parameter:      adr:  Page Start Address
 *                     sz:  Page Size
 *                    buf:  Page Data
 *    Return Value:         NAND_ERROR
 */

int ProgramPage_HW (unsigned long adr, unsigned long sz, unsigned char *buf) {
  int i;
  unsigned long *ptr_ul = (unsigned long *)buf;

  if (page_type_hw == SMALL_PAGE)  {    // Small Page Device
    while (!(MLC_ISR & 0x01));          // Wait for NAND ready
    MLC_CMD = NAND_CMD_SDIN;
    SetAddress_HW(adr);
    MLC_ECC_ENC_REG = 0;
    for (i=0;        i<(512>>2); i++)   // Load main area data
      MLC_DATAX(i) = *ptr_ul++;
    for (i=(512>>2); i<(520>>2); i++)   // Load spare area data
      MLC_DATAX(i) = 0xFFFFFFFF;
    MLC_ECC_AUTO_ENC_REG = 0;
    while (!(MLC_ISR & 0x02));          // Wait for controller ready
    MLC_CMD     = NAND_CMD_PAGEPROG;
  }  
  else  {                               // Large Page Device
    return (NAND_NOT_IMPLEMENTED_ERROR);
  }

  return (NAND_OK);
}


/*- CheckBlock_HW (...) --------------------------------------------------------
 *
 *  Check if block at requested address is valid
 *    Parameter:      adr:  Block Start Address
 *    Return Value:         NAND_ERROR
 */

int CheckBlock_HW (unsigned long adr) {
  int i;
  unsigned long *ptr_ul = (unsigned long *)spare_buf;

  if (page_type_hw == SMALL_PAGE)  {    // Small Page Device
    while (!(MLC_ISR & 0x01));          // Wait for NAND ready
    MLC_CMD = NAND_CMD_READ0;
    SetAddress_HW(adr);
    MLC_ECC_AUTO_DEC_REG = 0x00;        // Auto Decode
    while (!(MLC_ISR & 0x02));          // Wait for controller ready
    while (!(MLC_ISR & 0x04));          // Wait for ECC ready
    if (MLC_ISR & 0x40)                return (NAND_ECC_ERROR);
    for (i=0;        i<(512>>2); i++)   // Load main area data
      MLC_DATAX(i);
    for (i=(512>>2); i<(520>>2); i++)   // Load spare area data
      *ptr_ul++ = MLC_DATAX(i);

    // If 6-th byte in spare area is != 0xFF then the block is bad
    if (spare_buf[5] != 0xFF)          return (NAND_BAD_BLOCK_ERROR);
  }  
  else  {                               // Large Page Device
    return (NAND_NOT_IMPLEMENTED_ERROR);
  }
    
  return (NAND_OK);
}


/*- MarkBlockBad_HW (...) ------------------------------------------------------
 *
 *  Mark the block as being bad
 *    Parameter:      adr:  Block Start Address
 *    Return Value:         NAND_ERROR
 */

int MarkBlockBad_HW (unsigned long adr) {
  int i;
  unsigned long *ptr_ul = (unsigned long *)spare_buf;
  
  if (page_type_hw == SMALL_PAGE)  {    // Small Page Device
    while (!(MLC_ISR & 0x01));          // Wait for NAND ready
    // Marking Block 0 bad is forbidden
    if (adr == 0) return (NAND_NOT_ALLOWED_ERROR);

    // Prepare buffer for spare area data
    for (i=0; i<16; i++) spare_buf[i]=0xFF;
    spare_buf[5] = 0x00;                // Bad block marker in spare area

    // Erase bad block
    EraseBlock_HW(adr);

    // Write Spare Data
    MLC_CMD = NAND_CMD_SDIN;
    SetAddress_HW(adr);
    MLC_ECC_ENC_REG = 0;
    for (i=0;        i<(512>>2); i++)   // Load main area data
      MLC_DATAX(i) = 0xFFFFFFFF;
    for (i=(512>>2); i<(520>>2); i++)   // Load spare area data
      MLC_DATAX(i) = *ptr_ul++;
    MLC_ECC_AUTO_ENC_REG = 0;
    while (!(MLC_ISR & 0x02));          // Wait for controller ready
    MLC_CMD     = NAND_CMD_PAGEPROG;
  }  
  else  {                               // Large Page Device
    return (NAND_NOT_IMPLEMENTED_ERROR);
  }
  
  return (NAND_OK);
}


/**************************** Auxiliary Functions ******************************/

/*- SwapU32 (...) --------------------------------------------------------------
 *
 *  Swap big <-> little-endian for 32 bit value
 *    Parameter:
 *    Return Value:         swapped value
 *//*

static unsigned long SwapU32(unsigned long to_swap)
{
  const unsigned long mask = 0x00FF00FF;
  unsigned long temp;

  __asm {
    AND temp,    mask,    to_swap
    AND to_swap, mask,    to_swap, ROR #24
    ORR to_swap, to_swap, temp,    ROR #8
  }

  return (to_swap);
} */


/*- SetAddress_HW (...) --------------------------------------------------------
 *
 *  Set the address according to address word count
 *    Parameter:      adr:  Address Requested for Setting
 *               adr_type:  Address Word Count
 *              page_type:  Size of Page
 *    Return Value:         NAND_ERROR
 */

static int SetAddress_HW (unsigned long adr) {
  if (page_type_hw == SMALL_PAGE)  {    // Small Page Device
    MLC_ADDR    = (0        ) & 0xFF;   // Address word 1st
    MLC_ADDR    = (adr >>  9) & 0xFF;   // Address word 2nd
    MLC_ADDR    = (adr >> 17) & 0xFF;   // Address word 3rd
    if (adr_cycles_hw > 3)
      MLC_ADDR  = (adr >> 25) & 0xFF;   // Address word 4th
  }  
  else  {                               // Large Page Device
    MLC_ADDR    = (0        ) & 0xFF;   // Address word 1st
    MLC_ADDR    = (adr >>  8) & 0x0F;   // Address word 2nd
    MLC_ADDR    = (adr >> 12) & 0xFF;   // Address word 3rd
    if (adr_cycles_hw > 3)
      MLC_ADDR  = (adr >> 20) & 0xFF;   // Address word 4th
    if (adr_cycles_hw > 4)
      MLC_ADDR  = (adr >> 28) & 0xFF;   // Address word 5th
  }
  return (NAND_OK);
}


/*- SetBlockAddress_HW (...) --------------------------------------------------------
 *
 *  Set the block address according to address word count
 *    Parameter:      adr:  Address Requested for Setting
 *               adr_type:  Address Word Count
 *              page_type:  Size of Page
 *    Return Value:         NAND_ERROR
 */

static int SetBlockAddress_HW (unsigned long adr) {
  if (page_type_hw == SMALL_PAGE)  {    // Small Page Device
    MLC_ADDR    = (adr >>  9) & 0xFF;   // Address word 1nd
    MLC_ADDR    = (adr >> 17) & 0xFF;   // Address word 2rd
    if (adr_cycles_hw > 3)
      MLC_ADDR  = (adr >> 25) & 0xFF;   // Address word 3th
  }  
  else  {                               // Large Page Device
    MLC_ADDR    = (adr >> 12) & 0xFF;   // Address word 1rd
    if (adr_cycles_hw > 3)
      MLC_ADDR  = (adr >> 20) & 0xFF;   // Address word 2th
    if (adr_cycles_hw > 4)
      MLC_ADDR  = (adr >> 28) & 0xFF;   // Address word 3th
  }
  return (NAND_OK);
}


/*******************************************************************************/

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品综合久久| 一区二区三区免费网站| 精品在线视频一区| 91精品国产91综合久久蜜臀| 日韩精品电影一区亚洲| 制服丝袜中文字幕一区| 捆绑变态av一区二区三区| 欧美成人精品福利| 国产成人精品网址| 亚洲三级免费观看| 欧美色手机在线观看| 蜜臀av性久久久久蜜臀av麻豆 | 日韩黄色免费电影| 日韩欧美在线网站| 国产精品一二三四区| 亚洲欧洲日韩在线| 欧美一区二区私人影院日本| 国产在线一区二区综合免费视频| 国产欧美日韩精品一区| 在线免费观看日韩欧美| 日韩中文字幕不卡| 日本一区二区三区电影| 欧美怡红院视频| 奇米精品一区二区三区在线观看一 | 日日摸夜夜添夜夜添国产精品 | 风间由美一区二区av101| 成人免费视频在线观看| 91超碰这里只有精品国产| 国产剧情一区二区| 亚洲第一福利视频在线| 久久久久久久久久电影| 欧美色图一区二区三区| 国产精品99久| 视频在线观看一区二区三区| 欧美国产精品中文字幕| 欧美日韩国产精选| 波多野结衣亚洲一区| 爽好多水快深点欧美视频| 国产精品久久久久aaaa| 欧美一区午夜精品| 在线亚洲高清视频| 国产麻豆精品久久一二三| 亚洲免费视频成人| 久久久不卡网国产精品一区| 欧美天天综合网| 成人午夜大片免费观看| 青青草伊人久久| 亚洲一区二区三区在线播放| 中文欧美字幕免费| 精品久久久久香蕉网| 精品视频123区在线观看| bt7086福利一区国产| 精品中文字幕一区二区小辣椒| 亚洲黄色免费电影| 国产精品毛片久久久久久| 日韩欧美在线综合网| 欧美日韩午夜在线视频| 91首页免费视频| 成人一区二区三区中文字幕| 韩日欧美一区二区三区| 日韩精品一二三| 亚洲一区中文日韩| 亚洲精品老司机| 亚洲视频每日更新| 国产精品色哟哟网站| 久久精品网站免费观看| 久久综合久久99| 日韩女优av电影| 日韩女优制服丝袜电影| 日韩视频一区二区在线观看| 欧美日韩日本视频| 欧美三级电影网| 欧美亚洲国产一卡| 欧美三级三级三级爽爽爽| 欧洲一区二区三区免费视频| 色妹子一区二区| 91美女在线视频| 日本精品裸体写真集在线观看| 成人午夜视频在线观看| 不卡在线视频中文字幕| 菠萝蜜视频在线观看一区| 国产69精品一区二区亚洲孕妇| 国产精品一区2区| 国产成人免费视频网站高清观看视频| 精品一二线国产| 国产成人免费av在线| 成人午夜视频在线| 97se亚洲国产综合自在线观| 色综合久久久久| 欧美午夜不卡视频| 欧美一级在线观看| 精品少妇一区二区三区在线播放 | 欧美日本一道本| 日韩一区二区在线观看| 精品国产髙清在线看国产毛片| 久久午夜国产精品| 国产精品私房写真福利视频| 亚洲精品五月天| 天天影视网天天综合色在线播放| 奇米色777欧美一区二区| 国产一区二区按摩在线观看| 成人午夜激情视频| 欧美吻胸吃奶大尺度电影| 欧美一级在线免费| 亚洲国产经典视频| 亚洲第一久久影院| 国产一区二区三区观看| 成人性生交大片免费| 欧美三级蜜桃2在线观看| 日韩免费看的电影| 国产精品理论在线观看| 天天影视色香欲综合网老头| 国产一区二区三区免费在线观看| 91亚洲精品久久久蜜桃| 538在线一区二区精品国产| 久久久精品一品道一区| 一区二区三区国产精华| 久久成人综合网| 91在线精品秘密一区二区| 欧美日韩国产bt| 国产精品欧美极品| 久久精品国内一区二区三区| 99精品欧美一区| 精品sm捆绑视频| 亚洲一级二级三级| 国产高清在线精品| 欧美日韩一区在线观看| 久久日一线二线三线suv| 亚洲成人手机在线| 不卡免费追剧大全电视剧网站| 91精品国产麻豆国产自产在线| 中文字幕在线不卡国产视频| 久久99精品久久久久婷婷| 欧美自拍偷拍一区| 国产精品久久午夜| 麻豆国产一区二区| 欧美日韩国产区一| 亚洲色图.com| 国产成人午夜精品影院观看视频 | 白白色 亚洲乱淫| 日韩西西人体444www| 一区二区在线观看免费视频播放| 国产黄人亚洲片| 欧美大片顶级少妇| 日韩av中文在线观看| 在线免费观看不卡av| 中文在线免费一区三区高中清不卡| 日本在线不卡视频| 欧美日韩卡一卡二| 一区二区三区四区中文字幕| 国产寡妇亲子伦一区二区| 精品少妇一区二区三区视频免付费| 亚洲一区二区三区视频在线播放| 99re8在线精品视频免费播放| 久久久久久久久久久久久久久99| 日本美女一区二区| 91精品国产品国语在线不卡| 一区二区欧美视频| 欧洲激情一区二区| 一区二区三区四区国产精品| 97久久久精品综合88久久| 久久免费偷拍视频| 国产精品一区三区| 久久亚洲影视婷婷| 国产综合久久久久影院| 日韩精品一区二| 久久99精品视频| 久久久久久亚洲综合影院红桃 | 99re在线视频这里只有精品| 中文字幕av一区二区三区高| 成人午夜在线视频| 亚洲欧洲精品天堂一级| 成人av手机在线观看| 国产精品色呦呦| 91蝌蚪porny| 亚洲一区欧美一区| 69p69国产精品| 久久se这里有精品| 久久久www免费人成精品| 成人午夜av电影| 国产精品国产三级国产aⅴ原创| 亚洲大片精品永久免费| 不卡的av中国片| 亚洲狠狠丁香婷婷综合久久久| 欧美性三三影院| 免费精品视频最新在线| 欧美精品一区二区三区很污很色的| 韩国一区二区三区| 国产精品乱码一区二区三区软件| 色婷婷综合久色| 亚洲va韩国va欧美va| 欧美一级欧美三级在线观看 | 中文字幕高清一区| 在线观看一区不卡| 日韩二区三区在线观看| 欧美va日韩va| 99国产精品久| 奇米精品一区二区三区在线观看 | 日韩不卡一区二区三区| 26uuu另类欧美亚洲曰本|