ohci: Support configurable number of roothub ports
This commit is contained in:
parent
d367e8f8a8
commit
c820c87692
|
@ -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
|
||||
|
|
|
@ -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,20 +624,20 @@ 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
|
||||
for (int i = 0; i < OHCI_RHPORTS; i++)
|
||||
{
|
||||
uint32_t const rhport_status = OHCI_REG->rhport_status[i] & RHPORT_ALL_CHANGE_MASK;
|
||||
if ( rhport_status & RHPORT_CONNECT_STATUS_CHANGE_MASK )
|
||||
{
|
||||
// TODO check if remote wake-up
|
||||
if ( OHCI_REG->rhport_status_bit[0].current_connect_status )
|
||||
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[0] = RHPORT_PORT_RESET_STATUS_MASK;
|
||||
hcd_event_device_attach(hostid, true);
|
||||
OHCI_REG->rhport_status[i] = RHPORT_PORT_RESET_STATUS_MASK;
|
||||
hcd_event_device_attach(i, true);
|
||||
}else
|
||||
{
|
||||
hcd_event_device_remove(hostid, true);
|
||||
hcd_event_device_remove(i, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -642,7 +646,8 @@ void hcd_int_handler(uint8_t hostid)
|
|||
|
||||
}
|
||||
|
||||
OHCI_REG->rhport_status[0] = rhport_status; // acknowledge all interrupt
|
||||
OHCI_REG->rhport_status[i] = rhport_status; // acknowledge all interrupt
|
||||
}
|
||||
}
|
||||
|
||||
//------------- Transfer Complete -------------//
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue