123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- #include "hal.h"
- void hal_lld_init(void) {
- uint32_t n;
-
- if (halSPCSetRunMode(SPC5_RUNMODE_RUN0) == OSAL_FAILED) {
- SPC5_CLOCK_FAILURE_HOOK();
- }
-
- n = halSPCGetSystemClock() / OSAL_ST_FREQUENCY;
- asm volatile ("mtspr 22, %[n] \t\n"
- "mtspr 54, %[n] \t\n"
- "e_lis %%r3, 0x0440 \t\n"
- "mtspr 340, %%r3"
- : : [n] "r" (n) : "r3");
-
- asm volatile ("e_li %%r3, 0x4000 \t\n"
- "mtspr 1008, %%r3"
- : : : "r3");
-
- edmaInit();
- }
- void spc_clock_init(void) {
-
- while (!ME.GS.B.S_IRCOSC)
- ;
- #if !SPC5_NO_INIT
- #if SPC5_DISABLE_WATCHDOG
-
- SWT.SR.R = 0xC520;
- SWT.SR.R = 0xD928;
- SWT.CR.R = 0xFF00000A;
- #endif
-
- AIPS.MPROT.R = 0x77777777;
- AIPS.PACR0_7.R = 0;
- AIPS.PACR8_15.R = 0;
- AIPS.PACR16_23.R = 0;
- AIPS.PACR24_31.R = 0;
- AIPS.OPACR0_7.R = 0;
- AIPS.OPACR8_15.R = 0;
- AIPS.OPACR16_23.R = 0;
- AIPS.OPACR24_31.R = 0;
- AIPS.OPACR32_39.R = 0;
- AIPS.OPACR40_47.R = 0;
- AIPS.OPACR48_55.R = 0;
- AIPS.OPACR56_63.R = 0;
- AIPS.OPACR64_71.R = 0;
- AIPS.OPACR72_79.R = 0;
- AIPS.OPACR80_87.R = 0;
- AIPS.OPACR88_95.R = 0;
-
- SSCM.ERROR.R = 3;
-
- FCCU.CFK.R = 0x618B7A50;
- FCCU.CFS[0].R = 0xFFFFFFFF;
- while (FCCU.CTRL.B.OPS != 3)
- ;
- FCCU.CFK.R = 0x618B7A50;
- FCCU.CFS[1].R = 0xFFFFFFFF;
- while (FCCU.CTRL.B.OPS != 3)
- ;
-
- FCCU.NCFK.R = 0xAB3498FE;
- FCCU.NCFS[0].R = 0xFFFFFFFF;
- while (FCCU.CTRL.B.OPS != 3)
- ;
-
- RGM.FES.R = 0xFFFF;
- RGM.DES.R = 0xFFFF;
-
- if (ME.GS.B.S_CURRENT_MODE != SPC5_RUNMODE_DRUN) {
- SPC5_CLOCK_FAILURE_HOOK();
- }
- #if defined(SPC5_OSC_BYPASS)
-
- CGM.OSC_CTL.B.OSCBYP = TRUE;
- #endif
-
- CGM.SC_DC0.R = SPC5_CGM_SC_DC0;
- CGM.AC0_DC0_3.R = SPC5_CGM_AC0_DC0 | SPC5_CGM_AC0_DC1;
- CGM.AC0_SC.R = SPC5_AUX0CLK_SRC;
- CGM.AC1_DC0_3.R = SPC5_CGM_AC1_DC0;
- CGM.AC1_SC.R = SPC5_AUX1CLK_SRC;
- CGM.AC2_DC0_3.R = SPC5_CGM_AC2_DC0;
- CGM.AC2_SC.R = SPC5_AUX2CLK_SRC;
- CGM.AC3_SC.R = SPC5_FMPLL0_CLK_SRC;
- CGM.AC4_SC.R = SPC5_FMPLL1_CLK_SRC;
-
- ME.DRUN.R = SPC5_ME_MC_SYSCLK_IRC | SPC5_ME_MC_IRCON | SPC5_ME_MC_XOSC0ON | \
- SPC5_ME_MC_FLAON_NORMAL | SPC5_ME_MC_MVRON;
- if (halSPCSetRunMode(SPC5_RUNMODE_DRUN) == OSAL_FAILED) {
- SPC5_CLOCK_FAILURE_HOOK();
- }
-
- CGM.FMPLL[0].CR.R = SPC5_FMPLL0_ODF |
- ((SPC5_FMPLL0_IDF_VALUE - 1) << 26) |
- (SPC5_FMPLL0_NDIV_VALUE << 16);
- CGM.FMPLL[0].MR.R = 0;
- CGM.FMPLL[1].CR.R = SPC5_FMPLL1_ODF |
- ((SPC5_FMPLL1_IDF_VALUE - 1) << 26) |
- (SPC5_FMPLL1_NDIV_VALUE << 16);
- CGM.FMPLL[1].MR.R = 0;
-
- ME.IS.R = 8;
- ME.MER.R = SPC5_ME_ME_BITS;
- ME.SAFE.R = SPC5_ME_SAFE_MC_BITS;
- ME.DRUN.R = SPC5_ME_DRUN_MC_BITS;
- ME.RUN[0].R = SPC5_ME_RUN0_MC_BITS;
- ME.RUN[1].R = SPC5_ME_RUN1_MC_BITS;
- ME.RUN[2].R = SPC5_ME_RUN2_MC_BITS;
- ME.RUN[3].R = SPC5_ME_RUN3_MC_BITS;
- ME.HALT0.R = SPC5_ME_HALT0_MC_BITS;
- ME.STOP0.R = SPC5_ME_STOP0_MC_BITS;
- if (ME.IS.B.I_ICONF) {
-
- SPC5_CLOCK_FAILURE_HOOK();
- }
-
- ME.RUNPC[0].R = SPC5_ME_RUN_PC0_BITS;
- ME.RUNPC[1].R = SPC5_ME_RUN_PC1_BITS;
- ME.RUNPC[2].R = SPC5_ME_RUN_PC2_BITS;
- ME.RUNPC[3].R = SPC5_ME_RUN_PC3_BITS;
- ME.RUNPC[4].R = SPC5_ME_RUN_PC4_BITS;
- ME.RUNPC[5].R = SPC5_ME_RUN_PC5_BITS;
- ME.RUNPC[6].R = SPC5_ME_RUN_PC6_BITS;
- ME.RUNPC[7].R = SPC5_ME_RUN_PC7_BITS;
- ME.LPPC[0].R = SPC5_ME_LP_PC0_BITS;
- ME.LPPC[1].R = SPC5_ME_LP_PC1_BITS;
- ME.LPPC[2].R = SPC5_ME_LP_PC2_BITS;
- ME.LPPC[3].R = SPC5_ME_LP_PC3_BITS;
- ME.LPPC[4].R = SPC5_ME_LP_PC4_BITS;
- ME.LPPC[5].R = SPC5_ME_LP_PC5_BITS;
- ME.LPPC[6].R = SPC5_ME_LP_PC6_BITS;
- ME.LPPC[7].R = SPC5_ME_LP_PC7_BITS;
-
- CFLASH.PFCR0.B.B02_APC = 3;
- CFLASH.PFCR0.B.B02_WWSC = 3;
- CFLASH.PFCR0.B.B02_RWSC = 3;
-
- if (halSPCSetRunMode(SPC5_RUNMODE_DRUN) == OSAL_FAILED) {
- SPC5_CLOCK_FAILURE_HOOK();
- }
- #endif
- }
- bool halSPCSetRunMode(spc5_runmode_t mode) {
-
- ME.IS.R = 5;
-
- ME.MCTL.R = SPC5_ME_MCTL_MODE(mode) | SPC5_ME_MCTL_KEY;
- ME.MCTL.R = SPC5_ME_MCTL_MODE(mode) | SPC5_ME_MCTL_KEY_INV;
-
- while (TRUE) {
- uint32_t r = ME.IS.R;
- if (r & 1)
- return OSAL_SUCCESS;
- if (r & 4)
- return OSAL_FAILED;
- }
- }
- void halSPCSetPeripheralClockMode(uint32_t n, uint32_t pctl) {
- uint32_t mode;
- ME.PCTL[n].R = pctl;
- mode = ME.MCTL.B.TARGET_MODE;
- ME.MCTL.R = SPC5_ME_MCTL_MODE(mode) | SPC5_ME_MCTL_KEY;
- ME.MCTL.R = SPC5_ME_MCTL_MODE(mode) | SPC5_ME_MCTL_KEY_INV;
- }
- #if !SPC5_NO_INIT || defined(__DOXYGEN__)
- uint32_t halSPCGetSystemClock(void) {
- uint32_t sysclk;
- sysclk = ME.GS.B.S_SYSCLK;
- switch (sysclk) {
- case SPC5_ME_GS_SYSCLK_IRC:
- return SPC5_IRC_CLK;
- case SPC5_ME_GS_SYSCLK_XOSC:
- return SPC5_XOSC_CLK;
- case SPC5_ME_GS_SYSCLK_FMPLL0:
- return SPC5_FMPLL0_CLK;
- default:
- return 0;
- }
- }
- #endif
|