Hi Chao Li,
This is what I changed on lpcusblib_MassStorageHost example of lpcopen 2.10 for lpc1788 and it can work fine on usb port 2 on EA lpc1788 board.:
In HAL_LPC17xx.h I added a MACRO to switch between USB port 1 and port 2
#define USB_PORT_1 0
In HAL_LPC17xx.c, I modified IOCON configuration:
#if USB_PORT_1
Chip_IOCON_PinMux(LPC_IOCON, 0, 29, IOCON_MODE_INACT, IOCON_FUNC1);
Chip_IOCON_PinMux(LPC_IOCON, 0, 30, IOCON_MODE_INACT, IOCON_FUNC1);
#else
Chip_IOCON_PinMux(LPC_IOCON, 0, 31, IOCON_MODE_INACT, IOCON_FUNC1);
#endif
#if defined(USB_CAN_BE_HOST)
#if USB_PORT_1
Chip_IOCON_PinMux(LPC_IOCON, 1, 19, IOCON_MODE_INACT, IOCON_FUNC2);
#else
Chip_IOCON_PinMux(LPC_IOCON, 0, 12, IOCON_MODE_INACT, IOCON_FUNC1);
#endif
#endif
And finally, on OHCI.c file, I changed. In HcdInitDriver function:
#if USB_PORT_1
USB_REG(HostID)->StCtrl = 0x1;
#else
USB_REG(HostID)->StCtrl = 0x00;
#endif
In same OHCI.c file, I replace next functions to substitute RhPortStatus1 by RhPortStatus2:
#if USB_PORT_1
HCD_STATUS HcdGetDeviceSpeed(uint8_t HostID, HCD_USB_SPEED *DeviceSpeed)
{
if ( USB_REG(HostID)->RhPortStatus1 & HC_RH_PORT_STATUS_CurrentConnectStatus) {
*DeviceSpeed =
( USB_REG(HostID)->RhPortStatus1 & HC_RH_PORT_STATUS_LowSpeedDeviceAttached) ? LOW_SPEED : FULL_SPEED;
return HCD_STATUS_OK;
}
else {
return HCD_STATUS_DEVICE_DISCONNECTED;
}
}
uint32_t HcdGetFrameNumber(uint8_t HostID)
{
return ohci_data[HostID].hcca.HccaFrameNumber;
}
HCD_STATUS HcdRhPortReset(uint8_t HostID)
{
HcdDelayMS(400);
USB_REG(HostID)->RhPortStatus1 = HC_RH_PORT_STATUS_PortResetStatus;
while ( USB_REG(HostID)->RhPortStatus1 & HC_RH_PORT_STATUS_PortResetStatus) {}
USB_REG(HostID)->RhPortStatus1 = HC_RH_PORT_STATUS_PortResetStatusChange;
HcdDelayMS(400);
return HCD_STATUS_OK;
}
HCD_STATUS HcdRhPortEnable(uint8_t HostID)
{
USB_REG(HostID)->RhPortStatus1 = HC_RH_PORT_STATUS_PowerEnableStatus;
return HCD_STATUS_OK;
}
HCD_STATUS HcdRhPortDisable(uint8_t HostID)
{
USB_REG(HostID)->RhPortStatus1 = HC_RH_PORT_STATUS_CurrentConnectStatus;
return HCD_STATUS_OK;
}
#else
HCD_STATUS HcdGetDeviceSpeed(uint8_t HostID, HCD_USB_SPEED *DeviceSpeed)
{
if ( USB_REG(HostID)->RhPortStatus2 & HC_RH_PORT_STATUS_CurrentConnectStatus) {
*DeviceSpeed =
( USB_REG(HostID)->RhPortStatus2 & HC_RH_PORT_STATUS_LowSpeedDeviceAttached) ? LOW_SPEED : FULL_SPEED;
return HCD_STATUS_OK;
}
else {
return HCD_STATUS_DEVICE_DISCONNECTED;
}
}
uint32_t HcdGetFrameNumber(uint8_t HostID)
{
return ohci_data[HostID].hcca.HccaFrameNumber;
}
HCD_STATUS HcdRhPortReset(uint8_t HostID)
{
HcdDelayMS(400);
USB_REG(HostID)->RhPortStatus2 = HC_RH_PORT_STATUS_PortResetStatus;
while ( USB_REG(HostID)->RhPortStatus2 & HC_RH_PORT_STATUS_PortResetStatus) {}
USB_REG(HostID)->RhPortStatus2 = HC_RH_PORT_STATUS_PortResetStatusChange;
HcdDelayMS(400);
return HCD_STATUS_OK;
}
HCD_STATUS HcdRhPortEnable(uint8_t HostID)
{
USB_REG(HostID)->RhPortStatus2 = HC_RH_PORT_STATUS_PowerEnableStatus;
return HCD_STATUS_OK;
}
HCD_STATUS HcdRhPortDisable(uint8_t HostID)
{
USB_REG(HostID)->RhPortStatus2 = HC_RH_PORT_STATUS_CurrentConnectStatus;
return HCD_STATUS_OK;
}
#endif
And finally, in HcdirqHandler function RhPortStatus1 must be changed by RhPortStatus2:
#if USB_PORT_1
if (IntStatus & HC_INTERRUPT_RootHubStatusChange) {
for(;USB_REG(HostID)->RhPortStatus1 & HC_RH_PORT_STATUS_StatusChangeMask;){
if (USB_REG(HostID)->RhPortStatus1 & HC_RH_PORT_STATUS_ConnectStatusChange) {
if (USB_REG(HostID)->RhStatus & HC_RH_STATUS_DeviceRemoteWakeupEnable) {
}
else {}
USB_REG(HostID)->RhPortStatus1 = HC_RH_PORT_STATUS_ConnectStatusChange;
OHciRhStatusChangeIsr(HostID, USB_REG(HostID)->RhPortStatus1 & HC_RH_PORT_STATUS_CurrentConnectStatus);
}
if (USB_REG(HostID)->RhPortStatus1 & HC_RH_PORT_STATUS_PortEnableStatusChange) {
USB_REG(HostID)->RhPortStatus1 = HC_RH_PORT_STATUS_PortEnableStatusChange;
}
if (USB_REG(HostID)->RhPortStatus1 & HC_RH_PORT_STATUS_PortSuspendStatusChange) {
USB_REG(HostID)->RhPortStatus1 = HC_RH_PORT_STATUS_PortSuspendStatusChange;
}
if (USB_REG(HostID)->RhPortStatus1 & HC_RH_PORT_STATUS_OverCurrentIndicatorChange) {
USB_REG(HostID)->RhPortStatus1 = HC_RH_PORT_STATUS_OverCurrentIndicatorChange;
}
if (USB_REG(HostID)->RhPortStatus1 & HC_RH_PORT_STATUS_PortResetStatusChange) {
USB_REG(HostID)->RhPortStatus1 = HC_RH_PORT_STATUS_PortResetStatusChange;
}
}
}
#else
if (IntStatus & HC_INTERRUPT_RootHubStatusChange) {
for(;USB_REG(HostID)->RhPortStatus2 & HC_RH_PORT_STATUS_StatusChangeMask;){
if (USB_REG(HostID)->RhPortStatus2 & HC_RH_PORT_STATUS_ConnectStatusChange) {
if (USB_REG(HostID)->RhStatus & HC_RH_STATUS_DeviceRemoteWakeupEnable) {
}
else {}
USB_REG(HostID)->RhPortStatus2 = HC_RH_PORT_STATUS_ConnectStatusChange;
OHciRhStatusChangeIsr(HostID, USB_REG(HostID)->RhPortStatus2 & HC_RH_PORT_STATUS_CurrentConnectStatus);
}
if (USB_REG(HostID)->RhPortStatus2 & HC_RH_PORT_STATUS_PortEnableStatusChange) {
USB_REG(HostID)->RhPortStatus2 = HC_RH_PORT_STATUS_PortEnableStatusChange;
}
if (USB_REG(HostID)->RhPortStatus2 & HC_RH_PORT_STATUS_PortSuspendStatusChange) {
USB_REG(HostID)->RhPortStatus2 = HC_RH_PORT_STATUS_PortSuspendStatusChange;
}
if (USB_REG(HostID)->RhPortStatus2 & HC_RH_PORT_STATUS_OverCurrentIndicatorChange) {
USB_REG(HostID)->RhPortStatus2 = HC_RH_PORT_STATUS_OverCurrentIndicatorChange;
}
if (USB_REG(HostID)->RhPortStatus2 & HC_RH_PORT_STATUS_PortResetStatusChange) {
USB_REG(HostID)->RhPortStatus2 = HC_RH_PORT_STATUS_PortResetStatusChange;
}
}
}
#endif
Hope it helps!
Best Regards,
Carlos Mendoza
Technical Support Engineer