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

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

?? flashmem.c

?? at91rm9200 bsp at91rm9200 bsp
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* flashMem.c - Flash memory device driver *//* Copyright 1984-2001 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01b,03jan02,m_h  Fix flash write01a,12apr01,m_h  derived from version 01l of mem/flashMem.c.*//*DESCRIPTIONThis library contains routines to manipulate flash memory.  Read and writeroutines are included.The macro values FLASH_ADRS, FLASH_SIZE, and FLASH_WIDTH must be defined toindicate the address, size (in bytes), and the data-access width (in bytes) ofthe flash memory.If the flash memory needs to be overlaid, and the section of the memory thatneeds to be overlaid is less than FLASH_SIZE, then, for efficiency, defineFLASH_SIZE_WRITABLE to the size (in bytes) of the overlay section.The routine sysFlashDelay() creates a delay for a specified number ofmicroseconds.  The timing loop can be adjusted on a board-dependent basis bydefining the function sysFlashBoardDelay and values for the following macros,.iPSYS_FLASH_DELAY_SHIFT.iPSYS_FLASH_DELAY_ADJ.iPSYS_FLASH_DELAY_INCR.LPTo use the routine sysFlashBoardDelay(), the macro SYS_FLASH_BOARD_DELAYshould be defined.The macro FLASH_NO_OVERLAY should be defined when calls to sysFlashSet()are expected to erase the flash and reprogram it with only the new data.The macro SYS_FLASH_TYPE should be defined for flash devices that cannot beauto-selected. This macro should be set to a flash device code defined in theheader files, <drv/mem/flash28.h> and <drv/mem/flash29.h>To support flash devices that that need to turn on/off write protect features(special programming voltages or other write-enable features), the macroSYS_FLASH_WRITE, and the routines, sysFlashWriteEnable() andsysFlashFlashWriteDisable() should be defined.INTERNAL:The FLASH_SIZE_WRITABLE concept doesn't work very well.  It just limits theamount of flash that is writable, so why bother.  What it was reallyintended to address was flash that is only block writable, i.e. youcan only write a complete block at a time.  To properly handle blockmemory, you must copy the old block of memory to a buffer, update thepart of the buffer that is to be changed, and then write back thecomplete buffer in a single write operation.The accesses to non-volatile memory, and flash control registers needsto be abstracted.  Macros should be used for all actual i/o operations.*/#include "drv/mem/flashDev.h"#include "drv/mem/flash28.h"#include "flash29.h"/* defines *//* Establish default values for DELAY parameters */#ifndef	SYS_FLASH_DELAY_SHIFT#   define	SYS_FLASH_DELAY_SHIFT 0#endif /*SYS_FLASH_DELAY_SHIFT*/#ifndef	SYS_FLASH_DELAY_ADJ#   define	SYS_FLASH_DELAY_ADJ 0#endif	/* SYS_FLASH_DELAY_ADJ */#ifndef	SYS_FLASH_DELAY_INCR#   define	SYS_FLASH_DELAY_INCR 1#endif	/* SYS_FLASH_DELAY_INCR *//* Names of routines, or null values */#ifdef	SYS_FLASH_WRITE#   define SYS_FLASH_WRITE_ENABLE_RTN()	sysFlashWriteEnable ()#   define SYS_FLASH_WRITE_DISABLE_RTN() sysFlashWriteDisable ()#else#   define SYS_FLASH_WRITE_ENABLE_RTN()#   define SYS_FLASH_WRITE_DISABLE_RTN()#endif	/* SYS_FLASH_WRITE */#ifdef	SYS_FLASH_BOARD_DELAY#   define SYS_FLASH_BOARD_DELAY_RTN()	sysFlashBoardDelay ()#else#   define SYS_FLASH_BOARD_DELAY_RTN()#endif	/* SYS_FLASH_BOARD_DELAY */#ifdef SYS_FLASH_TYPE#   define FLASH_MEM_TYPE		SYS_FLASH_TYPE#else#   define FLASH_MEM_TYPE		0#endif	/* SYS_FLASH_TYPE */#ifdef FLASH_SIZE_WRITEABLE#   define FLASH_MEM_SIZE		FLASH_SIZE_WRITEABLE#else#   define FLASH_MEM_SIZE		FLASH_SIZE#endif	/* FLASH_SIZE_WRITEABLE *//* Operation status bits for Flash 29Fxxx devices */#define Q7(ix)		((ix & 0x80) >> 7)	/* DQ7 bit */#define Q5(ix)		((ix & 0x20) >> 5)	/* DQ5 bit *//* globals */IMPORT	void sysFlashWriteEnable (void);IMPORT	void sysFlashWriteDisable (void);IMPORT	void sysFlashBoardDelay (void);int	flashDelayShift	= SYS_FLASH_DELAY_SHIFT;int	flashDelayAdj	= SYS_FLASH_DELAY_ADJ;int	flashDelayIncr	= SYS_FLASH_DELAY_INCR;/* forward declarations */#ifdef	__STDC__void	sysFlashDelay (int delayCount);STATUS	sysFlashDataPoll (volatile FLASH_DEF * pFA, FLASH_DEF value);STATUS	sysFlashErase (UINT8 flashType);STATUS	sysFlashWrite (FLASH_DEF * pFB, int size, int offset,                       UINT8 flashType, FLASH_DEF value);UINT8	sysFlashTypeGet (void);#else	/* __STDC__ */void	sysFlashDelay ();STATUS	sysFlashDataPoll ();STATUS	sysFlashErase ();STATUS	sysFlashWrite ();UINT8	sysFlashTypeGet ();#endif	/* __STDC__ *//******************************************************************************** sysFlashGet - get the contents of flash memory** This routine copies the contents of flash memory into a specified* string.  The string is terminated with an EOS.** RETURNS: OK, or ERROR if access is outside the flash memory range.** SEE ALSO: sysFlashSet()** INTERNAL* If multiple tasks are calling sysFlashSet() and sysFlashGet(),* they should use a semaphore to ensure mutually exclusive access.*/STATUS sysFlashGet    (    char *	string,		/* where to copy flash memory      */    int		strLen,		/* maximum number of bytes to copy */    int		offset		/* byte offset into flash memory   */    )    {    if ((offset < 0) || (strLen < 0) || ((offset + strLen) > FLASH_SIZE))        return (ERROR);    bcopyBytes ((char *) (FLASH_ADRS + offset), string, strLen);    string [strLen] = EOS;    return (OK);    }/******************************************************************************** sysFlashDelay - create a delay for a specified number of microseconds** This routine implements a busy wait for a specified number of microseconds.* The timing loop can be adjusted on a board-dependent basis by* defining values for the following macros:* .iP* SYS_FLASH_DELAY_SHIFT* .iP* SYS_FLASH_DELAY_ADJ* .iP* SYS_FLASH_DELAY_INCR* .LP* The values SYS_FLASH_DELAY_SHIFT and SYS_FLASH_DELAY_ADJ* convert microseconds into a board-dependent tick-count.* This routine can call a user-defined hook, sysFlashBoardDelay(),* which creates a delay for a number of board-dependent ticks as* specified by SYS_FLASH_DELAY_INCR.  To use sysFlashBoardDelay(), define* SYS_FLASH_BOARD_DELAY in config.h.** RETURNS: N/A** SEE ALSO: sysFlashErase(), sysFlashWrite()*/void sysFlashDelay    (    int delayCount	/* number of uSec to delay */    )    {    int ix;    delayCount <<= flashDelayShift;	/* board-dependent shift */    delayCount += flashDelayAdj;		/* board-dependent addition */    for (ix = 0; ix < delayCount; ix += flashDelayIncr)        SYS_FLASH_BOARD_DELAY_RTN ();    }/******************************************************************************** sysFlashDataPoll - wait for a flash device operation to complete** This routine polls a specified address on a 29F\f2xxx\f1 flash device* until the device operation at that location completes or times out.** While a flash operation is in progress, a read on the device* returns on Q7 (data bit 7) the complement of the previous value of Q7.  Once* the flash operation has completed, the Q7 bit returns the true data* of the last write. Subsequent reads return the correct data in Q0-7.** The Q5 bit implements a timeout functionality.  When a currently* executing flash operation exceeds specified limits, the Q5 bit is set (to 1).** RETURNS: OK, or ERROR if the timeout (!Q5) occurs before the device operation* completes.** SEE ALSO: sysFlashErase(), sysFlashWrite()*/STATUS sysFlashDataPoll    (    volatile FLASH_DEF * pFA,	/* programmed address to poll */    FLASH_DEF value		/* data programmed to poll address */    )    {    STATUS retVal = OK;    volatile FLASH_POLL_DEF * pTest = (FLASH_POLL_DEF *) pFA;    volatile FLASH_POLL_DEF * pVal  = (FLASH_POLL_DEF *) &value;    int ix;			/* byte counter */    int vBit;			/* programmed value of DQ7 */    for (ix = (FLASH_WIDTH/FLASH_CHIP_WIDTH - 1); (ix >= 0 ) && (retVal == OK);             ix--, pTest++, pVal++)        {        vBit = Q7(*pVal);        while (Q7(*pTest) != vBit)            if (Q5(*pTest) == 1)	/* timeout ? */                break;        if (Q7(*pTest) != vBit)		/* check Q7 & Q5 race */            retVal = ERROR;        }    return (retVal);    }/******************************************************************************** sysFlashErase - erase the contents of flash memory** This routine clears the contents of flash memory.** Flash 28F\f2xxx\f1 devices are erased by writing a flash erase command to* the device and verifying that each flash location is set to a high value* (0xFF).** Flash 29F\f2xxx\f1 devices are erased by writing the six-byte erase code* into specific address locations, which sets all byte locations to a high* value (0xFF).** RETURNS: OK, or ERROR if the contents of flash memory cannot be erased.*/STATUS sysFlashErase    (    UINT8 flashType		/* type of flash memory on-board */    )    {    volatile FLASH_DEF * pFA = FLASH_CAST (FLASH_ADRS);    STATUS retVal = OK;    int ix;    switch (flashType)        {	case (FLASH_28F008):	case (FLASH_28F016):	    SYS_FLASH_WRITE_ENABLE_RTN ();		/* raise Vpp */            *pFA = FLASH28_CMD_ERASE_SETUP;		/* setup */            *pFA = FLASH28F008_CMD_ERASE;		/* erase */	    /* Check Write State Machine Status */	    do		*pFA = FLASH28F008_CMD_READ_STATUS;	    while ((*pFA & FLASH28F008_STAT_WSMS) != FLASH28F008_STAT_WSMS);	    /* Check Erase Error Status */	    if ((*pFA & FLASH28F008_STAT_EWS) != 0)		{		*pFA = FLASH28F008_CMD_CLEAR_STATUS;		retVal = ERROR;		}            pFA = FLASH_CAST (FLASH_ADRS);            *pFA = FLASH28_CMD_RESET;	    SYS_FLASH_WRITE_DISABLE_RTN ();		/* lower Vpp */            break;        case (FLASH_28F256):        case (FLASH_28F512):        case (FLASH_28F010):        case (FLASH_28F020):            {            /* program the device to all zeros */            if (sysFlashWrite (NULL, FLASH_SIZE, 0, flashType, 0) == ERROR)		return (ERROR);	    SYS_FLASH_WRITE_ENABLE_RTN ();		/* raise Vpp */            *pFA = FLASH28_CMD_ERASE_SETUP;		/* setup */            *pFA = FLASH28_CMD_ERASE;			/* erase */            sysFlashDelay (10000);            for (; (pFA < FLASH_CAST ((UINT32)FLASH_ADRS + (UINT32)FLASH_SIZE))		   && (retVal == OK); pFA++)                for (ix = 0; TRUE; ix++)	            {	            *pFA = FLASH28_CMD_ERASE_VERIFY;	/* verify */	            sysFlashDelay (6);			/* wait for verify */	            if (*pFA == (FLASH_DEF) 0xffffffff)	/* done? */		        break;                    if (ix == 1000)			{			retVal = ERROR;			break;			}                    *pFA = FLASH28_CMD_ERASE_SETUP;	/* setup */                    *pFA = FLASH28_CMD_ERASE;		/* erase */	            sysFlashDelay (10000);	            }            pFA = FLASH_CAST (FLASH_ADRS);            *pFA = FLASH28_CMD_RESET;            *pFA = FLASH28_CMD_READ_MEM;	    sysFlashDelay (6);	    SYS_FLASH_WRITE_DISABLE_RTN ();		/* lower Vpp */            break;            }        case (FLASH_29F010):        case (FLASH_29LV800):            {	    SYS_FLASH_WRITE_ENABLE_RTN ();		/* enable write */            *(FLASH_CAST FLASH29_REG_FIRST_CYCLE)  = FLASH29_CMD_FIRST;            *(FLASH_CAST FLASH29_REG_SECOND_CYCLE) = FLASH29_CMD_SECOND;            *(FLASH_CAST FLASH29_REG_FIRST_CYCLE)  = FLASH29_CMD_CHIP_ERASE;            *(FLASH_CAST FLASH29_REG_FIRST_CYCLE)  = FLASH29_CMD_FOURTH;            *(FLASH_CAST FLASH29_REG_SECOND_CYCLE) = FLASH29_CMD_FIFTH;            *(FLASH_CAST FLASH29_REG_FIRST_CYCLE)  = FLASH29_CMD_SIXTH;            do {                retVal = sysFlashDataPoll (pFA, (FLASH_DEF) 0xffffffff);                } while ((*pFA != (FLASH_DEF) 0xffffffff) && (retVal == OK));            *(FLASH_CAST FLASH29_REG_FIRST_CYCLE)  = FLASH29_CMD_FIRST;            *(FLASH_CAST FLASH29_REG_SECOND_CYCLE) = FLASH29_CMD_SECOND;            *(FLASH_CAST FLASH29_REG_FIRST_CYCLE)  = FLASH29_CMD_READ_RESET;	    SYS_FLASH_WRITE_DISABLE_RTN ();		/* disable enable */            break;            }	case (FLASH_29C040A):        case (FLASH_29LV1024):	    /*	     * You can erase these entire chips, but there is really no	     * need, as a write automatically erases the sector being	     * written. In particular, we will not generally want all	     * of the chip erased from sysFlashSet().	     */            {            *(FLASH_CAST FLASH29_REG_FIRST_CYCLE)  = FLASH29_CMD_FIRST;            *(FLASH_CAST FLASH29_REG_SECOND_CYCLE) = FLASH29_CMD_SECOND;            *(FLASH_CAST FLASH29_REG_FIRST_CYCLE)  = FLASH29_CMD_CHIP_ERASE;            *(FLASH_CAST FLASH29_REG_FIRST_CYCLE)  = FLASH29_CMD_FOURTH;            *(FLASH_CAST FLASH29_REG_SECOND_CYCLE) = FLASH29_CMD_FIFTH;            *(FLASH_CAST FLASH29_REG_FIRST_CYCLE)  = FLASH29_CMD_SIXTH;	    /*	     * Atmel chip spec says it will take 20 ms max and does not	     * define a mechanism for polling for completion	     *	     * It seems that this driver cannot always safely use taskDelay()	     */	    sysFlashDelay (20000);            break;            }        default:            retVal = ERROR;        }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美成人乱码一区二区三区| 国产二区国产一区在线观看| 欧美视频第二页| 亚洲亚洲人成综合网络| 欧美日韩国产免费一区二区| 青青草原综合久久大伊人精品| 精品视频一区二区三区免费| 午夜av区久久| 久久久一区二区三区| 国产成人av影院| 亚洲美女区一区| 日韩欧美一级精品久久| 国产精品一区二区男女羞羞无遮挡| 国产精品美日韩| 欧美图区在线视频| 激情文学综合网| 亚洲精品乱码久久久久久黑人| 欧美精品tushy高清| 国产成人精品影视| 亚洲高清久久久| 久久综合九色综合97婷婷| 成人国产精品免费观看视频| 亚洲成人资源网| 久久久久久久性| 欧美日韩和欧美的一区二区| 国产精品一区专区| 午夜日韩在线观看| 国产精品嫩草影院av蜜臀| 欧美日韩免费高清一区色橹橹| 国产毛片精品一区| 亚洲一区二区欧美日韩| 久久久久国产免费免费| 欧美日韩一区二区在线观看| 国产精品亚洲人在线观看| 亚洲v日本v欧美v久久精品| 欧美极品aⅴ影院| 欧美一区二区黄| 91欧美一区二区| 精品在线观看视频| 亚洲一区二区三区免费视频| 久久精品一区二区三区不卡| 欧美色精品在线视频| 国产99久久久国产精品潘金 | 国产麻豆日韩欧美久久| 亚洲精品国产a久久久久久| 久久一区二区三区国产精品| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 精品一区二区三区免费观看| 亚洲一区二区视频在线| 中文久久乱码一区二区| 337p粉嫩大胆噜噜噜噜噜91av| 国产精品久久久久一区| 精品99一区二区| 欧美日韩成人一区| 91浏览器入口在线观看| 国产成人av一区二区三区在线| 三级亚洲高清视频| 亚洲国产美国国产综合一区二区| 国产精品免费丝袜| 国产欧美视频一区二区三区| 日韩精品在线看片z| 欧美精品v国产精品v日韩精品| 欧洲一区二区三区在线| 日本韩国一区二区三区| 99精品偷自拍| 一本色道久久综合亚洲aⅴ蜜桃 | 日韩av一级片| 亚洲动漫第一页| 一区二区久久久久| 亚洲乱码一区二区三区在线观看| 国产精品伦一区| 亚洲色图视频网站| 中文字幕一区av| 国产欧美视频在线观看| 国产精品丝袜久久久久久app| 国产亚洲精品福利| 国产精品美女久久久久久久| 国产欧美日本一区二区三区| 欧美激情一区二区三区| 国产精品日产欧美久久久久| 国产精品久久久久aaaa| 日韩伦理av电影| 一区二区三区在线视频观看| 亚洲一区二区三区爽爽爽爽爽| 午夜精品福利一区二区蜜股av | 成人午夜大片免费观看| 国产高清一区日本| 不卡区在线中文字幕| 色综合欧美在线视频区| 欧美在线免费观看亚洲| 91精品国产一区二区三区香蕉| 欧美电影免费观看高清完整版 | 懂色av中文一区二区三区| 成人白浆超碰人人人人| 色综合天天综合狠狠| 欧美在线观看视频一区二区三区 | 色老汉一区二区三区| 欧美猛男超大videosgay| 欧美va日韩va| 国产欧美日韩亚州综合 | 日韩一区二区三区av| 久久综合色8888| 国产精品电影一区二区三区| 亚洲一区视频在线观看视频| 美女在线一区二区| 国产91综合一区在线观看| 99国产麻豆精品| 日韩一区二区视频| 亚洲欧美在线视频观看| 日韩一区精品字幕| 成人免费精品视频| 精品污污网站免费看| 久久综合九色综合97婷婷| 亚洲欧美乱综合| 久久不见久久见免费视频7 | 国产91精品一区二区麻豆网站 | 欧美视频一区在线| 久久午夜羞羞影院免费观看| 亚洲人成在线播放网站岛国| 免费看欧美女人艹b| 91在线观看下载| 日韩欧美自拍偷拍| 成人免费小视频| 精品一区二区久久| 欧洲精品在线观看| 欧美激情在线观看视频免费| 亚洲bt欧美bt精品777| 成人18精品视频| 日韩欧美一二三区| 亚洲成av人综合在线观看| 不卡电影免费在线播放一区| 在线成人免费视频| 亚洲男帅同性gay1069| 韩国在线一区二区| 欧美精品在线一区二区三区| 国产精品久久久久久久久搜平片 | 日本va欧美va精品| 在线亚洲一区观看| 日本一区二区综合亚洲| 久久97超碰色| 欧美日韩精品欧美日韩精品一综合| 国产女人18毛片水真多成人如厕 | 精品午夜久久福利影院 | 国产伦精品一区二区三区免费 | |精品福利一区二区三区| 国产美女视频91| 日韩久久精品一区| 亚洲观看高清完整版在线观看| 91麻豆成人久久精品二区三区| 国产情人综合久久777777| 精品一二三四在线| 91精品国产综合久久久久久久久久| 一区二区不卡在线视频 午夜欧美不卡在| 国产高清精品网站| 久久精品亚洲国产奇米99| 免费观看在线综合| 欧美一区二区三区电影| 天天综合天天做天天综合| 欧美性猛交xxxx黑人交| 亚洲一二三区在线观看| 91成人网在线| 亚洲高清不卡在线观看| 欧美日韩aaa| 日韩av网站在线观看| 欧美福利视频导航| 同产精品九九九| 在线不卡免费av| 日韩福利电影在线观看| 欧美一激情一区二区三区| 毛片一区二区三区| 日韩免费在线观看| 国产在线一区观看| 中文字幕二三区不卡| 99久久久国产精品免费蜜臀| 18涩涩午夜精品.www| 色综合天天天天做夜夜夜夜做| 亚洲欧美日韩国产综合在线| 欧美性生活久久| 日本不卡在线视频| 精品裸体舞一区二区三区| 国产一区二区主播在线| 亚洲国产精品v| 色一情一乱一乱一91av| 一卡二卡三卡日韩欧美| 欧美一区二区在线看| 极品尤物av久久免费看| 中文成人综合网| 欧美午夜一区二区三区| 久久9热精品视频| 国产欧美日本一区二区三区| 91搞黄在线观看| 欧美a级一区二区| 国产日韩欧美一区二区三区综合| av动漫一区二区| 水野朝阳av一区二区三区| 久久久久久一二三区| 91丝袜国产在线播放| 天天色综合天天| 国产精品每日更新在线播放网址| 欧美综合久久久|