diff --git a/k66_usbhost.ino b/k66_usbhost.ino index 16286b1..c499f25 100644 --- a/k66_usbhost.ino +++ b/k66_usbhost.ino @@ -1,8 +1,11 @@ // usb host experiments.... -//void * periodictable[64] __attribute__ ((section(".dmabuffers"), used, aligned(4096))) uint32_t periodictable[64] __attribute__ ((aligned(4096))); +uint32_t qh[12] __attribute__ ((aligned(64))); +uint32_t qtd_setup[8] __attribute__ ((aligned(32))); +uint32_t qtd_in[8] __attribute__ ((aligned(32))); +uint32_t qtd_outack[8] __attribute__ ((aligned(32))); void setup() @@ -11,7 +14,8 @@ void setup() digitalWrite(32, LOW); while (!Serial) ; // wait print("USB Host Testing"); - MPU_RGDAAC0 |= 0x30000000; + //MPU_RGDAAC0 |= 0x30000000; + MPU_RGDAAC0 |= 0xF0000000; MCG_C1 |= MCG_C1_IRCLKEN; // enable MCGIRCLK 32kHz OSC0_CR |= OSC_ERCLKEN; SIM_SOPT2 |= SIM_SOPT2_USBREGEN; // turn on USB regulator @@ -23,17 +27,17 @@ void setup() USBHSDCD_CLOCK = 33 << 2; print("init USBHS PHY & PLL"); // init process: page 1681-1682 - USBPHY_CTRL &= ~USBPHY_CTRL_SFTRST; // CTRL pg 1698 - USBPHY_CTRL &= ~USBPHY_CTRL_CLKGATE; - USBPHY_PLL_SIC |= USBPHY_PLL_SIC_PLL_POWER; - USBPHY_PLL_SIC |= USBPHY_PLL_SIC_PLL_DIV_SEL(1); // PLL_SIC pg 1708 + USBPHY_CTRL_CLR = (USBPHY_CTRL_SFTRST | USBPHY_CTRL_CLKGATE); // // CTRL pg 1698 + USBPHY_TRIM_OVERRIDE_EN_SET = 1; + USBPHY_PLL_SIC = USBPHY_PLL_SIC_PLL_POWER | USBPHY_PLL_SIC_PLL_ENABLE | + USBPHY_PLL_SIC_PLL_DIV_SEL(1) | USBPHY_PLL_SIC_PLL_EN_USB_CLKS; // wait for the PLL to lock int count=0; while ((USBPHY_PLL_SIC & USBPHY_PLL_SIC_PLL_LOCK) == 0) { count++; } print("PLL locked, waited ", count); - USBPHY_PLL_SIC |= USBPHY_PLL_SIC_PLL_EN_USB_CLKS; + // turn on power to PHY USBPHY_PWD = 0; delay(10); @@ -71,16 +75,31 @@ void setup() //periodictable[i] = (void *)1; periodictable[i] = 1; } + qh[0] = ((uint32_t)qh) | 2; + qh[1] = 0x0040E000; // addr=0, ep=0 + qh[2] = 0x40000000; + qh[3] = 0; + qh[4] = 1; + qh[5] = 0; + qh[6] = 0; + qh[7] = 0; + qh[8] = 0; + qh[9] = 0; + qh[10] = 0; + qh[11] = 0; + USBHS_USBINTR = 0; USBHS_PERIODICLISTBASE = (uint32_t)periodictable; USBHS_FRINDEX = 0; - USBHS_ASYNCLISTADDR = 0; // TODO: data.. + USBHS_ASYNCLISTADDR = (uint32_t)qh; // turn on the USBHS controller USBHS_USBMODE = USBHS_USBMODE_TXHSD(5) | USBHS_USBMODE_CM(3); // host mode USBHS_USBCMD = USBHS_USBCMD_ITC(0) | USBHS_USBCMD_RS | USBHS_USBCMD_ASP(3) | USBHS_USBCMD_FS2 | USBHS_USBCMD_FS(0) | // periodic table is 64 pointers - USBHS_USBCMD_PSE; + 0; + //USBHS_USBCMD_ASE; // TODO: halts with error, but why? + //USBHS_USBCMD_PSE | USBHS_USBCMD_ASE; // TODO: halts with error, but why? USBHS_PORTSC1 |= USBHS_PORTSC_PP; //USBHS_PORTSC1 |= USBHS_PORTSC_PFSC; // force 12 Mbit/sec