/****************************************************************************** * * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" * AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND * SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, * OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, * APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION * THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, * AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE * FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY * WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE * IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR * REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF * INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE. * * (c) Copyright 2014 Xilinx Inc. * All rights reserved. * ******************************************************************************/ /*****************************************************************************/ /** * * @file scaler_intg_basic.c * * @note * * This test works with Zynq702 system. * *
*
* MODIFICATION HISTORY:
*
* Ver   Who     Date     Changes
* ----- ------ -------- ---------------------------------------------
* 7.0   adk   22/08/14 First release.
* 
* ******************************************************************************/ /***************************** Include Files *********************************/ #include "xscaler.h" #include "xscaler_hw.h" #include "xparameters.h" #include "scaler_intgtest.h" /************************** Constant Definitions *****************************/ /***************** Macros (Inline Functions) Definitions *********************/ /*****************************************************************************/ /** * * Compare numbers. If not equal, then output message and increment fail * counter. The message contains the line number of the failure, the * name of the variable, and its actual and expected values in hex and * decimal. If equal, display current test pass number to user. * An example: * *
 *     1  UINT32 result = 5;
 *     2  UINT32 expected = 17;
 *     3
 *     4  CT_CMP_NUM(UINT32, result, expected)
 *
 * yields the output:
 *
 *     FAIL: 0004: result=5(5h), expected 17(11h)
 * 
* * @param Type is data type to compare (must be an ordinal type such * as int) * @param Val_16 is the actual data retrieved from test * @param Val_32 is the expected value * * @note Usage: CT_CMP_NUM(, actual, expected) * *****************************************************************************/ #define check_status_update(Type, Val_16, Val_32) \ if((Type)(Val_16) != (Type)(Val_32)){ \ CT_CMP_NUM(Type, XST_FAILURE, XST_SUCCESS); \ } \ else{ \ CT_NotifyNextPass(); \ } \ /**************************** Type Definitions *******************************/ #define round(x) ((x) >= 0 ? (s32)((x) + 0.5) : (s32)((x) - 0.5)) /************************** Function Prototypes ******************************/ /************************** Variable Definitions *****************************/ /************************** Function Definitions *****************************/ /*****************************************************************************/ /** * * This function executes the XScaler Self test. * * @param TestLoops is the number of times to execute test. * * @return Returns the total number of test failures. * * @note None. * ******************************************************************************/ int Scaler_Intg_SelfTest(int TestLoops) { u32 Status = (u32)XST_SUCCESS; double HoriScaleFactor; double VertScaleFactor; u32 OldScalerReg; u32 NewScalerReg; u32 LumaLeftH; u32 LumaTopV; u32 ChromaLeftH; u32 ChromaTopV; u32 OutSize; u32 InLine; u32 InPixel; u32 SrcSize; u32 QuantizedHoriSize; u32 QuantizedVertSize; u32 QuantizedInLastPixel; u32 QuantizedInLastLine; u32 PhaseRegValue; u16 VertPhaseNum; u16 HoriPhaseNum; u8 ChromaFormat; u8 ChromaLumaShareCoeff; u8 HoriVertShareCoeff; u8 VertSetIndex; u8 HoriSetIndex; u32 InLine_1; u32 InPixel_1; u32 OutSize_1 ; u32 SrcSize_1 ; double HoriScaleFactor_1; double VertScaleFactor_1; XScaler ScalerInst; XScalerStartFraction StartFractionInst; XScalerCoeffBank CoeffBankPtr; XScalerAperture AperturePtr; XScalerAperture AperturePtr_1; XScaler_Config *Config; CT_TestReset("Scaler Self Test .. .."); while (TestLoops--) { CT_NotifyNextPass(); /* Initialize the XScaler instance. */ Status = Scaler_Initialize(&ScalerInst, (u16)SCALER_0_DEVICE_ID); if (Status != XST_SUCCESS) { return Status; } /*****************************************************************************/ /* XScaler_GetVersion */ /*Test case 1 */ NewScalerReg = XScaler_GetVersion(&ScalerInst); if (NewScalerReg != 0x00000000) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } /*Test case 3 */ // XScaler_GetVersion(Null); /*****************************************************************************/ /* XScaler_Disable */ /*Test case 1 */ XScaler_Disable(&ScalerInst); if (0x0 == ((XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_CTL_OFFSET)) & ~(XSCL_CTL_SW_EN_MASK))) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } /* * Negative Test Case */ // XScaler_Disable(&ScalerInst); /*****************************************************************************/ /* XScaler_Enable */ /* check the bit 0 of control register, default is 0*/ /*Test case 1 */ XScaler_Enable(&ScalerInst); if(0x00000001 == ((XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_CTL_OFFSET)) | (XSCL_CTL_SW_EN_MASK))){ check_status_update(u32, 1, 1); } else{ check_status_update(u32, 0, 1); } XScaler_Enable(&ScalerInst); /*****************************************************************************/ /* XScaler_SetPhaseNum */ /* Test case 1*/ VertPhaseNum = 1; ScalerInst.Config.MaxPhaseNum = 1; HoriPhaseNum = 1; ScalerInst.Config.MaxPhaseNum = 1; XScaler_SetPhaseNum(&ScalerInst, VertPhaseNum, HoriPhaseNum); OldScalerReg = XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_NUMPHASE_OFFSET); NewScalerReg = (VertPhaseNum << XSCL_NUMPHASE_VERT_SHIFT) & XSCL_NUMPHASE_VERT_MASK; NewScalerReg |= HoriPhaseNum & XSCL_NUMPHASE_HORI_MASK; if (NewScalerReg == OldScalerReg) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } /* Test case 2 */ XScaler_SetPhaseNum(&ScalerInst, VertPhaseNum, HoriPhaseNum); OldScalerReg = XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_NUMPHASE_OFFSET); if ((VertPhaseNum == (OldScalerReg & XSCL_NUMPHASE_VERT_MASK) >> XSCL_NUMPHASE_VERT_SHIFT) && (HoriPhaseNum == (OldScalerReg & XSCL_NUMPHASE_HORI_MASK))) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } /* * Negative Test Case */ /* Test case 3 */ //XScaler_SetPhaseNum(Null, VertPhaseNum, HoriPhaseNum); /*****************************************************************************/ /* XScaler_GetPhaseNum */ XScaler_GetPhaseNum(&ScalerInst, &VertPhaseNum, &HoriPhaseNum); PhaseRegValue = XScaler_ReadReg((ScalerInst).Config.BaseAddress, XSCL_NUMPHASE_OFFSET); OldScalerReg = (PhaseRegValue & XSCL_NUMPHASE_VERT_MASK) >> XSCL_NUMPHASE_VERT_SHIFT; NewScalerReg = PhaseRegValue & XSCL_NUMPHASE_HORI_MASK; if ((NewScalerReg == HoriPhaseNum) && (OldScalerReg == VertPhaseNum)) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } /* * Negative Test Case */ /* Test case 3 */ //XScaler_GetPhaseNum(Null, &VertPhaseNum, &HoriPhaseNum); /*****************************************************************************/ XScaler_SetStartFraction(&ScalerInst, &StartFractionInst); LumaLeftH = XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_FRCTLUMALEFT_OFFSET); LumaTopV = XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_FRCTLUMATOP_OFFSET); ChromaLeftH = XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_FRCTCHROMALEFT_OFFSET); ChromaTopV = XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_FRCTCHROMATOP_OFFSET); if(((LumaLeftH)==((u32)StartFractionInst.LumaLeftHori & XSCL_FRCTLUMALEFT_VALUE_MASK)) && ( LumaTopV == ((u32)StartFractionInst.LumaTopVert & XSCL_FRCTLUMATOP_VALUE_MASK)) && (ChromaLeftH == ((u32)StartFractionInst.ChromaLeftHori & XSCL_FRCTCHROMALEFT_VALUE_MASK)) && (ChromaTopV == ((u32)StartFractionInst.ChromaTopVert & XSCL_FRCTCHROMATOP_VALUE_MASK))) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } /* * Negative Test Case */ //XScaler_SetStartFraction(Null, Null1); /*****************************************************************************/ XScaler_GetStartFraction(&ScalerInst, &StartFractionInst); LumaLeftH = XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_FRCTLUMALEFT_OFFSET) & XSCL_FRCTLUMALEFT_VALUE_MASK; LumaTopV = XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_FRCTLUMATOP_OFFSET) & XSCL_FRCTLUMATOP_VALUE_MASK; ChromaLeftH = XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_FRCTCHROMALEFT_OFFSET) & XSCL_FRCTCHROMALEFT_VALUE_MASK; ChromaTopV = XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_FRCTCHROMATOP_OFFSET) & XSCL_FRCTCHROMATOP_VALUE_MASK; if ((LumaLeftH == StartFractionInst.LumaLeftHori) && (LumaTopV == StartFractionInst.LumaTopVert) && (ChromaLeftH == StartFractionInst.ChromaLeftHori) && (ChromaTopV == StartFractionInst.ChromaTopVert)) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } /* * Negative Test Case */ //XScaler_GetStartFraction(Null, Null1); /*****************************************************************************/ XScaler_GetCoeffBankSharingInfo(&ScalerInst, &ChromaFormat, &ChromaLumaShareCoeff, &HoriVertShareCoeff); if (ChromaFormat == ScalerInst.Config.ChromaFormat) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } if (ScalerInst.Config.SeparateHvCoef !=0 ) { if (HoriVertShareCoeff == 0) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } } else { if (HoriVertShareCoeff == 1) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } } if (ChromaFormat ==XSCL_CHROMA_FORMAT_422 ) { if(ScalerInst.Config.SeparateYcCoef!=0) { if (ChromaLumaShareCoeff == 0) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } } } if(ChromaFormat == XSCL_CHROMA_FORMAT_422){ if (ChromaLumaShareCoeff == 1) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } } /*****************************************************************************/ InLine_1= 23; OutSize_1 = 22; SrcSize_1 = 11 ; InPixel_1 = 63; XScaler_CoefValueLookup(InLine_1, OutSize_1, SrcSize_1, InPixel_1); if(Xil_AssertStatus == XIL_ASSERT_NONE) { check_status_update(u32, 1, 1); } else{ check_status_update(u32, 0, 1); } /*****************************************************************************/ /* Xil_AssertVoid(CoeffBankPtr->SetIndex < InstancePtr->Config.CoeffSetNum); Xil_AssertVoid(CoeffBankPtr->CoeffValueBuf != NULL); Xil_AssertVoid(CoeffBankPtr->PhaseNum >= (XSCL_MIN_PHASE_NUM)); Xil_AssertVoid(CoeffBankPtr->PhaseNum <= InstancePtr->Config.MaxPhaseNum); Xil_AssertVoid(CoeffBankPtr->TapNum > 0U); Xil_AssertVoid(CoeffBankPtr->TapNum <= (XSCL_MAX_TAP_NUM)); */ CoeffBankPtr.SetIndex = 1; ScalerInst.Config.CoeffSetNum = 2; CoeffBankPtr.PhaseNum = 6; ScalerInst.Config.MaxPhaseNum = 6; CoeffBankPtr.TapNum = (XSCL_MAX_TAP_NUM); CoeffBankPtr.CoeffValueBuf = XScaler_CoefValueLookup(640, 480,CoeffBankPtr.TapNum, CoeffBankPtr.PhaseNum); XScaler_LoadCoeffBank(&ScalerInst, &CoeffBankPtr); NewScalerReg = CoeffBankPtr.SetIndex & XSCL_COEFFSETADDR_ADDR_MASK; OldScalerReg = XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_COEFFSETADDR_OFFSET); if (NewScalerReg == OldScalerReg) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } /* * Negative Test Case */ //XScaler_LoadCoeffBank(Null, Null2); /****************************************************************************/ VertSetIndex = 0 ; ScalerInst.Config.CoeffSetNum = 1 ; HoriSetIndex = 0; ScalerInst.Config.CoeffSetNum = 1; XScaler_SetActiveCoeffSet(&ScalerInst, VertSetIndex, HoriSetIndex); OldScalerReg = ((u32)HoriSetIndex) & XSCL_COEFFSETS_HORI_MASK; OldScalerReg |= (((u32)VertSetIndex) << XSCL_COEFFSETS_VERT_SHIFT) & XSCL_COEFFSETS_VERT_MASK; NewScalerReg = XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_COEFFSETS_OFFSET); if (NewScalerReg == OldScalerReg) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } /* * Negative Test Case */ //XScaler_SetActiveCoeffSet(Null, VertSetIndex, HoriSetIndex); /*****************************************************************************/ XScaler_GetActiveCoeffSet(&ScalerInst, &VertSetIndex, &HoriSetIndex); NewScalerReg = XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_COEFFSETS_OFFSET); if (((u8)(NewScalerReg & XSCL_COEFFSETS_VERT_MASK) >> XSCL_COEFFSETS_VERT_SHIFT) == VertSetIndex && (u8)(NewScalerReg & XSCL_COEFFSETS_HORI_MASK) == HoriSetIndex) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } /*****************************************************************************/ memset((void *)&AperturePtr, 0, sizeof(XScalerAperture)); memset((void *)&AperturePtr_1, 0, sizeof(XScalerAperture)); // memset((void *)&ScalerInst, 0, sizeof(XScaler)); AperturePtr.InFirstLine = 0; AperturePtr.InLastLine = 719; AperturePtr.InLastPixel = 1279; AperturePtr.InFirstPixel = 0; AperturePtr.OutVertSize = 1280; AperturePtr.OutHoriSize =720; XScaler_SetAperture(&ScalerInst, &AperturePtr); /* Calculate vertical and horizontal scale factors */ VertScaleFactor = (double)(AperturePtr.InLastLine - AperturePtr.InFirstLine + 1.0); VertScaleFactor /= (double)(AperturePtr.OutVertSize); HoriScaleFactor = (double)(AperturePtr.InLastPixel - AperturePtr.InFirstPixel + 1.0); HoriScaleFactor /= (double)AperturePtr.OutHoriSize; /* Convert HoriScaleFactor and VertScaleFactor values into a format * to write to HSF and VSF registers. */ VertScaleFactor = (u32)(VertScaleFactor * XSCL_SHRINK_FACTOR); HoriScaleFactor = (u32)(HoriScaleFactor * XSCL_SHRINK_FACTOR); /* Quantize Aperture - feed scale-factor back in to provide the * actual aperture required to generate the desired number of output * samples. */ QuantizedHoriSize = AperturePtr.OutHoriSize - 1; QuantizedHoriSize = (u32)(((double)QuantizedHoriSize * HoriScaleFactor) / XSCL_SHRINK_FACTOR); QuantizedHoriSize += 1 + (ScalerInst.Config.HoriTapNum + 1) / 2; QuantizedInLastPixel = AperturePtr.InFirstPixel + QuantizedHoriSize - 1; if (QuantizedInLastPixel > AperturePtr.InLastPixel) QuantizedInLastPixel = AperturePtr.InLastPixel; QuantizedVertSize = AperturePtr.OutVertSize - 1; QuantizedVertSize = (u32)(((float)QuantizedVertSize * VertScaleFactor) / XSCL_SHRINK_FACTOR); QuantizedVertSize += 1 + (ScalerInst.Config.VertTapNum + 1) / 2; QuantizedInLastLine = AperturePtr.InFirstLine + QuantizedVertSize - 1; if (QuantizedInLastLine > AperturePtr.InLastLine) QuantizedInLastLine = AperturePtr.InLastLine; /* Calculate input line, pixel and output size values */ InLine = AperturePtr.InFirstLine & XSCL_APTVERT_FIRSTLINE_MASK; InLine |= (QuantizedInLastLine << XSCL_APTVERT_LASTLINE_SHIFT) & XSCL_APTVERT_LASTLINE_MASK; InPixel = AperturePtr.InFirstPixel & XSCL_APTHORI_FIRSTPXL_MASK; InPixel |= (QuantizedInLastPixel << XSCL_APTHORI_LASTPXL_SHIFT) & XSCL_APTHORI_LASTPXL_MASK; OutSize = AperturePtr.OutHoriSize & XSCL_OUTSIZE_NUMPXL_MASK; OutSize |= (AperturePtr.OutVertSize << XSCL_OUTSIZE_NUMLINE_SHIFT) & XSCL_OUTSIZE_NUMLINE_MASK; SrcSize = AperturePtr.SrcHoriSize & XSCL_SRCSIZE_NUMPXL_MASK; SrcSize |= (AperturePtr.SrcVertSize << XSCL_SRCSIZE_NUMLINE_SHIFT) & XSCL_SRCSIZE_NUMLINE_MASK; //InLine_1 = XScaler_ReadReg(ScalerInst.Config.BaseAddress, // XSCL_FRCTLUMALEFT_OFFSET); InLine_1 = XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_APTVERT_OFFSET); InPixel_1 = XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_APTHORI_OFFSET); OutSize_1 =XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_OUTSIZE_OFFSET); SrcSize_1 =XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_SRCSIZE_OFFSET); HoriScaleFactor_1 =XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_HSF_OFFSET); HoriScaleFactor_1 = (u32)round(HoriScaleFactor_1); VertScaleFactor_1=XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_VSF_OFFSET); VertScaleFactor_1 = (u32)round(VertScaleFactor_1); /*if ((InLine == XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_FRCTLUMALEFT_OFFSET)) && (InPixel == XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_APTHORI_OFFSET)) && (OutSize == XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_OUTSIZE_OFFSET)) && (SrcSize == XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_SRCSIZE_OFFSET)) && ((u32)(round(HoriScaleFactor)) == XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_HSF_OFFSET)) && ((u32)(round(VertScaleFactor)) == XScaler_ReadReg(ScalerInst.Config.BaseAddress, XSCL_VSF_OFFSET))) */ if (InLine == InLine_1 && InPixel == InPixel_1 && OutSize == OutSize_1 && SrcSize== SrcSize_1 && HoriScaleFactor == HoriScaleFactor_1 && VertScaleFactor == VertScaleFactor_1) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } /* * Negative Test Case */ //XScaler_SetAperture(Null, Null3); /****************************************************************************/ AperturePtr.InFirstLine = 0; AperturePtr.InLastLine = 719; AperturePtr.InLastPixel = 1279; AperturePtr.InFirstPixel = 0; AperturePtr.OutVertSize = 1280; AperturePtr.OutHoriSize = 720; XScaler_GetAperture(&ScalerInst, &AperturePtr); InLine = XScaler_ReadReg(ScalerInst.Config.BaseAddress, (XSCL_APTVERT_OFFSET)); InPixel = XScaler_ReadReg(ScalerInst.Config.BaseAddress, (XSCL_APTHORI_OFFSET)); OutSize = XScaler_ReadReg(ScalerInst.Config.BaseAddress, (XSCL_OUTSIZE_OFFSET)); /* Parse the info and populate the aperture structure */ AperturePtr_1.InFirstLine = (InLine) & (XSCL_APTVERT_FIRSTLINE_MASK); AperturePtr_1.InLastLine = ((InLine) & (XSCL_APTVERT_LASTLINE_MASK)) >> (XSCL_APTVERT_LASTLINE_SHIFT); AperturePtr_1.InFirstPixel = (InPixel) & (XSCL_APTHORI_FIRSTPXL_MASK); AperturePtr_1.InLastPixel = ((InPixel) & (XSCL_APTHORI_LASTPXL_MASK)) >> (XSCL_APTHORI_LASTPXL_SHIFT); AperturePtr_1.OutHoriSize = (OutSize) & (XSCL_OUTSIZE_NUMPXL_MASK); AperturePtr_1.OutVertSize = ((OutSize) & (XSCL_OUTSIZE_NUMLINE_MASK)) >> (XSCL_OUTSIZE_NUMLINE_SHIFT); if(!(memcmp(&AperturePtr, &AperturePtr_1, sizeof(XScalerAperture)))) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } /* * Run XScaler self test. */ // Status = XScaler_SelfTest(&ScalerInst); // if (Status != XST_SUCCESS) { // check_status_update(u32, 0, 1); // return XST_FAILURE; // } // else{ // check_status_update(u32, 1, 1); // } /* * Test case for lookupconfig */ Config = XScaler_LookupConfig(XSCALAR_DEVICEID); if(Config == NULL) { check_status_update(u32, 1, 1); } else { check_status_update(u32, 0, 1); } CT_CMP_NUM(int, Status, XST_SUCCESS); } return (u32)(CT_GetTestFailures()); }