File indexing completed on 2025-05-11 08:22:44
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 #ifndef __rtems__
0031 #include "samv71.h"
0032 #else
0033 #include <chip.h>
0034 #endif
0035
0036
0037
0038 #ifdef __cplusplus
0039 extern "C" {
0040 #endif
0041
0042
0043
0044
0045
0046
0047 #define SYS_BOARD_OSCOUNT (CKGR_MOR_MOSCXTST(0x8U))
0048 #ifndef __rtems__
0049 #if BOARD_MCK == 123000000
0050
0051
0052 #define SYS_BOARD_PLLAR (CKGR_PLLAR_ONE | CKGR_PLLAR_MULA(0x28U) | \
0053 CKGR_PLLAR_PLLACOUNT(0x3fU) | CKGR_PLLAR_DIVA(0x1U))
0054
0055 #define SYS_BOARD_MCKR_MDIV (PMC_MCKR_MDIV_PCK_DIV2)
0056 #define SYS_BOARD_MCKR (PMC_MCKR_PRES_CLK_2 | PMC_MCKR_CSS_PLLA_CLK \
0057 | SYS_BOARD_MCKR_MDIV)
0058 #elif BOARD_MCK == 150000000
0059 #define SYS_BOARD_PLLAR (CKGR_PLLAR_ONE | CKGR_PLLAR_MULA(0x18U) | \
0060 CKGR_PLLAR_PLLACOUNT(0x3fU) | CKGR_PLLAR_DIVA(0x1U))
0061
0062 #define SYS_BOARD_MCKR_MDIV (PMC_MCKR_MDIV_PCK_DIV2)
0063 #define SYS_BOARD_MCKR (PMC_MCKR_PRES_CLK_1 | PMC_MCKR_CSS_PLLA_CLK \
0064 | SYS_BOARD_MCKR_MDIV)
0065 #else
0066 #error "unexpected Main Clock (MCK) frequency"
0067 #endif
0068
0069 uint32_t SystemCoreClock = CHIP_FREQ_MAINCK_RC_4MHZ;
0070 #else
0071 #define SYS_BOARD_MCKR_MDIV ((atsam_clock_config.mckr_init) & PMC_MCKR_MDIV_Msk)
0072 #define SYS_BOARD_MCKR (atsam_clock_config.mckr_init)
0073 #define SYS_BOARD_PLLAR (atsam_clock_config.pllar_init)
0074 #endif
0075 #define USBCLK_DIV 10
0076
0077
0078
0079
0080
0081 #ifndef __rtems__
0082 void SystemInit(void)
0083 #else
0084 void ATSAM_START_SRAM_SECTION SystemInit(void)
0085 #endif
0086 {
0087 uint32_t read_MOR;
0088
0089 EFC->EEFC_FMR = EEFC_FMR_FWS(5);
0090
0091
0092
0093
0094
0095
0096 #if ATSAM_SLOWCLOCK_USE_XTAL == 1
0097 read_MOR = PMC->CKGR_MOR;
0098
0099 read_MOR |= (CKGR_MOR_KEY_PASSWD | CKGR_MOR_XT32KFME);
0100 PMC->CKGR_MOR = read_MOR;
0101
0102
0103 if ((SUPC->SUPC_SR & SUPC_SR_OSCSEL) != SUPC_SR_OSCSEL_CRYST) {
0104 SUPC->SUPC_CR = SUPC_CR_KEY_PASSWD | SUPC_CR_XTALSEL_CRYSTAL_SEL;
0105
0106 while (!(SUPC->SUPC_SR & SUPC_SR_OSCSEL));
0107 }
0108 #endif
0109
0110
0111 if (!(PMC->CKGR_MOR & CKGR_MOR_MOSCSEL)) {
0112 PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD | SYS_BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN |
0113 CKGR_MOR_MOSCXTEN;
0114
0115 while (!(PMC->PMC_SR & PMC_SR_MOSCXTS)) {
0116 }
0117 }
0118
0119
0120 PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD | SYS_BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN |
0121 CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCSEL;
0122
0123 while (!(PMC->PMC_SR & PMC_SR_MOSCSELS)) {
0124 }
0125
0126 PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_CSS_Msk) |
0127 PMC_MCKR_CSS_MAIN_CLK;
0128
0129 while (!(PMC->PMC_SR & PMC_SR_MCKRDY)) {
0130 }
0131
0132
0133 PMC->CKGR_PLLAR = SYS_BOARD_PLLAR;
0134
0135 while (!(PMC->PMC_SR & PMC_SR_LOCKA)) {
0136 }
0137
0138
0139 PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_MDIV_Msk) |
0140 SYS_BOARD_MCKR_MDIV;
0141 PMC->PMC_MCKR = (SYS_BOARD_MCKR & ~PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK;
0142
0143 while (!(PMC->PMC_SR & PMC_SR_MCKRDY)) {
0144 }
0145
0146
0147 PMC->PMC_MCKR = SYS_BOARD_MCKR;
0148
0149 while (!(PMC->PMC_SR & PMC_SR_MCKRDY)) {
0150 }
0151
0152 #ifndef __rtems__
0153 SystemCoreClock = CHIP_FREQ_CPU_MAX;
0154 #endif
0155 }
0156
0157 #ifndef __rtems__
0158 void SystemCoreClockUpdate(void)
0159 {
0160
0161 switch (PMC->PMC_MCKR & (uint32_t) PMC_MCKR_CSS_Msk) {
0162 case PMC_MCKR_CSS_SLOW_CLK:
0163 if (SUPC->SUPC_SR & SUPC_SR_OSCSEL)
0164 SystemCoreClock = CHIP_FREQ_XTAL_32K;
0165 else
0166 SystemCoreClock = CHIP_FREQ_SLCK_RC;
0167
0168 break;
0169
0170 case PMC_MCKR_CSS_MAIN_CLK:
0171 if (PMC->CKGR_MOR & CKGR_MOR_MOSCSEL)
0172 SystemCoreClock = CHIP_FREQ_XTAL_12M;
0173 else {
0174 SystemCoreClock = CHIP_FREQ_MAINCK_RC_4MHZ;
0175
0176 switch (PMC->CKGR_MOR & CKGR_MOR_MOSCRCF_Msk) {
0177 case CKGR_MOR_MOSCRCF_4_MHz:
0178 break;
0179
0180 case CKGR_MOR_MOSCRCF_8_MHz:
0181 SystemCoreClock *= 2U;
0182 break;
0183
0184 case CKGR_MOR_MOSCRCF_12_MHz:
0185 SystemCoreClock *= 3U;
0186 break;
0187
0188 default:
0189 break;
0190 }
0191 }
0192
0193 break;
0194
0195 case PMC_MCKR_CSS_PLLA_CLK:
0196 if (PMC->CKGR_MOR & CKGR_MOR_MOSCSEL)
0197 SystemCoreClock = CHIP_FREQ_XTAL_12M;
0198 else {
0199 SystemCoreClock = CHIP_FREQ_MAINCK_RC_4MHZ;
0200
0201 switch (PMC->CKGR_MOR & CKGR_MOR_MOSCRCF_Msk) {
0202 case CKGR_MOR_MOSCRCF_4_MHz:
0203 break;
0204
0205 case CKGR_MOR_MOSCRCF_8_MHz:
0206 SystemCoreClock *= 2U;
0207 break;
0208
0209 case CKGR_MOR_MOSCRCF_12_MHz:
0210 SystemCoreClock *= 3U;
0211 break;
0212
0213 default:
0214 break;
0215 }
0216 }
0217
0218 if ((uint32_t) (PMC->PMC_MCKR & (uint32_t) PMC_MCKR_CSS_Msk) ==
0219 PMC_MCKR_CSS_PLLA_CLK) {
0220 SystemCoreClock *= ((((PMC->CKGR_PLLAR) & CKGR_PLLAR_MULA_Msk) >>
0221 CKGR_PLLAR_MULA_Pos) + 1U);
0222 SystemCoreClock /= ((((PMC->CKGR_PLLAR) & CKGR_PLLAR_DIVA_Msk) >>
0223 CKGR_PLLAR_DIVA_Pos));
0224 }
0225
0226 break;
0227
0228 default:
0229 break;
0230 }
0231
0232 if ((PMC->PMC_MCKR & PMC_MCKR_PRES_Msk) == PMC_MCKR_PRES_CLK_3)
0233 SystemCoreClock /= 3U;
0234 else
0235 SystemCoreClock >>= ((PMC->PMC_MCKR & PMC_MCKR_PRES_Msk) >> PMC_MCKR_PRES_Pos);
0236 }
0237 #endif
0238
0239
0240
0241 void system_init_flash(uint32_t ul_clk)
0242 {
0243
0244 if (ul_clk < CHIP_FREQ_FWS_0)
0245 EFC->EEFC_FMR = EEFC_FMR_FWS(0) | EEFC_FMR_CLOE;
0246 else {
0247 if (ul_clk < CHIP_FREQ_FWS_1)
0248 EFC->EEFC_FMR = EEFC_FMR_FWS(1) | EEFC_FMR_CLOE;
0249 else {
0250 if (ul_clk < CHIP_FREQ_FWS_2)
0251 EFC->EEFC_FMR = EEFC_FMR_FWS(2) | EEFC_FMR_CLOE;
0252 else {
0253 if (ul_clk < CHIP_FREQ_FWS_3)
0254 EFC->EEFC_FMR = EEFC_FMR_FWS(3) | EEFC_FMR_CLOE;
0255 else {
0256 if (ul_clk < CHIP_FREQ_FWS_4)
0257 EFC->EEFC_FMR = EEFC_FMR_FWS(4) | EEFC_FMR_CLOE;
0258 else
0259 EFC->EEFC_FMR = EEFC_FMR_FWS(5) | EEFC_FMR_CLOE;
0260 }
0261 }
0262 }
0263 }
0264 }
0265
0266
0267
0268
0269
0270
0271
0272 void sysclk_enable_usb(void)
0273 {
0274
0275 PMC->PMC_SCDR = PMC_SCDR_USBCLK;
0276
0277
0278 PMC->CKGR_UCKR = CKGR_UCKR_UPLLEN | CKGR_UCKR_UPLLCOUNT(0xF);
0279
0280
0281 while (!(PMC->PMC_SR & PMC_SR_LOCKU));
0282
0283
0284 PMC->PMC_USB = (PMC_USB_USBS | PMC_USB_USBDIV(USBCLK_DIV - 1));
0285
0286 PMC->PMC_SCER = PMC_SCER_USBCLK;
0287 }
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297 void sysclk_disable_usb(void)
0298 {
0299
0300 PMC->PMC_SCDR = PMC_SCDR_USBCLK;
0301
0302
0303 PMC->CKGR_UCKR = CKGR_UCKR_UPLLEN | CKGR_UCKR_UPLLCOUNT(0xF);
0304
0305
0306 while (!(PMC->PMC_SR & PMC_SR_LOCKU));
0307
0308
0309 PMC->PMC_USB = (PMC_USB_USBS | PMC_USB_USBDIV(USBCLK_DIV - 1));
0310 }
0311
0312
0313
0314 #ifdef __cplusplus
0315 }
0316 #endif
0317
0318