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

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

?? flash_mtd.renesas.c

?? 本軟件實現了FLASH底層驅動包括NOR FLASH與NAND FLASH
?? C
字號:
/*****************************************************************************
*  Copyright Statement:
*  --------------------
*  This software is protected by Copyright and the information contained
*  herein is confidential. The software may not be copied and the information
*  contained herein may not be used or disclosed except with the written
*  permission of MediaTek Inc. (C) 2005
*
*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
*
*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/

/*****************************************************************************
 *
 * Filename:
 * ---------
 *    flash_mtd.renesas.c
 *
 * Project:
 * --------
 *   Maui
 *
 * Description:
 * ------------
 *   This is flash MTD driver for renesas series devices.
 *
 * Author:
 * -------
 * -------
 *
 *============================================================================
 *             HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *------------------------------------------------------------------------------
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *============================================================================

/********************************************************/
/*                  Include Header Files                */
/********************************************************/

#include "flash_opt.h"
#include "flash_mtd.h"

#ifdef __RENESAS_SERIES_NOR__

/* ************************************************************
         RENESAS NOR FLASH MTD Flash Driver
   ************************************************************ */
   
/* Support RENESAS-series Page Buffer Program */
#ifdef __PAGE_BUFFER_PROGRAM__
   extern kal_uint32 PAGE_BUFFER_SIZE;
#endif

#define UNLOCK_COMMAND \
{\
   fp[0] = 0x60;\
   fp[0] = ((kal_uint32)D->CurrAddr >> 16);\
   fp[0] = 0xAC;\
   fp[0] = (~((kal_uint32)D->CurrAddr >> 16));\
   fp[0] = 0x7B;\
}

static int CheckDeviceReady_RENESAS(void * DriveData, kal_uint32 BlockIndex);

static int MountDevice_RENESAS(void * DriveData, NOR_MTD_FlashInfo * FlashInfo)
{
   NOR_Flash_MTD_Data * D = DriveData;
   kal_uint32 i=0;

   FlashInfo->TotalBlocks = 0;
   while(D->RegionInfo[i].BlockSize != 0)
   {
      FlashInfo->BlockSize[i] = D->RegionInfo[i].BlockSize;
      FlashInfo->RegionBlocks[i] = D->RegionInfo[i].RegionBlocks;
      FlashInfo->TotalBlocks += D->RegionInfo[i].RegionBlocks;
      i++;
   }
   FlashInfo->ActualRegionNum = i;

   return FS_NO_ERROR;
}

/*-----------------------------------*/
void WaitReady_RENESAS(kal_uint32 addr,kal_uint16 data)//Validate!!
{
   kal_uint16 stat_data;
   kal_uint32 data_cache_id;

   data_cache_id = INT_DisableDataCache();

   while(1)
   {
      *(volatile kal_uint16*)addr = 0x70;
      stat_data = *(volatile kal_uint16*)addr;
      if(stat_data & 0x80)
         break;
   }
   /* Clear status register */
   *(volatile kal_uint16*)addr = 0x50;
   /* Return to read mode */
   *(volatile kal_uint16*)addr = 0xFF;

   INT_RestoreDataCache(data_cache_id);

   if(data == 0)
   {
      /* Program */
      if (stat_data & 0x10)
         ASSERT(0);
   }else{
      /* Erase */
      if (stat_data & 0x28)
         ASSERT(0);
   }
}

/*-----------------------------------*/
static int ShutDown_RENESAS(void * DriveData)
{
   NOR_Flash_MTD_Data * D = DriveData;
   volatile FLASH_CELL *fp = (volatile FLASH_CELL*)D->BaseAddr;

   WaitReady_RENESAS((kal_uint32)fp, 1);

   D->CurrAddr = NULL;
   return FS_NO_ERROR;
}

/*-----------------------------------*/
static int EraseBlock_RENESAS(void * DriveData, kal_uint32 BlockIndex)
{
   NOR_Flash_MTD_Data * D = DriveData;
   volatile FLASH_CELL * fp = (volatile FLASH_CELL *) D->CurrAddr;
   kal_uint32 savedMask;

   ASSERT((~D->Signature == (kal_uint32)D->RegionInfo));

   savedMask = SaveAndSetIRQMask();
   //Erase command
   UNLOCK_COMMAND;

   fp[0] = 0x20;
   fp[0] = 0xD0;
   RestoreIRQMask(savedMask);

   WaitReady_RENESAS((kal_uint32)fp, 1);

   return FS_NO_ERROR;
}

/*-----------------------------------*/
static int ProgramData_RENESAS(void * DriveData, void * Address, void * Data, kal_uint32 Length)
{
   NOR_Flash_MTD_Data * D = DriveData;
   volatile FLASH_CELL *fp;
   kal_uint32 savedMask;

   ASSERT((~D->Signature == (kal_uint32)D->RegionInfo));

   switch (Length)
   {
      case 1:
         {
            kal_uint32 ofs = ((kal_uint32) Address) & (sizeof(FLASH_CELL)-1);
            FLASH_CELL Cell;
            kal_uint8 *b = (kal_uint8*) &Cell;

            fp = (FLASH_CELL*) (((kal_uint32) Address) & ~(sizeof(FLASH_CELL)-1)); // round it down
            Cell = fp[0];

            b[ofs] = ((kal_uint8*)Data)[0];

            savedMask = SaveAndSetIRQMask();
            UNLOCK_COMMAND;

            fp[0] = 0x40;
            fp[0] = Cell;
            RestoreIRQMask(savedMask);
            WaitReady_RENESAS((kal_uint32)Address, 0);
         }
         break;

      case 512:
         {
            kal_uint32 i, j, k;

            fp = (volatile FLASH_CELL *)Address;
            if((((kal_uint32)Data) & (sizeof(FLASH_CELL)-1)))// Data address is not word-aligned
            {
               kal_uint8 *bdp =  (kal_uint8*)Data;
               FLASH_CELL Cell;
               kal_uint8 *b = (kal_uint8*)&Cell;

               j = 0;

#ifndef __PAGE_BUFFER_PROGRAM__      // word program

               for(i = 0; i < Length/sizeof(FLASH_CELL); i++)
               {
                  b[0] = bdp[j++];
                  b[1] = bdp[j++];
                  savedMask = SaveAndSetIRQMask();
                  UNLOCK_COMMAND;

                  fp[i] = 0x40;
                  fp[i] = Cell;
                  RestoreIRQMask(savedMask);
                  WaitReady_RENESAS((kal_uint32)&fp[i], 0);
               }

#else // page buffer program
               for(i = 0; i < (Length/sizeof(FLASH_CELL));)
               {
                  savedMask = SaveAndSetIRQMask();
                  UNLOCK_COMMAND;
                  fp[0] = 0x41;

                  for(k = 0; k < PAGE_BUFFER_SIZE; k++, i++)
                  {
                     b[0] = bdp[j++];
                     b[1] = bdp[j++];
                     fp[i] = Cell;         // fill data to device buffer
                  }
                  RestoreIRQMask(savedMask);
                  WaitReady_RENESAS((kal_uint32)&fp[i-PAGE_BUFFER_SIZE], 0);
               }  
#endif
            }
            else   // Data address is word-aligned
            {
               FLASH_CELL *dp = (FLASH_CELL*)Data;

#ifndef __PAGE_BUFFER_PROGRAM__      // word program
               for(i = 0; i < Length/sizeof(FLASH_CELL); i++)
               {
                  savedMask = SaveAndSetIRQMask();
                  UNLOCK_COMMAND;

                  fp[i] = 0x40;
                  fp[i] = dp[i];
                  RestoreIRQMask(savedMask);
                  WaitReady_RENESAS((kal_uint32)&fp[i], 0);
               }  
#else // page buffer program
               for(i = 0; i < (Length/sizeof(FLASH_CELL));)
               {
                  savedMask = SaveAndSetIRQMask();

                  UNLOCK_COMMAND;
                  fp[i] = 0x41;

                  for(k = 0; k < PAGE_BUFFER_SIZE; k++, i++)
                  {
                     fp[i] = dp[i];         // fill data to device buffer
                  }
                  RestoreIRQMask(savedMask);
                  WaitReady_RENESAS((kal_uint32)&fp[i-PAGE_BUFFER_SIZE], 0);
               }  
#endif
            }
         }
         break;

      default:
         {
            kal_uint32 i;

            fp = (FLASH_CELL*)Address;
            for(i = 0; i < (Length/sizeof(FLASH_CELL)); i++)
            {
               savedMask = SaveAndSetIRQMask();
               UNLOCK_COMMAND;

               fp[i] = 0x40;
               fp[i] = ((FLASH_CELL*)Data)[i];
               RestoreIRQMask(savedMask);
               WaitReady_RENESAS((kal_uint32)Address, 0);
            }
         }
         break;
   }
   return FS_NO_ERROR;
}

/*-----------------------------------*/
static int NonBlockEraseBlock_RENESAS(void * DriveData, kal_uint32  BlockIndex) /* Added by Eric */
{
   NOR_Flash_MTD_Data * D = DriveData;
   volatile FLASH_CELL *fp = (volatile FLASH_CELL *) D->CurrAddr;
   kal_uint32 savedMask;

   ASSERT((~D->Signature == (kal_uint32)D->RegionInfo));

   savedMask = SaveAndSetIRQMask();
   //Erase command
   UNLOCK_COMMAND;

   fp[0] = 0x20;
   fp[0] = 0xD0;
   RestoreIRQMask(savedMask);

   return FS_NO_ERROR;
}

/*-----------------------------------*/
static int CheckDeviceReady_RENESAS(void * DriveData, kal_uint32 BlockIndex) /* Added by Eric */
{
   NOR_Flash_MTD_Data * D = DriveData;
   volatile FLASH_CELL *fp = (volatile FLASH_CELL *) D->CurrAddr;
   kal_uint16 stat_data;
   kal_uint32 data_cache_id;

   data_cache_id = INT_DisableDataCache();

   fp[0] = 0x70;
   stat_data = fp[0];
   fp[0] = 0xFF;
   INT_RestoreDataCache(data_cache_id);
   if(stat_data & 0x80)
   {
      /* Clear Status Register */
      fp[0] = 0x50;
      if(stat_data & 0x28)
      {
         ASSERT(0);
      }
      else
      {
         return FS_NO_ERROR;
      }
   }
   else
   {
      return FS_FLASH_ERASE_BUSY;
   }
}

/*-----------------------------------*/
static int SuspendErase_RENESAS(void * DriveData, kal_uint32 BlockIndex) /* Added by Eric */
{
   NOR_Flash_MTD_Data * D = DriveData;
   volatile FLASH_CELL *fp = (volatile FLASH_CELL *) D->CurrAddr;
   FLASH_CELL s = 0;
   kal_uint32 data_cache_id;
   
#ifdef _LOW_COST_SINGLE_BANK_FLASH_
   kal_uint32 savedMask;
   savedMask = SaveAndSetIRQMask();
#endif   

   data_cache_id = INT_DisableDataCache();

   fp[0] = 0xB0;

   fp[0] = 0x70;
   s = fp[0];
   while(!(s&0x80))
   {
      fp[0] = 0x70;
      s = fp[0];
   }
   fp[0] = 0xFF;

   INT_RestoreDataCache(data_cache_id);
   
#ifdef _LOW_COST_SINGLE_BANK_FLASH_  
   RestoreIRQMask(savedMask);
#endif    
   return FS_NO_ERROR;
}

/*-----------------------------------*/
static int ResumeErase_RENESAS(void * DriveData, kal_uint32 BlockIndex) /* Added by Eric */
{
   NOR_Flash_MTD_Data * D = DriveData;
   volatile FLASH_CELL *fp = (volatile FLASH_CELL *) D->CurrAddr;

   fp[0] = 0xD0;

   return FS_NO_ERROR;
}

/*-----------------------------------*/

NOR_MTD_Driver DriverName =
{
   MountDevice_RENESAS,
   ShutDown_RENESAS,
   MapWindow,
   EraseBlock_RENESAS,
   ProgramData_RENESAS,
   NonBlockEraseBlock_RENESAS,
   CheckDeviceReady_RENESAS,
   SuspendErase_RENESAS,
   ResumeErase_RENESAS
};

#endif  //__RENESAS_SERIES_NOR__

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99视频一区二区三区| 欧美一级欧美三级在线观看| 首页亚洲欧美制服丝腿| 国产精品欧美一级免费| 日韩欧美国产不卡| 色综合久久88色综合天天6| 国产一本一道久久香蕉| 三级一区在线视频先锋| 亚洲色图视频网站| 久久精品一区二区三区不卡牛牛 | 亚洲在线一区二区三区| 国产亚洲欧美一级| 日韩一区二区精品| 欧美久久一区二区| 欧美在线视频不卡| 91免费国产在线| 成人av午夜电影| 国产成人在线网站| 经典一区二区三区| 美国十次综合导航| 蜜臀av一区二区三区| 亚洲国产aⅴ天堂久久| 亚洲狼人国产精品| 亚洲精选在线视频| 亚洲美女电影在线| 亚洲精品午夜久久久| 亚洲人精品午夜| 亚洲三级理论片| 亚洲欧洲中文日韩久久av乱码| 亚洲一区二区欧美| 亚洲三级久久久| 亚洲激情自拍视频| 一区二区视频免费在线观看| 亚洲视频图片小说| 亚洲另类春色国产| 亚洲综合色噜噜狠狠| 亚洲图片一区二区| 亚洲h在线观看| 婷婷丁香激情综合| 日韩高清欧美激情| 九色|91porny| 国产精品一区在线观看乱码| 国产精品18久久久久久vr| 国产精品一区二区久久精品爱涩 | 中文字幕不卡一区| 国产精品福利影院| 自拍偷自拍亚洲精品播放| 中文字幕在线观看一区二区| 亚洲精品视频一区二区| 一个色在线综合| 日韩国产欧美三级| 国精产品一区一区三区mba桃花 | 成人午夜激情影院| 91在线观看下载| 欧美人妖巨大在线| 精品国产一区二区亚洲人成毛片| 久久亚洲一区二区三区明星换脸| 国产片一区二区| 亚洲美女淫视频| 日韩国产高清在线| 国产精品羞羞答答xxdd| 9i看片成人免费高清| 欧美色图第一页| 久久综合久久综合亚洲| 国产精品成人一区二区三区夜夜夜 | 久久精品国产一区二区| 国产精品一卡二| 在线观看国产日韩| 日韩区在线观看| 国产精品美女久久福利网站| 亚洲一级不卡视频| 国产精品自在在线| 色8久久精品久久久久久蜜| 91精品国产91久久综合桃花| 国产日本欧洲亚洲| 肉色丝袜一区二区| 国产成a人亚洲精| 欧美性生活久久| 26uuu欧美| 亚洲第一久久影院| 成人av影院在线| 欧美一级在线视频| 国产一区欧美一区| 色综合久久久久网| 久久久亚洲午夜电影| 亚洲国产精品一区二区久久恐怖片| 国内成+人亚洲+欧美+综合在线| 91精彩视频在线| 欧美韩国日本综合| 热久久一区二区| 色综合久久久久久久| 精品国产三级a在线观看| 亚洲黄一区二区三区| 国产精品主播直播| 欧美一区二区日韩一区二区| 中文字幕一区二区三区在线观看| 久久精品99国产国产精| 91国偷自产一区二区开放时间| 精品黑人一区二区三区久久 | ...xxx性欧美| 激情欧美一区二区| 欧美日韩情趣电影| 亚洲人成网站色在线观看| 狠狠色丁香九九婷婷综合五月| 日本韩国精品在线| 国产精品嫩草影院av蜜臀| 精品一区免费av| 欧美一区二区三区啪啪| 一区二区三区波多野结衣在线观看| 国产盗摄女厕一区二区三区| 91精品婷婷国产综合久久性色| 亚洲精品视频在线观看免费 | 色综合久久中文字幕综合网| 国产午夜精品一区二区三区嫩草| 日韩黄色小视频| 欧美区在线观看| 亚洲国产精品影院| 欧美伊人久久大香线蕉综合69| 国产精品久久影院| 成人免费不卡视频| 国产精品污污网站在线观看| 国产福利一区在线| 久久久精品黄色| 国产成a人无v码亚洲福利| 久久久亚洲午夜电影| 国产一区二区影院| 久久久久久久综合| 国产成人精品一区二区三区网站观看| 日韩一级大片在线观看| 蜜臀精品久久久久久蜜臀| 日韩三级中文字幕| 狠狠色狠狠色综合日日91app| 精品日韩在线观看| 国产精品888| 欧美激情一区在线| 91视频免费看| 亚洲国产综合色| 欧美一区二区三区四区久久| 蜜桃一区二区三区在线| 久久综合九色欧美综合狠狠| 国产米奇在线777精品观看| 国产网红主播福利一区二区| 成人手机在线视频| 亚洲理论在线观看| 欧美丰满高潮xxxx喷水动漫| 麻豆一区二区99久久久久| 亚洲日本韩国一区| 欧美色倩网站大全免费| 首页国产欧美久久| 精品国产sm最大网站免费看| 国产成人亚洲综合a∨婷婷图片| 国产精品女同一区二区三区| 色婷婷av一区二区三区软件| 丝袜亚洲另类欧美| 久久久久久久一区| 91视频免费看| 免费欧美日韩国产三级电影| 精品国产伦一区二区三区观看方式| 国产成人免费av在线| 亚洲日本韩国一区| 欧美放荡的少妇| 国产激情精品久久久第一区二区| 亚洲欧美综合色| 欧美放荡的少妇| 成人污污视频在线观看| 亚洲国产成人av网| 久久夜色精品国产噜噜av | 在线一区二区三区做爰视频网站| 午夜精品一区在线观看| 久久久久久久久99精品| 色综合欧美在线视频区| 老汉av免费一区二区三区| 中文字幕在线视频一区| 91麻豆精品国产91久久久使用方法| 国产精品一区在线观看你懂的| 亚洲人成电影网站色mp4| 日韩欧美另类在线| 91丨九色丨蝌蚪富婆spa| 老司机精品视频线观看86| 亚洲日本乱码在线观看| 欧美成人综合网站| 日本高清不卡视频| 韩国精品免费视频| 亚洲超丰满肉感bbw| 欧美国产97人人爽人人喊| 欧美日韩aaaaa| 成人va在线观看| 九色综合国产一区二区三区| 一区二区久久久久| 久久久久国产精品人| 91精品国产综合久久久久| 成人黄色在线视频| 蜜桃视频第一区免费观看| 一区二区三国产精华液| 中文字幕av免费专区久久| 精品免费视频一区二区| 欧美日韩一级片在线观看| 99精品黄色片免费大全| 国产乱妇无码大片在线观看| 日本成人在线一区|