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

📄 sysflashmem.c

📁 vxworks MPC8541 BSP
💻 C
📖 第 1 页 / 共 3 页
字号:
    SYS_FLASH_HW_ENABLE();

    overSize = pos % dataSize;
    curPos = (UINT32)(pos & ~(dataSize - 1));

    while (1)
        {
        dataBuf = buf + scanLen;

        if (overSize != 0)
            {
            memcpy(tempBuf, (char *)(dev->devAddr + curPos), dataSize);
            if (len < (dataSize - overSize))
                memcpy(tempBuf + overSize, dataBuf, len);
            else
                memcpy(tempBuf + overSize, dataBuf, dataSize - overSize);
            dataBuf = tempBuf;
            }
        else if (len < dataSize)
            {
            memcpy(tempBuf, (char *)(dev->devAddr + curPos), dataSize);
            memcpy(tempBuf, dataBuf, len);
            dataBuf = tempBuf;
            }
        else if ((UINT32)dataBuf % dataSize)
            {
            memcpy(tempBuf, dataBuf, dataSize);
            dataBuf = tempBuf;
            }

        if ((*dev->write)(dev, curPos, dataBuf) == ERROR)
            {
            SYS_FLASH_HW_DISABLE();
            semGive(dev->devSem);
            return ERROR;
            }

        if (len <= (dataSize - overSize))
            break;
        else
            {
            len -= dataSize - overSize;
            scanLen += dataSize - overSize;
            }
        overSize = 0;
        curPos += dataSize;
        }

    SYS_FLASH_HW_DISABLE();
    semGive(dev->devSem);

    return OK;
    }

/*******************************************************************************
*
* flashProgram - 
*
*/
STATUS flashProgram(FLASH_DEV *dev, UINT32 pos, char *buf, UINT32 len)
    {
    FLASH_PART *part;
    char *blkBuf = NULL;
    UINT32 blkPos = pos;
    UINT32 partPos = 0;
    UINT32 overSize = 0;
    UINT32 underSize = 0;
    UINT32 dataSize = 0;
    UINT32 scanLen = 0;
    UINT32 stepSize = dev->writeBufMod ? WRITE_BUF_SIZE * dev->bankCount : dev->portSize;
    UINT32 i, j;

    if (!dev->inited)
        {
        if (flashInit() == ERROR)
            return ERROR;
        }

    if (pos + len > dev->devSize)
        {
        printf("flash program position out of range!\n");
        return ERROR;
        }

    if (len == 0)
        return OK;

    semTake(dev->devSem, WAIT_FOREVER);
    SYS_FLASH_HW_ENABLE();

    for (i = 0; i < dev->partCount; i++)
        {
        part = dev->devPart + i;
        partPos += dev->bankCount * part->blockSize * part->blockCount;
        if (blkPos >= partPos)
            continue;

        blkPos &= (UINT32)~(dev->bankCount * part->blockSize - 1);
        overSize = pos + scanLen - blkPos;

        do
            {
            if (scanLen + dev->bankCount * part->blockSize - overSize > len)
                underSize = scanLen + dev->bankCount * part->blockSize - overSize - len;

            if ((overSize != 0) || (underSize != 0) || ((UINT32)(buf + scanLen) % stepSize))
                {
                if ((blkBuf = (char *)malloc(dev->bankCount * part->blockSize)) == NULL)
                    {
                    SYS_FLASH_HW_DISABLE();
                    semGive(dev->devSem);
                    return ERROR;
                    }

                memcpy(blkBuf, (char *)(dev->devAddr + blkPos),
                       dev->bankCount * part->blockSize);
                dataSize = dev->bankCount * part->blockSize - overSize - underSize;
                memcpy(blkBuf + overSize, buf + scanLen, dataSize);

                if ((*dev->erase)(dev, blkPos) == ERROR)
                    {
                    SYS_FLASH_HW_DISABLE();
                    semGive(dev->devSem);
                    free(blkBuf);
                    return ERROR;
                    }
                for (j = 0; j < dev->bankCount * part->blockSize; j += stepSize)
                    {
                    if ((*dev->write)(dev, blkPos + j, blkBuf + j) == ERROR)
                        {
                        SYS_FLASH_HW_DISABLE();
                        semGive(dev->devSem);
                        free(blkBuf);
                        return ERROR;
                        }
                    }

                free(blkBuf);
                }
            else
                {
                if ((*dev->erase)(dev, blkPos) == ERROR)
                    {
                    SYS_FLASH_HW_DISABLE();
                    semGive(dev->devSem);
                    return ERROR;
                    }
                for (j = 0; j < dev->bankCount * part->blockSize; j += stepSize)
                    {
                    if ((*dev->write)(dev, blkPos + j, buf + scanLen + j) == ERROR)
                        {
                        SYS_FLASH_HW_DISABLE();
                        semGive(dev->devSem);
                        return ERROR;
                        }
                    }
                dataSize = dev->bankCount * part->blockSize;
                }

            scanLen += dataSize;
            overSize = 0;
            blkPos += dev->bankCount * part->blockSize;
            } while ((scanLen != len) && (blkPos < partPos));

        if (scanLen == len)
            break;
        }

    SYS_FLASH_HW_DISABLE();
    semGive(dev->devSem);

    return OK;
    }

/*******************************************************************************
*
* flashErase - 
*
*/
STATUS flashErase(FLASH_DEV *dev, UINT32 pos, UINT32 len)
    {
    FLASH_PART *part;
    UINT32 blkPos = pos;
    UINT32 partPos = 0;
    UINT32 i;

    if (!dev->inited)
        {
        if (flashInit() == ERROR)
            return ERROR;
        }

    if (pos + len > dev->devSize)
        {
        printf("flash erase position out of range!\n");
        return ERROR;
        }

    if (len == 0)
        return OK;

    semTake(dev->devSem, WAIT_FOREVER);
    SYS_FLASH_HW_ENABLE();

    for (i = 0; i < dev->partCount; i++)
        {
        part = dev->devPart + i;
        partPos += dev->bankCount * part->blockSize * part->blockCount;
        if (blkPos >= partPos)
            continue;

        blkPos &= (UINT32)~(dev->bankCount * part->blockSize - 1);
        do
            {
            if ((*dev->erase)(dev, blkPos) == ERROR)
                {
                SYS_FLASH_HW_DISABLE();
                semGive(dev->devSem);
                return ERROR;
                }
            blkPos += dev->bankCount * part->blockSize;
            } while ((blkPos < pos + len) && (blkPos < partPos));

        if (blkPos >= pos + len)
            break;
        }

    SYS_FLASH_HW_DISABLE();
    semGive(dev->devSem);

    return OK;
    }

/*******************************************************************************
*
* flashEraseAll - 
*
*/
STATUS flashEraseAll(FLASH_DEV *dev)
    {
    return flashErase(dev, 0, dev->devSize);
    }

/*******************************************************************************
*
* flashWritable - 
*
*/
STATUS flashWritable(FLASH_DEV *dev, UINT32 pos, UINT32 len)
    {
    UINT8 buf[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

    if (!dev->inited)
        {
        if (flashInit() == ERROR)
            return ERROR;
        }

    if (pos + len > dev->devSize)
        {
        printf("flash write position out of range!\n");
        return ERROR;
        }

    if (len == 0)
        return OK;

    if ((pos | len) & (dev->portSize - 1))
        {
        printf("flash unaligned parameter!\n");
        return ERROR;
        }

    while (len)
        {
        (*dev->get)(dev, pos, buf);
        if (*(UINT64 *)buf != 0xFFFFFFFFFFFFFFFFLL)
            return FALSE;
        pos += dev->portSize;
        len -= dev->portSize;
        }

    return TRUE;
    }

/*******************************************************************************
*
* sysNvRamGet - 
*
*/
STATUS sysNvRamGet(char *string, int strLen, int offset)
    {
    FLASH_DEV *dev = FLASH_DEV_NVRAM;

    if (!dev->inited)
        {
        if (flashInit() == ERROR)
            return ERROR;
        }

    if (offset < 0 || strLen < 0 || offset + strLen > NV_RAM_SIZE)
        return ERROR;

    if (flashRead(dev, offset, string, strLen) == ERROR)
        return ERROR;

    return OK;
    }

/*******************************************************************************
*
* sysNvRamSet - 
*
*/
STATUS sysNvRamSet(char *string, int strLen, int offset)
    {
    FLASH_DEV *dev = FLASH_DEV_NVRAM;

    if (!dev->inited)
        {
        if (flashInit() == ERROR)
            return ERROR;
        }

    if (offset < 0 || strLen < 0 || offset + strLen > NV_RAM_SIZE)
        return ERROR;

    if (memcmp((char *)(dev->devAddr + offset), string, strLen) == 0)
        return OK;

    if (flashProgram(dev, offset, string, strLen) == ERROR)
        return ERROR;

    return OK;
    }

int WriteBootCfgPara(char *pvCfgPara, int length, unsigned long paraType)
{
    UINT offset = 0;
    FLASH_DEV *dev = FLASH_DEV_NVRAM;

    if (!dev->inited)
        {
        if (flashInit() == ERROR)
            return ERROR;
        }
 
    if (paraType == 1)
        offset = NV_RAM_SIZE;

    if (length < 0 || length > 0x200)
        return ERROR;
 
    return (flashProgram(dev,offset,pvCfgPara, length));
}


int ReadBootCfgPara (char *pvCfgPara, int length, UINT paraType)
{
    UINT offset = 0;
    FLASH_DEV *dev = FLASH_DEV_NVRAM;

    if (!dev->inited)
        {
        if (flashInit() == ERROR)
            return ERROR;
        }
 
    if (paraType == 1)
       offset = NV_RAM_SIZE;

    if (length < 0 || length > 0x100)
        return ERROR;

    return (flashRead(dev, offset,pvCfgPara, length));
}




/*
 *------------------------------------------------------------------------------
 * flashTest -
 *------------------------------------------------------------------------------
 */
/*lint -e449*/
STATUS flashTest(FLASH_DEV *dev)
    {
    FLASH_PART *part;
    UINT32 *buf = 0;
    UINT32 pos;
    int scanLen = 0;
    UINT32 i, j, k;
    int retVal = ERROR;

    if (flashCheck(dev) == ERROR)
        return ERROR;

    printf("\nErase dev%d...", (int)(dev - flashDev));

    if (flashEraseAll(dev) == ERROR)
        {
        printf("failed!\n");
        goto done;
        }
    else
        printf("done.\n");

    for (i = 0; i < dev->partCount; i++)
        {
        printf("Write part%d", i);
        part = dev->devPart + i;

        buf = malloc(dev->bankCount * part->blockSize);
        if (buf == 0)
            {
            printf("\nOut of memory!\n");
            goto done;
            }

        for (j = 0; j < part->blockCount; j++)
            {
            for (k = 0; k < dev->bankCount * part->blockSize / 4; k++)
                buf[k] = j << 24 | k;

            pos = dev->bankCount * part->blockSize * j + scanLen;
            if (flashWrite(dev, pos, (char *)buf, dev->bankCount * part->blockSize)
                == ERROR)
                {
                printf("\nWrite failed (part:%d, block:%d)\n", i, j);
                goto done;
                }

            printf(".");
            }

        scanLen += dev->bankCount * part->blockSize * part->blockCount;
        free(buf);
        printf("done.\n");
        }

    scanLen = 0;

    for (i = 0; i < dev->partCount; i++)
        {
        printf("Verify part%d", i);
        part = dev->devPart + i;

        buf = malloc(dev->bankCount * part->blockSize);
        if (buf == 0)
            {
            printf("\nOut of memory!\n");
            goto done;
            }

        for (j = 0; j < part->blockCount; j++)
            {
            pos = dev->bankCount * part->blockSize * j + scanLen;
            if (flashRead(dev, pos, (char *)buf, dev->bankCount * part->blockSize)
                == ERROR)
                {
                printf("\nRead failed (part:%d, block:%d)\n", i, j);
                goto done;
                }

            for (k = 0; k < dev->bankCount * part->blockSize / 4; k++)
                if (buf[k] != (j << 24 | k))
                    {
                    printf("\nVerify failed (part:%d, block:%d)\n", i, j);
                    goto done;
                    }

            printf(".");
            }

        scanLen += dev->bankCount * part->blockSize * part->blockCount;
        free(buf);
        printf("ok.\n");
        }

    printf("Erase dev%d...", (int)(dev - flashDev));

    if (flashEraseAll(dev) == ERROR)
        {
        printf("failed!\n");
        goto done;
        }
    else
        printf("done.\n");

    retVal = OK;

done:
    if (buf && retVal != OK)
        free(buf);

    if (retVal == OK)
        printf("Flash test device %d passed!\n", (int)(dev - flashDev));
    else
        printf("Flash test device %d failed!\n", (int)(dev - flashDev));

    return retVal;
    }
/*lint +e449*/
STATUS flashTestAll(void)
    {
    int i;
    int retVal = OK;

    printf("\nFlash test all: devices = %d\n", devCount);

    if (flashInit() == ERROR)
        return ERROR;

    for (i = 1; i < devCount; i++)
        {
        FLASH_DEV *dev = &flashDev[i];

        if (dev->inited && flashTest(dev) == ERROR)
            retVal = ERROR;
        }

    if (retVal == OK)
        printf("\nFlash test all passed!\n");
    else
        printf("\nFailed because of earlier errors!\n");

    return retVal;
    }

⌨️ 快捷键说明

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