//.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- EzUsbInit -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- // DtStatus EzUsbInit(DtuDeviceData* pDvcData, Bool* pReEnumerate) { DtStatus Status = DT_STATUS_OK; const DtuIntelHexRecord* pEzUsbFirmware = NULL; DtPropertyData* pPropData = &pDvcData->m_PropData; Bool IsEzUsbFwLoaded=FALSE, IsPldFwLoaded=FALSE; Int FirmwareEndpoint; Int ReadEndpoint; Int WriteEndpoint; // Initialize properties FirmwareEndpoint = DtPropertiesGetInt(pPropData, "USB_END_POINT_FIRMWARE", -1); ReadEndpoint = DtPropertiesGetInt(pPropData, "USB_END_POINT_READ", -1); WriteEndpoint = DtPropertiesGetInt(pPropData, "USB_END_POINT_WRITE", -1); // Check if no property error occurred Status = DtuPropertiesReportDriverErrors(pDvcData); if (!DT_SUCCESS(Status)) return Status; // Check if we need to load firmware. NOTE: there are two conditions to load the // firmware namely: // 1. EzUsb firmware is not loaded yet // 2. PLD firmware is loaded already, which suggest a warm-reboot which we want to // treat as a cold roboot => upload EzUsb firmware, but no re-enumeration *pReEnumerate = FALSE; IsEzUsbFwLoaded = EzUsbIsFirmwareLoaded(pDvcData); IsPldFwLoaded = FALSE; if (IsEzUsbFwLoaded && !(pDvcData->m_DevInfo.m_TypeNumber>=300 && pDvcData->m_DevInfo.m_TypeNumber<400)) IsPldFwLoaded = DtuPldIsFirmwareLoaded(pDvcData); if (!IsEzUsbFwLoaded || IsPldFwLoaded) { if (IsPldFwLoaded) DtDbgOut(MIN, DTU, "PLD FW is already loaded => warm reboot"); else DtDbgOut(MIN, DTU, "No EzUsb firmware loaded => cold reboot"); if (pDvcData->m_DevInfo.m_TypeNumber>=300 && pDvcData->m_DevInfo.m_TypeNumber<400) { // Lookup firmware const DtuFx3HexRecord* pFx3Firmware = Dtu3GetFx3Firmware( pDvcData->m_DevInfo.m_TypeNumber, -1, pDvcData->m_DevInfo.m_HardwareRevision); if (pFx3Firmware == NULL) DtDbgOut(ERR, DTU, "FX3 firmware not found for Typenumber: %d," " HardwareRev: 0x%X", pDvcData->m_DevInfo.m_TypeNumber, pDvcData->m_DevInfo.m_HardwareRevision); if (!DtUsbManufNameEq(&pDvcData->m_Device, "Cypress")) { DtDbgOut(ERR, DTU, "DTU-3XX vid/pid found but wrong manufacturer string"); return DT_STATUS_FAIL; } if (pDvcData->m_DevInfo.m_ProductId == DTU3_PID_UNIT_EEPROM) pDvcData->m_BootState = DTU_BOOTSTATE_FACTORY_COLD; else pDvcData->m_BootState = DTU_BOOTSTATE_COLD; //TODOTM: verify product string is "DTU-351" // Upload firmware for EzUsb chip Status = EzUsbLoadFirmwareFx3(pDvcData, pFx3Firmware); if (!DT_SUCCESS(Status)) { DtDbgOut(ERR, DTU, "Failed to upload FX3 firmware (Status=0x%08X)", Status); return Status; } DtDbgOut(ERR, DTU, "FX3 firmware uploaded"); } else { // Lookup firmware pEzUsbFirmware = DtuGetEzUsbFirmware(pDvcData->m_DevInfo.m_ProductId, -1, pDvcData->m_DevInfo.m_HardwareRevision); if (pEzUsbFirmware == NULL) { DtDbgOut(ERR, DTU, "No EzUsb firmware available for DTU-%d", pDvcData->m_DevInfo.m_TypeNumber); return DT_STATUS_FAIL; } // Upload firmware for EzUsb chip Status = EzUsbLoadFirmware(pDvcData, pEzUsbFirmware); if (!DT_SUCCESS(Status)) { DtDbgOut(ERR, DTU, "Failed to upload FX2 firmware (Status=0x%08X)", Status); return Status; } } *pReEnumerate = !IsPldFwLoaded; // Device will reenumerate, if cold reboot if (!IsPldFwLoaded) return DT_STATUS_OK; // In case of cold reboot we are done (will reenumerate) } // Convert endpoint to pipe numbers if (FirmwareEndpoint != -1) { // Convert endpoint to pipe number pDvcData->m_EzUsb.m_FirmwarePipe = DtUsbGetBulkPipeNumber(&pDvcData->m_Device, DT_USB_HOST_TO_DEVICE, FirmwareEndpoint); DT_ASSERT(pDvcData->m_EzUsb.m_FirmwarePipe != -1); } if (ReadEndpoint != -1) { // Convert endpoint to pipe number pDvcData->m_EzUsb.m_ReadPipe = DtUsbGetBulkPipeNumber(&pDvcData->m_Device, DT_USB_DEVICE_TO_HOST, ReadEndpoint); DT_ASSERT(pDvcData->m_EzUsb.m_ReadPipe != -1); } if (WriteEndpoint != -1) { // Convert endpoint to pipe number pDvcData->m_EzUsb.m_WritePipe = DtUsbGetBulkPipeNumber(&pDvcData->m_Device, DT_USB_HOST_TO_DEVICE, WriteEndpoint); DT_ASSERT(pDvcData->m_EzUsb.m_WritePipe != -1); } return Status; }
//.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- DtaGenlockInit -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. // DtStatus DtaGenlockInit(DtaDeviceData* pDvcData) { DtStatus Status = DT_STATUS_OK; // Initialize properties DtPropertyData* pPropData = &pDvcData->m_PropData; // Assume genlock is not supported pDvcData->m_Genlock.m_IsSupported = FALSE; pDvcData->m_Genlock.m_OpModeIntSrc = GENLOCK_OPMODE_INTSRC_UNDEF; pDvcData->m_Genlock.m_GenlArch = DtPropertiesGetInt(pPropData, "GENLOCK_ARCH", -1); // Do we have a valid architecture if (pDvcData->m_Genlock.m_GenlArch > 0) pDvcData->m_Genlock.m_IsSupported = TRUE; pDvcData->m_Genlock.m_AsyncPortIndex = DtPropertiesGetInt(pPropData, "GENLOCK_ASYNC_PORT", -1); if (pDvcData->m_Genlock.m_AsyncPortIndex > 0) pDvcData->m_Genlock.m_AsyncPortIndex--; // Convert to port-index else pDvcData->m_Genlock.m_AsyncPortIndex = -1; // No async port // Get internal genref port pDvcData->m_Genlock.m_IntGenrefPortIndex = DtPropertiesGetInt(pPropData, "GENLOCK_INT_GENREF_PORT", -1); if (pDvcData->m_Genlock.m_IntGenrefPortIndex > 0) pDvcData->m_Genlock.m_IntGenrefPortIndex--; // Convert to port-index else pDvcData->m_Genlock.m_IntGenrefPortIndex = -1; // No internal genref port // Get slave genref port pDvcData->m_Genlock.m_SlaveGenrefPortIndex = DtPropertiesGetInt(pPropData, "GENLOCK_SLAVE_GENREF_PORT", -1); if (pDvcData->m_Genlock.m_SlaveGenrefPortIndex > 0) pDvcData->m_Genlock.m_SlaveGenrefPortIndex--; // Convert to port-index else pDvcData->m_Genlock.m_SlaveGenrefPortIndex = -1; // No slave genref port // Get the port group mask pDvcData->m_Genlock.m_PortGroup = DtPropertiesGetUInt32(pPropData, "GENLOCK_PORT_GROUP", -1); // Init to 'safe' default values pDvcData->m_Genlock.m_FracMode = DTA_GENLOCK_FRACMODE_NA; pDvcData->m_Genlock.m_RefPortIndex = pDvcData->m_Genlock.m_IntGenrefPortIndex; pDvcData->m_Genlock.m_RefVidStd = DT_VIDSTD_625I50; pDvcData->m_Genlock.m_OutVidStd = pDvcData->m_Genlock.m_RefVidStd; pDvcData->m_Genlock.m_RefLineDurationNs = pDvcData->m_Genlock.m_OutLineDurationNs = 1; pDvcData->m_Genlock.m_InDelayNs = 0; pDvcData->m_Genlock.m_LineOffset = 0; pDvcData->m_Genlock.m_TofAlignOffsetNs = 0; if (pDvcData->m_Genlock.m_GenlArch == GENLOCK_ARCH_2152 || pDvcData->m_Genlock.m_GenlArch == GENLOCK_ARCH_2154) { UInt16 Offset = -1; Offset = DtPropertiesGetUInt16(&pDvcData->m_PropData, "REGISTERS_GENL", -1); if (Offset == (UInt16)-1) { DtDbgOut(ERR, GENL, "Failed to get genlock register offset property"); return DT_STATUS_FAIL; } pDvcData->m_Genlock.m_pGenlRegs = (UInt8*)pDvcData->m_DtaRegs.m_pKernel + Offset; } else pDvcData->m_Genlock.m_pGenlRegs = NULL; if (pDvcData->m_Genlock.m_GenlArch == GENLOCK_ARCH_2152) { Status = DtaLmh1982Init(pDvcData, &pDvcData->m_Genlock.m_Lmh1982); if (!DT_SUCCESS(Status)) DtDbgOut(ERR, GENL, "Failed to init LMH-1982 module"); } else if (pDvcData->m_Genlock.m_GenlArch == GENLOCK_ARCH_2154) { // Must have an operational mode Int OpMode = DtPropertiesGetInt(pPropData, "GENLOCK_OPMODE_INTSRC", -1); if (OpMode!=GENLOCK_OPMODE_INTSRC_FREE_RUN && OpMode!=GENLOCK_OPMODE_INTSRC_AFD) { DtDbgOut(ERR, GENL, "Invalid value (%d) for 'GENLOCK_OPMODE_INTSRC' property", OpMode); return DT_STATUS_FAIL; } pDvcData->m_Genlock.m_OpModeIntSrc = OpMode; pDvcData->m_Genlock.m_VcxoValue = -1; pDvcData->m_Genlock.m_pVcxoOwner = NULL; Status = DtaLmh1983Init(pDvcData, &pDvcData->m_Genlock.m_Lmh1983); if (!DT_SUCCESS(Status)) DtDbgOut(ERR, GENL, "Failed to init LMH-1983 module"); } // 145/2145/2144 architecture if (pDvcData->m_Genlock.m_GenlArch==GENLOCK_ARCH_2144 || pDvcData->m_Genlock.m_GenlArch==GENLOCK_ARCH_145) Status = DtaFpgaGenlockInit(pDvcData, &pDvcData->m_Genlock.m_FpgaGenlock); return Status; }