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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? flashprg.c

?? nxp 3250 的nandflash的bootloader
?? C
字號(hào):
/***********************************************************************/
/*  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);
}


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

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久影视一区二区| 亚洲一区在线观看视频| 在线亚洲高清视频| 美国十次了思思久久精品导航| 国产精品理论在线观看| 日韩欧美国产麻豆| 欧美在线观看18| 大白屁股一区二区视频| 蜜桃av噜噜一区二区三区小说| 中文字幕亚洲电影| 精品欧美一区二区久久| 欧美日韩一区国产| 91蜜桃传媒精品久久久一区二区| 国产制服丝袜一区| 久久国产人妖系列| 日韩**一区毛片| 亚洲妇熟xx妇色黄| 亚洲色图制服诱惑 | 国产精品热久久久久夜色精品三区| 69精品人人人人| 色婷婷av一区| 色悠悠久久综合| 成人av在线一区二区三区| 国产一区免费电影| 韩国毛片一区二区三区| 另类小说视频一区二区| 日韩电影在线免费看| 亚洲国产欧美在线人成| 一区二区三区不卡视频 | 美女视频网站久久| 日本欧美久久久久免费播放网| 亚洲亚洲人成综合网络| 亚洲一区二区三区视频在线播放 | 从欧美一区二区三区| 国产精品综合久久| 国产成人免费在线观看| 国产一二三精品| 国产二区国产一区在线观看| 国产曰批免费观看久久久| 久久精品国产亚洲一区二区三区| 日本不卡一二三| 麻豆91精品视频| 国内精品在线播放| 国产精品亚洲第一| 成人黄色在线网站| 色综合天天综合网天天狠天天 | 秋霞av亚洲一区二区三| 麻豆精品在线看| 国产精品资源网| 成人ar影院免费观看视频| 99久久精品情趣| 欧美亚洲国产怡红院影院| 欧美视频日韩视频在线观看| 欧美精品久久久久久久多人混战| 欧美丰满一区二区免费视频 | 中文字幕佐山爱一区二区免费| 亚洲人123区| 亚洲1区2区3区4区| 激情文学综合网| 丁香激情综合五月| 欧美在线观看一二区| 日韩欧美一区二区不卡| 欧美极品美女视频| 亚洲免费三区一区二区| 亚洲成人午夜电影| 国产在线一区观看| a在线欧美一区| 欧美久久一二区| 久久精品人人做| 亚洲一区中文在线| 国内成人自拍视频| 一本大道久久a久久精品综合| 欧美酷刑日本凌虐凌虐| 久久精品一区蜜桃臀影院| 亚洲精品乱码久久久久久 | 国产精品99久久久久久宅男| 99re亚洲国产精品| 91精品国产综合久久久久久漫画| 欧美精品一区二区三区久久久| 亚洲色图都市小说| 开心九九激情九九欧美日韩精美视频电影| 国产精品456| 91超碰这里只有精品国产| 国产清纯美女被跳蛋高潮一区二区久久w| 亚洲欧美精品午睡沙发| 九一九一国产精品| 色久综合一二码| 久久久亚洲午夜电影| 午夜成人免费电影| 成人美女在线视频| 日韩欧美中文字幕公布| 自拍偷在线精品自拍偷无码专区| 美女视频网站黄色亚洲| 在线视频国内一区二区| 国产欧美一二三区| 蜜桃视频在线观看一区| 欧美午夜在线观看| 中文字幕欧美一| 国产精品1024| 精品欧美乱码久久久久久| 亚洲国产毛片aaaaa无费看| av资源网一区| 久久亚洲影视婷婷| 美女精品一区二区| 欧美电影一区二区三区| 亚洲女人****多毛耸耸8| 国产白丝精品91爽爽久久| 精品国产免费一区二区三区四区| 亚洲国产一区二区视频| av欧美精品.com| 亚洲国产精品成人综合| 狠狠色丁香婷婷综合| 欧美欧美欧美欧美首页| 一区二区三区免费网站| eeuss鲁片一区二区三区| 国产日韩欧美a| 国产乱妇无码大片在线观看| 欧美成人免费网站| 蜜桃视频在线观看一区二区| 欧美精品久久天天躁| 午夜视频在线观看一区| 在线观看国产一区二区| 亚洲精品福利视频网站| 色久优优欧美色久优优| 一区二区在线观看不卡| 91啪亚洲精品| 亚洲免费av观看| 色吧成人激情小说| 一区二区三区精品在线观看| 91麻豆swag| 亚洲精品ww久久久久久p站| 91美女视频网站| 夜夜爽夜夜爽精品视频| 欧美日韩一区二区三区免费看| 一区二区三区在线播放| 欧美日韩在线播放三区四区| 亚洲成av人片| 日韩一级精品视频在线观看| 奇米一区二区三区| 日韩免费在线观看| 国产精品2024| 日韩理论在线观看| 欧美伊人久久久久久午夜久久久久| 亚洲国产另类精品专区| 制服丝袜成人动漫| 国产一区日韩二区欧美三区| 国产欧美日韩一区二区三区在线观看| 成人免费看片app下载| 亚洲伦在线观看| 欧美猛男gaygay网站| 理论片日本一区| 久久久99免费| 色综合天天综合网天天狠天天| 洋洋av久久久久久久一区| 欧美美女黄视频| 激情六月婷婷久久| 综合色天天鬼久久鬼色| 欧美日韩电影在线播放| 韩国精品主播一区二区在线观看 | 成人精品高清在线| 一区免费观看视频| 欧美精品 国产精品| 国产一区二区三区精品视频| 亚洲视频免费在线| 日韩一区二区电影在线| 成人永久aaa| 亚洲国产一二三| 337p粉嫩大胆色噜噜噜噜亚洲| thepron国产精品| 日本色综合中文字幕| 国产精品午夜在线| 在线成人av网站| 成人免费黄色大片| 日韩**一区毛片| 亚洲欧洲在线观看av| 日韩视频免费观看高清在线视频| 懂色av一区二区在线播放| 性做久久久久久久免费看| 国产视频一区在线观看| 欧美三级视频在线| 国产91精品精华液一区二区三区| 亚洲午夜久久久久久久久久久 | 成人丝袜18视频在线观看| 亚洲成a人v欧美综合天堂| 久久精品水蜜桃av综合天堂| 精品视频资源站| 成人自拍视频在线观看| 日本在线观看不卡视频| 亚洲欧美综合网| 欧美电影免费观看完整版| 91极品美女在线| 国产高清在线精品| 美女视频第一区二区三区免费观看网站 | 理论片日本一区| 一区二区三区在线播| 国产精品天天摸av网| 精品久久五月天| 欧美精品在线一区二区三区| 91热门视频在线观看| 国产99精品视频|