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

📄 flashmem.c

📁 vxworks的BSP开发配置文件
💻 C
📖 第 1 页 / 共 2 页
字号:
                   && (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):            {            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_28F800B):        case (FLASH_28F800T):        case (FLASH_28F320B):        case (FLASH_28F320T):            {            SYS_FLASH_WRITE_ENABLE_RTN ();              /* raise Vpp */            *pFA = FLASH28_CMD_ERASE_SETUP;             /* setup */            *pFA = FLASH28_CMD_ERASE_CONFIRM;           /* erase */            /* wait for completion */            for (ix = (FLASH_WIDTH/2)-1; ix >= 0; ix--)                 {                for (;;)                    {                    status = (*pFA) >> (ix * 16);                    if (status & BIT(7))                        break;                    }                if (status & (BIT(5) | BIT(4) | BIT(3) | BIT(1)))                    {                    retVal = ERROR;                    break;                    }                }            *pFA = FLASH28_CMD_RESET;                   /* read array */                        SYS_FLASH_WRITE_DISABLE_RTN ();             /* disable enable */            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.* * 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    (    char * 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, status;    switch (flashType)        {        case (FLASH_28F256):        case (FLASH_28F512):        case (FLASH_28F010):        case (FLASH_28F020):            {            SYS_FLASH_WRITE_ENABLE_RTN ();              /* raise Vpp */            for (pFA = FLASH_CAST (FLASH_ADRS + offset); (pFA < FLASH_CAST                (FLASH_ADRS + size + offset)) && (retVal == OK); pFA++)                for (ix = 0; TRUE; ix++)                    {                    if (pFB != NULL)                        {                        value = readPtr(pFB);                        pFB += FLASH_WIDTH;                        }                    *pFA = FLASH28_CMD_PROG_SETUP;      /* write setup */                    *pFA = value;                       /* data to write */                    sysFlashDelay (10);                 /* wait for write */                    *pFA = FLASH28_CMD_PROG_VERIFY;     /* verify command */                    sysFlashDelay (6);                  /* wait for verify */                    if (*pFA == value)                  /* done? */                        break;                    if (ix == 25)                       /* error? */                        {                        retVal = ERROR;                        break;                        }                    }            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):            {            SYS_FLASH_WRITE_ENABLE_RTN ();              /* enable write */            for (pFA = FLASH_CAST (FLASH_ADRS + offset); pFA < FLASH_CAST                (FLASH_ADRS + size + offset) && (retVal == OK); pFA++)                {                *(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_PROGRAM;                if (pFB != NULL)                    {                    value = readPtr(pFB);                    pFB += FLASH_WIDTH;                    }                *pFA = value;                           /* data to write */                do {                    retVal = sysFlashDataPoll (pFA, (FLASH_DEF) value);                    } while ((*pFA != value) && (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 write */            break;            }        case (FLASH_28F800B):        case (FLASH_28F800T):        case (FLASH_28F320B):        case (FLASH_28F320T):            {            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 = readPtr(pFB);                     pFB += FLASH_WIDTH;                     }                *pFA = FLASH28_CMD_PROG_SETUP;          /* write setup */                *pFA = value;                /* wait for completion */                for (ix = (FLASH_WIDTH/2)-1; ix >= 0; ix--)                     {                    for (;;)                        {                            status = (*pFA) >> (ix * 16);                            if (status & BIT(7))                                break;                        }                    if (status & (BIT(5) | BIT(4) | BIT(3) | BIT(1)))                        {                        retVal = ERROR;                        break;                        }                    } /* end for ix */                } /* end for pFA */                        *pFA = FLASH28_CMD_RESET;                   /* read array */                        SYS_FLASH_WRITE_DISABLE_RTN ();             /* disable enable */            break;            }        default:            retVal = ERROR;        }     return (retVal);    } /******************************************************************************** sysFlashTypeGet - determine the device type of on-board flash memory ** This routine uses the `autoselect' command to determine the device type of* on-board flash memory for flash 29F\f2xxx\f1 devices.** RETURNS: An integer indicating the device type of on-board flash memory.*/UINT8 sysFlashTypeGet (void)    {    volatile FLASH_DEF * pFA = FLASH_CAST (FLASH_ADRS); /* flash address */    UINT8 retVal;    SYS_FLASH_WRITE_ENABLE_RTN ();                      /* enable writes */    *(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_AUTOSELECT;    retVal = (UINT8) *++pFA;    *(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 writes */    return (retVal);    }/******************************************************************************** sysFlashSet - write to flash memory** This routine copies a specified string into flash memory after calling * sysFlashErase() and clearing flash memory.** If the specified string must be overlaid on the contents of flash memory, * undefine FLASH_NO_OVERLAY.** RETURNS: OK, or ERROR if the write fails or the input parameters are * out of range.** SEE ALSO: sysFlashErase(), sysFlashGet(), sysFlashTypeGet(), sysFlashWrite()** INTERNAL* If multiple tasks are calling sysFlashSet() and sysFlashGet(),* they should use a semaphore to ensure mutually exclusive access to flash* memory.*/STATUS sysFlashSet    (    char *string,     /* string to be copied into flash memory */    int strLen,       /* maximum number of bytes to copy       */    int offset        /* byte offset into flash memory         */    )    {    int flashSize = FLASH_SIZE;    static UINT8 flashType = FLASH_MEM_TYPE;#ifndef FLASH_NO_OVERLAY    static char tempBuffer [FLASH_MEM_SIZE];    flashSize = FLASH_MEM_SIZE;#endif  /* FLASH_NO_OVERLAY */    if ((offset < 0) || (strLen < 0) || ((offset + strLen) > flashSize))        return (ERROR);    /* see if contents are actually changing */    if (bcmp ((char *) (FLASH_ADRS + offset), string, strLen) == 0)        return (OK);    /* first read existing data */#ifndef FLASH_NO_OVERLAY    bcopyBytes ((char *) FLASH_ADRS, tempBuffer, flashSize);    bcopyBytes (string, (tempBuffer + offset), strLen);#endif  /* FLASH_NO_OVERLAY */    if (flashType == 0)        flashType = sysFlashTypeGet ();    if (sysFlashErase (flashType) == ERROR)             /* erase device */        return (ERROR);#ifndef FLASH_NO_OVERLAY                                /* program device */    if (sysFlashWrite (tempBuffer, flashSize, 0, flashType, 0) ==        ERROR)#else   /* FLASH_NO_OVERLAY */    if (sysFlashWrite (string, strLen, offset, flashType, 0) ==        ERROR)#endif  /* FLASH_NO_OVERLAY */        return (ERROR);    return (OK);    }

⌨️ 快捷键说明

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