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

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

?? amd29lvmtd.c

?? VxWorks5.5版本下的TrueFFS文件系統demo源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* amd29LvMtd.c - TrueFFS MTD for AMD AM29LV devices */ /* Copyright 2000 Wind River, Inc. *//*modification history--------------------01h,27oct01,mil  Removed inline eieio and replaced with CACHE_PIPE_FLUSH().01g,11oct01,mil  Merged from post T2.1 release into T2.2.01f,22aug01,mil  Decoupled this MTD from BSP by using tffsFlashBaseAdrs from                 sysTffs.c.01e,21aug01,mil  Created in mcpn765 for TFFS until merged back to                 target/src/drv/tffs/amdmtd.c.01d,06aug00,srr  Modified amd29lv323CT support for 16 MB.01c,31jul00,cak  Renamed from mv2400mtd to amd29lvmtd.                 Added support for the amd29lv323. 01b,09may00,add  Fixed erase bug (last 4 sectors are odd sizes)01a,21apr00,add  Created.*//*DESCRIPTIONThis module implements an TrueFFS MTD for the AMD AM29LV160D andAM29LV323 flash devices. *//* includes */#include <vxWorks.h>#include <taskLib.h>#include <logLib.h>#include <stdio.h>#include <cacheLib.h>#include "tffs/flflash.h"#include "tffs/backgrnd.h"IMPORT int sysClkRateGet();/* defines */#define AMD29LV_MTD_SECTOR_SIZE         (0x40000)#define AMD29LV_160_CHIP_SIZE           (0x800000)	/*  8MB */#define AMD29LV_160_LAST_SECTOR_NUM     (AMD29LV_160_CHIP_SIZE / AMD29LV_MTD_SECTOR_SIZE - 1)#define AMD29LV_323_CHIP_SIZE           (0x1000000)	/* 16MB */#define AMD29LV_323_LAST_SECTOR_SIZE    (0x8000)#define AMD29LV_323_LAST_SECTOR_NUM     (AMD29LV_323_CHIP_SIZE / AMD29LV_MTD_SECTOR_SIZE - 1)#define AMD29LV_MTD_CHIP_CNT            (1)#define AMD29LV_MTD_INTERLEAVE          (1)#define DEBUG_READ     0x00000001#define DEBUG_WRITE    0x00000002#define DEBUG_PROGRAM  0x00000004#define DEBUG_ERASE    0x00000008#define DEBUG_ID       0x00000010#define DEBUG_MAP      0x00000020#define DEBUG_PROG32   0x00000040#define DEBUG_ALWAYS   0xffffffff#define DEBUG#ifdef  DEBUG    LOCAL UINT32 debug;    #define DEBUG_PRINT(mask, string) \                if ((debug & mask) || (mask == DEBUG_ALWAYS)) \                printf string#else    #define DEBUG_PRINT(mask, string)#endif/* local routines */LOCAL FLStatus amd29lvSectorRangeErase(FLFlash* pVol, int, int);LOCAL FLStatus amd29lvProgram(FLFlash*, CardAddress, const void FAR1*, int,                             FLBoolean);LOCAL void FAR0* amd29lvMap(FLFlash*, CardAddress, int);LOCAL void flashReset(FLFlash*, BOOL);LOCAL void flashIdGet(FLFlash*, UINT16*, UINT16*);LOCAL void flashUnlock(FLFlash*, BOOL);LOCAL STATUS flashProgram32Bits(FLFlash*, volatile UINT32*, UINT32, BOOL);LOCAL void flashRegWrite32Bits(FLFlash*, UINT32, UINT32, BOOL);LOCAL UINT16 flashRegRead16Bits(FLFlash*, UINT32, BOOL);LOCAL STATUS flashHalfSectorErase(FLFlash*, int, BOOL);/******************************************************************************** amd29lvMTDIdentify - MTD identify routine (see TrueFFS Programmer's Guide)** RETURNS: FLStatus**/FLStatus amd29lvMTDIdentify    (    FLFlash* pVol    )    {    UINT16 manCode;    UINT16 devCode;    flashIdGet(pVol, &manCode, &devCode);    if (manCode != 0x0001)        {        DEBUG_PRINT(DEBUG_ALWAYS,                    ("amd29lvMTDIdentify Manufacturer unknown: 0x%02x\n",                    manCode));        return(flUnknownMedia);        }    if (devCode == 0x22C4)		/* amd29LV160BT */	{	pVol->type = 0x01C4;	pVol->erasableBlockSize = AMD29LV_MTD_SECTOR_SIZE;	pVol->chipSize = AMD29LV_160_CHIP_SIZE;	pVol->noOfChips = AMD29LV_MTD_CHIP_CNT;	pVol->interleaving = AMD29LV_MTD_INTERLEAVE;	pVol->write = amd29lvProgram;	pVol->erase = amd29lvSectorRangeErase;	pVol->map = amd29lvMap;	}    else if (devCode == 0x2250)		/* amd29LV323CT */	{	pVol->type = 0x0150;	pVol->erasableBlockSize = AMD29LV_MTD_SECTOR_SIZE;	pVol->chipSize = AMD29LV_323_CHIP_SIZE;	pVol->noOfChips = AMD29LV_MTD_CHIP_CNT;	pVol->interleaving = AMD29LV_MTD_INTERLEAVE;	pVol->write = amd29lvProgram;	pVol->erase = amd29lvSectorRangeErase;	pVol->map = amd29lvMap;	}    else        {        DEBUG_PRINT(DEBUG_ALWAYS,                    ("amd29lvMTDIdentify Device unknown: 0x%02x\n",                    devCode));        return(flUnknownMedia);        }        DEBUG_PRINT(DEBUG_ID, ("amd29lvMTDIdentify succeeds!\n"));    return(flOK);    }/******************************************************************************** amd29lvProgram - MTD write routine (see TrueFFS Programmer's Guide)** RETURNS: FLStatus**/LOCAL FLStatus amd29lvProgram    (    FLFlash*          pVol,    CardAddress       address,    const void FAR1*  buffer,    int               length,    FLBoolean         overwrite    )    {    volatile UINT32* pFlash;    UINT32* pBuffer;    STATUS rc = OK;    BOOL upper;    int i;    BOOL doFree = FALSE;    DEBUG_PRINT(DEBUG_PROGRAM,                ("Program: 0x%08x, 0x%08x, %d\n", (unsigned int) address,                 length, overwrite));    if (flWriteProtected(vol.socket))        {        return(flWriteProtect);        }    /* Check alignment */    if (((address & 0x03) != 0) || (((UINT32) buffer) &  0x03))        {        DEBUG_PRINT(DEBUG_ALWAYS, ("amd29lvProgram: Alignment error\n"));        return(flBadParameter);        }    if (overwrite && length == 2)        {        int sector;        int offset;        pFlash = (volatile UINT32*) pVol->map(pVol, address, length);        pBuffer = (UINT32*) malloc(AMD29LV_MTD_SECTOR_SIZE);        if (pBuffer == 0)            {            DEBUG_PRINT(DEBUG_ALWAYS, ("amd29lvProgram: No memory\n"));            return(flBadParameter);            }        /* Determine sector and offset */        sector = address / AMD29LV_MTD_SECTOR_SIZE;        offset = address % AMD29LV_MTD_SECTOR_SIZE;        DEBUG_PRINT(DEBUG_PROGRAM,("Overwrite sector: 0x%08x, offset: 0x%08x\n",                    sector,offset));        /* Get a pointer to the flash sector */        pFlash = (volatile UINT32*) pVol->map(pVol,                                              sector * AMD29LV_MTD_SECTOR_SIZE,                                              AMD29LV_MTD_SECTOR_SIZE);        /* Copy the sector from flash to memory */        memcpy(pBuffer, (void*) pFlash, AMD29LV_MTD_SECTOR_SIZE);        /* Overwrite the sector in memory */       memcpy(((UINT8*) pBuffer) + offset, buffer, length);        /* Erase sector */        rc = amd29lvSectorRangeErase(pVol, sector, 1);        if (rc != flOK)            {            free(pBuffer);            return(rc);            }        length = AMD29LV_MTD_SECTOR_SIZE;        doFree = TRUE;        }    else        {        if ((length & 0x03) != 0)            {            DEBUG_PRINT(DEBUG_ALWAYS, ("amd29lvProgram: length: %d\n", length));            return(flBadParameter);            }        pBuffer = (UINT32*) buffer;        pFlash = (volatile UINT32*) pVol->map(pVol, address, length);        }    /* Program 'length' bytes (4 bytes each iterations) */    upper = ((((UINT32) pFlash) & 0x04) != 0);    for (i = 0; i < (length / 4); i++, pFlash++, upper = !upper)        {        /* Don't bother programming if buffer data == format value */        if (pBuffer[i] == 0xffffffff)            continue;        /* Program 32 bits */        rc = flashProgram32Bits(pVol, pFlash, pBuffer[i], upper);        if (rc != OK)            break;        }    if (doFree)        {        free(pBuffer);        }    return((rc == OK) ? flOK : flTimedOut);    }/******************************************************************************** amd29lvSectorRangeErase - MTD erase routine (see TrueFFS Programmer's Guide)** RETURNS: FLStatus**/LOCAL FLStatus amd29lvSectorRangeErase    (    FLFlash* pVol,    int sectorNum,    int sectorCount    )    {    int i;    STATUS rc;    /* Check for valid range */    if (pVol->type == 0x1C4)			/* amd29LV160BT */	{	if (sectorNum + sectorCount >  AMD29LV_160_LAST_SECTOR_NUM + 1)	    {	    DEBUG_PRINT(DEBUG_ALWAYS, ("Invalid sector range: %d - %d\n",	                sectorNum, sectorCount));	    }	/* Last sector is really 4 seperately erasable sectors */	if (sectorNum + sectorCount == AMD29LV_160_LAST_SECTOR_NUM + 1)	    {	    sectorCount += 3;	    }	}    else					 /* amd29LV323CT */	{	if (sectorNum + sectorCount >  AMD29LV_323_LAST_SECTOR_NUM + 1)	    {	    DEBUG_PRINT(DEBUG_ALWAYS, ("Invalid sector range: %d - %d\n",	                sectorNum, sectorCount));	    }	/* Last sector is really 8 seperately erasable sectors */	if (sectorNum + sectorCount == AMD29LV_323_LAST_SECTOR_NUM + 1)	    {	    sectorCount += 7;	    }	}    for (i = 0; i < sectorCount; i++)        {        /* Erase lower half */        rc = flashHalfSectorErase(pVol, sectorNum + i, FALSE);        if (rc != OK)            return(flTimedOut);        /* Erase upper half */        rc = flashHalfSectorErase(pVol, sectorNum + i, TRUE);        if (rc != OK)            return(flTimedOut);        }    return(flOK);    }/******************************************************************************** amd29lvMap - MTD map routine (see TrueFFS Programmer's Guide)** RETURNS: FLStatus**/LOCAL void FAR0* amd29lvMap    (    FLFlash* pVol,    CardAddress address,    int length    )    {    UINT32 flashBaseAddr = (pVol->socket->window.baseAddress << 12);    void FAR0* pFlash = (void FAR0*) (flashBaseAddr + address);    DEBUG_PRINT(DEBUG_MAP, ("Mapping 0x%08x bytes at 0x%08x to %p\n", length,                (unsigned int) address, pFlash));    return(pFlash);    }/******************************************************************************** flashProgram32Bits - Program 32 bits at 4 byte aligned address.** RETURNS: OK or ERROR**/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性做爰猛烈叫床潮| 亚洲精品中文字幕乱码三区| 欧美激情综合五月色丁香小说| 亚洲美女淫视频| 国产91精品一区二区麻豆网站| 欧美丝袜丝交足nylons图片| 国产欧美日韩不卡免费| 蜜臀av亚洲一区中文字幕| 在线观看亚洲精品| 亚洲国产成人午夜在线一区 | 亚洲四区在线观看| 毛片av一区二区三区| 欧美在线影院一区二区| 中日韩av电影| 国产精品中文字幕一区二区三区| 欧美久久久久久久久久| 亚洲桃色在线一区| 99国产精品久久久久久久久久| 久久欧美中文字幕| 久久99精品久久只有精品| 欧美日韩在线免费视频| 亚洲另类色综合网站| 99re这里只有精品首页| 国产人久久人人人人爽| 国产中文一区二区三区| 欧美精品一区二区三区蜜桃视频 | 亚洲九九爱视频| 成人精品视频.| 欧美韩日一区二区三区四区| 国产精品综合在线视频| www日韩大片| 国产成人aaaa| 国产精品久久看| 一本大道久久a久久综合| 亚洲欧洲在线观看av| 99久久精品国产毛片| 亚洲欧洲美洲综合色网| 日本韩国精品在线| 亚洲.国产.中文慕字在线| 欧美三级乱人伦电影| 性感美女久久精品| 日韩欧美国产一二三区| 国产一区欧美二区| 中文字幕亚洲视频| 欧美视频在线播放| 日韩精品91亚洲二区在线观看| 制服丝袜日韩国产| 精品在线亚洲视频| 国产精品嫩草久久久久| 色婷婷久久99综合精品jk白丝| 亚洲影院理伦片| 欧美一区二区三区四区在线观看 | 久久综合综合久久综合| 欧美精品一区二区蜜臀亚洲| 国产99久久久精品| 一区二区成人在线视频| 91精品国产乱| 国产成人超碰人人澡人人澡| 亚洲日本乱码在线观看| 欧美精选一区二区| 成人性生交大片免费看视频在线| 亚洲三级理论片| 日韩午夜激情电影| 风流少妇一区二区| 日韩精品亚洲一区二区三区免费| 久久久亚洲欧洲日产国码αv| 99久久99久久精品免费看蜜桃| 午夜精品久久久久久久久久久| 精品国产百合女同互慰| 91丝袜美腿高跟国产极品老师 | 一个色综合av| 精品国产乱码久久久久久久久 | 免费欧美日韩国产三级电影| 国产欧美日韩精品a在线观看| 91黄视频在线| 国产成人精品影视| 日韩高清不卡在线| 亚洲欧洲精品天堂一级| 欧美videos大乳护士334| 色婷婷精品久久二区二区蜜臂av| 麻豆精品国产传媒mv男同| 一区二区三区四区在线播放| 久久婷婷久久一区二区三区| 欧美日韩在线播放三区| 国产东北露脸精品视频| 日本成人在线一区| 亚洲在线免费播放| 国产精品久久久久久一区二区三区 | 国产精品一区二区免费不卡| 亚洲国产aⅴ天堂久久| 国产午夜一区二区三区| 欧美一级淫片007| 欧美丝袜第三区| 色猫猫国产区一区二在线视频| 久久国产人妖系列| 午夜一区二区三区视频| 亚洲欧美日韩精品久久久久| 久久伊人中文字幕| 91精品在线观看入口| 在线一区二区三区做爰视频网站| jiyouzz国产精品久久| 国产九色精品成人porny| 成人a免费在线看| 久久激情五月激情| 蜜桃免费网站一区二区三区| 午夜精品免费在线观看| 亚洲二区在线视频| 一区二区三区中文字幕电影| 亚洲人成网站精品片在线观看| 中文字幕乱码亚洲精品一区| 国产欧美一区二区精品性色| 精品日韩一区二区| 精品国产乱码久久久久久牛牛 | 91精品国产综合久久精品图片| 色噜噜狠狠色综合中国| 色av成人天堂桃色av| 欧美艳星brazzers| 欧美中文字幕久久| 欧美精品乱码久久久久久| 欧美日韩高清一区二区不卡| 欧美日韩国产成人在线免费| 欧美蜜桃一区二区三区| 欧美电影影音先锋| 精品国产第一区二区三区观看体验 | 亚洲人精品一区| 一区二区免费在线播放| 婷婷中文字幕综合| 久久国产夜色精品鲁鲁99| 国产一区二区看久久| 国产91精品一区二区| 91在线视频播放地址| 欧洲av一区二区嗯嗯嗯啊| 欧美一区二区福利在线| 久久久夜色精品亚洲| 国产精品国产三级国产aⅴ入口| 亚洲欧美一区二区久久| 天天影视色香欲综合网老头| 精品在线视频一区| 99久久久久免费精品国产| 在线视频国产一区| 日韩欧美高清dvd碟片| 国产情人综合久久777777| 亚洲愉拍自拍另类高清精品| 久久精品国产网站| 91在线观看污| 欧美一区二区三区白人| 日韩一区日韩二区| 麻豆成人久久精品二区三区红| 粉嫩av一区二区三区在线播放| 在线观看亚洲成人| 久久久久久久久久久久电影| 一区二区三区四区激情| 国产自产2019最新不卡| 在线观看成人小视频| 久久影院视频免费| 亚洲精品综合在线| 国产一区二区三区日韩| 在线一区二区观看| 久久精品亚洲乱码伦伦中文| 亚洲永久免费av| 成人做爰69片免费看网站| 7777精品伊人久久久大香线蕉超级流畅 | 欧美日韩视频不卡| 中文字幕av一区二区三区高| 日韩极品在线观看| 成人av网站在线观看| 欧美成人一区二区| 亚洲国产一区二区a毛片| 成人在线一区二区三区| 欧美成人猛片aaaaaaa| 亚洲综合在线五月| jlzzjlzz国产精品久久| 国产亚洲精品福利| 麻豆91精品视频| 欧美一区三区二区| 亚洲午夜久久久久| 色婷婷综合久久| 亚洲天堂av老司机| 播五月开心婷婷综合| 26uuu欧美| 久久国产精品色婷婷| 欧美一区二区三区在线观看视频| 一区二区三区在线免费| 92精品国产成人观看免费| 国产精品麻豆欧美日韩ww| 国产精品香蕉一区二区三区| 欧美va天堂va视频va在线| 青青草精品视频| 欧美精品777| 亚洲不卡在线观看| 欧美日韩一区在线| 亚洲图片欧美色图| 欧美在线啊v一区| 亚洲国产精品麻豆| 色噜噜夜夜夜综合网| 一区二区三区在线视频观看58| 99riav久久精品riav| 亚洲欧洲韩国日本视频| 色综合久久中文字幕| 亚洲一区二区三区四区的|