summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRyzee119 <[email protected]>2022-06-04 13:47:02 +0930
committerRyan Wendland <[email protected]>2023-02-18 10:24:21 +1030
commitc820c8769267644af049e0be73b04b45d57e8d98 (patch)
tree78e6709d1a2aab318ad203919624a42c15c64ae6 /src
parentd367e8f8a8acd82c89ba3c029495b9404c3b7fdb (diff)
ohci: Support configurable number of roothub ports
Diffstat (limited to 'src')
-rw-r--r--src/common/tusb_mcu.h1
-rw-r--r--src/portable/ohci/ohci.c39
-rw-r--r--src/portable/ohci/ohci.h6
3 files changed, 26 insertions, 20 deletions
diff --git a/src/common/tusb_mcu.h b/src/common/tusb_mcu.h
index 0b10c5118..ee2b896ac 100644
--- a/src/common/tusb_mcu.h
+++ b/src/common/tusb_mcu.h
@@ -55,6 +55,7 @@
#elif TU_CHECK_MCU(OPT_MCU_LPC175X_6X, OPT_MCU_LPC177X_8X, OPT_MCU_LPC40XX)
#define TUP_DCD_ENDPOINT_MAX 16
#define TUP_USBIP_OHCI
+ #define OHCI_RHPORTS 2
#elif TU_CHECK_MCU(OPT_MCU_LPC18XX, OPT_MCU_LPC43XX)
// TODO USB0 has 6, USB1 has 4
diff --git a/src/portable/ohci/ohci.c b/src/portable/ohci/ohci.c
index 228da6ae0..45600c03b 100644
--- a/src/portable/ohci/ohci.c
+++ b/src/portable/ohci/ohci.c
@@ -28,6 +28,10 @@
#if CFG_TUH_ENABLED && defined(TUP_USBIP_OHCI)
+#ifndef OHCI_RHPORTS
+#error OHCI is enabled, but OHCI_RHPORTS is not defined.
+#endif
+
//--------------------------------------------------------------------+
// INCLUDE
//--------------------------------------------------------------------+
@@ -620,29 +624,30 @@ void hcd_int_handler(uint8_t hostid)
//------------- RootHub status -------------//
if ( int_status & OHCI_INT_RHPORT_STATUS_CHANGE_MASK )
{
- uint32_t const rhport_status = OHCI_REG->rhport_status[0] & RHPORT_ALL_CHANGE_MASK;
-
- // TODO dual port is not yet supported
- if ( rhport_status & RHPORT_CONNECT_STATUS_CHANGE_MASK )
+ for (int i = 0; i < OHCI_RHPORTS; i++)
{
- // TODO check if remote wake-up
- if ( OHCI_REG->rhport_status_bit[0].current_connect_status )
+ uint32_t const rhport_status = OHCI_REG->rhport_status[i] & RHPORT_ALL_CHANGE_MASK;
+ if ( rhport_status & RHPORT_CONNECT_STATUS_CHANGE_MASK )
{
- // TODO reset port immediately, without this controller will got 2-3 (debouncing connection status change)
- OHCI_REG->rhport_status[0] = RHPORT_PORT_RESET_STATUS_MASK;
- hcd_event_device_attach(hostid, true);
- }else
- {
- hcd_event_device_remove(hostid, true);
+ // TODO check if remote wake-up
+ if ( OHCI_REG->rhport_status_bit[i].current_connect_status )
+ {
+ // TODO reset port immediately, without this controller will got 2-3 (debouncing connection status change)
+ OHCI_REG->rhport_status[i] = RHPORT_PORT_RESET_STATUS_MASK;
+ hcd_event_device_attach(i, true);
+ }else
+ {
+ hcd_event_device_remove(i, true);
+ }
}
- }
- if ( rhport_status & RHPORT_PORT_SUSPEND_CHANGE_MASK)
- {
+ if ( rhport_status & RHPORT_PORT_SUSPEND_CHANGE_MASK)
+ {
- }
+ }
- OHCI_REG->rhport_status[0] = rhport_status; // acknowledge all interrupt
+ OHCI_REG->rhport_status[i] = rhport_status; // acknowledge all interrupt
+ }
}
//------------- Transfer Complete -------------//
diff --git a/src/portable/ohci/ohci.h b/src/portable/ohci/ohci.h
index c42db141a..b7706b636 100644
--- a/src/portable/ohci/ohci.h
+++ b/src/portable/ohci/ohci.h
@@ -267,7 +267,7 @@ typedef volatile struct
};
union {
- uint32_t rhport_status[2]; // TODO NXP OHCI controller only has 2 ports
+ uint32_t rhport_status[OHCI_RHPORTS];
struct {
uint32_t current_connect_status : 1;
uint32_t port_enable_status : 1;
@@ -284,11 +284,11 @@ typedef volatile struct
uint32_t port_over_current_indicator_change : 1;
uint32_t port_reset_status_change : 1;
uint32_t TU_RESERVED : 11;
- }rhport_status_bit[2];
+ }rhport_status_bit[OHCI_RHPORTS];
};
}ohci_registers_t;
-TU_VERIFY_STATIC( sizeof(ohci_registers_t) == 0x5c, "size is not correct");
+TU_VERIFY_STATIC( sizeof(ohci_registers_t) == (0x54 + (4 * OHCI_RHPORTS)), "size is not correct");
#ifdef __cplusplus
}