1__constant U32 _INDEX_AHB_AP_CORTEX_M33 = 3; 2__constant U32 _AHB_ACC_32BIT_AUTO_INC = (1 << 29) | (1 << 25) | (1 << 24) | (1 << 4) | (2 << 0); 3__constant U32 _AHB_ACC_16BIT_AUTO_INC = (1 << 29) | (1 << 25) | (1 << 24) | (1 << 4) | (1 << 0); // HMASTER = DEBUG, Private access, no Auto-increment, Access size: half word; 4__constant U32 _ACCESS_AP = 1; 5__constant U32 _CM33_CPUID = 0xD210; 6__constant U32 _CM7_CPUID = 0x0C27; 7 8unsigned int cpuID; 9 10static int _WriteViaCM33AP16(U32 Addr, U16 Data) { 11 int r; 12 13 JLINK_CORESIGHT_WriteDP(JLINK_CORESIGHT_DP_REG_SELECT, (0 << 4) | (_INDEX_AHB_AP_CORTEX_M33 << 24)); 14 JLINK_CORESIGHT_WriteAP(JLINK_CORESIGHT_AP_REG_CTRL, _AHB_ACC_16BIT_AUTO_INC); 15 Data = (Data & 0xFFFF) | ((Data & 0xFFFF) << 16); 16 r = JLINK_CORESIGHT_WriteDAP(JLINK_CORESIGHT_AP_REG_ADDR, _ACCESS_AP, Addr); 17 r |= JLINK_CORESIGHT_WriteDAP(JLINK_CORESIGHT_AP_REG_DATA, _ACCESS_AP, Data); 18 return r; 19} 20 21static U32 _ReadViaCM33AP16(U32 Addr) { 22 U32 r; 23 24 JLINK_CORESIGHT_WriteDP(JLINK_CORESIGHT_DP_REG_SELECT, (0 << 4) | (_INDEX_AHB_AP_CORTEX_M33 << 24)); 25 JLINK_CORESIGHT_WriteAP(JLINK_CORESIGHT_AP_REG_CTRL, _AHB_ACC_16BIT_AUTO_INC); 26 JLINK_CORESIGHT_WriteDAP(JLINK_CORESIGHT_AP_REG_ADDR, _ACCESS_AP, Addr); 27 JLINK_CORESIGHT_ReadDAP(JLINK_CORESIGHT_AP_REG_DATA, _ACCESS_AP, &r); 28 return r; 29} 30 31static int _WriteViaCM33AP32(U32 Addr, U32 Data) { 32 int r; 33 34 JLINK_CORESIGHT_WriteDP(JLINK_CORESIGHT_DP_REG_SELECT, (0 << 4) | (_INDEX_AHB_AP_CORTEX_M33 << 24)); 35 JLINK_CORESIGHT_WriteAP(JLINK_CORESIGHT_AP_REG_CTRL, _AHB_ACC_32BIT_AUTO_INC); 36 r = JLINK_CORESIGHT_WriteDAP(JLINK_CORESIGHT_AP_REG_ADDR, _ACCESS_AP, Addr); 37 r |= JLINK_CORESIGHT_WriteDAP(JLINK_CORESIGHT_AP_REG_DATA, _ACCESS_AP, Data); 38 return r; 39} 40 41static U32 _ReadViaCM33AP32(U32 Addr) { 42 int r; 43 44 JLINK_CORESIGHT_WriteDP(JLINK_CORESIGHT_DP_REG_SELECT, (0 << 4) | (_INDEX_AHB_AP_CORTEX_M33 << 24)); 45 JLINK_CORESIGHT_WriteAP(JLINK_CORESIGHT_AP_REG_CTRL, _AHB_ACC_32BIT_AUTO_INC); 46 r = JLINK_CORESIGHT_WriteDAP(JLINK_CORESIGHT_AP_REG_ADDR, _ACCESS_AP, Addr); 47 r |= JLINK_CORESIGHT_ReadDAP(JLINK_CORESIGHT_AP_REG_DATA, _ACCESS_AP, &r); 48 return r; 49} 50 51void _FLEXSPI1_ModuleReset() 52{ 53 unsigned int reg; 54 55 reg = MEM_ReadU32(0x425E0000); // FlexSPI1->MCR0 56 if( (reg & 0x02) == 0) // Module Enabled 57 { 58 reg = MEM_ReadU32(0x425E0000); 59 MEM_WriteU32(0x425E0000, (reg | 0x1)); 60 do 61 { 62 reg = MEM_ReadU32(0x425E0000); 63 } while ((reg & 0x1) != 0); 64 } 65} 66 67void _FLEXSPI1_WaitBusIdle() 68{ 69 unsigned int reg; 70 reg = MEM_ReadU32(0x425E0000); // FlexSPI1->MCR0 71 if( (reg & 0x02) == 0) // Module Enabled 72 { 73 do 74 { 75 reg = MEM_ReadU32(0x425E00E0); 76 } while ((reg & 0x3) != 0x3); 77 } 78} 79 80void _FLEXSPI1_ClockInit() 81{ 82 _WriteViaCM33AP32(0x54484350, 0x0); // ROSC400M_CTRL1 83 84 // Set flexspi1 root clock, use ROSC400, div = 4 = 1+3 85 MEM_WriteU32(0x54450A80, 0x103); // CLOCK_ROOT[21].CONTROL, FlexSPI1 86} 87 88void _FLEXSPI1_SetPinForQuadMode(void) { 89 // Set 4 Pin Mode for JLink 90 // IOMUXC_GPIO_B2_07_FLEXSPI1_BUS2BIT_A_DQS 91 MEM_WriteU32(0x42A1023C, 0x17); 92 MEM_WriteU32(0x42A10544, 0x1); 93 // IOMUXC_GPIO_B2_08_FLEXSPI1_BUS2BIT_A_SCLK 94 MEM_WriteU32(0x42A10240, 0x17); 95 // IOMUXC_GPIO_B2_09_FLEXSPI1_BUS2BIT_A_SS0_B 96 MEM_WriteU32(0x42A10244, 0x17); 97 // IOMUXC_GPIO_B2_10_FLEXSPI1_BUS2BIT_A_DATA00 98 MEM_WriteU32(0x42A10248, 0x17); 99 // IOMUXC_GPIO_B2_11_FLEXSPI1_BUS2BIT_A_DATA01 100 MEM_WriteU32(0x42A1024C, 0x17); 101 // IOMUXC_GPIO_B2_12_FLEXSPI1_BUS2BIT_A_DATA02 102 MEM_WriteU32(0x42A10250, 0x17); 103 // IOMUXC_GPIO_B2_13_FLEXSPI1_BUS2BIT_A_DATA03 104 MEM_WriteU32(0x42A10254, 0x17); 105} 106 107void _FLEXSPI1_ModuleInit(void) { 108 109 unsigned int reg; 110 reg = MEM_ReadU32(0x425E0000); 111 MEM_WriteU32(0x425E0000, (reg & 0xFFFFFFFD)); 112 113 //FLEXSPI1->MCR0 = 0xFFFF8010; 114 MEM_WriteU32(0x425E0000, 0xFFFF8010); 115 //FLEXSPI1->MCR2 = 0x200001F7; 116 MEM_WriteU32(0x425E0008, 0x200001F7); 117 //FLEXSPI1->AHBCR = 0x78; 118 MEM_WriteU32(0x425E000C, 0x78); 119 120 //FLEXSPI1->FLSHCR0[0] = 0x00004000; 121 MEM_WriteU32(0x425E0060, 0x00004000); 122 123 124 //FLEXSPI1->FLSHCR4 = 0xC3; 125 MEM_WriteU32(0x425E0094, 0xC3); 126 //FLEXSPI1->IPRXFCR = 0x1C; 127 MEM_WriteU32(0x425E00B8, 0x1C); 128 129 //FLEXSPI1->LUTKEY = 0x5AF05AF0UL; 130 MEM_WriteU32(0x425E0018, 0x5AF05AF0); 131 //FLEXSPI1->LUTCR = 0x02; 132 MEM_WriteU32(0x425E001C, 0x02); 133 134 //FLEXSPI1->LUT[0] = 0x0A1804EB; // AHB Quad Read Change to use Fast Read Quad 135 MEM_WriteU32(0x425E0200, 0x0A1804EB); 136 //FLEXSPI1->LUT[1] = 0x26043206; 137 MEM_WriteU32(0x425E0204, 0x26043206); 138 //FLEXSPI1->LUT[2] = 0x00000000; 139 MEM_WriteU32(0x425E0208, 0x00000000); 140 //FLEXSPI1->LUT[3] = 0x00000000; 141 MEM_WriteU32(0x425E020C, 0x00000000); 142 143 //FLEXSPI1->LUT[4] = 0x00000406; // Write Enable 144 MEM_WriteU32(0x425E0210, 0x00000406); 145 //FLEXSPI1->LUT[5] = 0x00000000; 146 MEM_WriteU32(0x425E0214, 0x00000000); 147 //FLEXSPI1->LUT[6] = 0x00000000; 148 MEM_WriteU32(0x425E0218, 0x00000000); 149 //FLEXSPI1->LUT[7] = 0x00000000; 150 MEM_WriteU32(0x425E021C, 0x00000000); 151 152 //FLEXSPI1->LUT[8] = 0x20040401; // Wirte s1 153 MEM_WriteU32(0x425E0220, 0x20040401); 154 //FLEXSPI1->LUT[9] = 0x00000000; 155 MEM_WriteU32(0x425E0224, 0x00000000); 156 //FLEXSPI1->LUT[10] = 0x00000000; 157 MEM_WriteU32(0x425E0228, 0x00000000); 158 //FLEXSPI1->LUT[11] = 0x00000000; 159 MEM_WriteU32(0x425E022C, 0x00000000); 160 161 //FLEXSPI1->LUT[12] = 0x24040405; // Read s1 162 MEM_WriteU32(0x425E0230, 0x24040405); 163 //FLEXSPI1->LUT[13] = 0x00000000; 164 MEM_WriteU32(0x425E0234, 0x00000000); 165 //FLEXSPI1->LUT[14] = 0x00000000; 166 MEM_WriteU32(0x425E0238, 0x00000000); 167 //FLEXSPI1->LUT[15] = 0x00000000; 168 MEM_WriteU32(0x425E023C, 0x00000000); 169 170 //FLEXSPI1->LUT[16] = 0x00000404; // Write Disable 171 MEM_WriteU32(0x425E0240, 0x00000404); 172 //FLEXSPI1->LUT[17] = 0x00000000; 173 MEM_WriteU32(0x425E0244, 0x00000000); 174 //FLEXSPI1->LUT[18] = 0x00000000; 175 MEM_WriteU32(0x425E0248, 0x00000000); 176 //FLEXSPI1->LUT[19] = 0x00000000; 177 MEM_WriteU32(0x425E024C, 0x00000000); 178 179 //FLEXSPI1->LUT[20] = 0x20040431; // Wirte s2 180 MEM_WriteU32(0x425E0250, 0x20040431); 181 //FLEXSPI1->LUT[21] = 0x00000000; 182 MEM_WriteU32(0x425E0254, 0x00000000); 183 //FLEXSPI1->LUT[22] = 0x00000000; 184 MEM_WriteU32(0x425E0258, 0x00000000); 185 //FLEXSPI1->LUT[23] = 0x00000000; 186 MEM_WriteU32(0x425E025C, 0x00000000); 187 188 //FLEXSPI1->LUT[24] = 0x24040435; // Read s2 189 MEM_WriteU32(0x425E0260, 0x24040435); 190 //FLEXSPI1->LUT[25] = 0x00000000; 191 MEM_WriteU32(0x425E0264, 0x00000000); 192 //FLEXSPI1->LUT[26] = 0x00000000; 193 MEM_WriteU32(0x425E0268, 0x00000000); 194 //FLEXSPI1->LUT[27] = 0x00000000; 195 MEM_WriteU32(0x425E026C, 0x00000000); 196 197 //FLEXSPI1->LUT[28] = 0x00000450; // Write Enable Volatile 198 MEM_WriteU32(0x425E0270, 0x00000450); 199 //FLEXSPI1->LUT[29] = 0x00000000; 200 MEM_WriteU32(0x425E0274, 0x00000000); 201 //FLEXSPI1->LUT[30] = 0x00000000; 202 MEM_WriteU32(0x425E0278, 0x00000000); 203 //FLEXSPI1->LUT[31] = 0x00000000; 204 MEM_WriteU32(0x425E027C, 0x00000000); 205 206 //FLEXSPI1->LUTKEY = 0x5AF05AF0UL; 207 MEM_WriteU32(0x425E0018, 0x5AF05AF0); 208 //FLEXSPI1->LUTCR = 0x01; 209 MEM_WriteU32(0x425E001C, 0x01); 210} 211 212void _FLEXSPI2_ModuleReset() 213{ 214 unsigned int reg; 215 216 reg = MEM_ReadU32(0x445E0000); // FlexSPI2->MCR0 217 if( (reg & 0x02) == 0) // Module Enabled 218 { 219 reg = MEM_ReadU32(0x445E0000); 220 MEM_WriteU32(0x445E0000, (reg | 0x1)); 221 do 222 { 223 reg = MEM_ReadU32(0x445E0000); 224 } while ((reg & 0x1) != 0); 225 } 226} 227 228void _FLEXSPI2_WaitBusIdle() 229{ 230 unsigned int reg; 231 232 reg = MEM_ReadU32(0x445E0000); // FlexSPI2->MCR0 233 if( (reg & 0x02) == 0) // Module Enabled 234 { 235 do 236 { 237 reg = MEM_ReadU32(0x445E00E0); 238 } while ((reg & 0x3) != 0x3); 239 } 240} 241 242void _FlexSPI2_SetPinForOctalMode() 243{ 244 // Config IOMUX for FlexSPI2 245 MEM_WriteU32(0x42A10088, 0x00000013); // FLEXSPI2_B_DATA03 246 MEM_WriteU32(0x42A1008C, 0x00000013); // FLEXSPI2_B_DATA02 247 MEM_WriteU32(0x42A10090, 0x00000013); // FLEXSPI2_B_DATA01 248 MEM_WriteU32(0x42A10094, 0x00000013); // FLEXSPI2_B_DATA00 249 MEM_WriteU32(0x42A1009C, 0x00000013); // FLEXSPI2_A_DATA00 250 MEM_WriteU32(0x42A100A0, 0x00000013); // FLEXSPI2_A_DATA01 251 MEM_WriteU32(0x42A100A4, 0x00000013); // FLEXSPI2_A_DATA02 252 MEM_WriteU32(0x42A100A8, 0x00000013); // FLEXSPI2_A_DATA03 253 MEM_WriteU32(0x42A100AC, 0x00000013); // FLEXSPI2_A_SS0_B 254 MEM_WriteU32(0x42A100B0, 0x00000013); // FLEXSPI2_A_DQS 255 MEM_WriteU32(0x42A100B4, 0x00000013); // FLEXSPI2_A_SCLK 256 257 //The input daisy!! 258 MEM_WriteU32(0x42A10594, 0x00000001); // FLEXSPI2_B_DATA03 259 MEM_WriteU32(0x42A10590, 0x00000001); // FLEXSPI2_B_DATA02 260 MEM_WriteU32(0x42A1058C, 0x00000001); // FLEXSPI2_B_DATA01 261 MEM_WriteU32(0x42A10588, 0x00000001); // FLEXSPI2_B_DATA00 262 MEM_WriteU32(0x42A10578, 0x00000000); // FLEXSPI2_A_DATA00 263 MEM_WriteU32(0x42A1057C, 0x00000000); // FLEXSPI2_A_DATA01 264 MEM_WriteU32(0x42A10580, 0x00000000); // FLEXSPI2_A_DATA02 265 MEM_WriteU32(0x42A10584, 0x00000000); // FLEXSPI2_A_DATA03 266 MEM_WriteU32(0x42A10570, 0x00000000); // FLEXSPI2_A_DQS 267 MEM_WriteU32(0x42A10598, 0x00000000); // FLEXSPI2_A_SCLK 268 269 // PAD ctrl 270 MEM_WriteU32(0x42A102D0, 0x00000008); // FLEXSPI2_B_DATA03 271 MEM_WriteU32(0x42A102D4, 0x00000008); // FLEXSPI2_B_DATA02 272 MEM_WriteU32(0x42A102D8, 0x00000008); // FLEXSPI2_B_DATA01 273 MEM_WriteU32(0x42A102DC, 0x00000008); // FLEXSPI2_B_DATA00 274 MEM_WriteU32(0x42A102E4, 0x00000008); // FLEXSPI2_A_DATA00 275 MEM_WriteU32(0x42A102E8, 0x00000008); // FLEXSPI2_A_DATA01 276 MEM_WriteU32(0x42A102EC, 0x00000008); // FLEXSPI2_A_DATA02 277 MEM_WriteU32(0x42A102F0, 0x00000008); // FLEXSPI2_A_DATA03 278 MEM_WriteU32(0x42A102F4, 0x00000008); // FLEXSPI2_A_SS0_B 279 MEM_WriteU32(0x42A102F8, 0x00000008); // FLEXSPI2_A_DQS 280 MEM_WriteU32(0x42A102FC, 0x00000008); // FLEXSPI2_A_SCLK 281} 282 283void _FLEXSPI2_ClockInit() 284{ 285 _WriteViaCM33AP32(0x54484350, 0x0); // ROSC400M_CTRL1 286 287 // Set flexspi2 root clock, use ROSC400, div = 2 = 1+1 288 MEM_WriteU32(0x44450B00, 0x101); // CLOCK_ROOT[22].CONTROL, FlexSPI2 289} 290 291void _FLEXSPI2_ModuleInit() 292{ 293 // Config FlexSPI2 Registers 294 295 unsigned int reg; 296 reg = MEM_ReadU32(0x445E0000); 297 MEM_WriteU32(0x445E0000, (reg & 0xFFFFFFFD)); 298 299 _FLEXSPI2_ModuleReset(); 300 301 MEM_WriteU32(0x445E0000, 0xFFFF3032); // MCR0 302 MEM_WriteU32(0x445E0004, 0xFFFFFFFF); // MCR1 303 MEM_WriteU32(0x445E0008, 0x200001F7); // MCR2 304 MEM_WriteU32(0x445E000C, 0x00000078); // AHBCR prefetch enable 305 MEM_WriteU32(0x445E0020, 0x800F0000); // AHBRXBUF0CR0 306 MEM_WriteU32(0x445E0024, 0x800F0000); // AHBRXBUF1CR0 307 MEM_WriteU32(0x445E0028, 0x800F0000); // AHBRXBUF2CR0 308 MEM_WriteU32(0x445E002C, 0x800F0000); // AHBRXBUF3CR0 309 MEM_WriteU32(0x445E0030, 0x800F0000); // AHBRXBUF4CR0 310 MEM_WriteU32(0x445E0034, 0x800F0000); // AHBRXBUF5CR0 311 MEM_WriteU32(0x445E0038, 0x80000020); // AHBRXBUF6CR0 312 MEM_WriteU32(0x445E003C, 0x80000020); // AHBRXBUF7CR0 313 MEM_WriteU32(0x445E00B8, 0x00000000); // IPRXFCR 314 MEM_WriteU32(0x445E00BC, 0x00000000); // IPTXFCR 315 316 MEM_WriteU32(0x445E0060, 0x00000000); // FLASHA1CR0 317 MEM_WriteU32(0x445E0064, 0x00000000); // FLASHA2CR0 318 MEM_WriteU32(0x445E0068, 0x00000000); // FLASHB1CR0 319 MEM_WriteU32(0x445E006C, 0x00000000); // FLASHB2CR0 320 321 _FLEXSPI2_WaitBusIdle(); 322 323 MEM_WriteU32(0x445E0060, 0x00002000); // FLASHA1CR0 324 MEM_WriteU32(0x445E0070, 0x00021C63); // FLASHA1CR1 325 MEM_WriteU32(0x445E0080, 0x00000100); // FLASHA1CR2 326 327 _FLEXSPI2_WaitBusIdle(); 328 329 MEM_WriteU32(0x445E00C0, 0x00000079); // DLLCRA 330 MEM_WriteU32(0x445E0000, 0xFFFF3030); // MCR0 331 332 do 333 { 334 reg = MEM_ReadU32(0x445E00E8); 335 } while (0x3 != (reg & 0x3)); 336 JLINK_SYS_Sleep(1); 337 // __delay(100);//100us 338 339 MEM_WriteU32(0x445E0000, 0xFFFF3032); // MCR0 340 MEM_WriteU32(0x445E0094, 0x000000C2); // FLASHCR4 341 MEM_WriteU32(0x445E0094, 0x000000C6); // FLASHCR4 342 MEM_WriteU32(0x445E0000, 0xFFFF3030); // MCR0 343 344 _FLEXSPI2_WaitBusIdle(); 345 346 MEM_WriteU32(0x445E0018, 0x5AF05AF0); // LUTKEY 347 MEM_WriteU32(0x445E001C, 0x00000002); // LUTCR 348 MEM_WriteU32(0x445E0200, 0x8B1887A0); // LUT[0] 349 MEM_WriteU32(0x445E0204, 0xB7078F10); // LUT[1] 350 MEM_WriteU32(0x445E0208, 0x0000A704); // LUT[2] 351 MEM_WriteU32(0x445E020C, 0x00000000); // LUT[3] 352 MEM_WriteU32(0x445E0210, 0x8B188720); // LUT[4] 353 MEM_WriteU32(0x445E0214, 0xB7078F10); // LUT[5] 354 MEM_WriteU32(0x445E0218, 0x0000A304); // LUT[6] 355 MEM_WriteU32(0x445E021C, 0x00000000); // LUT[7] 356 MEM_WriteU32(0x445E0220, 0x8B1887E0); // LUT[8] 357 MEM_WriteU32(0x445E0224, 0xB7078F10); // LUT[9] 358 MEM_WriteU32(0x445E0228, 0x0000A704); // LUT[10] 359 MEM_WriteU32(0x445E022C, 0x00000000); // LUT[11] 360 MEM_WriteU32(0x445E0230, 0x8B188760); // LUT[12] 361 MEM_WriteU32(0x445E0234, 0xA3048F10); // LUT[13] 362 MEM_WriteU32(0x445E0238, 0x00000000); // LUT[14] 363 MEM_WriteU32(0x445E023C, 0x00000000); // LUT[15] 364 MEM_WriteU32(0x445E0240, 0x00000000); // LUT[16] 365 MEM_WriteU32(0x445E0244, 0x00000000); // LUT[17] 366 MEM_WriteU32(0x445E0248, 0x00000000); // LUT[18] 367 MEM_WriteU32(0x445E024C, 0x00000000); // LUT[19] 368 MEM_WriteU32(0x445E0018, 0x5AF05AF0); // LUTKEY 369 MEM_WriteU32(0x445E001C, 0x00000001); // LUTCR 370 371 _FLEXSPI2_ModuleReset(); 372} 373 374void CM7_InitTCM(U32 targetAddr, U32 size) { 375 U32 reg; 376 377 reg = _ReadViaCM33AP32(0x52010000); // DMA4->TDC[0].CH_CSR 378 379 if((reg & 0x80000000) != 0) 380 { 381 // DMA channel is active, wait it get finished 382 do 383 { 384 reg = _ReadViaCM33AP32(0x52010000); // DMA4->TDC[0].CH_CSR 385 } while((reg & 0x40000000) == 0); 386 } 387 388 _WriteViaCM33AP32(0x52010000, 0x40000000); // DMA4->TDC[0].CH_CSR, clear DONE flag 389 390 _WriteViaCM33AP32(0x5201002C, 0x00000000); // DMA4->TCD[0].SLAST_SGA 391 _WriteViaCM33AP32(0x52010038, 0x00000000); // DMA4->TCD[0].DLAST_SGA 392 393 _WriteViaCM33AP32(0x52010000, 0x40000000); // DMA4->TCD[0].CH_CSR 394 395 _WriteViaCM33AP32(0x52010020, 0x20484000); // DMA4->TCD[0].SADDR 396 _WriteViaCM33AP32(0x52010030, targetAddr); // DMA4->TCD[0].DADDR 397 _WriteViaCM33AP32(0x52010028, size); // DMA4->TCD[0].NBYTES_MLOFFNO 398 _WriteViaCM33AP16(0x52010036, 0x1); // DMA4->TCD[0].ELINKNO 399 _WriteViaCM33AP16(0x5201003E, 0x1); // DMA4->TCD[0].BITER_ELINKNO 400 _WriteViaCM33AP16(0x52010026, 0x0303); // DMA4->TCD[0].ATTR 401 _WriteViaCM33AP16(0x52010024, 0x0); // DMA4->TCD[0].SOFF 402 _WriteViaCM33AP16(0x52010034, 0x8); // DMA4->TCD[0].DOFF 403 _WriteViaCM33AP32(0x52010000, 0x7); // DMA4->TDC[0].CH_CSR 404 _WriteViaCM33AP16(0x5201003C, 0x8); // DMA4->TCD[0].CSR 405 _WriteViaCM33AP16(0x5201003C, 0x9); // DMA4->TCD[0].CSR 406 407 do 408 { 409 reg = _ReadViaCM33AP32(0x52010000); // DMA4->TDC[0].CH_CSR 410 } while((reg & 0x40000000) == 0); 411 _WriteViaCM33AP32(0x52010000, 0x40000000); // DMA4->TDC[0].CH_CSR, clear DONE flag 412} 413 414void CM7_KickOff(void) 415{ 416 U32 reg, resp1, resp2; 417 418 reg = _ReadViaCM33AP32(0x544F0080); // BLK_CTRL_S_AONMIX->M7_CFG 419 if((reg & 0x10) == 0) 420 { 421 JLINK_SYS_Report("CM7 is running already"); 422 } 423 else 424 { 425 JLINK_SYS_Report("************* Begin Operations to Enable CM7 ***********************"); 426 427 // Clock Preparation 428 JLINK_SYS_Report("******** Prepare Clock *********"); 429 _WriteViaCM33AP32(0x54484350, 0x0); // ROSC400M_CTRL1 430 _WriteViaCM33AP32(0x54450000, 0x100); // CLOCK_ROOT[0].CONTROL, CM7 431 432 // Release CM7 433 _WriteViaCM33AP32(0x54460010, 0x1); // SRC_GENERAL_REG->SCR 434 435 // DMA initialization 436 JLINK_SYS_Report("******** DMA operation *********"); 437 CM7_InitTCM(0x303C0000, 0x40000); 438 CM7_InitTCM(0x30400000, 0x40000); 439 440 // Making Landing Zone 441 JLINK_SYS_Report("******** Creating Landing Zone *********"); 442 _WriteViaCM33AP32(0x303C0000, 0x20020000); 443 _WriteViaCM33AP32(0x303C0004, 0x00000009); 444 _WriteViaCM33AP32(0x303C0008, 0xE7FEE7FE); 445 446 // VTOR 0x00 447 _WriteViaCM33AP32(0x544F0080, 0x0010); // BLK_CTRL_S_AONMIX->M7_CFG 448 449 // Trigger ELE 450 JLINK_SYS_Report("******** ELE Trigger *********"); 451 _WriteViaCM33AP32(0x57540200, 0x17d20106); // MU_RT_S3MUA->TR[0] 452 resp1 = _ReadViaCM33AP32(0x57540280); // MU_RT_S3MUA->RR[0] 453 resp2 = _ReadViaCM33AP32(0x57540284); // MU_RT_S3MUA->RR[1] 454 JLINK_SYS_Report1("ELE RESP1 : ", resp1); 455 JLINK_SYS_Report1("ELE RESP2 : ", resp2); 456 457 // Deassert CM7 Wait 458 JLINK_SYS_Report("******** Kickoff CM7 *********"); 459 _WriteViaCM33AP32(0x544F0080, 0x0); // BLK_CTRL_S_AONMIX->M7_CFG 460 } 461} 462 463void DAP_Init(void) 464{ 465 JLINK_CORESIGHT_Configure(""); 466 467 CORESIGHT_AddAP(0, CORESIGHT_AHB_AP); 468 CORESIGHT_AddAP(1, CORESIGHT_APB_AP); 469 CORESIGHT_AddAP(2, CORESIGHT_AHB_AP); 470 CORESIGHT_AddAP(3, CORESIGHT_AHB_AP); 471 CORESIGHT_AddAP(4, CORESIGHT_APB_AP); 472 CORESIGHT_AddAP(5, CORESIGHT_APB_AP); 473 CORESIGHT_AddAP(6, CORESIGHT_APB_AP); 474 475 JLINK_SYS_Report("***************************************************"); 476 if(cpuID == _CM7_CPUID) 477 { 478 CPU = CORTEX_M7; 479 CORESIGHT_IndexAHBAPToUse = 2; 480 JLINK_SYS_Report("Current core is CM7"); 481 } 482 else if(cpuID == _CM33_CPUID) 483 { 484 CPU = CORTEX_M33; 485 CORESIGHT_IndexAHBAPToUse = 3; 486 JLINK_SYS_Report("Current core is CM33"); 487 } 488 else 489 { 490 JLINK_SYS_Report1("Wrong CPU ID: ", cpuID); 491 } 492 JLINK_SYS_Report("***************************************************"); 493} 494 495void CM33_Halt(void) 496{ 497 U32 reg; 498 499 reg = (_ReadViaCM33AP32(0x54460044) >> 24) & 0x3F; //SRC->SBMR2 500 501 if((reg == 8) || (reg == 9)) // Serial Download Mode, or Boot From Fuse 502 { 503 JLINK_SYS_Report("Not flash execution mode, check if CM33 is halted..."); 504 505 reg = _ReadViaCM33AP32(0xE000EDF0); //DHCSR 506 507 if(0 == (reg & 0x02)) 508 { 509 JLINK_SYS_Report1("CM33 is not halted, trying to halt it. CM33 DHCSR: ", reg); 510 511 _WriteViaCM33AP32(0xE000EDF0, 0xA05F0001); // DHCSR, Enable CM33 debug control 512 _WriteViaCM33AP32(0xE000EDF0, 0xA05F0003); // DHCSR, Halt CM33 513 reg = _ReadViaCM33AP32(0xE000EDF0); //DHCSR 514 if(0 != (reg & 0x02)) 515 { 516 JLINK_SYS_Report1("CM33 is halted now. CM33 DHCSR: ", reg); 517 } 518 else 519 { 520 JLINK_SYS_Report1("CM33 still running, halt failed. CM33 DHCSR: ", reg); 521 } 522 } 523 else 524 { 525 JLINK_SYS_Report1("CM33 is halted. CM33 DHCSR: ", reg); 526 } 527 } 528 else 529 { 530 JLINK_SYS_Report("Flash execution mode, leave CM33 run status as it was..."); 531 } 532} 533 534void Flash_Init() { 535 JLINK_SYS_Report("***************************************************"); 536 JLINK_SYS_Report("Init Flash"); 537 538 _FLEXSPI1_WaitBusIdle(); 539 _FLEXSPI1_ModuleReset(); 540 541 _FLEXSPI1_SetPinForQuadMode(); 542 _FLEXSPI1_ClockInit(); 543 _FLEXSPI1_ModuleInit(); 544 545 JLINK_SYS_Report("***************************************************"); 546} 547 548void HyperRAM_Init() 549{ 550 JLINK_SYS_Report("***************************************************"); 551 JLINK_SYS_Report("Init HyperRAM"); 552 553 _FLEXSPI2_WaitBusIdle(); 554 _FLEXSPI2_ModuleReset(); 555 556 _FlexSPI2_SetPinForOctalMode(); 557 _FLEXSPI2_ClockInit(); 558 _FLEXSPI2_ModuleInit(); 559 560 JLINK_SYS_Report("***************************************************"); 561} 562 563void CM33_ClearNVIC(void) { 564 JLINK_SYS_Report("***************************************************"); 565 JLINK_SYS_Report("Clear NVIC"); 566 JLINK_SYS_Report("***************************************************"); 567 JLINK_MEM_Fill(0xE000E180, 0x40, 0xFF); 568 JLINK_MEM_Fill(0xE000E280, 0x40, 0xFF); 569} 570 571int InitTarget(void) 572{ 573 cpuID = _CM7_CPUID; 574 575 DAP_Init(); 576 577 if(cpuID == _CM7_CPUID) 578 { 579 CM33_Halt(); 580 CM7_KickOff(); 581 582 /* Avoid to access TPIU to prevent soc hang */ 583 JLINK_ExecCommand("map region 0xE0040000-0xE0040FFF X"); // Mark region as illegal 584 } 585 586 return 0; 587} 588 589int SetupTarget(void) 590{ 591 return 0; 592} 593 594void ResetTarget(void) { 595 JLINK_TARGET_Halt(); // Make sure that the CPU is halted when reset is called 596} 597 598int AfterResetTarget(void) 599{ 600 U32 reg; 601 602 if(cpuID == _CM33_CPUID) 603 { 604 CM33_ClearNVIC(); 605 } 606 607 Flash_Init(); 608 HyperRAM_Init(); 609 610 return 0; 611} 612