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

📄 sysflash.c

📁 WINDRIVER SBC7410 BSP
💻 C
📖 第 1 页 / 共 3 页
字号:
        s1 = ptr->l ;        if ( !((s1 & 0x00000080)&&               (s1 & 0x00800000)) )            continue; /* wsm not ready */        status = checkStatusIntel(s1);        if ( status == -1 )            {            ptr->l = 0x00ff00ff;            sysFlashDelay();            return ERROR ;            }        else if ( status == 1 )            continue;        else if ( status == 0 )            break;        }    ptr->l = 0x00ff00ff ;    sysFlashDelay();    return OK ;    }/******************************************************************************** sysFlashSectorEraseIntel - erase the requested Intel Strataflash sector.** RETURNS: OK, or ERROR if unable to erase the sector.**/STATUS sysFlashSectorEraseIntel    (    char * sectorAdrs    )    {    FlashWord * ptr = (FlashWord *)sectorAdrs ;    if ( sysFlashBlockLockStatusIntel((FlashWord*)ptr) == OK )        {        printf("sysFlashSectorEraseIntel: sectorAdrs 0x%x is locked.\n",(unsigned)sectorAdrs);        return ERROR ;        }    ptr->l = 0x00200020 ;    ptr->l = 0x00d000d0 ;    if ( sysFlashPollDataIntel(ptr) != OK )        {        printf("sysFlashSectorEraseIntel: sysFlashPollDataIntel failure.\n");        return ERROR ;        }    ptr->l = 0x00ff00ff ;    sysFlashDelay();    return OK ;    }/******************************************************************************** sysFlashChipEraseIntel - Erase the entire Intel Strataflash chip.** RETURNS: OK, or ERROR if unable to erase the entire chip.**/STATUS sysFlashChipEraseIntel(void)    {    int i ;    FlashWord * ptr = (FlashWord *)INTEL28F640_BASE_ADRS ;    /* no chip erase - loop through all blocks, note ptr math : FlashWord is 4 bytes       so incrementing ptr will advance the address +4. That's why INTEL28F640_SECTOR_SZ       is adjusted by dividing by 4 since it defines how many bytes are in a sector. */    for ( i=0 ; i<INTEL28F640_NUM_SECTORS ; i++, ptr+=(INTEL28F640_SECTOR_SZ/4) )        {#if FLASH_DEBUG        printf("sysFlashChipEraseIntel: erasing sector %d, adrs - 0x%x\n",i,(unsigned)ptr) ;#else        printf(".") ;#endif        if ( sysFlashSectorEraseIntel((char*)ptr)!=OK )            {            printf("sysFlashChipEraseIntel: Unable to erase sector @ 0x%x\n",(unsigned)ptr);            return ERROR ;            }        }    return OK ;    }/******************************************************************************** sysFlashSectorWriteBufferIntel - this write routine uses write to buffer* programming - faster than byte at a time programming. Note: max number of* bytes per buffer is 16 for x16 mode. The caller must guarantee that the * data doesn't exceed flash sector boundaries.** RETURNS: OK, or ERROR if unable to program the requested sector.**/#define INTEL_28F640_WRITE_TO_BUFFER_COUNT 16 /* in x16 mode */#define INTEL_28F640_WRITE_TO_BUFFER_TIMEOUT 5 /* 5 seconds */STATUS sysFlashSectorWriteBufferIntel    (    FlashWord *adrs,     char * buf,     int len    )    {    int i ;    int longsToWrite ;    /* assumes that adrs is 32 bit aligned */    volatile FlashWord * ptr=NULL ;    volatile FlashWord *dst ;    volatile FlashWord *src ;    volatile UINT32 s1 ;    UINT32 endTicks ;    FlashWord f ;    int newLen=0 ;    UINT8 *memBuf ;    int alignment ;    int nBytes ;#ifdef FLASH_DEBUG    printf("sysFlashSectorWriteBuffeBufferIntel: programming @ 0x%x.\n",(unsigned)adrs);#endif    longsToWrite = ((len-1)/4)+1 ;    /* check to see if block is locked */    if ( sysFlashBlockLockStatusIntel((FlashWord*)adrs) == OK )        {        printf("sysFlashSectorWriteBufferIntel: sectorAdrs 0x%x is locked.\n",(unsigned)adrs);        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 sector data to memBuf */    memcpy((void*)memBuf,(const void*)ptr,newLen);    alignment = (UINT32)adrs & 0x3 ;    /* copy buffer data to memBuf */    memcpy(&memBuf[alignment],buf,len);    nBytes = newLen ;    longsToWrite = nBytes / 4 ;    src = (FlashWord *)memBuf ;    dst = ptr ;    while ( longsToWrite > 0 )        {        /* we want about 5 second timeout */        endTicks = tickGet() + (sysClkRateGet()*5);        while ( 1 )            {            do                {                ptr->l = 0x00500050 ; /* clear status register */                ptr->l = 0x00700070 ;                s1 = ptr->l ;                } while ( !(s1&0x00800000) || !(s1&0x00000080) ) ;            ptr->l = 0x00e800e8 ; /* set write to buffer mode */            s1 = ptr->l ;   /* read extended status register */            if ( tickGet() < endTicks )                {                if ( !(s1&0x00800000) || !(s1&0x00000080) )                    {                    /* continue waiting for buffer, not available, and timeout not expired */                    continue;                     }                }            else if ( tickGet() >= endTicks )                {                /* timeout waiting for buffer to be available */                do                    {                    ptr->l = 0x00500050 ; /* clear status register */                    ptr->l = 0x00700070 ;                    s1 = ptr->l ;                    } while ( !(s1&0x00800000) || !(s1&0x00000080) ) ;                printf("sysFlashSectorWriteBufferIntel: timeout trying to get write buffer!\n");                ptr->l = 0x00ff00ff ;                sysFlashDelay();                return ERROR ;                }#ifdef DEBUG            /* write word count (0 = 1) */            printf("longs to write - 0%d\n",longsToWrite) ;#endif            /* load word count into each x16 chip */            f.s[0] = f.s[1] = (longsToWrite > 16) ? 15 : longsToWrite-1 ;            ptr->l = f.l ;            /* buffer is available */            for ( i=0 ; (i < INTEL_28F640_WRITE_TO_BUFFER_COUNT) &&                 (longsToWrite > 0) ; i++, src++, dst++, longsToWrite-- )                dst->l = src->l ;            ptr->l = 0x00d000d0 ; /* confirm */            break;            }        }    /* read reset */    do        {        ptr->l = 0x00500050 ; /* clear status register */        ptr->l = 0x00700070 ;        s1 = ptr->l ;        } while ( !(s1&0x00800000) || !(s1&0x00000080) ) ;    ptr->l = 0x00ff00ff ;    sysFlashDelay();    return OK ;    }/******************************************************************************** sysFlashSectorLockIntel - Lock the requested Intel Stratflash sector.** RETURNS: OK, or ERROR if unable to lock the sector.**/STATUS sysFlashSectorLockIntel    (    char *adrs    )    {    FlashWord * ptr = (FlashWord *)adrs;    volatile UINT32 s1 ;    ptr->l = 0x00600060 ;    ptr->l = 0x00010001 ;    do        {        s1 = ptr->l ;        } while ( !(s1 & 0x00800000) ||                  !(s1 & 0x00000080) );    ptr->l = 0x00700070 ;    s1 = ptr->l ;    if ( (s1 & 0x00100000) ||         (s1 & 0x00000010) )        {        printf("sysFlashSectorLockIntel: Unable to set lock bit for sector 0x%x\n", (unsigned)adrs);        ptr->l = 0x00500050 ;        ptr->l = 0x00ff00ff ;        sysFlashDelay();        return ERROR ;        }    ptr->l = 0x00ff00ff ;    sysFlashDelay();    return OK ;    }/******************************************************************************** sysFlashSectorUnlockIntel - unlock the requested Intel Strataflash sector.** RETURNS: OK, or ERROR if unable to unlock sector.**/STATUS sysFlashSectorUnlockIntel(void)    {    FlashWord * ptr =  (FlashWord *)INTEL28F640_BASE_ADRS ;    volatile UINT32 s1 ;    ptr->l = 0x00600060 ;    ptr->l = 0x00d000d0 ;    do        {        s1 = ptr->l ;        } while ( !(s1 & 0x00800000) ||                  !(s1 & 0x00000080) );    ptr->l = 0x00700070 ;    s1 = ptr->l ;    if ( (s1 & 0x00200000) ||         (s1 & 0x00000020) )        {        printf("sysFlashSectorUnlockIntel: Unable to clear lock bits\n");        ptr->l = 0x00500050 ;        ptr->l = 0x00ff00ff ;        sysFlashDelay();        return ERROR ;        }    ptr->l = 0x00ff00ff ;    sysFlashDelay();    return OK ;    }/******************************************************************************** sysFlashSectorWriteIntel - this write routine uses byte programming.* to program an Intel Strataflash sector. Allows any alignment for* adrs and buf. Assumes that the flash region has been erased before* this function is called.** RETURNS: OK, or ERROR **/STATUS sysFlashSectorWriteIntel    (    char * adrs,     char * buf,     int len    )    {    int i ;    FlashWord * ptr=NULL ;    FlashWord *dst ;    FlashWord *src ;

⌨️ 快捷键说明

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