|
|
|
|
|
|
|
|
// turn on power to PHY |
|
|
// turn on power to PHY |
|
|
USBPHY_PWD = 0; |
|
|
USBPHY_PWD = 0; |
|
|
|
|
|
|
|
|
#elif defined(__IMXRT1052__) || defined(__IMXRT1062__) |
|
|
|
|
|
// Teensy 4.0 PLL & USB PHY powerup |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
delay(10); |
|
|
|
|
|
|
|
|
|
|
|
// sanity check, connect 470K pullup & 100K pulldown and watch D+ voltage change |
|
|
// sanity check, connect 470K pullup & 100K pulldown and watch D+ voltage change |
|
|
//USBPHY_ANACTRL_CLR = (1<<10); // turn off both 15K pulldowns... works! :) |
|
|
//USBPHY_ANACTRL_CLR = (1<<10); // turn off both 15K pulldowns... works! :) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//SIM_SOPT2 = SIM_SOPT2 & (~SIM_SOPT2_CLKOUTSEL(7)) | SIM_SOPT2_CLKOUTSEL(4); // MCGIRCLK |
|
|
//SIM_SOPT2 = SIM_SOPT2 & (~SIM_SOPT2_CLKOUTSEL(7)) | SIM_SOPT2_CLKOUTSEL(4); // MCGIRCLK |
|
|
//CORE_PIN9_CONFIG = PORT_PCR_MUX(5); // CLKOUT on PTC3 Alt5 (Arduino pin 9) |
|
|
//CORE_PIN9_CONFIG = PORT_PCR_MUX(5); // CLKOUT on PTC3 Alt5 (Arduino pin 9) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#elif defined(__IMXRT1052__) || defined(__IMXRT1062__) |
|
|
|
|
|
// Teensy 4.0 PLL & USB PHY powerup |
|
|
|
|
|
while (1) { |
|
|
|
|
|
uint32_t n = CCM_ANALOG_PLL_USB2; |
|
|
|
|
|
if (n & CCM_ANALOG_PLL_USB2_DIV_SELECT) { |
|
|
|
|
|
CCM_ANALOG_PLL_USB2_CLR = 0xC000; // get out of 528 MHz mode |
|
|
|
|
|
CCM_ANALOG_PLL_USB2_SET = CCM_ANALOG_PLL_USB2_BYPASS; |
|
|
|
|
|
CCM_ANALOG_PLL_USB2_CLR = CCM_ANALOG_PLL_USB2_POWER | |
|
|
|
|
|
CCM_ANALOG_PLL_USB2_DIV_SELECT | |
|
|
|
|
|
CCM_ANALOG_PLL_USB2_ENABLE | |
|
|
|
|
|
CCM_ANALOG_PLL_USB2_EN_USB_CLKS; |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
if (!(n & CCM_ANALOG_PLL_USB2_ENABLE)) { |
|
|
|
|
|
CCM_ANALOG_PLL_USB2_SET = CCM_ANALOG_PLL_USB2_ENABLE; // enable |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
if (!(n & CCM_ANALOG_PLL_USB2_POWER)) { |
|
|
|
|
|
CCM_ANALOG_PLL_USB2_SET = CCM_ANALOG_PLL_USB2_POWER; // power up |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
if (!(n & CCM_ANALOG_PLL_USB2_LOCK)) { |
|
|
|
|
|
continue; // wait for lock |
|
|
|
|
|
} |
|
|
|
|
|
if (n & CCM_ANALOG_PLL_USB2_BYPASS) { |
|
|
|
|
|
CCM_ANALOG_PLL_USB2_CLR = CCM_ANALOG_PLL_USB2_BYPASS; // turn off bypass |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
if (!(n & CCM_ANALOG_PLL_USB2_EN_USB_CLKS)) { |
|
|
|
|
|
CCM_ANALOG_PLL_USB2_SET = CCM_ANALOG_PLL_USB2_EN_USB_CLKS; // enable |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
println("USB2 PLL running"); |
|
|
|
|
|
break; // USB2 PLL up and running |
|
|
|
|
|
} |
|
|
|
|
|
// turn on USB clocks (should already be on) |
|
|
|
|
|
CCM_CCGR6 |= CCM_CCGR6_USBOH3(CCM_CCGR_ON); |
|
|
|
|
|
// turn on USB2 PHY |
|
|
|
|
|
USBPHY2_CTRL_CLR = USBPHY_CTRL_SFTRST | USBPHY_CTRL_CLKGATE; |
|
|
|
|
|
USBPHY2_CTRL_SET = USBPHY_CTRL_ENUTMILEVEL2 | USBPHY_CTRL_ENUTMILEVEL3; |
|
|
|
|
|
USBPHY2_PWD = 0; |
|
|
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
delay(10); |
|
|
|
|
|
|
|
|
// now with the PHY up and running, start up USBHS |
|
|
// now with the PHY up and running, start up USBHS |
|
|
//print("begin ehci reset"); |
|
|
//print("begin ehci reset"); |
|
|
USBHS_USBCMD |= USBHS_USBCMD_RST; |
|
|
USBHS_USBCMD |= USBHS_USBCMD_RST; |
|
|
//count = 0; |
|
|
|
|
|
|
|
|
int count = 0; |
|
|
while (USBHS_USBCMD & USBHS_USBCMD_RST) { |
|
|
while (USBHS_USBCMD & USBHS_USBCMD_RST) { |
|
|
//count++; |
|
|
|
|
|
|
|
|
count++; |
|
|
} |
|
|
} |
|
|
//println(" reset waited ", count); |
|
|
|
|
|
|
|
|
println(" reset waited ", count); |
|
|
|
|
|
|
|
|
init_Device_Pipe_Transfer_memory(); |
|
|
init_Device_Pipe_Transfer_memory(); |
|
|
for (int i=0; i < PERIODIC_LIST_SIZE; i++) { |
|
|
for (int i=0; i < PERIODIC_LIST_SIZE; i++) { |
|
|
|
|
|
|
|
|
//USBHS_PORTSC1 |= USBHS_PORTSC_PFSC; // force 12 Mbit/sec |
|
|
//USBHS_PORTSC1 |= USBHS_PORTSC_PFSC; // force 12 Mbit/sec |
|
|
//USBHS_PORTSC1 |= USBHS_PORTSC_PHCD; // phy off |
|
|
//USBHS_PORTSC1 |= USBHS_PORTSC_PHCD; // phy off |
|
|
|
|
|
|
|
|
//println("USBHS_ASYNCLISTADDR = ", USBHS_ASYNCLISTADDR, HEX); |
|
|
|
|
|
//println("USBHS_PERIODICLISTBASE = ", USBHS_PERIODICLISTBASE, HEX); |
|
|
|
|
|
//println("periodictable = ", (uint32_t)periodictable, HEX); |
|
|
|
|
|
|
|
|
println("USBHS_ASYNCLISTADDR = ", USBHS_ASYNCLISTADDR, HEX); |
|
|
|
|
|
println("USBHS_PERIODICLISTBASE = ", USBHS_PERIODICLISTBASE, HEX); |
|
|
|
|
|
println("periodictable = ", (uint32_t)periodictable, HEX); |
|
|
|
|
|
|
|
|
// enable interrupts, after this point interruts to all the work |
|
|
// enable interrupts, after this point interruts to all the work |
|
|
attachInterruptVector(IRQ_USBHS, isr); |
|
|
attachInterruptVector(IRQ_USBHS, isr); |