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

📄 sysflash.c

📁 WINDRIVER SBC7410 BSP
💻 C
📖 第 1 页 / 共 3 页
字号:
    int newLen=0 ;    UINT8 *memBuf ;    int alignment ;    int nBytes ;#ifdef FLASH_DEBUG    printf("sysFlashSectorWriteIntel: programming @ 0x%x.\n",(unsigned)adrs);#endif    if ( sysFlashBlockLockStatusIntel((FlashWord*)adrs) == OK )        {#ifdef FLASH_DEBUG        printf("sysFlashSectorWriteIntel: sectorAdrs 0x%x is locked.\n",(unsigned)adrs);#endif        return ERROR ;        }    /* programming address must being on word boundary */    switch ( ((UINT32)adrs&0x3) )        {        case 0:            ptr = (FlashWord*)adrs ;            newLen = len ;            break;        case 1:            ptr = (FlashWord*)((UINT32)adrs-1) ;            newLen = len+1 ;            break;        case 2:            ptr = (FlashWord*)((UINT32)adrs-2) ;            newLen = len+2 ;            break;        case 3:            ptr = (FlashWord*)((UINT32)adrs-3) ;            newLen = len+3 ;            break;        }    /* make length a multiple of 4 */    switch ( newLen%4 )        {        case 0:            break;        case 1:            newLen += 3 ;            break;        case 2:            newLen += 2 ;            break;        case 3:            newLen += 1 ;            break;        }    /* assumes that sector has been erased */    memBuf = (UINT8*)cacheDmaMalloc(newLen) ;    if ( memBuf == NULL )        {        logMsg("Unable to allocate memory size %d bytes.\n",newLen,2,3,4,5,6);        return ERROR ;        }    /* copy existing secdtor data to memBuf */    memcpy(memBuf,ptr,newLen);    alignment = (UINT32)adrs & 0x3 ;    /* copy buffer data to memBuf */    memcpy(&memBuf[alignment],buf,len);    nBytes = newLen ;    src = (FlashWord *)memBuf ;    dst = ptr ;    for ( i=0 ; i < (nBytes/4); i++, src++, dst++ )        {        if ( src->l == 0xffffffff )            continue;        ptr->l = 0x00400040 ;        dst->l = src->l ;        if ( sysFlashPollDataIntel(ptr) != OK )            {            ptr->l = 0x00ff00ff ;            sysFlashDelay();            printf("sysFlashSectorWriteIntel: sysFlashPollDataIntel failure.\n");            if ( memBuf != NULL )                cacheDmaFree(memBuf);            return ERROR ;            }        }    if ( memBuf != NULL )        cacheDmaFree(memBuf);    ptr->l = 0x00ff00ff ;    sysFlashDelay();    return OK ;    }/******************************************************************************** sysFlashEraseStrataflash - erase the requested Intel Strataflash sector.** RETURNS: OK, or ERROR if input argument error failure to erase sector.**/STATUS sysFlashEraseStrataflash    (    UINT8 * sectorAdrs    )    {    /* validate input arg */    if ( ((UINT32)sectorAdrs) < INTEL28F640_BASE_ADRS )        {        printf("sysFlashEraseStrataflash: invalid sector adrs - 0x%x\n",(unsigned)sectorAdrs);        return ERROR ;        }    if ( (((UINT32)sectorAdrs)) > (INTEL28F640_BASE_ADRS+INTEL28F640_SIZE) )        {        printf("sysFlashEraseStrataflash: invalid sector adrs - 0x%x\n",(unsigned)sectorAdrs);        return ERROR ;        }    /* check device */    if ( sysFlashReadIdIntel((FlashWord*)INTEL28F640_BASE_ADRS) != OK )        {        printf("sysFlashEraseStrataflash: can't read id from device\n");        return ERROR ;        }    if ( sysFlashSectorEraseIntel((char*)sectorAdrs) != OK )        {        printf("sysFlashEraseStrataflash: sysFlashSectorEraseIntel failure.\n");        return ERROR ;        }    return OK ;    }/******************************************************************************** sysFlashWriteStrataflash - program the requested sector using the byte program* algorithm. The data buffer must fit in the requested Intel Strataflash sector.** RETURNS: OK, or ERROR if input argument error failure to program sector.**/STATUS sysFlashWriteStrataflash    (    UINT8 * sectorAdrs,     UINT8 * buffer,     int length    )    {    /* validate input arg */    if ( ((UINT32)sectorAdrs) < INTEL28F640_BASE_ADRS )        {        printf("sysFlashWriteStrataflash: invalid sector adrs - 0x%x\n",(unsigned)sectorAdrs);        return ERROR ;        }    if ( (((UINT32)sectorAdrs)+length) > (INTEL28F640_BASE_ADRS+INTEL28F640_SIZE) )        {        printf("sysFlashWriteStrataflash: invalid sector adrs - 0x%x\n",(unsigned)sectorAdrs);        return ERROR ;        }    /* check device */    if ( sysFlashReadIdIntel((FlashWord*)INTEL28F640_BASE_ADRS) != OK )        {        printf("sysFlashWriteStrataflash: can't read id from device\n");        return ERROR ;        }    if ( sysFlashSectorWriteIntel(sectorAdrs, buffer, length)!=OK )        {        printf("sysFlashWriteStrataflash: sysFlashSectorWriteIntel failure.\n");        return ERROR ;        }    return OK ;    }/******************************************************************************** sysFlashWriteBufferStrataflash - program using the write buffer algorithm* the Intel strataflash sector. The data buffer must fit in the requested sector.** RETURNS: OK, or ERROR if input argument error failure to program sector.**/STATUS sysFlashWriteBufferStrataflash    (    UINT8 * sectorAdrs,     UINT8 * buffer,     int length    )    {    /* validate input arg */    if ( ((UINT32)sectorAdrs) < INTEL28F640_BASE_ADRS )        {        printf("sysFlashWriteBufferStrataflash: invalid sector adrs - 0x%x\n",(unsigned)sectorAdrs);        return ERROR ;        }    if ( (((UINT32)sectorAdrs)+length) > (INTEL28F640_BASE_ADRS+INTEL28F640_SIZE) )        {        printf("sysFlashWriteBufferStrataflash: invalid sector adrs - 0x%x\n",(unsigned)sectorAdrs);        return ERROR ;        }    /* check device */    if ( sysFlashReadIdIntel((FlashWord*)INTEL28F640_BASE_ADRS) != OK )        {        printf("sysFlashWriteBufferStrataflash: can't read id from device\n");        return ERROR ;        }    if ( sysFlashSectorWriteBufferIntel((FlashWord*)(sectorAdrs), buffer, length)!=OK )        {        printf("sysFlashWriteBufferStrataflash: sysFlashSectorWriteIntel failure.\n");        return ERROR ;        }    return OK ;    }#ifdef FLASH_TEST/* The following are test routines to illustrate flash driver function usage. */STATUS testFlashIntel(UINT32 adrs)    {    char buffer[256];    if ( adrs < FLASH_BASE_ADRS || adrs > ROM_BASE_ADRS )        {        printf("Attempting to test an invalid flash address 0x%x\n",adrs);        return ERROR ;        }    memset(buffer,0xff,256);    strcpy(buffer, "The quick brown fox jumps over the lazy dog.\n");    if ( sysFlashSectorLockIntel((char*)adrs) != OK )        {        printf("1a-unable to lock block\n");        return ERROR ;        }    if ( sysFlashSectorLockIntel((char*)adrs) != OK )        {        printf("1b-unable to lock block\n");        }    if ( sysFlashEraseStrataflash((char *)adrs)!=OK )        {        printf("1-can't erase sector\n");        }    if ( sysFlashWriteStrataflash((char*)adrs,buffer,sizeof(buffer))!=OK )        {        printf("1-can't write chip\n");        }    if ( sysFlashSectorUnlockIntel() != OK )        {        printf("1c-unable to unlock blocks\n");        return ERROR ;        }    if ( sysFlashSectorUnlockIntel() != OK )        {        printf("1d-unable to unlock blocks\n");        }    if ( sysFlashChipEraseIntel()!= OK )        {        printf("2-can't erase chip\n");        return ERROR ;        }    if ( sysFlashEraseStrataflash((char *)adrs)!=OK )        {        printf("2-can't erase sector\n");        return ERROR ;        }    if ( sysFlashWriteStrataflash((char*)adrs,buffer,sizeof(buffer))!=OK )        {        printf("2-can't write chip\n");        return ERROR ;        }    if ( sysFlashWriteStrataflash((char*)(adrs+0x41),buffer,sizeof(buffer))!=OK )        {        printf("2-can't write chip\n");        return ERROR ;        }    if ( sysFlashWriteStrataflash((char*)(adrs+0x82),buffer,sizeof(buffer))!=OK )        {        printf("2-can't write chip\n");        return ERROR ;        }    if ( sysFlashWriteStrataflash((char*)(adrs+0xc3),buffer,sizeof(buffer))!=OK )        {        printf("2-can't write chip\n");        return ERROR ;        }    return OK ;    }STATUS testFlashBufferIntel(UINT32 adrs)    {    char buffer[256];    if ( adrs < FLASH_BASE_ADRS || adrs > ROM_BASE_ADRS )        {        printf("Attempting to test an invalid flash address 0x%x\n",adrs);        return ERROR ;        }    memset(buffer,0xff,256);    strcpy(buffer, "The quick brown fox jumps over the lazy dog. The rain in Spain falls mainly on the plain.\n");    if ( sysFlashSectorLockIntel((char*)adrs) != OK )        {        printf("1a-unable to lock block\n");        return ERROR ;        }    if ( sysFlashSectorLockIntel((char*)adrs) != OK )        {        printf("1b-unable to lock block\n");        }    if ( sysFlashEraseStrataflash((char *)adrs)!=OK )        {        printf("1-can't erase sector\n");        }    if ( sysFlashWriteBufferStrataflash((char*)adrs,buffer,sizeof(buffer))!=OK )        {        printf("1-can't write chip\n");        }    if ( sysFlashSectorUnlockIntel() != OK )        {        printf("1c-unable to unlock blocks\n");        return ERROR ;        }    if ( sysFlashSectorUnlockIntel() != OK )        {        printf("1d-unable to unlock blocks\n");        }    printf("all blocks unlocked...\n");    /* test chip erase */    if ( sysFlashChipEraseIntel()!= OK )        {        printf("2-can't erase chip\n");        return ERROR ;        }    if ( sysFlashEraseStrataflash((char *)adrs)!=OK )        {        printf("2-can't erase sector\n");        return ERROR ;        }    if ( sysFlashWriteBufferStrataflash((char*)adrs,buffer,sizeof(buffer))!=OK )        {        printf("2-can't write chip\n");        return ERROR ;        }    if ( sysFlashWriteBufferStrataflash((char*)(adrs+0x101),buffer,sizeof(buffer))!=OK )        {        printf("2-can't write chip\n");        return ERROR ;        }    if ( sysFlashWriteBufferStrataflash((char*)(adrs+0x202),buffer,sizeof(buffer))!=OK )        {        printf("2-can't write chip\n");        return ERROR ;        }    if ( sysFlashWriteBufferStrataflash((char*)(adrs+0x303),buffer,sizeof(buffer))!=OK )        {        printf("2-can't write chip\n");        return ERROR ;        }    return OK ;    }#endif

⌨️ 快捷键说明

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