work in progress of usb controller and usb stack for omap3
diff --git a/dev/usb/rules.mk b/dev/usb/rules.mk
new file mode 100644
index 0000000..649f0c4
--- /dev/null
+++ b/dev/usb/rules.mk
@@ -0,0 +1,5 @@
+LOCAL_DIR := $(GET_LOCAL_DIR)
+
+OBJS += \
+ $(LOCAL_DIR)/usb.o
+
diff --git a/dev/usb/usb.c b/dev/usb/usb.c
new file mode 100644
index 0000000..6042391
--- /dev/null
+++ b/dev/usb/usb.c
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2008 Travis Geiselbrecht
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#include <debug.h>
+#include <dev/usb.h>
+#include <dev/usbc.h>
+#include <hw/usb.h>
+
+void usb_init(void)
+{
+}
+
diff --git a/include/dev/usb.h b/include/dev/usb.h
new file mode 100644
index 0000000..556a4ed
--- /dev/null
+++ b/include/dev/usb.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2008 Travis Geiselbrecht
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#ifndef __DEV_USB_H
+#define __DEV_USB_H
+
+/* device side usb stack api */
+
+void usb_init(void);
+
+#endif
+
diff --git a/include/dev/usbc.h b/include/dev/usbc.h
new file mode 100644
index 0000000..26c1945
--- /dev/null
+++ b/include/dev/usbc.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2008 Travis Geiselbrecht
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#ifndef __DEV_USBC_H
+#define __DEV_USBC_H
+
+/* device side usb controller api (used by the usb stack) */
+void usbc_init(void);
+
+#endif
+
diff --git a/include/hw/usb.h b/include/hw/usb.h
new file mode 100644
index 0000000..a533b7b
--- /dev/null
+++ b/include/hw/usb.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2008 Travis Geiselbrecht
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#ifndef __HW_USB_H
+#define __HW_USB_H
+
+#include <sys/types.h>
+#include <compiler.h>
+
+/* GLOBAL STATUS VALUES */
+#define STD_COMMAND 0x00
+#define SETUP_COMMAND_PHASE 0x40
+#define FUNCTION_ERROR 0x7F /* Used when we are stalling the function EP0 */
+#define HUB_ERROR 0xFF /* Used when we are stalling the HUB EP0 */
+
+/* Request Types */
+#define DIR_OUT (0 << 7)
+#define DIR_IN (1 << 7)
+#define DIR_MASK (1 << 7)
+#define TYPE_STANDARD (0 << 5)
+#define TYPE_CLASS (1 << 5)
+#define TYPE_VENDOR (2 << 5)
+#define TYPE_MASK (3 << 5)
+#define RECIP_DEVICE (0 << 0)
+#define RECIP_INTERFACE (1 << 0)
+#define RECIP_ENDPOINT (2 << 0)
+#define RECIP_OTHER (3 << 0)
+#define RECIP_MASK (0x1f << 0)
+
+/* 1.0 Request Values */
+#define GET_STATUS 0x00
+#define CLEAR_FEATURE 0x01
+#define SET_FEATURE 0x03
+#define SET_ADDRESS 0x05
+#define GET_DESCRIPTOR 0x06
+#define SET_DESCRIPTOR 0x07
+#define GET_CONFIGURATION 0x08
+#define SET_CONFIGURATION 0x09
+#define GET_INTERFACE 0x0A
+#define SET_INTERFACE 0x0B
+#define SYNCH_FRAME 0x0C
+
+/* Mass storage requests */
+#define MASS_STORAGE_GET_MAX_LUN 0xfe
+#define MASS_STORAGE_RESET 0xff
+
+/* DFU requests */
+#define DFU_DETACH 0x00
+#define DFU_DNLOAD 0x01
+#define DFU_UPLOAD 0x02
+#define DFU_GETSTATUS 0x03
+#define DFU_CLRSTATUS 0x04
+#define DFU_GETSTATE 0x05
+#define DFU_ABORT 0x06
+
+/* HID Request Values */
+#define GET_REPORT 0x01
+#define GET_IDLE 0x02
+#define GET_PROTOCOL 0x03
+#define SET_REPORT 0x09
+#define SET_IDLE 0x0A
+#define SET_PROTOCOL 0x0B
+
+/* Descriptor Types */
+#define DEVICE 0x01
+#define CONFIGURATION 0x02
+#define STRING 0x03
+#define INTERFACE 0x04
+#define ENDPOINT 0x05
+#define DEVICE_QUALIFIER 0x06
+#define OTHER_SPEED_CONFIGURATION 0x07
+#define INTERFACE_POWER 0x08
+#define HID 0x21
+#define HIDREPORT 0x22
+#define HIDPHYSICAL 0x23
+
+/* general USB defines */
+struct usb_setup {
+ uint8_t request_type;
+ uint8_t request;
+ uint16_t value;
+ uint16_t index;
+ uint16_t length;
+} __PACKED;
+
+#endif
+
diff --git a/include/reg.h b/include/reg.h
index e10a3e8..d04d4ea 100644
--- a/include/reg.h
+++ b/include/reg.h
@@ -31,6 +31,11 @@
#define REG16(addr) ((volatile uint16_t *)(addr))
#define REG8(addr) ((volatile uint8_t *)(addr))
+#define RMWREG64(addr, startbit, width, val) *REG64(addr) = (*REG64(addr) & ~(((1<<(width)) - 1) << (startbit))) | ((val) << (startbit))
+#define RMWREG32(addr, startbit, width, val) *REG32(addr) = (*REG32(addr) & ~(((1<<(width)) - 1) << (startbit))) | ((val) << (startbit))
+#define RMWREG16(addr, startbit, width, val) *REG16(addr) = (*REG16(addr) & ~(((1<<(width)) - 1) << (startbit))) | ((val) << (startbit))
+#define RMWREG8(addr, startbit, width, val) *REG8(addr) = (*REG8(addr) & ~(((1<<(width)) - 1) << (startbit))) | ((val) << (startbit))
+
#define writel(v, a) (*REG32(a) = (v))
#define readl(a) (*REG32(a))
diff --git a/platform/omap3/i2c.c b/platform/omap3/i2c.c
index 1c3efee..ad07d29 100644
--- a/platform/omap3/i2c.c
+++ b/platform/omap3/i2c.c
@@ -230,6 +230,10 @@
{
LTRACE_ENTRY;
+ /* enable clocks on i2c 0-2 */
+ RMWREG32(CM_FCLKEN1_CORE, 15, 3, 0x7),
+ RMWREG32(CM_ICLKEN1_CORE, 15, 3, 0x7),
+
i2c_reset_bus(0);
i2c_reset_bus(1);
i2c_reset_bus(2);
diff --git a/platform/omap3/include/platform/omap3.h b/platform/omap3/include/platform/omap3.h
index 1ad3ae0..4a2534e 100644
--- a/platform/omap3/include/platform/omap3.h
+++ b/platform/omap3/include/platform/omap3.h
@@ -39,6 +39,47 @@
/* clocks */
#define CM_CLKSEL_PER (L4_BASE + 0x5040)
+/* PRCM */
+#define CM_FCLKEN_IVA2 (L4_BASE + 0x4000)
+#define CM_CLKEN_PLL_IVA2 (L4_BASE + 0x4004)
+#define CM_IDLEST_PLL_IVA2 (L4_BASE + 0x4024)
+#define CM_CLKSEL1_PLL_IVA2 (L4_BASE + 0x4040)
+#define CM_CLKSEL2_PLL_IVA2 (L4_BASE + 0x4044)
+#define CM_CLKEN_PLL_MPU (L4_BASE + 0x4904)
+#define CM_IDLEST_PLL_MPU (L4_BASE + 0x4924)
+#define CM_CLKSEL1_PLL_MPU (L4_BASE + 0x4940)
+#define CM_CLKSEL2_PLL_MPU (L4_BASE + 0x4944)
+#define CM_FCLKEN1_CORE (L4_BASE + 0x4a00)
+#define CM_ICLKEN1_CORE (L4_BASE + 0x4a10)
+#define CM_ICLKEN2_CORE (L4_BASE + 0x4a14)
+#define CM_CLKSEL_CORE (L4_BASE + 0x4a40)
+#define CM_FCLKEN_GFX (L4_BASE + 0x4b00)
+#define CM_ICLKEN_GFX (L4_BASE + 0x4b10)
+#define CM_CLKSEL_GFX (L4_BASE + 0x4b40)
+#define CM_FCLKEN_WKUP (L4_BASE + 0x4c00)
+#define CM_ICLKEN_WKUP (L4_BASE + 0x4c10)
+#define CM_CLKSEL_WKUP (L4_BASE + 0x4c40)
+#define CM_IDLEST_WKUP (L4_BASE + 0x4c20)
+#define CM_CLKEN_PLL (L4_BASE + 0x4d00)
+#define CM_IDLEST_CKGEN (L4_BASE + 0x4d20)
+#define CM_CLKSEL1_PLL (L4_BASE + 0x4d40)
+#define CM_CLKSEL2_PLL (L4_BASE + 0x4d44)
+#define CM_CLKSEL3_PLL (L4_BASE + 0x4d48)
+#define CM_FCLKEN_DSS (L4_BASE + 0x4e00)
+#define CM_ICLKEN_DSS (L4_BASE + 0x4e10)
+#define CM_CLKSEL_DSS (L4_BASE + 0x4e40)
+#define CM_FCLKEN_CAM (L4_BASE + 0x4f00)
+#define CM_ICLKEN_CAM (L4_BASE + 0x4f10)
+#define CM_CLKSEL_CAM (L4_BASE + 0x4F40)
+#define CM_FCLKEN_PER (L4_BASE + 0x5000)
+#define CM_ICLKEN_PER (L4_BASE + 0x5010)
+#define CM_CLKSEL_PER (L4_BASE + 0x5040)
+#define CM_CLKSEL1_EMU (L4_BASE + 0x5140)
+
+#define PRM_CLKSEL (L4_BASE + 0x306d40)
+#define PRM_RSTCTRL (L4_BASE + 0x307250)
+#define PRM_CLKSRC_CTRL (L4_BASE + 0x307270)
+
/* General Purpose Timers */
#define OMAP34XX_GPT1 (L4_BASE + 0x318000)
#define OMAP34XX_GPT2 (L4_BASE + 0x1032000)
@@ -171,6 +212,19 @@
#define INT_VECTORS 96
#define GPT2_IRQ 38
+/* HS USB */
+#define USB_HS_BASE (L4_BASE + 0xab000)
+
+/* USB OTG */
+#define OTG_BASE (L4_BASE + 0xab400)
+
+#define OTG_REVISION (OTG_BASE + 0x00)
+#define OTG_SYSCONFIG (OTG_BASE + 0x04)
+#define OTG_SYSSTATUS (OTG_BASE + 0x08)
+#define OTG_INTERFSEL (OTG_BASE + 0x0C)
+#define OTG_SIMENABLE (OTG_BASE + 0x10)
+#define OTG_FORCESTDBY (OTG_BASE + 0x14)
+
/* I2C */
#define I2C1_BASE (L4_BASE + 0x70000)
#define I2C2_BASE (L4_BASE + 0x72000)
diff --git a/platform/omap3/platform.c b/platform/omap3/platform.c
index fbe1b46..cba7a26 100644
--- a/platform/omap3/platform.c
+++ b/platform/omap3/platform.c
@@ -28,6 +28,7 @@
#include <platform/omap3.h>
#include <dev/i2c.h>
#include <dev/uart.h>
+#include <dev/usbc.h>
void platform_init_mmu_mappings(void)
{
@@ -56,5 +57,9 @@
void platform_init(void)
{
i2c_init();
+
+ uart_init();
+
+ usbc_init();
}
diff --git a/platform/omap3/rules.mk b/platform/omap3/rules.mk
index ea47c37..c92ba0b 100644
--- a/platform/omap3/rules.mk
+++ b/platform/omap3/rules.mk
@@ -4,6 +4,13 @@
ARM_CPU := cortex-a8
CPU := generic
+DEVS += usb
+
+# provides a few devices
+DEFINES += \
+ WITH_DEV_USBC=1 \
+ WITH_DEV_UART=1
+
INCLUDES += \
-I$(LOCAL_DIR)/include
@@ -14,7 +21,8 @@
$(LOCAL_DIR)/interrupts.o \
$(LOCAL_DIR)/platform.o \
$(LOCAL_DIR)/timer.o \
- $(LOCAL_DIR)/uart.o
+ $(LOCAL_DIR)/uart.o \
+ $(LOCAL_DIR)/usbc.o
MEMBASE := 0x80000000
diff --git a/platform/omap3/timer.c b/platform/omap3/timer.c
index c6df208..f101f50 100644
--- a/platform/omap3/timer.c
+++ b/platform/omap3/timer.c
@@ -104,6 +104,11 @@
void platform_init_timer(void)
{
+ /* GPT2 */
+ RMWREG32(CM_CLKSEL_PER, 0, 1, 1);
+ RMWREG32(CM_ICLKEN_PER, 3, 1, 1);
+ RMWREG32(CM_FCLKEN_PER, 3, 1, 1);
+
// reset the GP timer
TIMER_REG(TIOCP_CFG) = 0x2;
while ((TIMER_REG(TISTAT) & 1) == 0)
diff --git a/platform/omap3/uart.c b/platform/omap3/uart.c
index e4c5102..27eee9f 100644
--- a/platform/omap3/uart.c
+++ b/platform/omap3/uart.c
@@ -21,6 +21,7 @@
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <debug.h>
+#include <reg.h>
#include <dev/uart.h>
#include <platform/omap3.h>
#include <target/debugconfig.h>
@@ -105,6 +106,18 @@
void uart_init_early(void)
{
+ /* UART1 */
+ RMWREG32(CM_FCLKEN1_CORE, 13, 1, 1),
+ RMWREG32(CM_ICLKEN1_CORE, 13, 1, 1),
+
+ /* UART2 */
+ RMWREG32(CM_FCLKEN1_CORE, 14, 1, 1),
+ RMWREG32(CM_ICLKEN1_CORE, 14, 1, 1),
+
+ /* UART3 */
+ RMWREG32(CM_FCLKEN_PER, 11, 1, 1),
+ RMWREG32(CM_ICLKEN_PER, 11, 1, 1),
+
uart_init_port(DEBUG_UART, 115200);
}
diff --git a/platform/omap3/usbc.c b/platform/omap3/usbc.c
new file mode 100644
index 0000000..99f9504
--- /dev/null
+++ b/platform/omap3/usbc.c
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2008 Travis Geiselbrecht
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#include <debug.h>
+#include <reg.h>
+#include <dev/usb.h>
+#include <dev/usbc.h>
+#include <dev/twl4030.h>
+#include <hw/usb.h>
+#include <platform/interrupts.h>
+#include <platform/omap3.h>
+
+#define LOCAL_TRACE 1
+
+#define hsusb_reg8(reg) *REG8(USB_HS_BASE + (reg))
+#define hsusb_reg16(reg) *REG16(USB_HS_BASE + (reg))
+#define hsusb_reg32(reg) *REG32(USB_HS_BASE + (reg))
+
+/* registers */
+#define FADDR 0x0
+#define POWER 0x1
+#define INTRTX 0x2
+#define INTRRX 0x4
+#define INTRTXE 0x6
+#define INTRRXE 0x8
+#define INTRUSB 0xa
+#define INTRUSBE 0xb
+#define FRAME 0xc
+#define INDEX 0xe
+#define TESTMODE 0xf
+
+// indexed endpoint regs
+#define IDX_TXMAXP 0x10
+#define IDX_TXCSR 0x12
+#define IDX_TXCSRL 0x12
+#define IDX_TXCSRH 0x13
+#define IDX_RXMAXP 0x14
+#define IDX_RXCSR 0x16
+#define IDX_RXCSRL 0x16
+#define IDX_RXCSRH 0x17
+#define IDX_RXCOUNT 0x18
+#define IDX_FIFOSIZE 0x1f
+
+// if endpoint 0 is selected
+#define IDX_CSR0 0x12
+#define IDX_CONFIGDATA 0x1f
+
+// endpoint FIFOs
+#define FIFOBASE 0x20
+
+#define DEVCTL 0x60
+#define TXFIFOSZ 0x62
+#define RXFIFOSZ 0x63
+#define TXFIFOADD 0x64
+#define RXFIFOADD 0x66
+#define HWVERS 0x6c
+#define EPINFO 0x78
+#define RAMINFO 0x79
+#define LINKINFO 0x7a
+
+static enum handler_return hsusb_interrupt(void *arg)
+{
+ uint16_t intrtx = hsusb_reg16(INTRTX);
+ uint16_t intrrx = hsusb_reg16(INTRRX);
+ uint8_t intrusb = hsusb_reg8(INTRUSB);
+ enum handler_return ret = INT_NO_RESCHEDULE;
+
+ LTRACEF("intrtx 0x%hx (0x%x), intrrx 0x%hx (0x%x), intrusb 0x%hhx, intrusbe 0x%hhx\n",
+ intrtx, hsusb_reg16(INTRTXE), intrrx, hsusb_reg16(INTRRXE), intrusb, hsusb_reg8(INTRUSBE));
+
+ return ret;
+}
+
+int usbc_set_active(bool active)
+{
+ if (active) {
+// DEBUG_ASSERT(!usbc->active);
+
+ hsusb_reg8(POWER) |= (1<<6); // soft conn
+ twl4030_set_usb_pullup(true);
+// usbc->active = true;
+ } else {
+ hsusb_reg8(POWER) &= ~(1<<6); // soft conn
+ twl4030_set_usb_pullup(false);
+// usbc->active = false;
+ }
+
+ return 0;
+}
+
+static void otg_reset(void)
+{
+ /* reset the chip */
+ *REG32(OTG_SYSCONFIG) |= (1<<1);
+ while ((*REG32(OTG_SYSSTATUS) & 1) == 0)
+ ;
+
+ /* power up the controller */
+ *REG32(OTG_FORCESTDBY) = 0; // disable forced standby
+ *REG32(OTG_SYSCONFIG) &= ~(1<<1); // autoidle off
+ *REG32(OTG_SYSCONFIG) = (2<<12) | (2<<3) | (0<<0); // master in smart-standby, periph in smart-idle, autoidle off
+
+ *REG32(OTG_SYSCONFIG) |= 1; // autoidle on
+
+ *REG32(OTG_INTERFSEL) = 1; // 8 bit ULPI
+}
+
+static void hsusb_init(void)
+{
+ LTRACE_ENTRY;
+
+ // select endpoint 0
+ dprintf("hwvers 0x%hx\n", hsusb_reg16(HWVERS));
+ dprintf("epinfo 0x%hhx\n", hsusb_reg8(EPINFO));
+ dprintf("raminfo 0x%hhx\n", hsusb_reg8(RAMINFO));
+ hsusb_reg8(INDEX) = 0;
+ dprintf("config 0x%hhx\n", hsusb_reg8(IDX_CONFIGDATA));
+
+ // assert that we have dynamic fifo sizing
+ DEBUG_ASSERT(hsusb_reg8(IDX_CONFIGDATA) & (1<<2));
+
+ // mask all the interrupts for the endpoints (except 0)
+ hsusb_reg16(INTRTXE) = (1<<0);
+ hsusb_reg16(INTRRXE) = 0;
+
+ twl4030_usb_reset();
+ twl4030_init_hs();
+
+ hsusb_reg8(DEVCTL) = 0; // peripheral mode
+// hsusb_reg8(POWER) &= (1<<5); // disable high speed
+ hsusb_reg8(POWER) |= (1<<5); // enable high speed
+
+ hsusb_reg8(INTRUSBE) = (1<<5)|(1<<2)|(1<<1)|(1<<0); // disconnect, reset, resume, suspend
+
+ LTRACE_EXIT;
+}
+
+void usbc_init(void)
+{
+ // enable the clock
+ RMWREG32(CM_ICLKEN1_CORE, 4, 1, 1);
+
+ // register the interrupt handlers
+ register_int_handler(92, hsusb_interrupt, NULL);
+// register_int_handler(93, hsusb_dma_interrupt, NULL);
+
+ otg_reset();
+ hsusb_init();
+
+ unmask_interrupt(92, NULL);
+// unmask_interrupt(93, NULL);
+
+ usbc_set_active(true);
+}
+