//----- (00002788) -------------------------------------------------------- __myevic__ void hidGetOutReport( uint8_t *pu8Buffer, uint32_t u32BufferLen ) { uint8_t u8Cmd; uint8_t *hidDataPtr; uint32_t u32StartAddr; uint32_t u32DataSize; uint32_t u32ByteCount; uint32_t u32Page; uint32_t sz; uint32_t veo; u8Cmd = hidCmd.u8Cmd; u32StartAddr = hidCmd.u32Arg1; u32DataSize = hidCmd.u32Arg2; u32ByteCount = hidCmd.u32Signature; hidDataPtr = &hidData[hidDataIndex]; switch ( hidCmd.u8Cmd ) { case HID_CMD_SETPARAMS: { USBD_MemCopy( hidDataPtr, pu8Buffer, EP3_MAX_PKT_SIZE ); hidDataIndex += EP3_MAX_PKT_SIZE; if ( hidDataIndex >= u32DataSize ) { u8Cmd = HID_CMD_NONE; if ( u32StartAddr + u32DataSize > FMC_FLASH_PAGE_SIZE ) { sz = FMC_FLASH_PAGE_SIZE - u32StartAddr; } else { sz = u32DataSize; } MemCpy( (uint8_t*)(&hidDFData) + u32StartAddr, hidData, sz ); myprintf( "Set Sys Param complete.\n" ); dfStruct_t * df = (dfStruct_t*)hidDFData; if ( Checksum( (uint8_t*)df->params, FMC_FLASH_PAGE_SIZE - 4 ) == df->Checksum ) { myprintf( "\tCompany ID ............................ [0x%08x]\n", df->i.fmcCID ); myprintf( "\tDevice ID ............................. [0x%08x]\n", df->i.fmcDID ); myprintf( "\tProduct ID ............................ [0x%08x]\n", df->i.fmcPID ); myprintf( "\tu8UpdateAPRom ......................... [0x%08x]\n", df->p.BootFlag ); MemCpy( DataFlash.params, df->params, DATAFLASH_PARAMS_SIZE ); DFCheckValuesValidity(); UpdateDataFlash(); if ( df->i.Year >= 2000 && df->i.Year <= 2099 ) { S_RTC_TIME_DATA_T rtd; rtd.u32Year = df->i.Year; rtd.u32Month = df->i.Month; rtd.u32Day = df->i.Day; rtd.u32DayOfWeek = 0; rtd.u32Hour = df->i.Hour; rtd.u32Minute = df->i.Minute; rtd.u32Second = df->i.Second; rtd.u32TimeScale = RTC_CLOCK_24; SetRTC( &rtd ); } gFlags.refresh_display = 1; } else { myprintf( "Sys Param Receive fail.\n" ); } hidDataIndex = 0; } break; } case HID_CMD_SETLOGO: { USBD_MemCopy( hidDataPtr, pu8Buffer, EP3_MAX_PKT_SIZE ); hidDataIndex += EP3_MAX_PKT_SIZE; if ( hidDataIndex < FMC_FLASH_PAGE_SIZE && hidDataIndex + u32ByteCount < u32DataSize ) { break; } u32Page = u32StartAddr + u32ByteCount; myprintf( "Writing page %d\n", u32Page ); SYS_UnlockReg(); FMC_ENABLE_ISP(); FMC_ENABLE_AP_UPDATE(); if ( FMCEraseWritePage( u32Page, (uint32_t*)hidData ) ) { myprintf( "Data Flash Erase error!\n" ); } veo = FMCVerifyPage( u32Page, (uint32_t*)hidData ); if ( veo ) { myprintf( "Data Flash Verify error! 0x%x\n", 4 * veo - 4 ); } MemClear( hidData, FMC_FLASH_PAGE_SIZE ); u32ByteCount += hidDataIndex; myprintf( "g_u32BytesInPageBuf %d, u32LenCnt 0x%x\n", hidDataIndex, u32ByteCount ); FMC_DISABLE_AP_UPDATE(); FMC_DISABLE_ISP(); SYS_LockReg(); if ( u32ByteCount < u32DataSize ) { hidDataIndex = 0; } else { u8Cmd = HID_CMD_NONE; myprintf( "set boot logo command complete.\n" ); } break; } case HID_CMD_LDUPDATE: { USBD_MemCopy( hidDataPtr, pu8Buffer, EP3_MAX_PKT_SIZE ); hidDataIndex += EP3_MAX_PKT_SIZE; if ( hidDataIndex < FMC_FLASH_PAGE_SIZE && hidDataIndex + u32ByteCount < u32DataSize ) { break; } u32Page = u32StartAddr + u32ByteCount; myprintf( "Writing page 0x%08X\n", u32Page ); SYS_UnlockReg(); FMC_ENABLE_ISP(); FMC_EnableLDUpdate(); if ( FMCEraseWritePage( u32Page, (uint32_t*)hidData ) ) { myprintf( "Data Flash Erase error!\n" ); } veo = FMCVerifyPage( u32Page, (uint32_t*)hidData ); if ( veo ) { myprintf( "Data Flash Verify error! 0x%x\n", 4 * veo - 4 ); } MemClear( hidData, FMC_FLASH_PAGE_SIZE ); u32ByteCount += hidDataIndex; hidDataIndex = 0; myprintf( "g_u32BytesInPageBuf %d, u32LenCnt 0x%x\n", hidDataIndex, u32ByteCount ); FMC_DisableLDUpdate(); FMC_DISABLE_ISP(); SYS_LockReg(); if ( u32ByteCount >= u32DataSize ) { u8Cmd = HID_CMD_NONE; myprintf( "Update LDROM command complete.\n" ); } break; } default: { if ( hidProcessCommand( pu8Buffer, u32BufferLen ) ) { myprintf( "Unknown HID command!\n" ); } return; } } hidCmd.u8Cmd = u8Cmd; hidCmd.u32Signature = u32ByteCount; }
int aprom() { uint8_t u8Item; uint32_t u32Data; char *acBootMode[] = {"LDROM+IAP", "LDROM", "APROM+IAP", "APROM"}; uint32_t u32CBS; /* Unlock protected registers */ SYS_UnlockReg(); /* Init system clock and multi-function I/O */ SYS_Init(); /* Init UART */ UART_Init(); printf("\n\n"); printf("+----------------------------------------+\n"); printf("| NUC029 FMC IAP Sample Code |\n"); printf("| [APROM code] |\n"); printf("+----------------------------------------+\n"); /* Enable FMC ISP function */ FMC_Open(); if(SetIAPBoot() < 0) { printf("Failed to set IAP boot mode!\n"); goto lexit; } /* Get boot mode */ printf(" Boot Mode ............................. "); u32CBS = (FMC->ISPSTA & FMC_ISPSTA_CBS_Msk) >> FMC_ISPSTA_CBS_Pos; printf("[%s]\n", acBootMode[u32CBS]); u32Data = FMC_ReadCID(); printf(" Company ID ............................ [0x%08x]\n", u32Data); u32Data = FMC_ReadDID(); printf(" Device ID ............................. [0x%08x]\n", u32Data); u32Data = FMC_ReadPID(); printf(" Product ID ............................ [0x%08x]\n", u32Data); /* Read User Configuration */ printf(" User Config 0 ......................... [0x%08x]\n", FMC_Read(FMC_CONFIG_BASE)); printf(" User Config 1 ......................... [0x%08x]\n", FMC_Read(FMC_CONFIG_BASE + 4)); do { printf("\n\n\n"); printf("+----------------------------------------+\n"); printf("| Select |\n"); printf("+----------------------------------------+\n"); printf("| [0] Load IAP code to LDROM |\n"); printf("| [1] Run IAP program (in LDROM) |\n"); printf("+----------------------------------------+\n"); printf("Please select..."); u8Item = UART_GetChar(); printf("%c\n", u8Item); switch(u8Item) { case '0': FMC_EnableLDUpdate(); if(LoadImage((uint32_t)&loaderImage1Base, (uint32_t)&loaderImage1Limit, FMC_LDROM_BASE, FMC_LDROM_SIZE) != 0) { printf("Load image to LDROM failed!\n"); goto lexit; } FMC_DisableLDUpdate(); break; case '1': printf("\n\nChange VECMAP and branch to LDROM...\n"); UART_WAIT_TX_EMPTY(UART0); /* To make sure all message has been print out */ /* Mask all interrupt before changing VECMAP to avoid wrong interrupt handler fetched */ __set_PRIMASK(1); /* Set VECMAP to LDROM for booting from LDROM */ FMC_SetVectorPageAddr(FMC_LDROM_BASE); /* Software reset to boot to LDROM */ NVIC_SystemReset(); break; default : break; } } while(1); lexit: /* Disable FMC ISP function */ FMC_Close(); /* Lock protected registers */ SYS_LockReg(); printf("\nFMC Sample Code Completed.\n"); while(1); }
int main() { uint32_t i, u32Data; /* Unlock protected registers */ SYS_UnlockReg(); SYS_Init(); UART_Init(); /* This sample code is used to show how to use StdDriver API to implement ISP functions. */ printf("\n\n"); printf("+----------------------------------------+\n"); printf("| NUC029xDE FMC Sample Code |\n"); printf("+----------------------------------------+\n"); //SYS_UnlockReg(); /* Enable FMC ISP function */ FMC_Open(); if(SetDataFlashBase(DATA_FLASH_TEST_BASE) < 0) { printf("Failed to set Data Flash base address!\n"); goto lexit; } /* Read BS */ printf(" Boot Mode ............................. "); if(FMC_GetBootSource() == 0) printf("[APROM]\n"); else { printf("[LDROM]\n"); printf(" WARNING: The driver sample code must execute in AP mode!\n"); goto lexit; } u32Data = FMC_ReadCID(); printf(" Company ID ............................ [0x%08x]\n", u32Data); u32Data = FMC_ReadDID(); printf(" Device ID ............................. [0x%08x]\n", u32Data); u32Data = FMC_ReadPID(); printf(" Product ID ............................ [0x%08x]\n", u32Data); for(i = 0; i < 3; i++) { u32Data = FMC_ReadUID(i); printf(" Unique ID %d ........................... [0x%08x]\n", i, u32Data); } for(i = 0; i < 4; i++) { u32Data = FMC_ReadUCID(i); printf(" Unique Customer ID %d .................. [0x%08x]\n", i, u32Data); } /* Read User Configuration */ printf(" User Config 0 ......................... [0x%08x]\n", FMC_Read(FMC_CONFIG_BASE)); printf(" User Config 1 ......................... [0x%08x]\n", FMC_Read(FMC_CONFIG_BASE + 4)); /* Read Data Flash base address */ u32Data = FMC_ReadDataFlashBaseAddr(); printf(" Data Flash Base Address ............... [0x%08x]\n", u32Data); printf("\n\nLDROM test =>\n"); FMC_EnableLDUpdate(); if(FlashTest(FMC_LDROM_BASE, FMC_LDROM_BASE + FMC_LDROM_SIZE, TEST_PATTERN) < 0) { printf("\n\nLDROM test failed!\n"); goto lexit; } FMC_DisableLDUpdate(); printf("\n\nAPROM test =>\n"); FMC_EnableAPUpdate(); if(FlashTest(APROM_TEST_BASE, APROM_TEST_END, TEST_PATTERN) < 0) { printf("\n\nAPROM test failed!\n"); goto lexit; } FMC_DisableAPUpdate(); printf("\n\nData Flash test =>\n"); if(FlashTest(DATA_FLASH_TEST_BASE, DATA_FLASH_TEST_END, TEST_PATTERN) < 0) { printf("\n\nUHB test failed!\n"); goto lexit; } lexit: /* Disable FMC ISP function */ FMC_Close(); /* Lock protected registers */ SYS_LockReg(); printf("\nFMC Sample Code Completed.\n"); while(1); }
/** * @brief Main funcion * @param None * @retval 0: Success; <0: Failed */ int32_t main (void) { int32_t i32Err; uint32_t u32Data, i, u32ImageSize, j, *pu32Loader; uint8_t ch; UNLOCKREG(); /* Enable FMC ISP function */ FMC_Init(); /* Read Company ID */ u32Data = 0; FMC_ReadCID(&u32Data); if (u32Data != 0xda) { printf("Wrong CID: 0x%x\n", u32Data); goto lexit; } /* Check the signature to check if Simple LD code is finished or not */ if (inpw(KEY_ADDR) == SIGNATURE) { /* Just clear SIGNATURE and finish the sample code if Simple LD code has been executed. */ outpw(KEY_ADDR, 0); /* Read BS */ printf(" Boot Mode .................................. "); if (FMC_GetBootSelect() == E_FMC_APROM) printf("[APROM]\n"); else { printf("[LDROM]\n"); printf(" WARNING: The driver sample code must execute in AP mode!\n"); } goto lexit; } printf("\n\n"); printf("+-------------------------------------------------------------------------+\n"); printf("| NANO1xx Flash Memory Controller Driver Sample Code |\n"); printf("+-------------------------------------------------------------------------+\n"); printf(" NOTE: This sample must be applied to NANO1xx series equipped with 16KB RAM.\n"); /* Read BS */ printf(" Boot Mode .................................. "); if (FMC_GetBootSelect() == E_FMC_APROM) printf("[APROM]\n"); else { printf("[LDROM]\n"); printf(" WARNING: The driver sample code must execute in AP mode!\n"); goto lexit; } /* Read Data Flash base address */ u32Data = FMC_ReadDataFlashBaseAddr(); printf(" Data Flash Base Address .................... [0x%08x]\n", u32Data); /* Check the data in LD ROM to avoid overwrite them */ FMC_Read(LDROM_BASE, &u32Data); if (u32Data != 0xFFFFFFFF) { printf("\n WARNING: There is code in LD ROM.\n If you proceed, the code in LD ROM will be corrupted.\n"); printf(" Continue? [y/n]:"); ch = getchar(); putchar(ch); if (ch != 'y') goto lexit; printf("\n\n"); } /* Enable LDROM update */ FMC_EnableLDUpdate(); printf(" Erase LD ROM ............................... "); /* Page Erase LDROM */ for (i = 0; i < 4096; i += PAGE_SIZE) FMC_Erase(LDROM_BASE + i); /* Erase Verify */ i32Err = 0; for (i = LDROM_BASE; i < (LDROM_BASE+4096); i += 4) { FMC_Read(i, &u32Data); if(u32Data != 0xFFFFFFFF) { printf(" u32Data = 0x%x\n", u32Data); i32Err = 1; } } if (i32Err) printf("[FAIL]\n"); else printf("[OK]\n"); printf(" Program LD ROM test ........................ "); /* Program LD ROM and read out data to compare it */ for (i = LDROM_BASE; i < (LDROM_BASE+4096); i += 4) { FMC_Write(i, i); } i32Err = 0; for (i = LDROM_BASE; i < (LDROM_BASE+4096); i += 4) { FMC_Read(i, &u32Data); if(u32Data != i) { i32Err = 1; } } if (i32Err) printf("[FAIL]\n"); else printf("[OK]\n"); /* Check LD image size */ u32ImageSize = (uint32_t)&loaderImageLimit - (uint32_t)&loaderImageBase; if (u32ImageSize == 0) { printf(" ERROR: Loader Image is 0 bytes!\n"); goto lexit; } if (u32ImageSize > 4096) { printf(" ERROR: Loader Image is larger than 4KBytes!\n"); goto lexit; } printf(" Program Simple LD Code ..................... "); pu32Loader = (uint32_t *)&loaderImageBase; for (i = 0; i < u32ImageSize; i += PAGE_SIZE) { FMC_Erase(LDROM_BASE + i); for (j = 0; j < PAGE_SIZE; j += 4) { FMC_Write(LDROM_BASE + i + j, pu32Loader[(i + j) / 4]); } } /* Verify loader */ i32Err = 0; for (i = 0; i < u32ImageSize; i += PAGE_SIZE) { for(j = 0; j < PAGE_SIZE; j += 4) { FMC_Read(LDROM_BASE + i + j, &u32Data); if (u32Data != pu32Loader[(i+j)/4]) i32Err = 1; if (i + j >= u32ImageSize) break; } } if(i32Err) { printf("[FAIL]\n"); } else { printf("[OK]\n"); /* Reset CPU to boot to LD mode */ printf("\n >>> Reset to LD mode <<<\n"); FMC_BootSelect(E_FMC_LDROM); GCR->IPRST_CTL1 = GCR_IPRSTCTL1_CPU; } lexit: /* Disable FMC ISP function */ FMC_DeInit(); /* Lock protected registers */ LOCKREG(); printf("\nFMC Sample Code Completed.\n"); }
int FMC_RW() { uint32_t i, u32Data; /* Init System, IP clock and multi-function I/O */ SysInit(); /* Init UART0 for printf */ UART0_Init(); /*---------------------------------------------------------------------------------------------------------*/ /* SAMPLE CODE */ /*---------------------------------------------------------------------------------------------------------*/ printf("\n\nCPU @ %dHz\n", SystemCoreClock); SYS_UnlockReg(); /* Enable FMC ISP function */ FMC_Open(); if (set_data_flash_base(DATA_FLASH_TEST_BASE) < 0) { printf("Failed to set Data Flash base address!\n"); goto lexit; } /* Read BS */ printf(" Boot Mode ............................. "); if (FMC_GetBootSource() == 0) printf("[APROM]\n"); else { printf("[LDROM]\n"); printf(" WARNING: The driver sample code must execute in AP mode!\n"); goto lexit; } u32Data = FMC_ReadCID(); printf(" Company ID ............................ [0x%08x]\n", u32Data); u32Data = FMC_ReadDID(); printf(" Device ID ............................. [0x%08x]\n", u32Data); u32Data = FMC_ReadPID(); printf(" Product ID ............................ [0x%08x]\n", u32Data); for (i = 0; i < 3; i++) { u32Data = FMC_ReadUID(i); printf(" Unique ID %d ........................... [0x%08x]\n", i, u32Data); } for (i = 0; i < 4; i++) { u32Data = FMC_ReadUCID(i); printf(" Unique Customer ID %d .................. [0x%08x]\n", i, u32Data); } /* Read User Configuration */ printf(" User Config 0 ......................... [0x%08x]\n", FMC_Read(FMC_CONFIG_BASE)); printf(" User Config 1 ......................... [0x%08x]\n", FMC_Read(FMC_CONFIG_BASE+4)); /* Read Data Flash base address */ u32Data = FMC_ReadDataFlashBaseAddr(); printf(" Data Flash Base Address ............... [0x%08x]\n", u32Data); printf("\n\nLDROM test =>\n"); FMC_EnableLDUpdate(); if (flash_test(FMC_LDROM_BASE, FMC_LDROM_END, TEST_PATTERN) < 0) { printf("\n\nLDROM test failed!\n"); goto lexit; } FMC_DisableLDUpdate(); printf("\n\nAPROM test =>\n"); FMC_EnableAPUpdate(); if (flash_test(APROM_TEST_BASE, DATA_FLASH_TEST_BASE, TEST_PATTERN) < 0) { printf("\n\nAPROM test failed!\n"); goto lexit; } FMC_DisableAPUpdate(); printf("\n\nData Flash test =>\n"); if (flash_test(DATA_FLASH_TEST_BASE, DATA_FLASH_TEST_END, TEST_PATTERN) < 0) { printf("\n\nUHB test failed!\n"); goto lexit; } lexit: /* Disable FMC ISP function */ FMC_Close(); /* Lock protected registers */ SYS_LockReg(); printf("\nFMC Sample Code Completed.\n"); while (1); }