亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产超碰在线一区| 91麻豆精品91久久久久同性| 91视视频在线观看入口直接观看www | 亚洲九九爱视频| 亚洲国产成人porn| 国产一区在线观看麻豆| 91尤物视频在线观看| 日韩午夜激情免费电影| 国产精品伦理一区二区| 99国产精品国产精品久久| 欧美日韩免费高清一区色橹橹| 日韩欧美一区在线| 中文字幕乱码一区二区免费| 亚洲国产精品一区二区久久 | 久久精品夜色噜噜亚洲a∨| 成人欧美一区二区三区在线播放| 日本亚洲欧美天堂免费| a4yy欧美一区二区三区| 欧美一区二区三区四区在线观看| 中文字幕乱码一区二区免费| 日日夜夜免费精品视频| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 欧美一区二区日韩一区二区| 欧美国产精品中文字幕| 日韩极品在线观看| 波多野结衣视频一区| 日韩欧美视频一区| 亚洲免费在线电影| 国产在线精品免费| 欧美理论片在线| √…a在线天堂一区| 日韩美女视频在线| 亚洲欧美国产毛片在线| 韩国三级电影一区二区| 欧美三区在线观看| 国产精品久久夜| 国模娜娜一区二区三区| 欧美日韩电影在线播放| 亚洲欧美日韩中文字幕一区二区三区| 国产在线播放一区三区四| 欧美撒尿777hd撒尿| 国产精品久久久久久久久果冻传媒| 全国精品久久少妇| 欧美日韩中字一区| 中文字幕佐山爱一区二区免费| 国产在线看一区| 欧美一区在线视频| 亚洲电影一区二区| 日本韩国欧美一区| 中文字幕日本乱码精品影院| av一区二区三区四区| 99re热视频精品| 久久久99精品免费观看不卡| 日产欧产美韩系列久久99| 色婷婷久久久久swag精品| 激情伊人五月天久久综合| 欧美伊人精品成人久久综合97| 国产精品久久久久久久久果冻传媒| 国产精选一区二区三区| 久久一夜天堂av一区二区三区| 免费日韩伦理电影| 欧美一级在线免费| 日韩**一区毛片| 欧美精品日韩一区| 亚洲h精品动漫在线观看| 欧美性感一区二区三区| 亚洲最色的网站| 欧美视频你懂的| 午夜久久久影院| 91精品国产一区二区| 免费黄网站欧美| 欧美一区二区日韩一区二区| 欧美aa在线视频| 日韩精品一区二| 精品一区二区三区的国产在线播放 | 色吊一区二区三区| 亚洲精品视频在线| 91黄色免费看| 性久久久久久久| 欧美福利视频导航| 日日摸夜夜添夜夜添精品视频| 亚洲一级片在线观看| 色又黄又爽网站www久久| 一区二区欧美精品| 欧美人与禽zozo性伦| 天天av天天翘天天综合网| 欧美丰满一区二区免费视频| 日韩av在线播放中文字幕| 日韩欧美高清一区| 国产风韵犹存在线视精品| 国产精品丝袜91| 91久久精品网| 日韩高清一区二区| 国产亚洲欧美一级| 99精品国产视频| 午夜不卡在线视频| 精品日韩欧美一区二区| 成人h版在线观看| 亚洲午夜免费福利视频| 日韩精品一区二区三区在线播放| 国产精品中文有码| 中文字幕一区日韩精品欧美| 欧美私模裸体表演在线观看| 久久精品久久综合| 国产精品色婷婷| 精品污污网站免费看| 久久99国产精品成人| 中文一区一区三区高中清不卡| 日本高清无吗v一区| 日本成人中文字幕在线视频| 国产日本欧美一区二区| 精品视频一区 二区 三区| 精品系列免费在线观看| 亚洲毛片av在线| 全国精品久久少妇| 1024国产精品| 日韩女优毛片在线| av一区二区三区四区| 同产精品九九九| 国产人成亚洲第一网站在线播放| 在线免费观看成人短视频| 久久成人久久鬼色| 亚洲精品第一国产综合野| 日韩美女一区二区三区| 91蜜桃婷婷狠狠久久综合9色| 免费一级片91| 亚洲色图制服诱惑| 精品美女在线观看| 在线欧美一区二区| 国产成人av电影| 日韩精品亚洲一区二区三区免费| 国产精品毛片久久久久久久| 91精品麻豆日日躁夜夜躁| 99re成人精品视频| 国产精品一色哟哟哟| 亚洲午夜久久久久久久久电影网 | 粉嫩高潮美女一区二区三区| 亚洲国产欧美日韩另类综合| 国产精品久久久一区麻豆最新章节| 欧美一区欧美二区| 日本久久一区二区三区| 国产中文字幕精品| 琪琪一区二区三区| 一级做a爱片久久| 国产精品久久毛片av大全日韩| 欧美xxxx老人做受| 欧美精品日韩一区| 色妹子一区二区| 欧美国产精品中文字幕| 欧美一区二区网站| 欧美午夜精品一区| av成人老司机| 国产ts人妖一区二区| 精品一区二区三区视频| 亚洲国产精品一区二区尤物区| 亚洲视频1区2区| 国产精品视频麻豆| 国产欧美精品一区二区色综合| 日韩网站在线看片你懂的| 在线观看91精品国产麻豆| 91极品视觉盛宴| 色婷婷激情久久| 99这里只有久久精品视频| 国产成人在线色| 精品一区二区三区不卡| 蜜桃免费网站一区二区三区| 日韩精品一二三| 日韩精品一卡二卡三卡四卡无卡| 亚洲一区二区三区四区的| 一区二区在线免费观看| 亚洲视频在线一区| 亚洲柠檬福利资源导航| 亚洲欧洲日产国码二区| 国产精品久久久一区麻豆最新章节| 欧美激情资源网| 国产婷婷精品av在线| 欧美激情中文字幕| 国产精品久久国产精麻豆99网站| 国产精品嫩草影院com| 中文字幕乱码日本亚洲一区二区| 久久精品亚洲乱码伦伦中文| 欧美精品一区二区三区在线 | 欧美性猛交xxxx黑人交| 免费在线看成人av| 美腿丝袜亚洲三区| 精彩视频一区二区三区| 激情综合一区二区三区| 国产乱淫av一区二区三区| 国产精品一区二区免费不卡 | 亚洲精品一区二区三区影院| 精品国产免费人成在线观看| 久久亚洲春色中文字幕久久久| 国产欧美综合在线| 亚洲欧洲一区二区在线播放| 亚洲摸摸操操av| 亚洲一级片在线观看| 日av在线不卡| 国产麻豆精品在线| www.亚洲在线| 欧美三级欧美一级|