uint8_t TFlash_UnlockSequence(void) { uint32_t val, i; /* verify the result */ SWJ_ReadAP(MDM_IDR, &val); if ((val != KINETIS_KK_MCU_ID) && (val != KINETIS_KL_MCU_ID)) { printf("MCU_ID does not match!0x%X\r\n", val); return 1; } SWJ_ReadAP(MDM_STATUS, &val); /* flash in secured mode */ if (val & (1 << 2)) { printf("system is secured mode\r\n"); /* hold the device in reset */ SWJ_SetTargetState(RESET_HOLD); // SWJ_WriteAP(MDM_CTRL, 0x08); // DelayMs(20); // SWJ_SetTargetState(RESET_RUN); // SWJ_InitDebug(); // SWJ_SetTargetState(RESET_HOLD); /* write the mass-erase enable bit */ if(SWJ_WriteAP(MDM_CTRL, 1)) { printf("write mass erase enable failed\r\n"); return 1; } SWJ_ReadAP(MDM_CTRL, &val); printf("MDM_CTRL:0x%X\r\n", MDM_CTRL); while (1) { /* wait until mass erase is started */ if(SWJ_ReadAP(MDM_STATUS, &val)) { printf("read satatus failed\r\n"); return 2; } if (val & 1) break; } /* mass erase in progress */ while (1) { /* keep reading until procedure is complete */ if(SWJ_ReadAP(MDM_CTRL, &val)) return 3; if (val == 0) break; } } return 0; }
int ResetTarget(void) { SWJ_WriteAP(MDM_CTRL, 0x08); DelayMs(10); SWJ_SetTargetState(RESET_RUN); DelayMs(10); }
int main(void) { uint32_t i, err; DelayInit(); GPIO_QuickInit(HW_GPIOC, 10, kGPIO_Mode_OPP); #ifdef MK22F25612 UART_QuickInit(UART0_RX_PB16_TX_PB17, 115200); #elif MK20D5 UART_QuickInit(UART1_RX_PC03_TX_PC04, 115200); #endif printf("program for Manley\r\n"); swd_io_init(); SWJ_InitDebug(); SWJ_SetTargetState(RESET_HOLD); ShowID(); for(i=0;i<sizeof(buf);i++) { buf[i] = i & 0xFF; } SWJ_WriteMem(0x20000000, buf, sizeof(buf)); memset(buf, 0, sizeof(buf)); SWJ_ReadMem(0x20000000, buf, sizeof(buf)); for(i=0;i<sizeof(buf);i++) { if(buf[i] != (i & 0xFF)) { printf("error buf[%d]:%d should be:%d\r\n", i, buf[i], i); } } printf("mem teset complete\r\n"); SWJ_SetTargetState(RESET_PROGRAM); err = TFlash_UnlockSequence(); printf("TFlash_UnlockSequence %d\r\n", err); SWJ_SetTargetState(RESET_PROGRAM); err = TFlash_Init(&flash); printf("TFlash_Init %d\r\n", err); err = target_flash_program_page(&flash, 0x00000200, (uint8_t*)flash.image, 512); printf("target_flash_program_page %d\r\n", err); while(1) { GPIO_ToggleBit(HW_GPIOC, 10); DelayMs(500); } }
uint8_t TFlash_UnlockSequence(void) { uint32_t val; /* read the device ID */ if(SWJ_ReadAP(MDM_IDR, &val)) { printf("readID failed:0x%08X\r\n", val); return 1; } /* verify the result */ if ((val != KINETIS_KK_MCU_ID) && (val != KINETIS_KL_MCU_ID)) { printf("MCU_ID does not match!0x%X\r\n", val); return 1; } if(SWJ_ReadAP(MDM_STATUS, &val)) { printf("read mem_status error\r\n"); return 3; } printf("MEMSTATUS:0x%X\r\n", val); /* flash in secured mode */ // if (val & (1 << 2)) { printf("system is secured mode\r\n"); /* hold the device in reset */ //SWJ_SetTargetState(RESET_PROGRAM); SWJ_SetTargetState(RESET_HOLD); /* write the mass-erase enable bit */ if(SWJ_WriteAP(MDM_CTRL, 1)) { printf("write enable failed\r\n"); return 1; } while (1) { //SWJ_WriteAP(MDM_CTRL, 1); /* wait until mass erase is started */ if(SWJ_ReadAP(MDM_STATUS, &val)) { printf("read satatus failed\r\n"); return 2; } if (val & 1) break; } /* mass erase in progress */ while (1) { /* keep reading until procedure is complete */ if(SWJ_ReadAP(MDM_CTRL, &val)) return 3; if (val == 0) break; } } return 0; }