From dc93e828f0c365f118ebbd504fc84324fb8c5616 Mon Sep 17 00:00:00 2001 From: dean Date: Wed, 11 Oct 2017 14:42:03 -0400 Subject: [PATCH] DM: fixed USB enumeration bug in bootloader and core --- bootloaders/metroM4/board_init.c | 106 ++-- bootloaders/metroM4/samd51_sam_ba.bin | Bin 7276 -> 7268 bytes bootloaders/metroM4/samd51_sam_ba.elf | Bin 1262262 -> 1262262 bytes bootloaders/metroM4/samd51_sam_ba.hex | 762 +++++++++++++------------- cores/arduino/startup.c | 28 +- 5 files changed, 446 insertions(+), 450 deletions(-) diff --git a/bootloaders/metroM4/board_init.c b/bootloaders/metroM4/board_init.c index d237622a..acdb36a2 100644 --- a/bootloaders/metroM4/board_init.c +++ b/bootloaders/metroM4/board_init.c @@ -63,64 +63,62 @@ void board_init(void) while ( GCLK->SYNCBUSY.reg & GCLK_SYNCBUSY_SWRST ){ /* wait for reset to complete */ } - - /* ---------------------------------------------------------------------------------------------- - * 2) Put XOSC32K as source of Generic Clock Generator 3 - */ - GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_XOSC32K].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_XOSC32K) | //generic clock gen 3 + + /* ---------------------------------------------------------------------------------------------- + * 2) Put XOSC32K as source of Generic Clock Generator 3 + */ + GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_XOSC32K].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_XOSC32K) | //generic clock gen 3 GCLK_GENCTRL_GENEN; - while ( GCLK->SYNCBUSY.reg & GCLK_SYNCBUSY_GENCTRL3 ){ - /* Wait for synchronization */ - } - - /* ---------------------------------------------------------------------------------------------- - * 3) Put Generic Clock Generator 3 as source for Generic Clock Gen 0 (DFLL48M reference) - */ - GCLK->GENCTRL[GENERIC_CLOCK_MULTIPLEXER_DFLL48M].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_OSCULP32K) | GCLK_GENCTRL_GENEN; - - while ( GCLK->SYNCBUSY.bit.GENCTRL0 ){ - /* Wait for synchronization */ - } - - /* ---------------------------------------------------------------------------------------------- - * 4) Enable DFLL48M clock - */ - - /* DFLL Configuration in Closed Loop mode - Closed-Loop Operation */ - - OSCCTRL->DFLLCTRLA.reg = 0; - GCLK->PCHCTRL[OSCCTRL_GCLK_ID_DFLL48].reg = (1 << GCLK_PCHCTRL_CHEN_Pos) | GCLK_PCHCTRL_GEN(GCLK_PCHCTRL_GEN_GCLK3_Val); - - OSCCTRL->DFLLMUL.reg = OSCCTRL_DFLLMUL_CSTEP( 31 ) | // Coarse step is 31, half of the max value - OSCCTRL_DFLLMUL_FSTEP( 511 ) | // Fine step is 511, half of the max value - OSCCTRL_DFLLMUL_MUL( (VARIANT_MCK/VARIANT_MAINOSC) ); // External 32KHz is the reference - - while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_DFLLMUL ) - { - /* Wait for synchronization */ - } + while ( GCLK->SYNCBUSY.reg & GCLK_SYNCBUSY_GENCTRL3 ){ + /* Wait for synchronization */ + } - OSCCTRL->DFLLCTRLB.reg = 0; - while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_DFLLCTRLB ) - { - /* Wait for synchronization */ - } + /* ---------------------------------------------------------------------------------------------- + * 3) Put Generic Clock Generator 3 as source for Generic Clock Gen 0 (DFLL48M reference) + */ + GCLK->GENCTRL[0].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_OSCULP32K) | GCLK_GENCTRL_GENEN; + + /* ---------------------------------------------------------------------------------------------- + * 4) Enable DFLL48M clock + */ + + /* DFLL Configuration in Open Loop mode */ + + OSCCTRL->DFLLCTRLA.reg = 0; + //GCLK->PCHCTRL[OSCCTRL_GCLK_ID_DFLL48].reg = (1 << GCLK_PCHCTRL_CHEN_Pos) | GCLK_PCHCTRL_GEN(GCLK_PCHCTRL_GEN_GCLK3_Val); + + OSCCTRL->DFLLMUL.reg = OSCCTRL_DFLLMUL_CSTEP( 0x1 ) | + OSCCTRL_DFLLMUL_FSTEP( 0x1 ) | + OSCCTRL_DFLLMUL_MUL( 0 ); + + while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_DFLLMUL ) + { + /* Wait for synchronization */ + } - OSCCTRL->DFLLCTRLA.reg |= OSCCTRL_DFLLCTRLA_ENABLE; - while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_ENABLE ) - { - /* Wait for synchronization */ - } - - OSCCTRL->DFLLCTRLB.reg |= OSCCTRL_DFLLCTRLB_MODE | - OSCCTRL_DFLLCTRLB_WAITLOCK | - OSCCTRL_DFLLCTRLB_QLDIS; - - while ( (OSCCTRL->STATUS.reg & (OSCCTRL_STATUS_DFLLRDY | OSCCTRL_STATUS_DFLLLCKC)) != (OSCCTRL_STATUS_DFLLRDY | OSCCTRL_STATUS_DFLLLCKC) ) - { - /* Wait for synchronization */ - } + OSCCTRL->DFLLCTRLB.reg = 0; + while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_DFLLCTRLB ) + { + /* Wait for synchronization */ + } + + OSCCTRL->DFLLCTRLA.reg |= OSCCTRL_DFLLCTRLA_ENABLE; + while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_ENABLE ) + { + /* Wait for synchronization */ + } + + OSCCTRL->DFLLVAL.reg = OSCCTRL->DFLLVAL.reg; + while( OSCCTRL->DFLLSYNC.bit.DFLLVAL ); + + OSCCTRL->DFLLCTRLB.reg = OSCCTRL_DFLLCTRLB_WAITLOCK | + OSCCTRL_DFLLCTRLB_CCDIS | OSCCTRL_DFLLCTRLB_USBCRM ; + + while ( !OSCCTRL->STATUS.bit.DFLLRDY ) + { + /* Wait for synchronization */ + } /* ---------------------------------------------------------------------------------------------- * 5) Switch Generic Clock Generator 0 to DFLL48M. CPU will run at 48MHz. diff --git a/bootloaders/metroM4/samd51_sam_ba.bin b/bootloaders/metroM4/samd51_sam_ba.bin index 546d65b87ffbf885fd7c57d7e303e927e0eb7e86..6049ba8be57a477ad7631b7ec5163b1f4120fccd 100644 GIT binary patch delta 902 zcmZ9HZ%7ki9LJyMcFxW1)G?=SvN~^p3>9ZhaOi9*9@$kQH3&sCC7kuDM0_DJ(V~fg z&4(Z*$;cofp*e&ke3#LS0>xfPWVx^)C~&d5>D{`1vl-IC=lOk~@9)q3o^O>~m2O#~ zSg#r(7vKhJfd-%v`2Rb7z-tEmIq0@wI(Pw&(2XgKxv-6D!1yKUQFY-_@on(Ms zEpQ5!!1%mnuNDwY!Qqt1ujA*?o@&FJG|u>$WM%(!cLg;2MRNOD+F;HQ?Ok zGE=?A9%F3KFRgffsfj^-BpqQIWg`!%RtK<#EUT}kxe(~@KKy1-jvHD#Ru+wGLqr7o|AuX z{{7E}ypvMvatxFrZV@TNYB*&^h(?HYKy(5gV%N1>r{vjGbwHj;sbTs4Uf&pbq>CDJ zWiI7o*}CU5WL9rAcSsqV8rZ#eZ+B5rrK&!WkNQ&VCJb{pZ$O%grz6$Vwm2>2Q;5|p zs81+j4XI~}ZF-62vzL-?-=aZR3yN(boch85qL)EqU07AR+j|Ai=qWdLd=doBn{3kV(WA^&%*krQGyxUC-tO>ELtE_rA}U@9})|{PdJb zGQ~Ej5h@3&fEu6<@B;ro4colapnnaP*|C1G8D7CVqZscA*{Ldw-;g#%3%*a@D<-jr zbSM{c5AsZ4XqxG+_`QR2^CLYB_rYh3;tX-#MOsz%E(gDSf#HsW$7YBN^{YMCcJoZi zQG#RRk&W?JTJvgO#k%Rd+7Z|d#R{FqD4nsf06V@n#lYG?eO424RUI|70qGpz! zQ6H&~_Eg%>%Yq}$a#o)#7>P>LhzCN=ntY4}(yw*kuOy@`$8%&&>u4#CpNX&>w#veR zcmpU|D37~&bHM5ApOyu0oR2v9+`#^;iH#d7WuY!!9&vHrm{Nyr$Sw;5Qc+}I4YKRH zoj%GY3%!ynQn2m2gWOJU;Ezdv!<+y4B(0~^qO=N17Q#|Aj9xrMi0uXL0-ZoNa0@tL zMo04#e7yw4{PA2 z_T)`}L`5p~g?!ZS#YIGA$lK)?M`LM7G1U}Pia8WwH8bjJStuqYh5}wAvK&2|a6L0B zPR}Ja%!V_l5CNnX}WN4nOx4gq)oIW8s|tP>pET{Crvf@2N^Rt@G^O8x`_25S9ZO^JZ3`ZH82CL i1Ey?*o&(>>u=$XAU5}8(fKVCG1l&l?(a?&yo%#pWK1o;r diff --git a/bootloaders/metroM4/samd51_sam_ba.elf b/bootloaders/metroM4/samd51_sam_ba.elf index 081f17b07adb050611d224b12ee391f3a7e2771b..a3fba7e2d9416ff61ae68fa4e4807babaabb45ba 100644 GIT binary patch delta 11606 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 Sr>U=pV<2B@uNz_Ck@7#xRa|iZ delta 11688 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 P(HO{An`eyi-;(gZGENCTRL[GENERIC_CLOCK_MULTIPLEXER_DFLL48M].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_OSCULP32K) | GCLK_GENCTRL_GENEN; - - while ( GCLK->SYNCBUSY.bit.GENCTRL0 ){ - /* Wait for synchronization */ - } - + GCLK->GENCTRL[0].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_OSCULP32K) | GCLK_GENCTRL_GENEN; + /* ---------------------------------------------------------------------------------------------- * 4) Enable DFLL48M clock */ - /* DFLL Configuration in Closed Loop mode - Closed-Loop Operation */ + /* DFLL Configuration in Open Loop mode */ OSCCTRL->DFLLCTRLA.reg = 0; - GCLK->PCHCTRL[OSCCTRL_GCLK_ID_DFLL48].reg = (1 << GCLK_PCHCTRL_CHEN_Pos) | GCLK_PCHCTRL_GEN(GCLK_PCHCTRL_GEN_GCLK3_Val); + //GCLK->PCHCTRL[OSCCTRL_GCLK_ID_DFLL48].reg = (1 << GCLK_PCHCTRL_CHEN_Pos) | GCLK_PCHCTRL_GEN(GCLK_PCHCTRL_GEN_GCLK3_Val); - OSCCTRL->DFLLMUL.reg = OSCCTRL_DFLLMUL_CSTEP( 31 ) | // Coarse step is 31, half of the max value - OSCCTRL_DFLLMUL_FSTEP( 511 ) | // Fine step is 511, half of the max value - OSCCTRL_DFLLMUL_MUL( (VARIANT_MCK/VARIANT_MAINOSC) ); // External 32KHz is the reference + OSCCTRL->DFLLMUL.reg = OSCCTRL_DFLLMUL_CSTEP( 0x1 ) | + OSCCTRL_DFLLMUL_FSTEP( 0x1 ) | + OSCCTRL_DFLLMUL_MUL( 0 ); while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_DFLLMUL ) { @@ -126,12 +122,14 @@ void SystemInit( void ) { /* Wait for synchronization */ } + + OSCCTRL->DFLLVAL.reg = OSCCTRL->DFLLVAL.reg; + while( OSCCTRL->DFLLSYNC.bit.DFLLVAL ); - OSCCTRL->DFLLCTRLB.reg |= OSCCTRL_DFLLCTRLB_MODE | - OSCCTRL_DFLLCTRLB_WAITLOCK | - OSCCTRL_DFLLCTRLB_QLDIS; + OSCCTRL->DFLLCTRLB.reg = OSCCTRL_DFLLCTRLB_WAITLOCK | + OSCCTRL_DFLLCTRLB_CCDIS | OSCCTRL_DFLLCTRLB_USBCRM ; - while ( (OSCCTRL->STATUS.reg & (OSCCTRL_STATUS_DFLLRDY | OSCCTRL_STATUS_DFLLLCKC)) != (OSCCTRL_STATUS_DFLLRDY | OSCCTRL_STATUS_DFLLLCKC) ) + while ( !OSCCTRL->STATUS.bit.DFLLRDY ) { /* Wait for synchronization */ }