Exemplo n.º 1
0
//.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- 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;
}
Exemplo n.º 2
0
//.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- 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;
}