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

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

?? nandflash.c

?? 啟動代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/**

* @FILENAME nandflash.c
* @BRIEF    并口NAND FLASH控制器驅
* Copyright (C) 2006 Anyka (Guangzhou) Software Technology Co., LTD
* @AUTHOR   dengjian
* @DATE   2006-1-11
* @VERSION  1.0
* @REF    Please refer to…
* @NOTE   1.只支持目前市面上大量生產的samsung 和hynix的驅動(這樣運行速度會快一些
     果要支持比較特殊 的nandflash驅動,需要調整程序和宏定義
*   2. 多片選擇的相關細節目前沒有在驅動中體現,大多數都是針對單片flash編寫。
*/
//#define OS_ANYKA
#ifdef OS_ANYKA

//#define CHK_STA_BEFORE
//#define CHK_STA_AFTER
//#define STORE_ALL_INT
#include "akdefine.h"
#include "nandflash.h"
#include "nand_list.h"
#include "CRCDrv.h"


// ECC flag bit
#define RS1_NO_ERR_BIT        (1 << 11)
#define RS2_NO_ERR_BIT        (1 << 12)
#define BCH_NO_ERR_BIT        (1 << 13)

#define RS1_CANT_CORRECT_BIT    (1 << 5)
#define RS2_CANT_CORRECT_BIT    (1 << 7)
#define BCH_CANT_CORRECT_BIT    (1 << 9)

#define RS1_CORRECT_END_BIT     (1 << 6)
#define RS2_CORRECT_END_BIT     (1 << 8)
#define BCH_CORRECT_END_BIT     (1 << 10)

// ECC error code(留16個錯誤碼)
/*
 * 函數do_ECC_coerr()設置兩個閥值:
 *  一個是16, 一個是2;
 *  當do_ECC_coerr()返回值>=ECC_CANT_CORRECT, 表示錯不可糾, 此時不執行CRC校驗;
 *  當do_ECC_coerr返回值小于ECC_CANT_CORRECT而大于等于ECC_NEED_CRC_CHECK, 表示錯誤較多, 可能會錯糾, 此時執行CRC校驗;
 *  當do_ECC_coerr返回值為0時, 表示無錯或已經正確糾錯;
 */
#define ECC_NEED_CRC_CHECK      (2)
#define ECC_CANT_CORRECT      (1 << 4)  // 
#define RS1_CANT_CORRECT      (1 << 4)
#define RS2_CANT_CORRECT      (1 << 5)
#define BCH_CANT_CORRECT      (1 << 6)

#define RS1_COERR         1
#define RS2_COERR         2


static T_S16 read_chipinfo();
static T_BOOL check_cmd_done(T_VOID);
static T_VOID CPU_setFIFO(T_U32 addr, T_U32 val);
static T_U32 CPU_readFIFO(T_U32 addr);
static T_VOID CPU_FIFO2memory(T_U32 *dest, T_U32 fifo_start, T_U8 count);
static T_VOID CPU_memory2FIFO(T_U32 fifo_start, T_U32 *src, T_U8 count);
static T_VOID DMA_FIFO2memory(T_U32 *dest, T_U32 fifo_start, T_U8 count);
static T_VOID DMA_memory2FIFO(T_U32 fifo_start, T_U32 *src, T_U8 count);
static T_U8 nf_read_status(T_U8 chip);

//#######excute comamnd,ctrl reg22 command configuration define ################
//所有的配置定義針對發送命令的方式。
//必須進行片選或片保護、操作模式、以及是否使能的省電模式flag
//片選使用宏NCHIP_SELECT(x)
//同時打該片的寫保護,使用宏WRITE_PROTECT(x),
#define NCHIP_SELECT(x)     (((0x01 << (chipInfo.pos[x])) << 10) | (0xF << 15))


//*****************************************************************************************
//*************from lgj******************************************************************
// regisger 0x44 命令組合
#define comb_ctrl_reg(ps, staff, ce_keep, ce, wp, go) (ps | (staff << 1) | (ce_keep << 9) \
                       | (ce << 10) | (wp << 15) | (go << 30))

#define FLASH_CE_VALID    0 // (配置此值可選擇不同FLASH)
#define SELECT_FLASH_CE   (1 << FLASH_CE_VALID)

#define SELECT_FLASH_WP   0x1

//static volatile T_BOOL NC_DMARun = AK_FALSE;
//static volatile T_BOOL NChip_Busy = AK_FALSE;
//static T_BOOL bNandInit = AK_FALSE;

T_NANDCHIP_INFO chipInfo;
T_NAND_LOG_INFO Nand_SysInfo;


/**
* @BRIEF read chip id for head file
* @AUTHOR dengjian
* @DATE 2006-01-05
* @PARAM
* @RETURN chip id
* @RETVAL
*/
static T_S16 read_chipinfo()
{

    T_U16  i, chip_cnt = 0;
    T_U32 nand_id = ERROR_CHIP_ID;
    T_NAND_PHY_INFO *nand_info;
    
    nand_info = (T_NAND_PHY_INFO *)0x40000020;
    

    chipInfo.count = 0;
    chipInfo.id = ERROR_CHIP_ID;
    for(i=0;i<NFC_SUPPORT_CHIPNUM;i++)
        chipInfo.pos[i] = i;
  
    for(i=0;i<NFC_SUPPORT_CHIPNUM;i++)
    {
        nand_id = ERROR_CHIP_ID;
    
        HAL_WRITE_UINT32(FLASH_CTRL_REG22, 0x00);

        HAL_WRITE_UINT32(FLASH_CTRL_REG0, (NFLASH_READ_ID << 11) | COMMAND_CYCLES_CONF);
        HAL_WRITE_UINT32(FLASH_CTRL_REG0+0x04, (0x00 << 11) | ADDRESS_CYCLES_CONF);

        //wait > 10 ns < 30????(84M, 1 clock =12ns)//wait 2 clocks
        HAL_WRITE_UINT32(FLASH_CTRL_REG0+0x08, 0 | DELAY_CNT_CONF);
        //ID information is 4 byte,read it to register 22

        HAL_WRITE_UINT32(FLASH_CTRL_REG0+0x0C, (0x03 << 11) | READ_INFO_CONF | LAST_CMD_FLAG);

        // excute operation, , enable power saving, CE# keep LOW wait R/B
        //printf("%d is 0x%x", i, NCHIP_SELECT(i));
        HAL_WRITE_UINT32(FLASH_CTRL_REG22, NCHIP_SELECT(i)|DEFAULT_GO);
        //HAL_READ_UINT32(FLASH_CTRL_REG22, nand_id);
        //printf("\r\nreg22 is 0x%x\r\n",nand_id );

        // wait end & read data (data at where)
        while(!check_cmd_done());

        // read status
        HAL_READ_UINT32(FLASH_CTRL_REG20, nand_id);

        //printf("\n*********************detect nand********************\n");
        //printf("bios detect %d nandid is 0x%x\n", i, nand_id);

        if(nand_id != ERROR_CHIP_ID)
        {
            printf("nand_info->chip_id nand_id is 0x%x 0x%x\n", nand_info->chip_id, nand_id);
            if(chipInfo.id != nand_id)
            {
                if(nand_info->chip_id == nand_id)
                {
                    if (chipInfo.id == ERROR_CHIP_ID)
                    {
                        chipInfo.id = nand_id;
            
                        //printf("\r\ncurrent nandflash:");
                        //printf(SUPPORT_NAND_TABLE[id_cnt].des_str);
                        //printf("\r\n");
            
                        chipInfo.col_cycle = nand_info->col_cycle;
                        printf("chipInfo.col_cycle %x\n", chipInfo.col_cycle);
                        chipInfo.row_cycle = nand_info->row_cycle;
                        printf("chipInfo.row_cycle %x\n", chipInfo.row_cycle);
                        chipInfo.lst_col_mask = nand_info->lst_col_mask;
                        printf("chipInfo.lst_col_mask %x\n", chipInfo.lst_col_mask);
                        chipInfo.last_row_mask = nand_info->last_row_mask;
                        printf("chipInfo.last_row_mask %x\n", chipInfo.last_row_mask);
                        chipInfo.phy_page_size = nand_info->page_size;
                        printf("chipInfo.phy_page_size %x\n", chipInfo.phy_page_size);
                        chipInfo.chip_blk_num = nand_info->blk_num;
                        printf("chipInfo.chip_blk_num %x\n", chipInfo.chip_blk_num);
                        chipInfo.group_blk_num = nand_info->group_blk_num;
                        printf("chipInfo.group_blk_num %x\n", chipInfo.group_blk_num);
                        chipInfo.plane_blk_num = nand_info->plane_blk_num;
                        printf("chipInfo.plane_blk_num %x\n", chipInfo.plane_blk_num);
                        chipInfo.phy_page_per_blk = nand_info->page_per_blk;
                        printf("chipInfo.phy_page_per_blk %x\n", chipInfo.phy_page_per_blk);
                    }
                }
                else
                {
                    printf("We dont support different chip type in one machine!!\r\n");
                    return NF_FAIL;
                }
            }

            if (nand_id == chipInfo.id)
            {
                chipInfo.pos[chipInfo.count] = i;
                chipInfo.count++;
                printf("now count is %d\n", chipInfo.count);
            }
        }

    }  

    if (chipInfo.count>0)
    {
        printf("\r\n chip ID is 0x%x\r\n  count= %d \n", chipInfo.id, chipInfo.count);
  
        return NF_SUCCESS;
    }

    printf("Cannot find chip!\r\n");
    return NF_FAIL;
}


//******************************************init,read chipID and set information done*******************************//

static T_S32 do_RS_coerr(T_U8 RS_type, T_pDATA buf)
{
  T_S32 errCnt;
  T_U32 regAddr, offset, tmp;
  T_U32 errValue, errAddr;
  

  if (RS_type == RS1_COERR)
  {
    printf("do RS1 coerr\r\n");

    regAddr = FLASH_ECC_REG4 + 0x04;
    offset = 0;
  }
  else if (RS_type == RS2_COERR)
  {
    printf("do RS2 coerr\r\n");

    regAddr = FLASH_ECC_REG4 + 0x08;
    /* phy structure, must offset value is 255(251B + 4B)
     * phy structure conver to logic structure !!!
     * 減去1個RS占的長度(4B*1), rs2 logic offset value is 251B(no RS code)       
     */
    offset = 255 - 4;
  }

  errCnt = 0;
  HAL_READ_UINT32(regAddr, tmp);
  errValue = (tmp >> 16) & 0xFF;
  errAddr = (tmp >> 24) & 0xFF;
  if ((251 <= errAddr) && (errAddr <= 254)) // 是否是ECC本身錯
  {
    printf("Is RS_err1 ECC itself error, ignore it\r\n");
    
    errCnt++;
  }     
  else if (errAddr != 255)
  {
    errAddr += offset;
    printf("rs err1 value is 0x%x, location is 0x%x\r\n", errValue, errAddr);
    printf("excute corect rs err1: 0x%x --> 0x%x\r\n", 
      buf[errAddr], buf[errAddr] ^ errValue);
    buf[errAddr] = buf[errAddr] ^ errValue; // correct
    
    errCnt++;
  }

  errValue = tmp & 0xFF;
  errAddr = (tmp >> 8) & 0xFF;
  if ((251 <= errAddr) && (errAddr <= 254)) // 是否是ECC本身錯
  {
    printf("errAddr = 0x%x,  errValue = 0x%x\r\n", errAddr, errValue);
    printf("Is RS_err2 ECC itself error, ignore it\r\n");
    
    errCnt++;
  }     
  else if (errAddr != 255)  // have error
  {
    errAddr += offset;
    printf("rs err2 value is 0x%x, location is 0x%x\r\n", errValue, errAddr);
    printf("excute corect rs err2: 0x%x --> 0x%x\r\n", 
      buf[errAddr], buf[errAddr] ^ errValue);
    buf[errAddr] = buf[errAddr] ^ errValue; // correct
    
    errCnt++;
  }

  return errCnt;
}

/**
* @BRIEF 根據ECC進行糾錯
* @AUTHOR lgj
* @DATE 2005-10-25
* @PARAM
*     buf
*       518Byte data for coerror.
*     fileSysBuf
*       file system information buffer.
* @RETURN
* @RETVAL
*     >=ECC_CANT_CORRECT, 表示錯不可糾, 此時不執行CRC校驗;
*     小于ECC_CANT_CORRECT而大于等于ECC_NEED_CRC_CHECK, 表示錯誤較多, 可能會錯糾, 此時執行CRC校驗;
*     為0時, 表示無錯或已經正確糾錯;
* @NOTE   
*   1.
*     buf: is logic structure:  512B data + 6B file system
*     ECC: is phy structure: 251B data + 4B rs1 + 251B data + 4B rs2 + 16B data + 2B bch
*
*   2. 校驗碼本身錯時不用糾
*
*   3. 糾錯過程:
*
* @to do
*   1. 當錯不可糾時的處理.
*/
T_S32 do_ECC_coerr(T_pDATA buf, T_pDATA fileSysBuf)
{
  T_S32 ret;
  T_U32 tmp, status;

  T_U8 bit_loc;
  T_U16 byte_loc;
  T_U16 ecc_loc;
  T_U32 *reg_addr = (T_U32 *) FLASH_ECC_REG4;

  ret = 0;

  HAL_READ_UINT32(FLASH_ECC_REG4, status);
  if ((status & RS1_NO_ERR_BIT) != RS1_NO_ERR_BIT)
  {
    // RS1 have error
    if (status & RS1_CANT_CORRECT_BIT)
    {
      printf("RS1 have error, but can't correct(too many error)\r\n");
      ret |= RS1_CANT_CORRECT;
    }
    else
    {
      // 等待糾錯過程結束
      while (1)
      {
        HAL_READ_UINT32(FLASH_ECC_REG4, status);
        if (status & RS1_CORRECT_END_BIT)
          break;
      }
      ret += do_RS_coerr(RS1_COERR, buf);
    }
  }
  else
  {
//    printf("RS1 no error\r\n");
  }

  // 使用最新的status
  if ((status & RS2_NO_ERR_BIT) != RS2_NO_ERR_BIT)
  {
    // RS2 have error
    if (status & RS2_CANT_CORRECT_BIT)
    {
      printf("RS2 have error, but can't correct(too many error)\r\n");
      ret |= RS2_CANT_CORRECT;
    }
    else
    {
      // 等待糾錯過程結束
      while (1)
      {
        HAL_READ_UINT32(FLASH_ECC_REG4, status);
        if (status & RS2_CORRECT_END_BIT)
          break;
      }

      ret += do_RS_coerr(RS2_COERR, buf);
    }
  }
  else
  {
//    printf("RS2 no error\r\n");
  }
  
  // 使用最新的status
  if ((status & BCH_NO_ERR_BIT) != BCH_NO_ERR_BIT)
  {
    // BCH have error
    if (status & BCH_CANT_CORRECT_BIT)
    {
      printf("BCH have error, but can't correct(too many error)\r\n");
      ret |= BCH_CANT_CORRECT;
    }
    else
    {
      T_U8 cnt;

      // 等待糾錯過程結束
      while (1)
      {
        HAL_READ_UINT32(FLASH_ECC_REG4, status);
        if (status & BCH_CORRECT_END_BIT)
          break;
      }
      // corect bch
      HAL_READ_UINT32(FLASH_ECC_REG4 + 0x0C, tmp);      
      for (cnt=0; cnt<2; cnt++)
      {
        ecc_loc = (tmp >> 8*cnt) & 0xFF;
        if (ecc_loc == 0xFF)
        {
          // 不是BCH2有錯
//          printf("BCH %d no error\r\n", cnt);
        }
        else
        {
          ret++;

          byte_loc = (ecc_loc - 111) / 8 + 510; // ?
          bit_loc = (byte_loc - 510) * 8 + 111 + 7 - ecc_loc;
          // phy structure conver to logic structure !!!

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲午夜在线视频| 亚洲永久精品大片| 4438x成人网最大色成网站| 91极品美女在线| 在线观看视频91| 欧美性色综合网| 91精品国产麻豆| 精品国产一区二区三区久久影院| 91精品国产色综合久久久蜜香臀| 欧美色精品在线视频| 91精品久久久久久蜜臀| 91精品国产色综合久久不卡电影| 欧美精品18+| 日韩免费在线观看| 国产精品免费网站在线观看| 日韩毛片高清在线播放| 亚洲一区二区五区| 美女在线视频一区| 成人免费看的视频| 91传媒视频在线播放| 日韩欧美电影一二三| 国产无人区一区二区三区| 亚洲女同ⅹxx女同tv| 天堂蜜桃91精品| 国产成人高清在线| 欧美另类久久久品| 久久精品夜色噜噜亚洲aⅴ| 亚洲天堂2016| 久久福利视频一区二区| 成人黄色av电影| 9191久久久久久久久久久| 国产日韩欧美精品电影三级在线| 中文字幕日韩av资源站| 日韩精品亚洲一区| av在线免费不卡| 欧美日韩午夜在线| 国产精品萝li| 日本不卡123| 色一情一乱一乱一91av| 一区二区三区在线播放| 久久久久久影视| 亚洲一级二级在线| 国产传媒久久文化传媒| 欧美日韩一区不卡| 久久精品欧美日韩精品| 天堂在线一区二区| 91免费版在线| 欧美国产日产图区| 蜜臀精品久久久久久蜜臀| 91传媒视频在线播放| 国产人妖乱国产精品人妖| 青青草原综合久久大伊人精品| 懂色av一区二区在线播放| 制服丝袜激情欧洲亚洲| 一区二区三区在线免费观看 | 色综合中文字幕国产 | 日韩激情av在线| 91麻豆精东视频| 国产蜜臀av在线一区二区三区 | 久久欧美中文字幕| 美女一区二区三区在线观看| 欧美色图天堂网| 亚洲色图视频网站| 成人h动漫精品一区二| 国产日韩三级在线| 国产精品91一区二区| 精品日韩一区二区三区| 日韩成人一级大片| 欧美日韩国产综合一区二区| 夜夜嗨av一区二区三区中文字幕 | 91精品国产全国免费观看| 亚洲丰满少妇videoshd| 欧美亚洲国产一区二区三区va| 国产精品丝袜久久久久久app| 国产精品99久久久| 国产午夜亚洲精品午夜鲁丝片| 精品一区二区三区在线播放视频| 欧美一区二区网站| 韩日av一区二区| 国产婷婷色一区二区三区四区| 高清久久久久久| 国产精品欧美一区喷水| av中文一区二区三区| 亚洲另类中文字| 欧美乱妇15p| 久久精品久久精品| 国产欧美精品一区二区色综合朱莉 | 成人在线视频首页| 亚洲欧美一区二区三区孕妇| 欧美视频一区二区三区四区| 免费的成人av| 久久精品欧美日韩| 91成人免费网站| 奇米精品一区二区三区在线观看一| 欧美一区二区免费观在线| 开心九九激情九九欧美日韩精美视频电影 | 91日韩精品一区| 天堂va蜜桃一区二区三区漫画版| 日韩三级免费观看| 成人免费高清在线| 亚洲午夜精品17c| 久久久亚洲精华液精华液精华液| 不卡的av电影| 美洲天堂一区二卡三卡四卡视频 | 亚洲女子a中天字幕| 91精品国产乱| 99视频精品全部免费在线| 午夜免费欧美电影| 国产精品网站导航| 欧美一区二区三级| 99re这里只有精品视频首页| 日本特黄久久久高潮| 中文字幕精品—区二区四季| 欧美日韩精品一区二区三区| 国产毛片精品一区| 午夜电影一区二区| 国产精品久久久久三级| 日韩一区二区三区视频| 一本一道波多野结衣一区二区| 美国十次了思思久久精品导航| 国产精品超碰97尤物18| 日韩欧美不卡一区| 欧美剧情片在线观看| www.综合网.com| 国产乱码精品1区2区3区| 香蕉久久夜色精品国产使用方法| 中文字幕精品一区二区精品绿巨人 | 成人黄色综合网站| 国产一区欧美二区| 视频一区二区三区在线| 一区二区三区产品免费精品久久75| 欧美精品一区二区三区视频| 6080国产精品一区二区| 色婷婷精品久久二区二区蜜臀av| 国产精品一二三区| 麻豆国产一区二区| 五月综合激情网| 亚洲一区在线观看免费观看电影高清| 国产女人18毛片水真多成人如厕 | 亚洲伦理在线精品| 国产日本亚洲高清| 国产亚洲视频系列| 久久日一线二线三线suv| 日韩欧美国产综合| 日韩午夜三级在线| 69堂精品视频| 日韩一级二级三级| 91精品国产麻豆国产自产在线| 欧美男男青年gay1069videost| 91麻豆精品在线观看| 色欧美日韩亚洲| 色噜噜狠狠色综合中国| 91成人免费在线视频| 欧美日韩一区二区在线视频| 欧美优质美女网站| 欧美日韩成人在线| 日韩欧美电影一区| 久久夜色精品国产欧美乱极品| 久久久综合精品| 国产精品久久夜| 亚洲黄一区二区三区| 亚洲小少妇裸体bbw| 日本美女视频一区二区| 欧美aⅴ一区二区三区视频| 视频一区中文字幕| 久草在线在线精品观看| 国产精品一区三区| eeuss鲁一区二区三区| 一本高清dvd不卡在线观看| 欧美日韩亚洲综合在线| 欧美变态凌虐bdsm| 国产精品理论片| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲国产成人91porn| 久久99精品久久久久久久久久久久| 国产成人啪免费观看软件| 91麻豆免费观看| 精品国产免费一区二区三区香蕉| 国产精品污www在线观看| 一区二区三区在线播放| 久久99国产精品免费网站| 99久久夜色精品国产网站| 欧美视频一区在线| 337p粉嫩大胆色噜噜噜噜亚洲| 亚洲色图在线看| 国产一区二区三区精品欧美日韩一区二区三区 | 美女尤物国产一区| 成人午夜激情视频| 欧美日韩在线精品一区二区三区激情| 日韩亚洲国产中文字幕欧美| 国产精品你懂的| 久色婷婷小香蕉久久| 在线观看亚洲专区| 久久久久久久综合狠狠综合| 亚洲精品伦理在线| 国产成人自拍高清视频在线免费播放| 91精品福利视频| 国产精品人人做人人爽人人添| 日韩不卡手机在线v区| 91视频国产资源|