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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? flashprg.c

?? lpc3250 example program
?? C
字號:
/***********************************************************************/
/*  This file is part of the ARM Toolchain package                     */
/*  Copyright KEIL ELEKTRONIK GmbH 2003 - 2006                         */
/***********************************************************************/
/*                                                                     */
/*  FlashDev.C:  Flash Programming Functions adapted                   */
/*               for NAND Flash programmed with Philips LPC318x        */
/***********************************************************************/

#include "..\FlashOS.H"                 // FlashOS Structures
#include "FlashHW.h"                    // Low level NAND flash declarations
#include "NAND_Error.h"                 // Error definitions

#define STACK_SIZE   64                 // Stack Size

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

// Constants values for Small and Large Page
const unsigned int BLOCK_SIZE[2]      = {16384, 131072};  // Block size
const unsigned int BLOCK_SIZE_SHIFT[2]= {   14,     17};  // Block size in bit shifts
const unsigned int PAGE_SIZE[2]       = {  528,   2112};  // Size of complete page
const unsigned int PAGE_USR_SIZE[2]   = {  512,   2048};  // Size of page user data

// Global variables used throughout this module
unsigned long base_adr;                 // Base Address
unsigned long nand_block_offset;        // Offset of valid block
unsigned char ICR;                      // Interface Configuration Data
unsigned char SZ_INFO = 0x1F ;          // Size info for bootloader (1-st level from ROM) (copy 31 pages)
unsigned char bus_width;                // Bus width
unsigned char adr_cycles;               // Address word count
unsigned char page_type;                // Page type (small or large)
unsigned int  block_size;               // Block size
unsigned int  block_size_shift;         // Block size in bit shifts
unsigned int  page_size;                // Size of Complete Page
unsigned int  page_usr_size;            // Size of User Page Data
unsigned char data_buf[2112];           // Data buffer

// Module's local functions prototypes
static int WriteBootInfo (void);
static int TryInit       (unsigned char bus_wdth, unsigned char adr_cyc, unsigned char page_typ, unsigned long clk);
static int FindBlock     (unsigned long adr, unsigned int restart);


/************************* Flash Algorithm Functions ***************************/

/*- Init (...) -----------------------------------------------------------------
 *
 *  Initialize Flash Programming Functions
 *    Parameter:      adr:  Device Base Address
 *                    clk:  Clock Frequency (Hz)
 *                    fnc:  Function Code (1 - Erase, 2 - Program, 3 - Verify)
 *    Return Value:   0 - OK,  1 - Failed
 */
           
int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {
  int i;
  unsigned char byte, temp;
  static unsigned char first_run_f = TRUE;

  base_adr = adr;

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

    // Autodetect address cycles and page type
    if (TryInit(16, 4, SMALL_PAGE, clk)) {
      if (TryInit(16, 4, LARGE_PAGE, clk)) {
        if (TryInit(16, 5, LARGE_PAGE, clk)) {
          if (TryInit( 8, 4, SMALL_PAGE, clk)) {
            if (TryInit( 8, 4, LARGE_PAGE, clk)) {
              if (TryInit( 8, 5, LARGE_PAGE, clk)) {
                return (1);             // Fail 
              }
            }
          } else {
            if (TryInit( 8, 3, SMALL_PAGE, clk))
              TryInit( 8, 4, SMALL_PAGE, clk);
          }
        }
      }
    } else {
      if (TryInit(16, 3, SMALL_PAGE, clk))
        TryInit(16, 4, SMALL_PAGE, clk);
    }

    // Remember block size information
    block_size       = BLOCK_SIZE[page_type];
   
    // Remember block size information in bit shifts
    block_size_shift = BLOCK_SIZE_SHIFT[page_type];

    // Remember page size information
    page_size        = PAGE_SIZE[page_type];

    // Remember user page size information
    page_usr_size    = PAGE_USR_SIZE[page_type];

    // Check if Interface Configuration Data (ICR) are valid and setup interface accordingly
    for (i=0; i<16; i=i+4) {
      byte = data_buf[i];

      // Check if ICR valid
      if (((byte & 0x0F) ^ (byte >> 4)) == 0x0F) {

        ICR = byte;
        if (ICR & 0x01) bus_width = 16;
        else            bus_width =  8;
  
        if (ICR & 0x04) {
          page_type = LARGE_PAGE;
          if (ICR & 0x02) adr_cycles = 5;
          else            adr_cycles = 4;
        } else {
          page_type = SMALL_PAGE;
          if (ICR & 0x02) adr_cycles = 4;
          else            adr_cycles = 3;
        }
        if (TryInit(bus_width, adr_cycles, page_type, clk) == 0) {
          // Restart block searching from beginning
          FindBlock(0, 1);

          return (0);
        }
      }
    }

    // If no ICRs were valid erase first block detect bus width 
    // and setup new ICRs and write them to page 0 of bank 0
    EraseBlock_HW(0);

    // Check if 8-bit bus width not already autodetected
    if (bus_width != 8) {
      if (InitFlashController_HW(16, adr_cycles, page_type, clk) == NAND_OK) {
        for (i=0; i<page_size; i++) data_buf[i]=0xFF;
        data_buf[0] = 0x55;
        data_buf[1] = 0xAA;
        ProgramPage_HW (0, 2, data_buf);
        ReadPage_HW    (0, 2, data_buf);
        if ((data_buf[0] != 0x55) || (data_buf[1] != 0xAA)) {
          // 8-bit bus width detected
          InitFlashController_HW(8, adr_cycles, page_type, clk);
        } else {
          // 16-bit bus width detected, it is already used
        }
      }
    }

    // Setup Interface Configuration Data
    temp = 0;
    if (bus_width == 16) temp = 1;
    if (page_type == SMALL_PAGE && adr_cycles == 4) 
      temp |= 0x02;
      
    if (page_type == LARGE_PAGE) {
      temp |= 0x04;
      if (adr_cycles == 5) temp |= 0x02;
    }           
    
    // Generate ICR
    ICR = (temp | temp << 4) ^ 0xF0;

    // Clear data buffer
    for (i=0; i<page_size; i++) data_buf[i]=0xFF;

    // Setup ICRs to data buffer to be written to page 0 of bank 0
    for (i=0; i<16; i=i+4) data_buf[i] = ICR;

    // Write ICRs to flash to page 0 of bank 0
    ProgramPage_HW (0, 16, data_buf);
  }

  // Restart block searching from beginning
  FindBlock(0, 1);

  return (0);
}


/*
 *  De-Initialize Flash Programming Functions
 *    Parameter:      fnc:  Function Code (1 - Erase, 2 - Program, 3 - Verify)
 *    Return Value:   0 - OK,  1 - Failed
 */

int UnInit (unsigned long fnc) {
  return (0);
}


/*- BlankCheck (...) -----------------------------------------------------------
 *
 *  Blank Check Checks if Memory is Blank
 *    Parameter:      adr:  Block Start Address
 *                    sz:   Block Size (in bytes)
 *                    pat:  Block Pattern
 *    Return Value:   0 - OK,  1 - Failed
 */

int BlankCheck (unsigned long adr, unsigned long sz, unsigned char pat) {

  return (1);                           // Always Force Erase
}


/*- EraseSector (...) ----------------------------------------------------------
 *
 *  Erase Sector in Flash Memory
 *    Parameter:      adr:  Sector Address
 *    Return Value:   0 - OK,  1 - Failed
 */

int EraseSector (unsigned long adr) {

  if (adr == 0) {                       // Erasing block for 2-nd level bootloader
    EraseBlock_HW(0);
    if (WriteBootInfo () == 0) return (0);
  } else {                              // Erasing block for program
    FindBlock(adr, 0);
    if (EraseBlock_HW(nand_block_offset) == NAND_OK) return (0);
  }

  return (1);
}


/*- ProgramPage (...) ----------------------------------------------------------
 *
 *  Program Page in Flash Memory
 *    Parameter:      adr:  Page Start Address
 *                    sz:   Page Size
 *                    buf:  Page Data
 *    Return Value:   0 - OK,  1 - Failed
 */

int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {
  unsigned long adr_dest;
  int stat;

  if (adr < block_size) {               // Programming 2-nd level bootloader data
    adr_dest = adr + page_usr_size;     // skip page 0 of block 0
  } else {                              // Programming program data
    FindBlock(adr, 0);
    adr_dest  = nand_block_offset + (adr & (block_size-1));
  }

  if (ProgramPage_HW(adr_dest, sz, buf) != NAND_OK) return (1);
  stat = ReadPage_HW(adr_dest, sz, data_buf);
  if (stat != NAND_OK) {
    if (stat == NAND_ECC_ERROR) {
      MarkBlockBad_HW(adr_dest);
    }
    return (1);
  }

  return (0);
}

/*- Verify (...) ---------------------------------------------------------------
 *
 *  Verify Flash Contents
 *    Parameter:      adr:  Start Address
 *                    sz:   Size (in bytes)
 *                    buf:  Data
 *    Return Value:   (adr+sz) - OK, Failed Address
 */

unsigned long Verify (unsigned long adr, unsigned long sz, unsigned char *buf) {
  unsigned long i, adr_dest, in_page_ofs;

  if (adr < block_size) {               // Verifying 2-nd level bootloader data
    adr_dest = adr + page_usr_size;     // skip page 0 of block 0
  } else {                              // Verifying program data
    FindBlock(adr, 0);
    adr_dest  = nand_block_offset + (adr & (block_size-1));
  }
  in_page_ofs = adr_dest & (page_usr_size-1);

  if (ReadPage_HW(adr_dest, page_usr_size, data_buf)) return (1);
  for (i=0; i<sz; i++)
    if (buf[i] != data_buf[i+in_page_ofs])
      break;

  return (adr+i);
}


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

/*- WriteBootInfo () -----------------------------------------------------------
 *
 *  Try initializing controller and reading Interface Configuration Data (ICR)
 *    Parameter:   
 *    Return Value:  0 - Ok, 1 - Fail
 */

static int WriteBootInfo (void) {
  int i;

  for (i=0;  i<page_size; i++) data_buf[i]=0xFF;   // Clear data buffer
  for (i=0;  i<16; i=i+4) data_buf[i] =  ICR;      // d0, d1, d2, d3  - Setup ICRs
  for (i=16; i<48; i=i+8) data_buf[i] =  SZ_INFO;  // d4, d6, d8, d10 - Setup Size info for bootloader
  for (i=20; i<48; i=i+8) data_buf[i] = ~SZ_INFO;  // d5, d7, d9, d11 - Setup inv Size info for bootloader
  data_buf[48] = 0xaa;                             // d12
  data_buf[49] = 0x00;
  data_buf[50] = 0x00;
  data_buf[51] = 0x00;

  ProgramPage_HW (0, 64, data_buf);

  return (0);
}


/*- TryInit (...) --------------------------------------------------------------
 *
 *  Try initializing controller and reading Interface Configuration Data (ICR)
 *    Parameter:     bus_wdth:  Bus Width (8, 16 bit)
 *                   adr_cyc:   Addressing Cycles (3, 4, 5)
 *                   page_typ:  Page Type (0 -Small Page, 1 - Large Page)
 *                   clk:       Clock Frequency (Hz)
 *    Return Value:  0 - Ok, 1 - Fail
 */

static int TryInit (unsigned char bus_wdth, unsigned char adr_cyc, unsigned char page_typ, unsigned long clk) {
  bus_width  = bus_wdth; 
  adr_cycles = adr_cyc; 
  page_type  = page_typ;

  if (InitFlashController_HW(bus_wdth, adr_cyc, page_typ, clk) != NAND_OK)
    return (1);
  if ((ReadPage_HW(0, 16, data_buf) != NAND_OK) && (ReadPage_HW(0, 16, data_buf) != NAND_ECC_ERROR))
    return (1);

  return (0);
}


/*- FindBlock (...) ------------------------------------------------------------
 *
 *  Find appropriate valid block for requested address
 *    Parameter:     adr:       Address Requested for Setting
 *                   restart:   0 - find operation, 1 - restart search from beginning
 *    Return Value:  0 - OK,  1 - Failed
 */

static int FindBlock (unsigned long adr, unsigned int restart) {
  static int last_src_index  = -1;
         int src_index;

  if (restart == 1) {                   // Just restart for block finding starting from beginning
    last_src_index = -1;
    nand_block_offset = 0;
    return (0);
  }

  adr      -= base_adr;                 // Address to relative
  src_index = adr >> block_size_shift;  // Get requested block index for source

  if (src_index == last_src_index)      // Same block as previously requested
    return (0);

  while (last_src_index < src_index) {  // Find appropriate valid block
    nand_block_offset += block_size;
    if (CheckBlock_HW(nand_block_offset) == NAND_OK) 
      last_src_index++;
  }

  return (0);
}


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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品亚洲乱码伦伦中文| 国产精品视频你懂的| 在线精品观看国产| 色偷偷久久人人79超碰人人澡 | 99久久久免费精品国产一区二区| 韩国三级中文字幕hd久久精品| 久久精品国产亚洲高清剧情介绍 | 欧美精品一区二区三区蜜桃视频| 欧美一区二区三区成人| 在线成人高清不卡| 国产欧美综合在线| 欧美国产一区视频在线观看| 久久久久国产精品麻豆ai换脸| 精品久久久久av影院| 欧美成人猛片aaaaaaa| www国产亚洲精品久久麻豆| 久久综合久久综合九色| 国产精品视频免费看| 最近中文字幕一区二区三区| 亚洲精品国产视频| 亚洲国产成人av好男人在线观看| 亚洲成人7777| 美国毛片一区二区| 国产在线不卡一区| 91美女在线观看| 欧美亚洲一区三区| 欧美一区二区三区公司| 久久美女艺术照精彩视频福利播放 | 日韩欧美一区二区三区在线| 欧美精品在线一区二区三区| 884aa四虎影成人精品一区| 欧美日本乱大交xxxxx| 久久久久久久久久美女| 91麻豆精品秘密| 91精品国产全国免费观看| 久久99精品久久久久久| 国产精品亚洲综合一区在线观看| 久久精品国产亚洲aⅴ | 精品国产乱子伦一区| 国产精品网曝门| 中文字幕一区二区三区不卡在线| 一区二区三区精品| 日本伊人精品一区二区三区观看方式| 综合激情网...| 亚洲一区二区视频| 亚洲乱码精品一二三四区日韩在线| 制服丝袜中文字幕一区| 久久嫩草精品久久久久| 夜夜嗨av一区二区三区中文字幕| 国产成人精品一区二| 久久精品免视看| 美女精品自拍一二三四| 久久91精品国产91久久小草| 国产一区二区在线观看视频| 成人性生交大片免费看视频在线 | 一级特黄大欧美久久久| 成人妖精视频yjsp地址| 亚洲精品一区二区三区精华液| 国产一区中文字幕| 日本道精品一区二区三区 | 中文字幕日韩一区二区| 成人久久视频在线观看| 欧美日韩激情一区二区三区| 精品91自产拍在线观看一区| 亚洲你懂的在线视频| 激情综合五月天| 色94色欧美sute亚洲线路一ni | 中文字幕精品三区| 亚洲a一区二区| 99精品国产99久久久久久白柏| 欧美成人精品3d动漫h| 亚洲在线视频一区| 成人综合在线观看| 精品久久久久久久久久久院品网| 亚洲综合图片区| 北条麻妃国产九九精品视频| 精品久久五月天| 亚洲超碰精品一区二区| 成人免费高清在线观看| 亚洲精品一区在线观看| 婷婷丁香激情综合| 色综合久久综合| 国产精品美女久久久久久2018| 韩国女主播成人在线观看| 在线电影一区二区三区| 一区二区三区四区在线播放 | 91色婷婷久久久久合中文| 欧美精品一区二区三区蜜臀| 日韩影院免费视频| 日本乱码高清不卡字幕| 国产精品久久久久久久久快鸭 | 99国产精品国产精品久久| 久久久久久**毛片大全| 九九久久精品视频| 日韩写真欧美这视频| 午夜欧美大尺度福利影院在线看| 91在线视频官网| 国产精品区一区二区三区| 国产成人精品午夜视频免费| 久久亚洲精精品中文字幕早川悠里| 奇米影视一区二区三区| 91精品国产综合久久久久| 图片区小说区国产精品视频| 欧美日韩一区 二区 三区 久久精品| 亚洲日本中文字幕区| 91色|porny| 亚洲欧美日韩国产综合| 91色九色蝌蚪| 亚洲精品国产a| 日本二三区不卡| 亚洲综合一区二区| 欧美日韩夫妻久久| 亚洲成人黄色影院| 欧美三级欧美一级| 天堂久久一区二区三区| 69p69国产精品| 日本va欧美va瓶| 欧美大尺度电影在线| 久久精品国产一区二区三 | 欧美激情资源网| 国产不卡视频在线播放| 视频在线在亚洲| 日韩一区二区三区视频| 久久99国产乱子伦精品免费| 精品对白一区国产伦| 国产精品1024久久| 亚洲欧洲一区二区三区| 欧美日韩在线三级| 日本人妖一区二区| 久久日韩精品一区二区五区| 国产成人精品免费在线| 亚洲人成网站影音先锋播放| 欧美在线观看视频一区二区| 国产精品久久午夜夜伦鲁鲁| 色综合天天综合在线视频| 亚洲成人7777| 久久精品亚洲一区二区三区浴池| 国内精品在线播放| 国产精品免费观看视频| 欧美日韩一区二区电影| 国产精品资源在线看| 亚洲乱码日产精品bd | 免费在线欧美视频| 日本一区二区动态图| 欧美日韩你懂得| 国产在线一区二区综合免费视频| 国产精品久久久久影院| 欧美浪妇xxxx高跟鞋交| 国产成人免费在线| 一区二区三区四区蜜桃| 欧美成人高清电影在线| 色哟哟一区二区在线观看| 久久精品国产在热久久| 亚洲欧美日韩久久| 久久午夜老司机| 欧美性猛片aaaaaaa做受| 韩国av一区二区三区| 亚洲国产日韩一级| 国产精品视频九色porn| 欧美一级淫片007| 91亚洲永久精品| 国产乱子轮精品视频| 亚洲综合在线视频| 国产亚洲精品中文字幕| 欧美高清视频一二三区| 成人av在线一区二区| 日韩国产精品久久久久久亚洲| 精品国产乱码久久久久久浪潮 | 日韩欧美一级特黄在线播放| 色哟哟精品一区| 久久国产精品一区二区| 666欧美在线视频| 蜜桃免费网站一区二区三区| 亚洲第一久久影院| 2023国产精品自拍| 97国产一区二区| 天天操天天综合网| 久久久久99精品一区| 色综合久久久久网| 成人免费观看男女羞羞视频| 亚洲乱码日产精品bd| 国产精品久久久久久久久久久免费看| 97精品国产97久久久久久久久久久久| 国产毛片精品视频| 自拍偷拍欧美激情| 99久久国产综合精品女不卡| 亚洲一区二区三区视频在线播放| 欧美性生活大片视频| 久久国产乱子精品免费女| 欧美女孩性生活视频| 欧美中文一区二区三区| 另类成人小视频在线| 免费观看成人鲁鲁鲁鲁鲁视频| 中文一区二区完整视频在线观看| 26uuu另类欧美| 欧美在线视频日韩| 国产成人av电影在线| 国产精品乱人伦中文| 欧美一区二区三区啪啪| 五月综合激情日本mⅴ|