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

📄 sysflashmem.c

📁 vxworks MPC8541 BSP
💻 C
📖 第 1 页 / 共 3 页
字号:
                break;
            curPos += dev->portSize;
            tempBuf += dev->portSize;
            }
        if (curPos == (pos + dataSize))
            return OK;
        }

    if (dev->writeBufMod)
        {
        for (j = 0; j < dev->portSize; j += dev->portSize / dev->bankCount)
            {
            (*dev->get)(dev, pos, stat);
            if (stat[j + dev->portSize / dev->bankCount - 1] & 0x02)
                {
                printf("flash write buffer aborted!\n");
                (*dev->set)(dev, 0x5555 * dev->portSize, (char *)&amdFlashCmd[0]);
                (*dev->set)(dev, 0x2AAA * dev->portSize, (char *)&amdFlashCmd[1]);
                (*dev->set)(dev, 0x5555 * dev->portSize, (char *)&amdFlashCmd[7]);
                return ERROR;
                }
            }
        }

    printf("flash check timeout!\n");

    amdFlashReset(dev);

    return ERROR;
    }

/*******************************************************************************
*
* intelFlashReset - 
*
*/
static void intelFlashReset(FLASH_DEV *dev)
    {
    (*dev->set)(dev, 0x0, (char *)&intelFlashCmd[4]);
    (*dev->set)(dev, 0x0, (char *)&intelFlashCmd[0]);
    }

/*******************************************************************************
*
* intelFlashProbe - 
*
*/
static STATUS intelFlashProbe(FLASH_DEV *dev)
    {
    FLASH_UNIT *unit = &flashUnit[dev->unitNo];
    FLASH_PHY *phy = flashPhy;
    UINT8 offset = dev->portSize > 1 ? 0 : 1;

    if (unit->inited && unit->phy->isAmdType)
        return ERROR;

    if (!unit->inited)
        {
        unit->unitAddr = dev->devAddr;

        memset(&tempID, 0, sizeof(tempID));
        memset(&buffID, 0, sizeof(buffID));

        flashCmdRawSet(dev, 0x0, (char *)&intelFlashCmd[1]);

        taskDelay(1);

        if (dev->portSize == 1 && dev->unitNo != 0)
            {
            flashCfgRawGet(dev, 0x0, (char *)&tempID.vendorID);
            flashCfgRawGet(dev, 0x2, (char *)&tempID.deviceID);
            }
        else
            {
            flashCfgRawGet(dev, 0x0, (char *)&tempID.vendorID);
            flashCfgRawGet(dev, 0x1, (char *)&tempID.deviceID);
            }

        flashCmdRawSet(dev, 0x0, (char *)&intelFlashCmd[4]);
        flashCmdRawSet(dev, 0x0, (char *)&intelFlashCmd[0]);

        if (*(char *)&tempID.vendorID != (char)0xFF)
            buffID = tempID;

        do
            {
            if ((memcmp((char *)&tempID.vendorID, (char *)&phy->flashID->vendorID + offset, dev->portSize) == OK) &&
                (memcmp((char *)&tempID.deviceID, (char *)&phy->flashID->deviceID + offset, dev->portSize) == OK) &&
                !phy->isAmdType)
                {
                unit->phy = phy;
                unit->inited = 1;
                break;
                }
            phy++;
            } while (phy->flashID != (FLASH_ID *)-1);

        if (!unit->inited)
            return ERROR;
        }

    flashPartIdentify(dev, unit->phy->flashPart, unit->phy->partCount);

    unit->devCount++;

    switch (dev->portSize)
        {
    case 8:
        dev->get = flashGetOctet8;
        dev->set = flashSetOctet8;
        break;

    case 4:
        dev->get = flashGetOctet4;
        dev->set = flashSetOctet4;
        break;

    case 2:
        dev->get = flashGetOctet2;
        dev->set = flashSetOctet2;
        break;

    case 1:
        dev->get = flashGetOctet1;
        dev->set = flashSetOctet1;
        break;

    default:
        return ERROR;
        }

    if (dev->writeBufMod && unit->phy->writeBufMod)
        dev->write = intelFlashBWrite;
    else
        {
        dev->write = intelFlashWrite;
        dev->writeBufMod = 0;
        }

    dev->erase = intelFlashErase;

    if (!unit->unitSem)
        {
        unit->unitSem = semBCreate(SEM_Q_FIFO, SEM_FULL);
        if (unit->unitSem == NULL)
            return ERROR;
        }
    dev->devSem = unit->unitSem;

    dev->unit = unit;

    intelFlashUnlockAll(dev);

    dev->inited = 1;

    return OK;
    }

/*******************************************************************************
*
* intelFlashUnlock - 
*
*/
static STATUS intelFlashUnlock(FLASH_DEV *dev, UINT32 pos)
    {
    char stat[8];
    int retVal = OK;
    UINT32 i;

    (*dev->set)(dev, pos, (char *)&intelFlashCmd[1]);
    if (dev->portSize != 1)
        (*dev->get)(dev, pos + dev->portSize * 2, stat);
    else
        (*dev->get)(dev, pos + dev->portSize * 4, stat);

    intelFlashReset(dev);

    for (i = 0; i < dev->portSize; i += dev->portSize / dev->bankCount)
        {
        if (stat[i + dev->portSize / dev->bankCount - 1] & 0x1)
            {
            retVal = ERROR;
            break;
            }
        }

    if (retVal == OK)
        return retVal;

    (*dev->set)(dev, pos, (char *)&intelFlashCmd[9]);
    (*dev->set)(dev, pos, (char *)&intelFlashCmd[8]);

    return intelFlashCheck(dev, pos, FLASH_POLL_UNLOCK);
    }

/*******************************************************************************
*
* intelFlashUnlockAll - 
*
*/
static STATUS intelFlashUnlockAll(FLASH_DEV *dev)
    {
    FLASH_PART *part;
    UINT32 blkPos = 0;
    UINT32 i, j;

    for (i = 0; i < dev->partCount; i++)
        {
        part = dev->devPart + i;
        for (j = 0; j < part->blockCount; j++)
            {
            if (intelFlashUnlock(dev, blkPos) == ERROR)
                return ERROR;

            blkPos += dev->bankCount * part->blockSize;
            }
        }

    return OK;
    }

/*******************************************************************************
*
* intelFlashErase - 
*
*/
static STATUS intelFlashErase(FLASH_DEV *dev, UINT32 pos)
    {
    (*dev->set)(dev, pos, (char *)&intelFlashCmd[6]);
    (*dev->set)(dev, pos, (char *)&intelFlashCmd[8]);

    return intelFlashCheck(dev, pos, FLASH_POLL_ERASE);
    }

/*******************************************************************************
*
* intelFlashWrite - 
*
*/
static STATUS intelFlashWrite(FLASH_DEV *dev, UINT32 pos, char *buf)
    {
    (*dev->set)(dev, pos, (char *)&intelFlashCmd[5]);
    (*dev->set)(dev, pos, buf);

    return intelFlashCheck(dev, pos, FLASH_POLL_WRITE);
    }

/*******************************************************************************
*
* intelFlashBWrite - 
*
*/
static STATUS intelFlashBWrite(FLASH_DEV *dev, UINT32 pos, char *buf)
    {
    UINT32 curPos = pos;
    int intLevel;
    UINT32 i;

    (*dev->set)(dev, pos, (char *)&intelFlashCmd[13]);
    if (dev->portSize != 1)
        (*dev->set)(dev, pos, (char *)&intelFlashCmd[14]);
    else
        (*dev->set)(dev, pos, (char *)&intelFlashCmd[15]);

    intLevel = intLock();
    for (i = 0; i < WRITE_BUF_SIZE * dev->bankCount / dev->portSize; i++)
        {
        (*dev->set)(dev, curPos, buf);
        curPos += dev->portSize;
        buf += dev->portSize;
        }
    intUnlock(intLevel);

    (*dev->set)(dev, pos, (char *)&intelFlashCmd[8]);

    return intelFlashCheck(dev, pos, FLASH_POLL_WRITE);
    }

/*******************************************************************************
*
* intelFlashCheck - 
*
*/
static STATUS intelFlashCheck(FLASH_DEV *dev, UINT32 pos, int option)
    {
    int retVal = ERROR, chkGo = FALSE;
    UINT32 i, j;
    UINT32 polls;
    char stat[8];

    if (option == FLASH_POLL_ERASE)
        polls = FLASH_ERASE_TIMEOUT;
    else
        polls = FLASH_WRITE_TIMEOUT;

    for (i = 0; i < polls; i++)
        {
        if (option == FLASH_POLL_ERASE)
            {
            SYS_FLASH_TIMER_RESET();
            taskDelay(1);
            }

        (*dev->get)(dev, pos, stat);

        chkGo = FALSE;
        for (j = 0; j < dev->portSize; j += dev->portSize / dev->bankCount)
            {
            if ((stat[j + dev->portSize / dev->bankCount - 1] & 0x80) != 0x80)
                {
                chkGo = TRUE;
                break;
                }
            }

        if (!chkGo)
            {
            retVal = OK;
            break;
            }
        }

    SYS_FLASH_TIMER_RESET();

    if (retVal == OK)
        {
        (*dev->get)(dev, pos, stat);
        for (i = 0; i < dev->portSize; i += dev->portSize / dev->bankCount)
            {
            if (stat[i + dev->portSize / dev->bankCount - 1] & 0x3A)
                {
                printf("flash write error!\n");
                intelFlashReset(dev);
                return ERROR;
                }
            }
        }
    else
        printf("flash check timeout!\n");

    intelFlashReset(dev);

    return retVal;
    }

/*******************************************************************************
*
* flashInit - 
*
*/
STATUS flashInit(void)
    {
   /* int retVal;*/
    int unit;
    int i;

    if (flashInited)
        return OK;

    flashInited = 1;

    SYS_FLASH_HW_INIT();

    SYS_FLASH_HW_ENABLE();

    for (i = 0; i < FLASH_UNIT_NUM; i++)
        {
        memset((char *)(flashUnit + i), 0, sizeof(FLASH_UNIT));
        flashUnit[i].unitNo = i;
        }

    for (
#ifdef __BOOTROM__
        i = 0,
#else
        i = 1,
#endif /* __BOOTROM__ */
        unit = i;
        i < devCount;
        i++
        )
        {
        if ((/*retVal = */amdFlashProbe(flashDev + i)) == ERROR)
            if ((/*retVal = */intelFlashProbe(flashDev + i)) == ERROR)
                {
                if ((flashDev + i)->unitNo == unit)
                    {
                    switch ((flashDev + i)->portSize)
                        {
                    case 8:
                        printf("flash unit %d init failed! VendorID = 0x%08x%08x DeviceID = 0x%08x%08x\n",
                               unit,
                               *(UINT32 *)&buffID.vendorID,
                               *(UINT32 *)((char *)&buffID.vendorID + 4),
                               *(UINT32 *)&buffID.deviceID,
                               *(UINT32 *)((char *)&buffID.deviceID + 4));
                        break;

                    case 4:
                        printf("flash unit %d init failed! VendorID = 0x%08x DeviceID = 0x%08x\n",
                               unit,
                               *(UINT32 *)&buffID.vendorID,
                               *(UINT32 *)&buffID.deviceID);
                        break;

                    case 2:
                        printf("flash unit %d init failed! VendorID = 0x%04x DeviceID = 0x%04x\n",
                               unit,
                               *(UINT16 *)&buffID.vendorID,
                               *(UINT16 *)&buffID.deviceID);
                        break;

                    case 1:
                        printf("flash unit %d init failed! VendorID = 0x%02x DeviceID = 0x%02x\n",
                               unit,
                               *(UINT8 *)&buffID.vendorID,
                               *(UINT8 *)&buffID.deviceID);
                        break;

                    default:
                        break;
                        }

                    unit++;
                    }

                flashInited = 0;

                continue;
                }

        if ((flashDev + i)->unitNo == unit)
            {
            printf("flash unit %d init OK!\n", unit);
            unit++;
            }
        }

    SYS_FLASH_HW_DISABLE();

    return flashInited == 1 ? OK : ERROR;
    }

/*******************************************************************************
*
* flashCheck - 
*
*/
static STATUS flashCheck(FLASH_DEV *dev)
    {
    if (!flashInited)
        {
        printf("flash not initialized!\n");
        return ERROR;
        }

    if (dev < &flashDev[0] || dev >= &flashDev[devCount])
        {
        printf("flash dev parameter error!\n");
        return ERROR;
        }

    if (!dev->inited)
        {
        printf("flash device %d not available!\n", (int)(dev - flashDev));
        return ERROR;
        }

    return OK;
    }

/*******************************************************************************
*
* flashRead - 
*
*/
STATUS flashRead(FLASH_DEV *dev, UINT32 pos, char *buf, UINT32 len)
    {
    if (!dev->inited)
        {
        if (flashInit() == ERROR)
            return ERROR;
        }

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

    if (len == 0)
        return OK;

    semTake(dev->devSem, WAIT_FOREVER);

    memcpy(buf, (char *)(dev->devAddr + pos), len);

    semGive(dev->devSem);

    return OK;
    }

/*******************************************************************************
*
* flashWrite - 
*
*/
STATUS flashWrite(FLASH_DEV *dev, UINT32 pos, char *buf, UINT32 len)
    {
    UINT32 curPos;
    char *dataBuf;
    char tempBuf[WRITE_BUF_SIZE * FLASH_BANK_MAX];
    UINT32 dataSize = dev->writeBufMod ? WRITE_BUF_SIZE * dev->bankCount : dev->portSize;
    UINT32 overSize = 0;
    int scanLen = 0;

    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;

    semTake(dev->devSem, WAIT_FOREVER);

⌨️ 快捷键说明

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