672 lines
20 KiB
C
672 lines
20 KiB
C
![]() |
/******************************************************************************
|
||
|
*
|
||
|
* 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.
|
||
|
*
|
||
|
* <pre>
|
||
|
*
|
||
|
* MODIFICATION HISTORY:
|
||
|
*
|
||
|
* Ver Who Date Changes
|
||
|
* ----- ------ -------- ---------------------------------------------
|
||
|
* 7.0 adk 22/08/14 First release.
|
||
|
* </pre>
|
||
|
*
|
||
|
******************************************************************************/
|
||
|
|
||
|
/***************************** 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:
|
||
|
*
|
||
|
* <pre>
|
||
|
* 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)
|
||
|
* </pre>
|
||
|
*
|
||
|
* @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(<type>, 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());
|
||
|
|
||
|
}
|