Skip to content

Commit 169c784

Browse files
committed
DM: fixed USB enumeration bug in bootloader and core
1 parent c3b70d0 commit 169c784

File tree

5 files changed

+442
-446
lines changed

5 files changed

+442
-446
lines changed

bootloaders/metroM4/board_init.c

Lines changed: 48 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -63,64 +63,62 @@ void board_init(void)
6363
while ( GCLK->SYNCBUSY.reg & GCLK_SYNCBUSY_SWRST ){
6464
/* wait for reset to complete */
6565
}
66-
67-
/* ----------------------------------------------------------------------------------------------
68-
* 2) Put XOSC32K as source of Generic Clock Generator 3
69-
*/
70-
GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_XOSC32K].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_XOSC32K) | //generic clock gen 3
66+
67+
/* ----------------------------------------------------------------------------------------------
68+
* 2) Put XOSC32K as source of Generic Clock Generator 3
69+
*/
70+
GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_XOSC32K].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_XOSC32K) | //generic clock gen 3
7171
GCLK_GENCTRL_GENEN;
7272

73-
while ( GCLK->SYNCBUSY.reg & GCLK_SYNCBUSY_GENCTRL3 ){
74-
/* Wait for synchronization */
75-
}
76-
77-
/* ----------------------------------------------------------------------------------------------
78-
* 3) Put Generic Clock Generator 3 as source for Generic Clock Gen 0 (DFLL48M reference)
79-
*/
80-
GCLK->GENCTRL[GENERIC_CLOCK_MULTIPLEXER_DFLL48M].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_OSCULP32K) | GCLK_GENCTRL_GENEN;
81-
82-
while ( GCLK->SYNCBUSY.bit.GENCTRL0 ){
83-
/* Wait for synchronization */
84-
}
85-
86-
/* ----------------------------------------------------------------------------------------------
87-
* 4) Enable DFLL48M clock
88-
*/
73+
while ( GCLK->SYNCBUSY.reg & GCLK_SYNCBUSY_GENCTRL3 ){
74+
/* Wait for synchronization */
75+
}
76+
77+
/* ----------------------------------------------------------------------------------------------
78+
* 3) Put Generic Clock Generator 3 as source for Generic Clock Gen 0 (DFLL48M reference)
79+
*/
80+
GCLK->GENCTRL[0].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_OSCULP32K) | GCLK_GENCTRL_GENEN;
81+
82+
/* ----------------------------------------------------------------------------------------------
83+
* 4) Enable DFLL48M clock
84+
*/
8985

90-
/* DFLL Configuration in Closed Loop mode - Closed-Loop Operation */
86+
/* DFLL Configuration in Open Loop mode */
9187

92-
OSCCTRL->DFLLCTRLA.reg = 0;
93-
GCLK->PCHCTRL[OSCCTRL_GCLK_ID_DFLL48].reg = (1 << GCLK_PCHCTRL_CHEN_Pos) | GCLK_PCHCTRL_GEN(GCLK_PCHCTRL_GEN_GCLK3_Val);
88+
OSCCTRL->DFLLCTRLA.reg = 0;
89+
//GCLK->PCHCTRL[OSCCTRL_GCLK_ID_DFLL48].reg = (1 << GCLK_PCHCTRL_CHEN_Pos) | GCLK_PCHCTRL_GEN(GCLK_PCHCTRL_GEN_GCLK3_Val);
9490

95-
OSCCTRL->DFLLMUL.reg = OSCCTRL_DFLLMUL_CSTEP( 31 ) | // Coarse step is 31, half of the max value
96-
OSCCTRL_DFLLMUL_FSTEP( 511 ) | // Fine step is 511, half of the max value
97-
OSCCTRL_DFLLMUL_MUL( (VARIANT_MCK/VARIANT_MAINOSC) ); // External 32KHz is the reference
91+
OSCCTRL->DFLLMUL.reg = OSCCTRL_DFLLMUL_CSTEP( 0x1 ) |
92+
OSCCTRL_DFLLMUL_FSTEP( 0x1 ) |
93+
OSCCTRL_DFLLMUL_MUL( 0 );
9894

99-
while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_DFLLMUL )
100-
{
101-
/* Wait for synchronization */
102-
}
95+
while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_DFLLMUL )
96+
{
97+
/* Wait for synchronization */
98+
}
10399

104-
OSCCTRL->DFLLCTRLB.reg = 0;
105-
while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_DFLLCTRLB )
106-
{
107-
/* Wait for synchronization */
108-
}
100+
OSCCTRL->DFLLCTRLB.reg = 0;
101+
while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_DFLLCTRLB )
102+
{
103+
/* Wait for synchronization */
104+
}
109105

110-
OSCCTRL->DFLLCTRLA.reg |= OSCCTRL_DFLLCTRLA_ENABLE;
111-
while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_ENABLE )
112-
{
113-
/* Wait for synchronization */
114-
}
115-
116-
OSCCTRL->DFLLCTRLB.reg |= OSCCTRL_DFLLCTRLB_MODE |
117-
OSCCTRL_DFLLCTRLB_WAITLOCK |
118-
OSCCTRL_DFLLCTRLB_QLDIS;
119-
120-
while ( (OSCCTRL->STATUS.reg & (OSCCTRL_STATUS_DFLLRDY | OSCCTRL_STATUS_DFLLLCKC)) != (OSCCTRL_STATUS_DFLLRDY | OSCCTRL_STATUS_DFLLLCKC) )
121-
{
122-
/* Wait for synchronization */
123-
}
106+
OSCCTRL->DFLLCTRLA.reg |= OSCCTRL_DFLLCTRLA_ENABLE;
107+
while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_ENABLE )
108+
{
109+
/* Wait for synchronization */
110+
}
111+
112+
OSCCTRL->DFLLVAL.reg = OSCCTRL->DFLLVAL.reg;
113+
while( OSCCTRL->DFLLSYNC.bit.DFLLVAL );
114+
115+
OSCCTRL->DFLLCTRLB.reg = OSCCTRL_DFLLCTRLB_WAITLOCK |
116+
OSCCTRL_DFLLCTRLB_CCDIS | OSCCTRL_DFLLCTRLB_USBCRM ;
117+
118+
while ( !OSCCTRL->STATUS.bit.DFLLRDY )
119+
{
120+
/* Wait for synchronization */
121+
}
124122

125123
/* ----------------------------------------------------------------------------------------------
126124
* 5) Switch Generic Clock Generator 0 to DFLL48M. CPU will run at 48MHz.

bootloaders/metroM4/samd51_sam_ba.bin

-8 Bytes
Binary file not shown.

bootloaders/metroM4/samd51_sam_ba.elf

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)