📄 skgeasf.c
字号:
FwCs += *pTmp32; pTmp32++; } pTmp32 = (SK_U32 *) pAsfFwS2; for( i=0; i<ASF_DASH_FLASH_SIZE_2; i+=4 ) { FwCs += *pTmp32; pTmp32++; }#else /* calculate CS of the FW image */ pTmp32 = (SK_U32 *) pAsfFwS1; for( i=0, FwCs=0; i<ASF_FLASH_SIZE; i+=4 ) { FwCs += *pTmp32; pTmp32++; } pTmp32 = (SK_U32 *) pAsfFwS2; for( i=0; i<ASF_FLASH_SIZE; i+=4 ) { FwCs += *pTmp32; pTmp32++; }#endif if( FwCs == 0 ) { // CS == 0 => O.K. FwImageCsOk = 1; FwImageCs = *(pTmp32 - 1); SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" FW Image Checksum O.K. \n")); } else { printk("%s: File FW Checksum not OK\n", SK_DRV_NAME); FwImageCsOk = 0; SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** Error: FW Image Checksum:0x%x\n", FwCs)); }#ifdef USE_ASF_DASH_FW pAC->AsfData.DriverVersion[0] = 'v'; pAC->AsfData.DriverVersion[1] = '1'; pAC->AsfData.DriverVersion[2] = '.'; pAC->AsfData.DriverVersion[3] = '0'; pAC->AsfData.DriverVersion[4] = '0'; for( i=0; i<5; i++ ) pAC->AsfData.FileFwVersion[i] = *(pAsfFwS2 + ASF_FLASH_EX_OFFS_VER - 65536 + i); pAC->AsfData.FileFwRev = *(pAsfFwS2 + ASF_FLASH_EX_OFFS_REV - 65536);#else pAC->AsfData.DriverVersion[0] = 'v'; pAC->AsfData.DriverVersion[1] = '1'; pAC->AsfData.DriverVersion[2] = '.'; pAC->AsfData.DriverVersion[3] = '1'; pAC->AsfData.DriverVersion[4] = '0'; for( i=0; i<5; i++ ) pAC->AsfData.FileFwVersion[i] = *(pAsfFwS2 + ASF_FLASH_OFFS_VER - 65536 + i); pAC->AsfData.FileFwRev = *(pAsfFwS2 + ASF_FLASH_OFFS_REV - 65536);#endif SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" FW Image:%c%c%c%c %c Driver:%c%c%c%c\n", pAC->AsfData.FileFwVersion[1], pAC->AsfData.FileFwVersion[2], pAC->AsfData.FileFwVersion[3], pAC->AsfData.FileFwVersion[4], pAC->AsfData.FileFwRev, pAC->AsfData.DriverVersion[1], pAC->AsfData.DriverVersion[2], pAC->AsfData.DriverVersion[3], pAC->AsfData.DriverVersion[4] )); /* check, whether the FW file version suits the driver version */ if( (pAC->AsfData.FileFwVersion[1] == pAC->AsfData.DriverVersion[1]) && (pAC->AsfData.FileFwVersion[3] == pAC->AsfData.DriverVersion[3]) && (pAC->AsfData.FileFwVersion[4] == pAC->AsfData.DriverVersion[4]) && (FwImageCsOk == 1) ) { /* read the flash (upper 128k) */ SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" FW suits the driver version\n")); if( pAC->AsfData.ChipMode == SK_GEASF_CHIP_EX ) { SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** Extreme -> Do not reset !!\n")); } else if (YukonEcA1) { // was if (pAC->GIni.GIChipRev == CHIP_REV_YU_EC_A1) before SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** Chip Rev. A1 -> Do reset !!\n")); AsfResetCpu(pAC, IoC); // AsfSmartResetCpu( pAC, IoC, ASF_RESET_HOT ); // fixed in A2 } else { /* * just in case the FW is not running !! * (shouldn磘 happen with A2 and later versions) */ if( !pAC->AsfData.CpuAlive ) { SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** FW is not running !! *** \n")); AsfResetCpu(pAC, IoC); // AsfSmartResetCpu( pAC, IoC, ASF_RESET_HOT ); // AsfRunCpu( IoC ); } } if (!YukonEcA1) {#ifdef USE_ASF_DASH_FW AsfLockSpi( pAC, IoC );#else SK_OUT8(IoC, GPHY_CTRL + 2, 1); // Lock the SPI access#endif } spi_init_pac( pAC ); if (!flash_check_spi( &FlashSize )) {#ifdef USE_ASF_DASH_FW printk("%s: SPI not present!\n", SK_DRV_NAME);#endif } else { SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" Flash found with size of %d KBytes\n", FlashSize/1024)); } /* Read flash low pages */ #ifdef USE_ASF_DASH_FW FwCs = 0; SpiRetVal = spi_flash_manage( pAC->AsfData.FlashBuffer, ASF_FLASH_EX_OFFS, ASF_DASH_FLASH_SIZE_1, SPI_READ ); pTmp32 = (SK_U32 *) pAC->AsfData.FlashBuffer; for( i=0; i< ASF_DASH_FLASH_SIZE_1; i+=4 ) { FwCs += *pTmp32; pTmp32++; }#else SpiRetVal = spi_flash_manage( pAC->AsfData.FlashBuffer, ASF_FLASH_OFFS, ASF_FLASH_SIZE, SPI_READ ); if( SpiRetVal == 0 ) { /* calculate CS of the FW flash */ SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** Flash low pages loaded. Calculate the CS of the FW flash.\n")); pTmp32 = (SK_U32 *) pAC->AsfData.FlashBuffer; for( i=0, FwCs=0; i<ASF_FLASH_SIZE; i+=4 ) { FwCs += *pTmp32; pTmp32++; } } else { SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** Error: SPI read\n")); SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_ASF_E002, SKERR_ASF_E002MSG); RetCode = SK_ASF_PNMI_ERR_GENERAL; }#endif#ifdef USE_ASF_DASH_FW if( SpiRetVal == 0 ) { } else { RetCode = SK_ASF_PNMI_ERR_GENERAL; }#endif /* Read flash high pages */#ifdef USE_ASF_DASH_FW SpiRetVal = spi_flash_manage( pAC->AsfData.FlashBuffer, ASF_FLASH_EX_OFFS + 65536, ASF_DASH_FLASH_SIZE_2, SPI_READ );#else SpiRetVal = spi_flash_manage( pAC->AsfData.FlashBuffer, ASF_FLASH_OFFS + 65536, ASF_FLASH_SIZE, SPI_READ );#endif#ifdef USE_ASF_DASH_FW if( SpiRetVal == 0 ) { } else { RetCode = SK_ASF_PNMI_ERR_GENERAL; }#endif if (!YukonEcA1) {#ifdef USE_ASF_DASH_FW AsfUnlockSpi( pAC, IoC );#else SK_OUT8(IoC, GPHY_CTRL + 2, 0); // Unlock the SPI access#endif }#ifdef USE_ASF_DASH_FW if( pAC->AsfData.ChipMode == SK_GEASF_CHIP_EX ) { if (!pAC->ReturningFromSuspend) AsfRunCpu( pAC, IoC ); }#endif if (( SpiRetVal == 0 ) && (!RetCode)) { /* calculate CS of the FW flash */ SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** Flash high pages loaded. Calculate the CS of the FW flash.\n")); pTmp32 = (SK_U32 *) pAC->AsfData.FlashBuffer;#ifdef USE_ASF_DASH_FW for( i=0; i< ASF_DASH_FLASH_SIZE_2; i+=4 ) {#else for( i=0; i<ASF_FLASH_SIZE; i+=4 ) {#endif FwCs += *pTmp32; pTmp32++; } if( FwCs == 0 ) { // CS == 0 => O.K. FwFlashCsOk = 1; FwFlashCs = *(pTmp32 - 1); SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" FW Flash Checksum O.K. \n")); } else { FwFlashCsOk = 0;#ifdef USE_ASF_DASH_FW printk("%s: Chip FW Checksum not OK\n", SK_DRV_NAME);#endif SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** Error: FW Flash Checksum:0x%x\n", FwCs)); }#ifdef USE_ASF_DASH_FW /* read the FW flash version/rev */ for( i=0; i<5; i++ ) { pAC->AsfData.FlashFwVersion[i] = pAC->AsfData.FlashBuffer[ASF_FLASH_EX_OFFS_VER - 65536 + i]; } pAC->AsfData.FlashFwRev = pAC->AsfData.FlashBuffer[ASF_FLASH_EX_OFFS_REV - 65536 ]; /* read the GUID from flash */ SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** GUID ***\n")); SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" ")); for( i=0; i<16; i++ ) { pAC->AsfData.Mib.Guid[i] = pAC->AsfData.FlashBuffer[ASF_FLASH_EX_OFFS_GUID - 65536 +i]; SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("%x ", pAC->AsfData.Mib.Guid[i])); OldGuid[i] = pAC->AsfData.FlashBuffer[ASF_FLASH_EX_OFFS_GUID - 65536 +i]; } SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("\n")); SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" FW Flash:>>%c%c%c%c %c<<\n", pAC->AsfData.FlashFwVersion[1], pAC->AsfData.FlashFwVersion[2], pAC->AsfData.FlashFwVersion[3], pAC->AsfData.FlashFwVersion[4], pAC->AsfData.FlashFwRev ));#else /* read the FW flash version/rev */ for( i=0; i<5; i++ ) { pAC->AsfData.FlashFwVersion[i] = pAC->AsfData.FlashBuffer[ASF_FLASH_OFFS_VER - 65536 + i]; } pAC->AsfData.FlashFwRev = pAC->AsfData.FlashBuffer[ASF_FLASH_OFFS_REV - 65536 ]; /* read the GUID from flash */ SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** GUID ***\n")); SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" ")); for( i=0; i<16; i++ ) { pAC->AsfData.Mib.Guid[i] = pAC->AsfData.FlashBuffer[ASF_FLASH_OFFS_GUID - 65536 +i]; SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("%x ", pAC->AsfData.Mib.Guid[i])); OldGuid[i] = pAC->AsfData.FlashBuffer[ASF_FLASH_OFFS_GUID - 65536 +i]; } SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("\n")); SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" FW Flash:>>%c%c%c%c %c<<\n", pAC->AsfData.FlashFwVersion[1], pAC->AsfData.FlashFwVersion[2], pAC->AsfData.FlashFwVersion[3], pAC->AsfData.FlashFwVersion[4], pAC->AsfData.FlashFwRev ));#endif#ifdef USE_ASF_DASH_FW#ifdef FORCE_FW_FLASH // Flash though Flash Version already the Chip and Flash Version of Driver are the same if (!pAC->ReturningFromSuspend) pAC->AsfData.FileFwRev = 'x'; pAC->ReturningFromSuspend = 0;#endif#endif printk("%s: Flash FW Version %c%c%c%c Rev.%c, File FW Version: %c%c%c%c Rev.%c\n", SK_DRV_NAME, pAC->AsfData.FlashFwVersion[1], pAC->AsfData.FlashFwVersion[2], pAC->AsfData.FlashFwVersion[3], pAC->AsfData.FlashFwVersion[4], pAC->AsfData.FlashFwRev, pAC->AsfData.FileFwVersion[1], pAC->AsfData.FileFwVersion[2], pAC->AsfData.FileFwVersion[3], pAC->AsfData.FileFwVersion[4], pAC->AsfData.FileFwRev); /* check the FW version/rev and update the flash if necessary */ if( ( (pAC->AsfData.FlashFwVersion[1] != pAC->AsfData.DriverVersion[1]) || (pAC->AsfData.FlashFwVersion[3] != pAC->AsfData.DriverVersion[3]) || (pAC->AsfData.FlashFwVersion[4] != pAC->AsfData.DriverVersion[4]) || (pAC->AsfData.FlashFwRev != pAC->AsfData.FileFwRev) || (pAC->AsfData.FileFwRev == 'x') || // Rev == 'x' means: do always a flash update ! (for test purposes)#ifdef USE_ASF_DASH_FW (FwFlashCsOk != 1) ) && (!pAC->ReturningFromSuspend) ) // Checksum error in flash#else (FwFlashCsOk != 1) )) // Checksum error in flash#endif { SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" Updating flash\n")); // AsfResetCpu( pAC, IoC ); for( i=0; i<ASF_FLASH_SIZE; i++ ) pAC->AsfData.FlashBuffer[i] = *(pAsfFwS1 + FlashOffset + i); /* flash erase, determine flash size and select area to be erased */ switch (FlashSize) { case ASF_FLASH_SIZE * 4: /* 256 kB */#ifdef USE_ASF_DASH_FW FlashOffset = ASF_FLASH_EX_OFFS; EraseOff = ASF_FLASH_EX_OFFS;#else EraseOff = ASF_FLASH_OFFS;#endif break; case ASF_FLASH_SIZE * 2: /* 128 kB */#ifdef USE_ASF_DASH_FW FlashOffset = 0;#endif EraseOff = 0; break; case 2097152: FlashOffset = ASF_FLASH_EX_OFFS; EraseOff = ASF_FLASH_EX_OFFS; printk("%s: Huge FlashSize (%lu) activated\n", SK_DRV_NAME, FlashSize); break; default: /* unsupported */ SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" Unsupported Flash Size: %lu\n", FlashSize )); RetCode = SK_ASF_PNMI_ERR_GENERAL; #ifdef USE_ASF_DASH_FW printk("%s: Flash Size (%lu) not supported\n", SK_DRV_NAME, FlashSize);#endif break; } if (!RetCode) DoUpdate = SK_TRUE; } else { SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" Flash is up to date\n"));#ifdef USE_ASF_DASH_FW printk("%s: Flash is up to date\n", SK_DRV_NAME);#endif } if (DoUpdate) { /* This hangs the CPU in case we do NOT flash */ /* So we defer it to this point where we are */ /* sure we will flash. */#ifdef USE_ASF_DASH_FW AsfSmartResetCpu( pAC, IoC, ASF_RESET_COLD );#endif#ifdef USE_ASF_DASH_FW printk("%s: Starting the flash process\n", SK_DRV_NAME);#endif if (spi_flash_erase( EraseOff, ASF_FLASH_SIZE * 2) == 0 ) { /* * Handle sector 1 * (first flash file) */ /* write sector 1 buffer to flash and check the buffer */#ifdef USE_ASF_DASH_FW if (spi_flash_manage( pAC->AsfData.FlashBuffer, FlashOffset, ASF_DASH_FLASH_SIZE_1, SPI_WRITE ) == 0 ) { /* read buffer back */ if( spi_flash_manage( pAC->AsfData.FlashBuffer, FlashOffset, ASF_DASH_FLASH_SIZE_1, SPI_READ ) == 0 ) { /* compare buffer with content of flash image file */ for( i=0,FlashOk=1; i<ASF_DASH_FLASH_SIZE_1; i++ ) { if( pAC->AsfData.FlashBuffer[i] != *(pAsfFwS1 + i) ) { FlashOk = 0; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -