MV_STATUS mvUsbInit(int dev, MV_BOOL isHost) { MV_STATUS status; status = mvUsbWinInit(dev); if(status != MV_OK) return status; return mvUsbHalInit(dev, isHost); }
/******************************************************************************* * mvSysUsbHalInit - Initialize the USB subsystem * * DESCRIPTION: * * INPUT: * None * OUTPUT: * None * RETURN: * None * *******************************************************************************/ MV_STATUS mvSysUsbInit(MV_U32 dev, MV_BOOL isHost) { MV_USB_HAL_DATA halData; MV_UNIT_WIN_INFO addrWinMap[MAX_TARGETS + 1]; MV_STATUS status; status = mvCtrlAddrWinMapBuild(addrWinMap, MAX_TARGETS + 1); if(status == MV_OK) status = mvUsbWinInit(dev, addrWinMap); if(status == MV_OK) { halData.ctrlModel = mvCtrlModelGet(); halData.ctrlRev = mvCtrlRevGet(); status = mvUsbHalInit(dev, isHost, &halData); } return status; }
/******************************************************************************* * mvSysUsbHalInit - Initialize the USB subsystem * * DESCRIPTION: * * INPUT: * None * OUTPUT: * None * RETURN: * None * *******************************************************************************/ MV_STATUS mvSysUsbInit(MV_VOID) { MV_USB_HAL_DATA halData; MV_STATUS status = MV_OK; MV_U32 dev; MV_UNIT_WIN_INFO addrWinMap[MAX_TARGETS + 1]; halData.ctrlModel = mvCtrlModelGet(); halData.ctrlRev = mvCtrlRevGet(); halData.ctrlFamily = mvCtrlDevFamilyIdGet(halData.ctrlModel); status = mvCtrlAddrWinMapBuild(addrWinMap, MAX_TARGETS + 1); #ifdef CONFIG_USB_EHCI MV_BOOL isHost; char envname[10], *env; int maxUsbPorts = mvCtrlUsbMaxGet(); /* for ALP/A375: if using single usb2 port, use Virtual MAC ID since MAC ID0 (usbActive =0) is connected to Physical MAC ID1 */ int id, mac_id[2] = {1, 0}; for (id = 0; id < maxUsbPorts ; id++) { if (mvBoardIsUsbPortConnected(USB_UNIT_ID,id) == MV_FALSE) continue; if (maxUsbPorts == 1 && (halData.ctrlFamily == MV_88F67X0 || (halData.ctrlRev == MV_88F66XX_A0_ID && halData.ctrlFamily == MV_88F66X0))) dev = mac_id[id]; else dev = id; sprintf(envname, "usb%dMode", dev); env = getenv(envname); if ((!env) || (strcmp(env, "device") == 0) || (strcmp(env, "Device") == 0)) isHost = MV_FALSE; else isHost = MV_TRUE; if (status == MV_OK) /* Map DDR windows to EHCI */ #ifdef CONFIG_USB_XHCI_HCD /* CONFIG_USB_XHCI_HCD indicate that both xHCI and eHCI are compiled: * Last Boolean argument is used to indicate the HAL layer which unit is currently initiated */ status = mvUsbWinInit(dev, addrWinMap, MV_FALSE); #else status = mvUsbWinInit(dev, addrWinMap); #endif if (status == MV_OK) status = mvUsbHalInit(dev, isHost, &halData); if (status == MV_OK) printf("USB2.0 %d: %s Mode\n", dev, (isHost == MV_TRUE ? "Host" : "Device")); else mvOsPrintf("%s: Error: USB2.0 initialization failed (port %d).\n", __func__, dev); } #endif #ifdef CONFIG_USB_XHCI MV_U32 reg; for (dev = 0; dev < mvCtrlUsb3HostMaxGet(); dev++) { if (mvBoardIsUsbPortConnected(USB3_UNIT_ID,dev) == MV_FALSE) continue; status = mvUsbUtmiPhyInit(dev, &halData); if (halData.ctrlFamily == MV_88F66X0 || halData.ctrlFamily == MV_88F67X0) { /* ALP/A375: Set UTMI PHY Selector: * - Connect UTMI PHY to USB2 port of USB3 Host * - Powers down the other unit (so USB3.0 unit's registers are accessible) */ reg = MV_REG_READ(USB_CLUSTER_CONTROL); reg = (reg & (~0x1)) | 0x1; MV_REG_WRITE(USB_CLUSTER_CONTROL, reg); } if (status == MV_OK) /* Map DDR windows to XHCI */ status = mvUsbWinInit(mvCtrlUsbMapGet(USB3_UNIT_ID, dev), addrWinMap, MV_TRUE); if (status == MV_OK) printf("USB3.0 %d: Host Mode\n", mvCtrlUsbMapGet(USB3_UNIT_ID, dev)); else mvOsPrintf("%s: Error: USB3.0 initialization failed (port %d).\n", __func__, mvCtrlUsbMapGet(USB3_UNIT_ID, dev)); } #endif return status; }