⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flashmem.c

📁 vwworks 在 at91rm9200上的bsp配置
💻 C
📖 第 1 页 / 共 3 页
字号:
	    SYS_FLASH_WRITE_DISABLE_RTN ();		/* lower Vpp */
            break;

        case (FLASH_29LV160T):
        case (FLASH_29LV160B):
	case (FLASH_29LV040B):    
	    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;
            *pFA		  		   = FLASH29_CMD_SECTOR;

            do {
                retVal = sysFlashDataPoll (pFA, (FLASH_DEF) 0xffffffff);
                } while ((*pFA != (FLASH_DEF) 0xffffffff) && (retVal == OK));


	    SYS_FLASH_WRITE_DISABLE_RTN ();		/* disable write */
	    break;
        default:
            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):
	case (FLASH_28F160):
	case (FLASH_28F320):
	    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_28F640J3A):
	case (FLASH_28F320J3A):
	case (FLASH_28F128J3A):
	    SYS_FLASH_WRITE_ENABLE_RTN ();		/* raise Vpp */

	    *pFA = FLASH28_CMD_ERASE_SETUP;		/* setup */
	    *pFA = FLASH28F008_CMD_ERASE;		/* erase */

	    /* Check Write State Machine Status */

	    do
	      {
	      } 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_29LV160T):
        case (FLASH_29LV160B):
	case (FLASH_29LV040B):
            {
	    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;
        }

    return (retVal);
    }

/******************************************************************************
*
* sysFlashWrite - write data to flash memory
*
* This routine copies specified data of a specified length, <size>, into a
* specified offset, <offset>, in the flash memory.  Data is passed as a string,
* <pFB>, if not NULL.  If NULL, data is taken as a repeated sequence of
* <value>.
* The parameter <flashType> should be set to the flash device code.
* The parameter <offset> must be appropriately aligned for the width of
* the Flash devices in use.
*
* Flash 28F\f2xxx\f1 devices are programmed by a sequence of operations:
* .iP
* set up device to write
* .iP
* perform write
* .iP
* verify the write
* .LP
*
* Flash 29F\f2xxx\f1 devices are programmed by a sequence of operations:
* .iP
* set up device to write
* .iP
* perform write
* .iP
* wait for the write to complete
* .LP
*
* RETURNS: OK, or ERROR if the write operation fails.
*
* SEE ALSO: sysFlashSet()
*/

STATUS sysFlashWrite
    (
    FLASH_DEF *	pFB,		/* string to be copied; use <value> if NULL */
    int		    size,		/* size to program in bytes */
    int		    offset,		/* byte offset into flash memory */
    UINT8	    flashType,	/* type of flash memory on-board */
    FLASH_DEF	value		/* value to program */
    )
    {
    volatile FLASH_DEF * pFA;		/* flash address */
    STATUS retVal = OK;
    int ix;
    int sectorSize = 128;
    int twc = 2;	/* time for write completion */

#ifdef FLASH_DEBUG_PRINT
	printf("sysSectorWrite: pFB = %s, offset = 0x%x, size = %d\n",pFB,offset,size);

#endif /* FLASH_DEBUG_PRINT */

    switch (flashType)
        {
	case (FLASH_28F008):
	case (FLASH_28F016):
	case (FLASH_28F160):
	case (FLASH_28F320):
	    SYS_FLASH_WRITE_ENABLE_RTN ();		/* raise Vpp */

            for (pFA = FLASH_CAST (FLASH_ADRS + offset); (pFA < FLASH_CAST
                (FLASH_ADRS + size + offset)) && (retVal == OK); pFA++)
		{
		if (pFB != NULL)
		    value = *pFB++;

		*pFA = FLASH28_CMD_PROG_SETUP;	/* write setup */
		*pFA = value;			/* data to write */

		/* Check Write State Machine Status */

		do
		    {
		    *pFA = FLASH28F008_CMD_READ_STATUS;
		    }
		while ((*pFA & FLASH28F008_STAT_WSMS) != FLASH28F008_STAT_WSMS);


		/* Check Byte Write Error Status */

		if ((*pFA & FLASH28F008_STAT_BWS) != 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_28F320J3A):	    
	case (FLASH_28F640J3A):	    
	case (FLASH_28F128J3A):
        SYS_FLASH_WRITE_ENABLE_RTN ();     /* raise Vpp */

#ifdef INCLUDE_FLASH_WRITE_BUFFER

#define FLASH28_BUFFER_SIZE             (32 * (FLASH_WIDTH / FLASH_CHIP_WIDTH))
#define FLASH28_CMD_CONFIRM_WRITE       (FLASH_DEF) 0xD0D0D0D0
#define FLASH28_CMD_WRITE_TO_BUFFER     (FLASH_DEF) 0xE8E8E8E8
#define FLASH28_CMD_WSM_ERROR           (FLASH_DEF) 0x003a003a

        {
        volatile FLASH_DEF *    pFlash;		/* flash address */
        int                     nBytes;
        int                     adrs;

        nBytes = size;
        adrs   = offset;

#ifdef FLASH_DEBUG_PRINT
	printf("sysSectorWrite: using write buffer algorithm\n");
#endif /* FLASH_DEBUG_PRINT */
        
        pFA    = FLASH_CAST (FLASH_ADRS + adrs);
        pFlash = pFA;

        while (nBytes >= FLASH28_BUFFER_SIZE && (retVal == OK))
            {
            /* write to buffer command */
            *pFA = FLASH28_CMD_WRITE_TO_BUFFER;

            while ((*pFA & FLASH28F008_STAT_WSMS) != FLASH28F008_STAT_WSMS);

            /* write number of data to write */
            *pFA = (FLASH_DEF) (((FLASH28_BUFFER_SIZE / FLASH_WIDTH - 1) << 16)
                                | (FLASH28_BUFFER_SIZE / FLASH_WIDTH - 1));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -