2014-06-24 16:45:01 +05:30
|
|
|
/******************************************************************************
|
|
|
|
*
|
|
|
|
* Copyright (C) 2009 - 2014 Xilinx, Inc. All rights reserved.
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
|
|
* in the Software without restriction, including without limitation the rights
|
|
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
|
|
* furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be included in
|
|
|
|
* all copies or substantial portions of the Software.
|
|
|
|
*
|
|
|
|
* Use of the Software is limited solely to applications:
|
|
|
|
* (a) running on a Xilinx device, or
|
|
|
|
* (b) that interact with a Xilinx device through a bus or interconnect.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
* XILINX CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
|
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
|
|
|
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
|
* SOFTWARE.
|
|
|
|
*
|
|
|
|
* Except as contained in this notice, the name of the Xilinx shall not be used
|
|
|
|
* in advertising or otherwise to promote the sale, use or other dealings in
|
|
|
|
* this Software without prior written authorization from Xilinx.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @file xosd.c
|
|
|
|
*
|
2014-07-18 12:45:33 +05:30
|
|
|
* This file is main code of Xilinx Video On-Screen-Display (OSD) core.
|
2014-06-24 16:45:01 +05:30
|
|
|
* Please see xosd.h for more details of the driver.
|
|
|
|
*
|
|
|
|
* <pre>
|
|
|
|
* MODIFICATION HISTORY:
|
|
|
|
*
|
2014-07-18 12:45:33 +05:30
|
|
|
* Ver Who Date Changes
|
|
|
|
* ----- ------ -------- -------------------------------------------------------
|
|
|
|
* 1.00a xd 08/18/08 First release.
|
|
|
|
* 1.02a xd 12/21/10 Removed endian conversion for text bank loading.
|
|
|
|
* 1.03a cm 09/07/11 Updated XOsd_GetLayerAlpha(), XOsd_SetLayerAlpha(),
|
|
|
|
* XOsd_SetBackgroundColor() and XOsd_GetBackgroundColor()
|
|
|
|
* to allow 10 and 12 bit alpha and background colors.
|
|
|
|
* 2.00a cjm 12/18/12 Converted from xio.h to xil_io.h, translating
|
|
|
|
* basic types, MB cache functions, exceptions and
|
|
|
|
* assertions to xil_io format.
|
|
|
|
* 4.0 adk 02/18/14 Renamed S_AXIS_VIDEO_DATA_WIDTH ->
|
|
|
|
* SlaveAxisVideoDataWidth.
|
|
|
|
* Removed from XOsd_CfgInitialize:
|
|
|
|
* VbiStartCallBack, VbiStartRef, VbiEndCallBack,
|
|
|
|
* VbiEndRef.
|
|
|
|
*
|
|
|
|
* Added in XOsd_CfgInitialize:
|
|
|
|
* ProcStartCallBack, ProcStartRef.
|
|
|
|
*
|
|
|
|
* Renamed the following function prototypes:
|
|
|
|
* XOSD_CfgInitialize -> XOsd_CfgInitialize,
|
|
|
|
* XOSD_SetScreenSize -> XOsd_SetActiveSize,
|
|
|
|
* XOSD_GetScreenSize -> XOsd_GetActiveSize,
|
|
|
|
* XOSD_SetBackgroundColor -> XOsd_SetBackgroundColor,
|
|
|
|
* XOSD_GetBackgroundColor -> XOSD_GetBackgroundColor,
|
|
|
|
* XOSD_SetLayerDimension -> XOsd_SetLayerDimension,
|
|
|
|
* XOSD_GetLayerDimension -> XOsd_GetLayerDimension,
|
|
|
|
* XOSD_SetLayerAlpha -> XOsd_SetLayerAlpha,
|
|
|
|
* XOSD_GetLayerAlpha -> XOsd_GetLayerAlpha,
|
|
|
|
* XOSD_SetLayerAlpha -> XOsd_SetLayerAlpha,
|
|
|
|
* XOSD_GetLayerAlpha -> XOsd_GetLayerAlpha,
|
|
|
|
* XOSD_SetLayerPriority -> XOsd_SetLayerPriority,
|
|
|
|
* XOSD_GetLayerPriority -> XOsd_GetLayerPriority,
|
|
|
|
* XOSD_EnableLayer -> XOsd_EnableLayer,
|
|
|
|
* XOSD_DisableLayer -> XOsd_DisableLayer,
|
|
|
|
* XOSD_LoadColorLUTBank - > XOsd_LoadColorLUTBank,
|
|
|
|
* XOSD_LoadCharacterSetBank -> XOsd_LoadCharacterSetBank,
|
|
|
|
* XOSD_LoadTextBank - > XOsd_LoadTextBank,
|
|
|
|
* XOSD_SetActiveBank -> XOsd_SetActiveBank,
|
|
|
|
* XOSD_CreateInstruction -> XOsd_CreateInstruction,
|
|
|
|
* XOSD_LoadInstructionList -> XOsd_LoadInstructionList,
|
|
|
|
* XOSD_LookupConfig -> XOsd_LookupConfig,
|
|
|
|
* XOSD_IntrHandler -> XOsd_IntrHandler,
|
|
|
|
* XOSD_SetCallBack -> XOsd_SetCallBack.
|
|
|
|
*
|
|
|
|
* Changed the prototype of XOSD_GetVersion and renamed it as
|
|
|
|
* XOsd_GetVersion
|
|
|
|
*
|
|
|
|
* Removed the following function implementation:
|
|
|
|
* XOSD_SetBlankPolarity.
|
2014-06-24 16:45:01 +05:30
|
|
|
* </pre>
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
/***************************** Include Files *********************************/
|
|
|
|
|
|
|
|
#include "xosd.h"
|
|
|
|
|
|
|
|
/************************** Constant Definitions *****************************/
|
|
|
|
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/***************** Macros (Inline Functions) Definitions *********************/
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/**************************** Type Definitions *******************************/
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
|
|
|
|
/************************** Function Prototypes ******************************/
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
static void PopulateLayerProperty(XOsd *InstancePtr, XOsd_Config *CfgPtr);
|
2014-06-24 16:45:01 +05:30
|
|
|
static void StubCallBack(void *CallBackRef);
|
|
|
|
static void StubErrCallBack(void *CallBackRef, u32 ErrorMask);
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/************************** Variable Definitions *****************************/
|
|
|
|
|
|
|
|
|
|
|
|
/************************** Function Definitions *****************************/
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function initializes an OSD core. This function must be called
|
|
|
|
* prior to using an OSD core. Initialization of an OSD includes setting up
|
|
|
|
* the instance data and ensuring the hardware is in a quiescent state.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param CfgPtr points to the configuration structure associated
|
|
|
|
* with the OSD core.
|
|
|
|
* @param EffectiveAddr is the base address of the core. If address
|
|
|
|
* translation is being used, then this parameter must reflect the
|
|
|
|
* virtual base address. Otherwise, the physical address should be
|
|
|
|
* used.
|
|
|
|
*
|
|
|
|
* @return - XST_SUCCESS if XOsd_CfgInitialize was successful.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
int XOsd_CfgInitialize(XOsd *InstancePtr, XOsd_Config *CfgPtr,
|
2014-06-24 16:45:01 +05:30
|
|
|
u32 EffectiveAddr)
|
|
|
|
{
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-09-02 11:29:15 +05:30
|
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertNonvoid(CfgPtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertNonvoid(CfgPtr->LayerNum <= (XOSD_MAX_NUM_OF_LAYERS));
|
2014-09-02 11:29:15 +05:30
|
|
|
Xil_AssertNonvoid(EffectiveAddr != (u32)0x00);
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Setup the instance */
|
2014-07-18 12:45:33 +05:30
|
|
|
(void)memset((void *)InstancePtr, 0, sizeof(XOsd));
|
|
|
|
(void)memcpy((void *)&(InstancePtr->Config), (const void *)CfgPtr,
|
|
|
|
sizeof(XOsd_Config));
|
2014-06-24 16:45:01 +05:30
|
|
|
InstancePtr->Config.BaseAddress = EffectiveAddr;
|
|
|
|
|
|
|
|
/* Reset to use instruction from the OSD internal buffer */
|
|
|
|
InstancePtr->InstructionInExternalMem = 0;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Set all handlers to stub values, let user configure this
|
|
|
|
* data later
|
2014-06-24 16:45:01 +05:30
|
|
|
*/
|
2014-07-18 12:45:33 +05:30
|
|
|
InstancePtr->ProcStartCallBack =
|
|
|
|
(XOsd_CallBack)((void *)StubCallBack);
|
|
|
|
InstancePtr->FrameDoneCallBack =
|
|
|
|
(XOsd_CallBack)((void *)StubCallBack);
|
|
|
|
InstancePtr->ErrCallBack =
|
|
|
|
(XOsd_ErrorCallBack)((void *)StubErrCallBack);
|
|
|
|
|
|
|
|
/* Populate the layer properties into a array to help easy
|
|
|
|
* fetch later
|
2014-06-24 16:45:01 +05:30
|
|
|
*/
|
|
|
|
PopulateLayerProperty(InstancePtr, CfgPtr);
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Reset the hardware and set the flag to indicate the
|
|
|
|
* driver is ready
|
2014-06-24 16:45:01 +05:30
|
|
|
*/
|
2014-07-18 12:45:33 +05:30
|
|
|
XOsd_Reset(InstancePtr);
|
|
|
|
InstancePtr->IsReady = (u32)(XIL_COMPONENT_IS_READY);
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
return (XST_SUCCESS);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function sets the screen size of the OSD Output.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param Width defines the width of the OSD output.
|
|
|
|
* @param Height defines the height of the OSD output.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_SetActiveSize(XOsd *InstancePtr, u32 Width, u32 Height)
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
|
|
|
u32 RegValue;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
2014-09-02 11:29:15 +05:30
|
|
|
Xil_AssertVoid(Width > (u32)0x0);
|
|
|
|
Xil_AssertVoid(Height > (u32)0x0);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(Width <= (u32)(XOSD_ACTSIZE_NUM_PIXEL_MASK));
|
|
|
|
Xil_AssertVoid(Height <= ((XOSD_ACTSIZE_NUM_LINE_MASK) >>
|
|
|
|
(XOSD_ACTSIZE_NUM_LINE_SHIFT)));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Save the dimension info in the driver instance for error handling */
|
|
|
|
InstancePtr->ScreenWidth = Width;
|
|
|
|
InstancePtr->ScreenHeight = Height;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Update the screen size register */
|
2014-06-24 16:45:01 +05:30
|
|
|
RegValue = Width;
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue |= (Height << (XOSD_ACTSIZE_NUM_LINE_SHIFT)) &
|
|
|
|
(XOSD_ACTSIZE_NUM_LINE_MASK);
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress,
|
|
|
|
(XOSD_ACTIVE_SIZE_OFFSET), RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function gets the screen size of the OSD Output.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param WidthPtr will point to the width of the OSD output after this
|
|
|
|
* function returns.
|
|
|
|
* @param HeightPtr will point to the height of the OSD output after this
|
|
|
|
* function returns.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_GetActiveSize(XOsd *InstancePtr, u32 *WidthPtr, u32 *HeightPtr)
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
|
|
|
u32 RegValue;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(WidthPtr != NULL);
|
|
|
|
Xil_AssertVoid(HeightPtr != NULL);
|
|
|
|
|
|
|
|
/* Get the screen size info */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue = XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
(XOSD_ACTIVE_SIZE_OFFSET));
|
|
|
|
*WidthPtr = (RegValue) & (XOSD_ACTSIZE_NUM_PIXEL_MASK);
|
|
|
|
*HeightPtr = ((RegValue) & (XOSD_ACTSIZE_NUM_LINE_MASK)) >>
|
|
|
|
(XOSD_ACTSIZE_NUM_LINE_SHIFT);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function sets the background color used by the OSD output.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param Red indicates the red value to be used in the background color.
|
|
|
|
* @param Blue indicates the blue value to be used in the background
|
|
|
|
* color.
|
|
|
|
* @param Green indicates the green value to be used in the background
|
|
|
|
* color.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_SetBackgroundColor(XOsd *InstancePtr, u16 Red, u16 Blue, u16 Green)
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
|
|
|
u32 RegValue;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Update the background color register */
|
|
|
|
RegValue = ((u32)Green) & (XOSD_BC0_YG_MASK);
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress, (XOSD_BC0_OFFSET),
|
|
|
|
RegValue);
|
|
|
|
RegValue = ((u32)Blue) & (XOSD_BC1_UCBB_MASK);
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress, (XOSD_BC1_OFFSET),
|
|
|
|
RegValue);
|
|
|
|
RegValue = ((u32)Red) & (XOSD_BC2_VCRR_MASK);
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress, (XOSD_BC2_OFFSET),
|
|
|
|
RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function gets the background color used by the OSD output.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param RedPtr will point to the red value used in the background color
|
|
|
|
* after this function returns.
|
|
|
|
* @param BluePtr will point to the blue value used in the background
|
|
|
|
* color after this function returns.
|
|
|
|
* @param GreenPtr will point to the green value used in the background
|
|
|
|
* color after this function returns.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_GetBackgroundColor(XOsd *InstancePtr, u16 *RedPtr, u16 *BluePtr,
|
|
|
|
u16 *GreenPtr)
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(RedPtr != NULL);
|
|
|
|
Xil_AssertVoid(BluePtr != NULL);
|
|
|
|
Xil_AssertVoid(GreenPtr != NULL);
|
|
|
|
|
|
|
|
/* Get the background color */
|
2014-07-18 12:45:33 +05:30
|
|
|
*GreenPtr = (u16)((XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
(XOSD_BC0_OFFSET))) & (XOSD_BC0_YG_MASK));
|
|
|
|
*BluePtr = (u16)((XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
(XOSD_BC1_OFFSET))) & (XOSD_BC1_UCBB_MASK));
|
|
|
|
*RedPtr = (u16)((XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
XOSD_BC2_OFFSET)) & (XOSD_BC2_VCRR_MASK));
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
|
2014-06-24 16:45:01 +05:30
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function sets the start position and size of an OSD layer.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param LayerIndex indicates which layer to be worked on. Valid
|
|
|
|
* value range is from 0 to (the number of layers implemented in
|
|
|
|
* the core - 1).
|
|
|
|
* @param XStart indicates the horizontal start pixel of origin of the
|
|
|
|
* layer.
|
|
|
|
* @param YStart indicates the vertical start line of origin of the
|
|
|
|
* layer.
|
|
|
|
* @param XSize indicates the horizontal size of the layer.
|
|
|
|
* @param YSize indicates the vertical size of the layer.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_SetLayerDimension(XOsd *InstancePtr, u8 LayerIndex, u16 XStart,
|
2014-06-24 16:45:01 +05:30
|
|
|
u16 YStart, u16 XSize, u16 YSize)
|
|
|
|
{
|
|
|
|
u32 LayerBaseRegAddr;
|
|
|
|
u32 RegValue;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
|
|
|
Xil_AssertVoid((u16)LayerIndex < InstancePtr->Config.LayerNum);
|
|
|
|
Xil_AssertVoid(InstancePtr->Layers[LayerIndex].LayerType !=
|
|
|
|
(XOSD_LAYER_TYPE_DISABLE));
|
2014-09-02 11:29:15 +05:30
|
|
|
Xil_AssertVoid(XSize > (u16)0x0);
|
|
|
|
Xil_AssertVoid(YSize > (u16)0x0);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(((u32)XStart + (u32)XSize) <= InstancePtr->ScreenWidth);
|
|
|
|
Xil_AssertVoid(((u32)YStart + (u32)YSize) <=
|
|
|
|
InstancePtr->ScreenHeight);
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Calculate the base register address of the layer to work on */
|
2014-07-18 12:45:33 +05:30
|
|
|
LayerBaseRegAddr = (u32)(XOSD_L0C_OFFSET) + (((u32)LayerIndex) *
|
|
|
|
((u32)(XOSD_LAYER_SIZE)));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Set the origin of the layer */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue = ((u32)XStart) & (XOSD_LXP_XSTART_MASK);
|
|
|
|
RegValue |= (((u32)YStart) << (XOSD_LXP_YSTART_SHIFT)) &
|
|
|
|
(XOSD_LXP_YSTART_MASK);
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress, LayerBaseRegAddr +
|
|
|
|
(XOSD_LXP), RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Set the size of the layer */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue = ((u32)XSize) & (XOSD_LXS_XSIZE_MASK);
|
|
|
|
RegValue |= (((u32)YSize) << (XOSD_LXS_YSIZE_SHIFT)) &
|
|
|
|
(XOSD_LXS_YSIZE_MASK);
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress,
|
|
|
|
((LayerBaseRegAddr) + (XOSD_LXS)), RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function gets the start position and size of an OSD layer.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param LayerIndex indicates which layer to be worked on. Valid
|
|
|
|
* value range is from 0 to (the number of layers implemented
|
|
|
|
* in the core - 1).
|
|
|
|
* @param XStartPtr will point to the horizontal start pixel value
|
|
|
|
* of origin of the layer after this function returns.
|
|
|
|
* @param YStartPtr will point to the vertical start line of origin
|
|
|
|
* of the layer after this function returns.
|
|
|
|
* @param XSizePtr will point to the horizontal size value of the
|
|
|
|
* layer after this function returns.
|
|
|
|
* @param YSizePtr will point to the vertical size value of the
|
|
|
|
* layer after this function returns.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_GetLayerDimension(XOsd *InstancePtr, u8 LayerIndex, u16 *XStartPtr,
|
2014-06-24 16:45:01 +05:30
|
|
|
u16 *YStartPtr, u16 *XSizePtr, u16 *YSizePtr)
|
|
|
|
{
|
|
|
|
u32 LayerBaseRegAddr;
|
|
|
|
u32 RegValue;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
|
|
|
Xil_AssertVoid((u16)LayerIndex < InstancePtr->Config.LayerNum);
|
|
|
|
Xil_AssertVoid(InstancePtr->Layers[LayerIndex].LayerType !=
|
|
|
|
(XOSD_LAYER_TYPE_DISABLE));
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(XStartPtr != NULL);
|
|
|
|
Xil_AssertVoid(YStartPtr != NULL);
|
|
|
|
Xil_AssertVoid(XSizePtr != NULL);
|
|
|
|
Xil_AssertVoid(YSizePtr != NULL);
|
|
|
|
|
|
|
|
/* Calculate the base register address of the layer to work on */
|
2014-07-18 12:45:33 +05:30
|
|
|
LayerBaseRegAddr = (u32)(XOSD_L0C_OFFSET) + (((u32)LayerIndex) *
|
|
|
|
((u32)XOSD_LAYER_SIZE));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Get the origin of the layer */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue = XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
((LayerBaseRegAddr) + (XOSD_LXP)));
|
|
|
|
*XStartPtr = (u16)((RegValue) & (XOSD_LXP_XSTART_MASK));
|
2014-09-02 11:29:15 +05:30
|
|
|
*YStartPtr = (u16)(((RegValue) & (XOSD_LXP_YSTART_MASK)) >>
|
|
|
|
(XOSD_LXP_YSTART_SHIFT));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Get the size of the layer */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue = XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
LayerBaseRegAddr + (XOSD_LXS));
|
|
|
|
*XSizePtr = (u16)((RegValue) & (XOSD_LXS_XSIZE_MASK));
|
|
|
|
*YSizePtr = (u16)(((RegValue) & (XOSD_LXS_YSIZE_MASK)) >>
|
|
|
|
(XOSD_LXS_YSIZE_SHIFT));
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function sets the alpha value and mode of an OSD layer.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param LayerIndex indicates which layer to be worked on. Valid value
|
|
|
|
* range is from 0 to (the number of layers implemented in the
|
|
|
|
* core - 1).
|
|
|
|
* @param GlobalAlphaEnable indicates whether to enable the global alpha.
|
|
|
|
* Use any non-0 value to enable the global alpha, and 0 to
|
|
|
|
* disable it.
|
|
|
|
* @param GlobalAlphaValue indicates the transparent level. 0 for 100%
|
|
|
|
* transparent, 255 (8bit) for 0% transparent (100% opaque).
|
|
|
|
* This argument will be ignored if parameter GlobalAlphaEnble has
|
|
|
|
* value 0.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_SetLayerAlpha(XOsd *InstancePtr, u8 LayerIndex,
|
|
|
|
u16 GlobalAlphaEnable, u16 GlobalAlphaValue)
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
|
|
|
u32 LayerBaseRegAddr;
|
|
|
|
u32 RegValue;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
|
|
|
Xil_AssertVoid((u16)LayerIndex < InstancePtr->Config.LayerNum);
|
|
|
|
Xil_AssertVoid(InstancePtr->Layers[LayerIndex].LayerType !=
|
|
|
|
(XOSD_LAYER_TYPE_DISABLE));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Calculate the base register address of the layer to work on */
|
2014-07-18 12:45:33 +05:30
|
|
|
LayerBaseRegAddr = (u32)(XOSD_L0C_OFFSET) + (((u32)LayerIndex) *
|
|
|
|
((u32)(XOSD_LAYER_SIZE)));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Read the current Layer Control register value */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue = XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
((LayerBaseRegAddr) + (XOSD_LXC)));
|
|
|
|
|
|
|
|
/* Update the global alpha enable and the global alpha value fields */
|
2014-09-02 11:29:15 +05:30
|
|
|
if (GlobalAlphaEnable != (u16)0x0) {
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue |= ((u32)(XOSD_LXC_GALPHAEN_MASK));
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
RegValue &= (u32)(~(XOSD_LXC_GALPHAEN_MASK));
|
|
|
|
}
|
|
|
|
RegValue &= (u32)(~(XOSD_LXC_ALPHA_MASK));
|
|
|
|
RegValue |= (((u32)GlobalAlphaValue) << (XOSD_LXC_ALPHA_SHIFT)) &
|
|
|
|
(XOSD_LXC_ALPHA_MASK);
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress,
|
|
|
|
((LayerBaseRegAddr) + (XOSD_LXC)), RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function gets the alpha value and mode of an OSD layer.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param LayerIndex indicates which layer to be worked on. Valid
|
|
|
|
* value range is from 0 to (the number of layers implemented
|
|
|
|
* in the core - 1).
|
|
|
|
* @param GlobalAlphaEnablePtr will point to a flag indicating whether the
|
|
|
|
* global alpha is enabled on a layer after this function returns.
|
|
|
|
* Flag 1 indicates that the global alpha is enabled, 0 indicates
|
|
|
|
* that it is not.
|
|
|
|
* @param GlobalAlphaValuePtr will point to the transparent level after
|
|
|
|
* this function returns. 0 for 100% transparent, 255 (8bit)
|
|
|
|
* for 0% transparent (100% opaque).
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_GetLayerAlpha(XOsd *InstancePtr, u8 LayerIndex,
|
|
|
|
u16 *GlobalAlphaEnablePtr, u16 *GlobalAlphaValuePtr)
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
|
|
|
u32 LayerBaseRegAddr;
|
|
|
|
u32 RegValue;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
|
|
|
Xil_AssertVoid((u16)LayerIndex < InstancePtr->Config.LayerNum);
|
|
|
|
Xil_AssertVoid(InstancePtr->Layers[LayerIndex].LayerType !=
|
|
|
|
(XOSD_LAYER_TYPE_DISABLE));
|
|
|
|
Xil_AssertVoid(GlobalAlphaEnablePtr != NULL);
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(GlobalAlphaValuePtr != NULL);
|
|
|
|
|
|
|
|
/* Calculate the base register address of the layer to work on */
|
2014-07-18 12:45:33 +05:30
|
|
|
LayerBaseRegAddr = ((u32)(XOSD_L0C_OFFSET) + (((u32)LayerIndex) *
|
|
|
|
((u32)(XOSD_LAYER_SIZE))));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Read the current layer control register value */
|
|
|
|
RegValue = XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
((LayerBaseRegAddr) + (XOSD_LXC)));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Get the info of the global alpha enable and the global alpha value
|
2014-06-24 16:45:01 +05:30
|
|
|
* fields
|
|
|
|
*/
|
2014-07-18 12:45:33 +05:30
|
|
|
*GlobalAlphaEnablePtr = (u16)((((RegValue) &
|
|
|
|
((u32)(XOSD_LXC_GALPHAEN_MASK))) ==
|
2014-09-02 11:29:15 +05:30
|
|
|
(XOSD_LXC_GALPHAEN_MASK)) ? 1 : 0);
|
2014-07-18 12:45:33 +05:30
|
|
|
*GlobalAlphaValuePtr = (u16)(((RegValue) & (XOSD_LXC_ALPHA_MASK)) >>
|
|
|
|
(XOSD_LXC_ALPHA_SHIFT));
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function sets the priority of an OSD layer.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param LayerIndex indicates which layer to be worked on. Valid value
|
|
|
|
* range is from 0 to (the number of layers implemented in the
|
|
|
|
* core - 1).
|
|
|
|
* @param Priority indicates the priority to be applied on the layer.
|
|
|
|
* Use one of XOSD_LAYER_PRIORITY_0 (the lowest priority) through
|
|
|
|
* XOSD_LAYER_PRIORITY_7 (the highest priority) defined in
|
|
|
|
* xosd_hw.h.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_SetLayerPriority(XOsd *InstancePtr, u8 LayerIndex, u8 Priority)
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
|
|
|
u32 LayerBaseRegAddr;
|
|
|
|
u32 RegValue;
|
|
|
|
|
|
|
|
/* Verify arguments */
|
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
|
|
|
Xil_AssertVoid((u16)LayerIndex < InstancePtr->Config.LayerNum);
|
|
|
|
Xil_AssertVoid(InstancePtr->Layers[LayerIndex].LayerType !=
|
|
|
|
(XOSD_LAYER_TYPE_DISABLE));
|
|
|
|
Xil_AssertVoid(Priority <= (XOSD_LAYER_PRIORITY_7));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Calculate the base register address of the layer to work on */
|
2014-07-18 12:45:33 +05:30
|
|
|
LayerBaseRegAddr = ((u32)(XOSD_L0C_OFFSET)) + ((((u32)LayerIndex) *
|
|
|
|
((u32)(XOSD_LAYER_SIZE))));
|
|
|
|
|
|
|
|
/* Read the current layer control register value */
|
|
|
|
RegValue = XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
((LayerBaseRegAddr) + (XOSD_LXC)));
|
|
|
|
|
|
|
|
/* Update the priority field */
|
|
|
|
RegValue &= (u32)(~(XOSD_LXC_PRIORITY_MASK));
|
|
|
|
RegValue |= (((u32)Priority) << (XOSD_LXC_PRIORITY_SHIFT))
|
|
|
|
& (XOSD_LXC_PRIORITY_MASK);
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress,
|
|
|
|
((LayerBaseRegAddr) + (XOSD_LXC)), RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function gets the priority of an OSD layer.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param LayerIndex indicates which layer to be worked on. Valid value
|
|
|
|
* range is from 0 to (the number of layers implemented in the
|
|
|
|
* core - 1).
|
|
|
|
* @param PriorityPtr will point to the priority used on the layer
|
|
|
|
* after this function returns. Use one of XOSD_LAYER_PRIORITY_0
|
|
|
|
* (the lowest priority) through XOSD_LAYER_PRIORITY_7
|
|
|
|
* (the highest priority) defined in xosd_hw.h to interpret
|
|
|
|
* the value.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_GetLayerPriority(XOsd *InstancePtr, u8 LayerIndex, u8 *PriorityPtr)
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
|
|
|
u32 LayerBaseRegAddr;
|
|
|
|
u32 RegValue;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
|
|
|
Xil_AssertVoid((u16)LayerIndex < InstancePtr->Config.LayerNum);
|
|
|
|
Xil_AssertVoid(InstancePtr->Layers[LayerIndex].LayerType !=
|
|
|
|
(XOSD_LAYER_TYPE_DISABLE));
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(PriorityPtr != NULL);
|
|
|
|
|
|
|
|
/* Calculate the base register address of the layer to work on */
|
2014-07-18 12:45:33 +05:30
|
|
|
LayerBaseRegAddr = ((u32)(XOSD_L0C_OFFSET)) + ((((u32)LayerIndex) *
|
|
|
|
((u32)(XOSD_LAYER_SIZE))));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Read the current layer control register value */
|
|
|
|
RegValue = XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
((LayerBaseRegAddr) + (XOSD_LXC)));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Get the priority field */
|
|
|
|
*PriorityPtr = (u8)(((RegValue) & (XOSD_LXC_PRIORITY_MASK)) >>
|
|
|
|
(XOSD_LXC_PRIORITY_SHIFT));
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function enables an OSD layer.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param LayerIndex indicates which layer to be worked on. Valid
|
|
|
|
* value range is from 0 to (the number of layers implemented
|
|
|
|
* in the core - 1).
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_EnableLayer(XOsd *InstancePtr, u8 LayerIndex)
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
|
|
|
u32 LayerBaseRegAddr;
|
|
|
|
u32 RegValue;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
|
|
|
Xil_AssertVoid((u16)LayerIndex < InstancePtr->Config.LayerNum);
|
|
|
|
Xil_AssertVoid(InstancePtr->Layers[LayerIndex].LayerType !=
|
|
|
|
(XOSD_LAYER_TYPE_DISABLE));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Calculate the base register address of the layer to work on */
|
2014-07-18 12:45:33 +05:30
|
|
|
LayerBaseRegAddr = ((u32)(XOSD_L0C_OFFSET)) + ((((u32)LayerIndex) *
|
|
|
|
((u32)(XOSD_LAYER_SIZE))));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Read the current layer control register value */
|
|
|
|
RegValue = XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
((LayerBaseRegAddr) + (XOSD_LXC)));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Set the layer enable field */
|
|
|
|
RegValue |= (XOSD_LXC_EN_MASK);
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress,
|
|
|
|
((LayerBaseRegAddr) + (XOSD_LXC)), RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function disables an OSD layer.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param LayerIndex indicates which layer to be worked on. Valid
|
|
|
|
* value range is from 0 to (the number of layers implemented
|
|
|
|
* in the core - 1).
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_DisableLayer(XOsd *InstancePtr, u8 LayerIndex)
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
|
|
|
u32 LayerBaseRegAddr;
|
|
|
|
u32 RegValue;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
|
|
|
Xil_AssertVoid((u16)LayerIndex < InstancePtr->Config.LayerNum);
|
|
|
|
Xil_AssertVoid(InstancePtr->Layers[LayerIndex].LayerType !=
|
|
|
|
(XOSD_LAYER_TYPE_DISABLE));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Calculate the base register address of the layer to work on */
|
2014-07-18 12:45:33 +05:30
|
|
|
LayerBaseRegAddr = ((u32)(XOSD_L0C_OFFSET)) +
|
2014-09-02 11:29:15 +05:30
|
|
|
((((u32)LayerIndex) * ((u32)(XOSD_LAYER_SIZE))));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Read the current layer control register value */
|
|
|
|
RegValue = XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
((LayerBaseRegAddr) + (XOSD_LXC)));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Clear the layer enable field */
|
|
|
|
RegValue &= (u32)(~(XOSD_LXC_EN_MASK));
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress,
|
|
|
|
((LayerBaseRegAddr) + (XOSD_LXC)), RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function loads color look up table data into an OSD Graphics Controller
|
|
|
|
* bank.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param GcIndex indicates which Graphics Controller to work on.
|
|
|
|
* Valid value range is from 0 to (The Number of Layers) - 1.
|
|
|
|
* The layer's type must be set to XOSD_LAYER_TYPE_GPU
|
|
|
|
* (defined in xosd_hw.h) for this function to work properly.
|
|
|
|
* @param BankIndex indicates which GC Bank to be worked on. Valid
|
|
|
|
* value range is from 0 to XOSD_GC_BANK_NUM - 1.
|
|
|
|
* @param ColorData points to the color LUT data to be loaded.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_LoadColorLUTBank(XOsd *InstancePtr, u8 GcIndex, u8 BankIndex,
|
|
|
|
u32 ColorData[])
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
2014-07-18 12:45:33 +05:30
|
|
|
u32 Index;
|
2014-06-24 16:45:01 +05:30
|
|
|
u32 RegValue;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
|
|
|
Xil_AssertVoid((u16)GcIndex < InstancePtr->Config.LayerNum);
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->Layers[GcIndex].LayerType ==
|
2014-07-18 12:45:33 +05:30
|
|
|
(XOSD_LAYER_TYPE_GPU));
|
|
|
|
Xil_AssertVoid(BankIndex < (XOSD_GC_BANK_NUM));
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(ColorData != NULL);
|
|
|
|
|
|
|
|
/* Choose which bank to be loaded */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue = (((u32)BankIndex) + (XOSD_GCWBA_COL0)) &
|
|
|
|
(XOSD_GCWBA_BANK_MASK);
|
|
|
|
RegValue |= (((u32)GcIndex) << (XOSD_GCWBA_GCNUM_SHIFT))
|
|
|
|
& (XOSD_GCWBA_GCNUM_MASK);
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress, (XOSD_GCWBA_OFFSET),
|
|
|
|
RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Load color data */
|
2014-07-18 12:45:33 +05:30
|
|
|
if(InstancePtr->Config.SlaveAxisVideoDataWidth == (u16)(XOSD_DATA_8)) {
|
2014-09-02 11:29:15 +05:30
|
|
|
for(Index = 0x0;
|
2014-07-18 12:45:33 +05:30
|
|
|
Index < ((InstancePtr->Layers[GcIndex].ColorLutSize *
|
|
|
|
(XOSD_COLOR_ENTRY_SIZE)) / sizeof(u32));
|
|
|
|
Index++) {
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress,
|
|
|
|
(XOSD_GCD_OFFSET), ColorData[Index]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* For video channel size of 10 or 12, the color size is 64 bits */
|
|
|
|
else {
|
2014-09-02 11:29:15 +05:30
|
|
|
for (Index = 0;
|
2014-07-18 12:45:33 +05:30
|
|
|
Index < (((InstancePtr->Layers[GcIndex].ColorLutSize) *
|
|
|
|
((XOSD_DATA_2) * (XOSD_COLOR_ENTRY_SIZE))) /
|
|
|
|
(sizeof(u32)));
|
|
|
|
Index++) {
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress,
|
|
|
|
(XOSD_GCD_OFFSET), ColorData[Index]);
|
|
|
|
}
|
|
|
|
}
|
2014-06-24 16:45:01 +05:30
|
|
|
/* Set the active color LUT bank */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue = XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
(XOSD_GCABA_OFFSET));
|
2014-09-02 11:29:15 +05:30
|
|
|
RegValue &= ~((u32)1 << ((XOSD_GCABA_COL_SHIFT) + GcIndex));
|
2014-07-18 12:45:33 +05:30
|
|
|
|
|
|
|
RegValue |= ((u32)BankIndex) << ((XOSD_GCABA_COL_SHIFT) +
|
|
|
|
((u32)GcIndex));
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress, (XOSD_GCABA_OFFSET),
|
|
|
|
RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function loads character set data (font) into an OSD Graphics
|
|
|
|
* Controller bank.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param GcIndex indicates which Graphics Controller to work on. Valid
|
|
|
|
* value range is from 0 to (The Number of Layers) - 1. The
|
|
|
|
* layer's type must be set to XOSD_LAYER_TYPE_GPU
|
|
|
|
* (defined in xosd_hw.h) for this function to work properly.
|
|
|
|
* @param BankIndex indicates which GC bank to be worked on. Valid
|
|
|
|
* value range is from 0 to XOSD_GC_BANK_NUM - 1.
|
|
|
|
* @param CharSetData points to the character set data to be loaded.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_LoadCharacterSetBank(XOsd *InstancePtr, u8 GcIndex, u8 BankIndex,
|
|
|
|
u32 CharSetData[])
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
|
|
|
u32 RegValue;
|
|
|
|
u32 FontWriteNum;
|
2014-07-18 12:45:33 +05:30
|
|
|
u32 Index;
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
|
|
|
Xil_AssertVoid((u16)GcIndex < InstancePtr->Config.LayerNum);
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->Layers[GcIndex].LayerType ==
|
2014-07-18 12:45:33 +05:30
|
|
|
(XOSD_LAYER_TYPE_GPU));
|
|
|
|
Xil_AssertVoid(BankIndex < (XOSD_GC_BANK_NUM));
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(CharSetData != NULL);
|
|
|
|
|
|
|
|
/* Choose which bank to be loaded */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue = (((u32)BankIndex) + (XOSD_GCWBA_CHR0)) &
|
|
|
|
(XOSD_GCWBA_BANK_MASK);
|
|
|
|
RegValue |= (((u32)GcIndex) << (XOSD_GCWBA_GCNUM_SHIFT)) &
|
|
|
|
(XOSD_GCWBA_GCNUM_MASK);
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress, (XOSD_GCWBA_OFFSET),
|
|
|
|
RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Calculate the number of write to load the whole font data set */
|
2014-07-18 12:45:33 +05:30
|
|
|
FontWriteNum = ((u32)(InstancePtr->Layers[GcIndex].FontWidth) *
|
|
|
|
(u32)(InstancePtr->Layers[GcIndex].FontHeight) *
|
|
|
|
(u32)(InstancePtr->Layers[GcIndex].FontBitsPerPixel));
|
|
|
|
FontWriteNum /= (u32)(XOSD_FONT_BIT_TO_BYTE);
|
|
|
|
FontWriteNum *= (u32)(InstancePtr->Layers[GcIndex].FontNumChars);
|
|
|
|
FontWriteNum /= (u32)sizeof(u32);
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Load the font data */
|
2014-09-02 11:29:15 +05:30
|
|
|
for (Index = 0x0; Index < FontWriteNum; Index++) {
|
2014-07-18 12:45:33 +05:30
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress, (XOSD_GCD_OFFSET),
|
|
|
|
CharSetData[Index]);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/* Set the bank to be active so the font is used by the core */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue = XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
(XOSD_GCABA_OFFSET));
|
2014-09-02 11:29:15 +05:30
|
|
|
RegValue &= ~((u32)1 << ((XOSD_GCABA_CHR_SHIFT) + GcIndex));
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue |= ((u32)BankIndex) << ((XOSD_GCABA_CHR_SHIFT) +
|
|
|
|
((u32)GcIndex));
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress, (XOSD_GCABA_OFFSET),
|
|
|
|
RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function loads text data into an OSD Graphics Controller bank.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be
|
|
|
|
* worked on.
|
|
|
|
* @param GcIndex indicates which Graphics Controller to work on.
|
|
|
|
* Valid value range is from 0 to (The Number of Layers) - 1.
|
|
|
|
* The layer's type must be set to XOSD_LAYER_TYPE_GPU
|
|
|
|
* (defined in xosd_hw.h) for this function to work properly.
|
|
|
|
* @param BankIndex indicates which GC bank to be worked on. Valid value
|
|
|
|
* range is from 0 to XOSD_GC_BANK_NUM - 1.
|
|
|
|
* @param TextData points to the text data to be loaded.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_LoadTextBank(XOsd *InstancePtr, u8 GcIndex, u8 BankIndex,
|
|
|
|
u32 TextData[])
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
2014-07-18 12:45:33 +05:30
|
|
|
u32 Index;
|
2014-06-24 16:45:01 +05:30
|
|
|
u32 RegValue;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
|
|
|
Xil_AssertVoid((u16)GcIndex < InstancePtr->Config.LayerNum);
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->Layers[GcIndex].LayerType ==
|
2014-07-18 12:45:33 +05:30
|
|
|
(XOSD_LAYER_TYPE_GPU));
|
|
|
|
Xil_AssertVoid(BankIndex < (XOSD_GC_BANK_NUM));
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(TextData != NULL);
|
|
|
|
|
|
|
|
/* Choose which bank to be loaded */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue = (((u32)BankIndex) + (XOSD_GCWBA_TXT0)) &
|
|
|
|
(XOSD_GCWBA_BANK_MASK);
|
|
|
|
RegValue |= (((u32)GcIndex) << (XOSD_GCWBA_GCNUM_SHIFT)) &
|
|
|
|
(XOSD_GCWBA_GCNUM_MASK);
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress, (XOSD_GCWBA_OFFSET),
|
|
|
|
RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Load text data */
|
2014-09-02 11:29:15 +05:30
|
|
|
for (Index = 0x0;
|
2014-07-18 12:45:33 +05:30
|
|
|
Index < (u32)((((u32)(InstancePtr->
|
|
|
|
Layers[GcIndex].TextNumStrings) *
|
|
|
|
(u32)(InstancePtr->Layers[GcIndex].TextMaxStringLength)) /
|
|
|
|
sizeof(u32)));
|
|
|
|
Index++) {
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress,
|
|
|
|
(XOSD_GCD_OFFSET), TextData[Index]);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/* Set the active text bank */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue = XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
(XOSD_GCABA_OFFSET));
|
2014-09-02 11:29:15 +05:30
|
|
|
RegValue &= ~(1 << ((XOSD_GCABA_TXT_SHIFT) + GcIndex));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue |= ((u32)BankIndex) << ((XOSD_GCABA_TXT_SHIFT) +
|
|
|
|
((u32)GcIndex));
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress, (XOSD_GCABA_OFFSET),
|
|
|
|
RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function chooses active banks for a GC in the OSD core.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param GcIndex indicates which Graphics Controller to work on.
|
|
|
|
* Valid value range is from 0 to (The Number of Layers) - 1.
|
|
|
|
* The layer's type must be set to XOSD_LAYER_TYPE_GPU
|
|
|
|
* (defined in xosd_hw.h) for this function to work properly.
|
|
|
|
* @param ColorBankIndex indicates the color LUT bank to be choose as
|
|
|
|
* active.
|
|
|
|
* @param CharBankIndex indicates the character set bank to be chosen as
|
|
|
|
* active.
|
|
|
|
* @param TextBankIndex indicates the text data bank to be chosen as
|
|
|
|
* active.
|
|
|
|
* @param InstructionBankIndex indicates the instruction bank to be
|
|
|
|
* chosen as active.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_SetActiveBank(XOsd *InstancePtr, u8 GcIndex, u8 ColorBankIndex,
|
|
|
|
u8 CharBankIndex, u8 TextBankIndex, u8 InstructionBankIndex)
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
|
|
|
u32 RegValue;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
|
|
|
Xil_AssertVoid((u16)GcIndex < InstancePtr->Config.LayerNum);
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->Layers[GcIndex].LayerType ==
|
2014-07-18 12:45:33 +05:30
|
|
|
(XOSD_LAYER_TYPE_GPU));
|
|
|
|
Xil_AssertVoid(ColorBankIndex < (XOSD_GC_BANK_NUM));
|
|
|
|
Xil_AssertVoid(CharBankIndex < (XOSD_GC_BANK_NUM));
|
|
|
|
Xil_AssertVoid(TextBankIndex < (XOSD_GC_BANK_NUM));
|
|
|
|
Xil_AssertVoid(InstructionBankIndex < (XOSD_GC_BANK_NUM));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Clear the current active bank setting first */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue = XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
(XOSD_GCABA_OFFSET));
|
2014-09-02 11:29:15 +05:30
|
|
|
RegValue &= ~(1 << GcIndex) & (XOSD_GCABA_INS_MASK);
|
|
|
|
RegValue &= ~(1 << ((XOSD_GCABA_COL_SHIFT) + (GcIndex))) &
|
2014-07-18 12:45:33 +05:30
|
|
|
(XOSD_GCABA_COL_MASK);
|
2014-09-02 11:29:15 +05:30
|
|
|
RegValue &= ~(1 << ((XOSD_GCABA_TXT_SHIFT) + (GcIndex))) &
|
2014-07-18 12:45:33 +05:30
|
|
|
(XOSD_GCABA_TXT_MASK);
|
2014-09-02 11:29:15 +05:30
|
|
|
RegValue &= ~(1 << ((XOSD_GCABA_CHR_SHIFT) + (GcIndex))) &
|
2014-07-18 12:45:33 +05:30
|
|
|
(XOSD_GCABA_CHR_MASK);
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Choose the active banks */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue |= (((u32)InstructionBankIndex) << ((u32)GcIndex)) &
|
|
|
|
(XOSD_GCABA_INS_MASK);
|
|
|
|
RegValue |= (((u32)ColorBankIndex) << ((XOSD_GCABA_COL_SHIFT) +
|
|
|
|
(GcIndex))) & (XOSD_GCABA_COL_MASK);
|
|
|
|
RegValue |= (((u32)TextBankIndex) << ((XOSD_GCABA_TXT_SHIFT) +
|
|
|
|
(GcIndex))) & (XOSD_GCABA_TXT_MASK);
|
|
|
|
RegValue |= (((u32)CharBankIndex) << ((XOSD_GCABA_CHR_SHIFT) +
|
|
|
|
(GcIndex))) & (XOSD_GCABA_CHR_MASK);
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress, XOSD_GCABA_OFFSET,
|
|
|
|
RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function creates an instruction for the OSD core.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param InstructionPtr is a pointer to the instruction buffer to be
|
|
|
|
* populated with the instruction to be created. The upper level
|
|
|
|
* application is responsible for allocating this instruction
|
|
|
|
* buffer.
|
|
|
|
* @param GcIndex indicates the Graphics Controller that will consume the
|
|
|
|
* instruction. Valid value range is from 0 to
|
|
|
|
* (The Number of Layers) - 1. The layer's type must be set to
|
|
|
|
* XOSD_LAYER_TYPE_GPU (defined in xosd_hw.h) for this function to
|
|
|
|
* work properly.
|
|
|
|
* @param ObjType indicates the type of object to draw. Use one of
|
|
|
|
* XOSD_INS_OPCODE_* constants defined in xosd_hw.h.
|
|
|
|
* @param ObjSize indicates line width of boxes and lines and the text
|
|
|
|
* scale factor for text boxes.
|
|
|
|
* @param XStart indicates the horizontal start pixel of the Object.
|
|
|
|
* @param YStart indicates the vertical start line of the Object.
|
|
|
|
* @param XEnd indicates the horizontal end pixel of the Object.
|
|
|
|
* @param YEnd indicates the vertical end line of the Object.
|
|
|
|
* @param TextIndex indicates the string index.
|
|
|
|
* @param ColorIndex indicates the color index.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_CreateInstruction(XOsd *InstancePtr, u32 InstructionPtr[],
|
|
|
|
u8 GcIndex, u16 ObjType, u8 ObjSize, u16 XStart, u16 YStart,
|
|
|
|
u16 XEnd, u16 YEnd, u8 TextIndex, u8 ColorIndex)
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
|
|
|
u32 Value;
|
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstructionPtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid((u16)GcIndex < InstancePtr->Config.LayerNum);
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->Layers[GcIndex].LayerType ==
|
2014-07-18 12:45:33 +05:30
|
|
|
(XOSD_LAYER_TYPE_GPU));
|
|
|
|
Xil_AssertVoid((ObjType == (XOSD_INS_OPCODE_END)) ||
|
|
|
|
(ObjType == (XOSD_INS_OPCODE_NOP)) ||
|
|
|
|
(ObjType == (XOSD_INS_OPCODE_BOXTXT)) ||
|
|
|
|
(ObjType == (XOSD_INS_OPCODE_LINE)) ||
|
|
|
|
(ObjType == (XOSD_INS_OPCODE_TXT)) ||
|
|
|
|
(ObjType == (XOSD_INS_OPCODE_BOX)));
|
|
|
|
Xil_AssertVoid((u32)XEnd < InstancePtr->ScreenWidth);
|
|
|
|
Xil_AssertVoid((u32)YEnd < InstancePtr->ScreenHeight);
|
|
|
|
Xil_AssertVoid(TextIndex <
|
|
|
|
InstancePtr->Layers[GcIndex].TextNumStrings);
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(ColorIndex < InstancePtr->Layers[GcIndex].ColorLutSize);
|
|
|
|
|
|
|
|
/* Clear the whole instruction first */
|
2014-07-18 12:45:33 +05:30
|
|
|
(void)memset((void *)InstructionPtr, 0, (XOSD_INS_SIZE) *
|
|
|
|
(sizeof(u32)));
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Populate instruction word 0 fields */
|
2014-07-18 12:45:33 +05:30
|
|
|
Value = ((u32)XStart) & (XOSD_INS0_XSTART_MASK);
|
|
|
|
Value |= (((u32)XEnd) << (XOSD_INS0_XEND_SHIFT)) &
|
|
|
|
(XOSD_INS0_XEND_MASK);
|
|
|
|
Value |= (((u32)GcIndex) << (XOSD_INS0_GCNUM_SHIFT)) &
|
|
|
|
(XOSD_INS0_GCNUM_MASK);
|
|
|
|
Value |= (((u32)ObjType) << (XOSD_INS0_OPCODE_SHIFT)) &
|
|
|
|
(XOSD_INS0_OPCODE_MASK);
|
2014-06-24 16:45:01 +05:30
|
|
|
InstructionPtr[XOSD_INS0] = Value;
|
|
|
|
|
|
|
|
/* Populate instruction word 1 fields */
|
2014-07-18 12:45:33 +05:30
|
|
|
Value = ((u32)TextIndex) & (XOSD_INS1_TXTINDEX_MASK);
|
2014-06-24 16:45:01 +05:30
|
|
|
InstructionPtr[XOSD_INS1] = Value;
|
|
|
|
|
|
|
|
/* Populate instruction word 2 fields */
|
2014-07-18 12:45:33 +05:30
|
|
|
Value = ((u32)YStart) & (XOSD_INS2_YSTART_MASK);
|
|
|
|
Value |= (((u32)YEnd) << (XOSD_INS2_YEND_SHIFT)) &
|
|
|
|
(XOSD_INS2_YEND_MASK);
|
|
|
|
Value |= (((u32)ObjSize) << (XOSD_INS2_OBJSIZE_SHIFT)) &
|
|
|
|
(XOSD_INS2_OBJSIZE_MASK);
|
2014-06-24 16:45:01 +05:30
|
|
|
InstructionPtr[XOSD_INS2] = Value;
|
|
|
|
|
|
|
|
/* Populate instruction word 3 fields */
|
2014-07-18 12:45:33 +05:30
|
|
|
Value = ((u32)ColorIndex) & (XOSD_INS3_COL_MASK);
|
2014-06-24 16:45:01 +05:30
|
|
|
InstructionPtr[XOSD_INS3] = Value;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function load an instruction list to be used by an Graphic Controller
|
|
|
|
* in the OSD core.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param GcIndex indicates which Graphics Controller to work on. Valid
|
|
|
|
* value range is from 0 to (The Number of Layers) - 1. The
|
|
|
|
* layer's type must be set to XOSD_LAYER_TYPE_GPU
|
|
|
|
* (defined in xosd_hw.h) for this function to work properly.
|
|
|
|
* @param BankIndex indicates which GC Bank to be worked on. Valid
|
|
|
|
* value range is from 0 to XOSD_GC_BANK_NUM.
|
|
|
|
* @param InstSetPtr is a pointer to the start of the instruction list
|
|
|
|
* to load into the OSD core. The last instruction in the list
|
|
|
|
* must has XOSD_INS_OPCODE_END type.
|
|
|
|
* @param InstNum indicates the number of the instructions in the list to
|
|
|
|
* load. Valid value range is from 1 to the half of the size of
|
|
|
|
* the instruction memory created for the Graphic Controller.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
void XOsd_LoadInstructionList(XOsd *InstancePtr, u8 GcIndex, u8 BankIndex,
|
|
|
|
u32 InstSetPtr[], u32 InstNum)
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
|
|
|
u32 RegValue;
|
2014-07-18 12:45:33 +05:30
|
|
|
u32 Index;
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
2014-07-18 12:45:33 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY));
|
|
|
|
Xil_AssertVoid((u16)GcIndex < InstancePtr->Config.LayerNum);
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr->Layers[GcIndex].LayerType ==
|
2014-07-18 12:45:33 +05:30
|
|
|
(XOSD_LAYER_TYPE_GPU));
|
|
|
|
Xil_AssertVoid(BankIndex < (XOSD_GC_BANK_NUM));
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstSetPtr != NULL);
|
|
|
|
Xil_AssertVoid(InstNum <= InstancePtr->Layers[GcIndex].InstructionNum);
|
|
|
|
|
|
|
|
/* Choose which bank to be loaded */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue = (((u32)BankIndex) + (XOSD_GCWBA_INS0)) &
|
|
|
|
(XOSD_GCWBA_BANK_MASK);
|
|
|
|
RegValue |= (((u32)GcIndex) << (XOSD_GCWBA_GCNUM_SHIFT)) &
|
|
|
|
(XOSD_GCWBA_GCNUM_MASK);
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress, (XOSD_GCWBA_OFFSET),
|
|
|
|
RegValue);
|
2014-09-02 11:29:15 +05:30
|
|
|
for (Index = 0; Index < (InstNum * (XOSD_INS_SIZE)); Index++) {
|
2014-07-18 12:45:33 +05:30
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress,
|
|
|
|
(XOSD_GCD_OFFSET), InstSetPtr[Index]);
|
|
|
|
}
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Notify OSD this is the end of the instruction list by adding an END
|
2014-06-24 16:45:01 +05:30
|
|
|
* instruction
|
|
|
|
*/
|
2014-07-18 12:45:33 +05:30
|
|
|
if (InstNum < InstancePtr->Layers[GcIndex].InstructionNum) {
|
2014-09-02 11:29:15 +05:30
|
|
|
for (Index = 0x0; Index < (XOSD_INS_SIZE); Index++) {
|
2014-07-18 12:45:33 +05:30
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress,
|
2014-09-02 11:29:15 +05:30
|
|
|
(XOSD_GCD_OFFSET), 0x0);
|
2014-07-18 12:45:33 +05:30
|
|
|
}
|
|
|
|
}
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Set the active instruction bank */
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue = XOsd_ReadReg(InstancePtr->Config.BaseAddress,
|
|
|
|
(XOSD_GCABA_OFFSET));
|
2014-09-02 11:29:15 +05:30
|
|
|
RegValue &= ~(1 << GcIndex);
|
2014-07-18 12:45:33 +05:30
|
|
|
RegValue |= ((u32)BankIndex << (u32)GcIndex);
|
|
|
|
XOsd_WriteReg(InstancePtr->Config.BaseAddress,
|
|
|
|
(XOSD_GCABA_OFFSET), RegValue);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/*
|
2014-07-18 12:45:33 +05:30
|
|
|
*
|
|
|
|
* This function populates the layer array in the XOsd instance with
|
|
|
|
* the properties of all layers. This is to help fetch the information faster
|
|
|
|
* later.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
* @param CfgPtr is a to the configuration structure associated with
|
|
|
|
* the OSD core.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
static void PopulateLayerProperty(XOsd *InstancePtr, XOsd_Config *CfgPtr)
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
2014-07-18 12:45:33 +05:30
|
|
|
XOsd *IpTemp = NULL;
|
|
|
|
XOsd_Config *Cfg = NULL;
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
|
|
Xil_AssertVoid(CfgPtr != NULL);
|
|
|
|
|
|
|
|
/* Use short variable names to keep the lines in this function
|
|
|
|
* shorter
|
|
|
|
*/
|
2014-07-18 12:45:33 +05:30
|
|
|
IpTemp = InstancePtr;
|
2014-06-24 16:45:01 +05:30
|
|
|
Cfg = CfgPtr;
|
|
|
|
|
|
|
|
/* Layer #0 */
|
2014-07-18 12:45:33 +05:30
|
|
|
IpTemp->Layers[0].LayerType = Cfg->Layer0Type;
|
|
|
|
IpTemp->Layers[0].InstructionNum = Cfg->Layer0InstructionMemSize;
|
|
|
|
IpTemp->Layers[0].InstructionBoxEnable = Cfg->Layer0InstructionBoxEnable;
|
|
|
|
IpTemp->Layers[0].InstructionLineEnable = Cfg->Layer0InstructionLineEnable;
|
|
|
|
IpTemp->Layers[0].InstructionTextEnable = Cfg->Layer0InstructionTextEnable;
|
|
|
|
IpTemp->Layers[0].ColorLutSize = Cfg->Layer0ColorLutSize;
|
|
|
|
IpTemp->Layers[0].ColorLutMemoryType = Cfg->Layer0ColorLutMemoryType;
|
|
|
|
IpTemp->Layers[0].FontNumChars = Cfg->Layer0FontNumChars;
|
|
|
|
IpTemp->Layers[0].FontWidth = Cfg->Layer0FontWidth;
|
|
|
|
IpTemp->Layers[0].FontHeight = Cfg->Layer0FontHeight;
|
|
|
|
IpTemp->Layers[0].FontBitsPerPixel = Cfg->Layer0FontBitsPerPixel;
|
|
|
|
IpTemp->Layers[0].FontAsciiOffset = Cfg->Layer0FontAsciiOffset;
|
|
|
|
IpTemp->Layers[0].TextNumStrings = Cfg->Layer0TextNumStrings;
|
|
|
|
IpTemp->Layers[0].TextMaxStringLength = Cfg->Layer0TextMaxStringLength;
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Layer #1 */
|
2014-07-18 12:45:33 +05:30
|
|
|
IpTemp->Layers[1].LayerType = Cfg->Layer1Type;
|
|
|
|
IpTemp->Layers[1].InstructionNum = Cfg->Layer1InstructionMemSize;
|
|
|
|
IpTemp->Layers[1].InstructionBoxEnable = Cfg->Layer1InstructionBoxEnable;
|
|
|
|
IpTemp->Layers[1].InstructionLineEnable = Cfg->Layer1InstructionLineEnable;
|
|
|
|
IpTemp->Layers[1].InstructionTextEnable = Cfg->Layer1InstructionTextEnable;
|
|
|
|
IpTemp->Layers[1].ColorLutSize = Cfg->Layer1ColorLutSize;
|
|
|
|
IpTemp->Layers[1].ColorLutMemoryType = Cfg->Layer1ColorLutMemoryType;
|
|
|
|
IpTemp->Layers[1].FontNumChars = Cfg->Layer1FontNumChars;
|
|
|
|
IpTemp->Layers[1].FontWidth = Cfg->Layer1FontWidth;
|
|
|
|
IpTemp->Layers[1].FontHeight = Cfg->Layer1FontHeight;
|
|
|
|
IpTemp->Layers[1].FontBitsPerPixel = Cfg->Layer1FontBitsPerPixel;
|
|
|
|
IpTemp->Layers[1].FontAsciiOffset = Cfg->Layer1FontAsciiOffset;
|
|
|
|
IpTemp->Layers[1].TextNumStrings = Cfg->Layer1TextNumStrings;
|
|
|
|
IpTemp->Layers[1].TextMaxStringLength = Cfg->Layer1TextMaxStringLength;
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Layer #2 */
|
2014-07-18 12:45:33 +05:30
|
|
|
IpTemp->Layers[2].LayerType = Cfg->Layer2Type;
|
|
|
|
IpTemp->Layers[2].InstructionNum = Cfg->Layer2InstructionMemSize;
|
|
|
|
IpTemp->Layers[2].InstructionBoxEnable = Cfg->Layer2InstructionBoxEnable;
|
|
|
|
IpTemp->Layers[2].InstructionLineEnable = Cfg->Layer2InstructionLineEnable;
|
|
|
|
IpTemp->Layers[2].InstructionTextEnable = Cfg->Layer2InstructionTextEnable;
|
|
|
|
IpTemp->Layers[2].ColorLutSize = Cfg->Layer2ColorLutSize;
|
|
|
|
IpTemp->Layers[2].ColorLutMemoryType = Cfg->Layer2ColorLutMemoryType;
|
|
|
|
IpTemp->Layers[2].FontNumChars = Cfg->Layer2FontNumChars;
|
|
|
|
IpTemp->Layers[2].FontWidth = Cfg->Layer2FontWidth;
|
|
|
|
IpTemp->Layers[2].FontHeight = Cfg->Layer2FontHeight;
|
|
|
|
IpTemp->Layers[2].FontBitsPerPixel = Cfg->Layer2FontBitsPerPixel;
|
|
|
|
IpTemp->Layers[2].FontAsciiOffset = Cfg->Layer2FontAsciiOffset;
|
|
|
|
IpTemp->Layers[2].TextNumStrings = Cfg->Layer2TextNumStrings;
|
|
|
|
IpTemp->Layers[2].TextMaxStringLength = Cfg->Layer2TextMaxStringLength;
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Layer #3 */
|
2014-07-18 12:45:33 +05:30
|
|
|
IpTemp->Layers[3].LayerType = Cfg->Layer3Type;
|
|
|
|
IpTemp->Layers[3].InstructionNum = Cfg->Layer3InstructionMemSize;
|
|
|
|
IpTemp->Layers[3].InstructionBoxEnable = Cfg->Layer3InstructionBoxEnable;
|
|
|
|
IpTemp->Layers[3].InstructionLineEnable = Cfg->Layer3InstructionLineEnable;
|
|
|
|
IpTemp->Layers[3].InstructionTextEnable = Cfg->Layer3InstructionTextEnable;
|
|
|
|
IpTemp->Layers[3].ColorLutSize = Cfg->Layer3ColorLutSize;
|
|
|
|
IpTemp->Layers[3].ColorLutMemoryType = Cfg->Layer3ColorLutMemoryType;
|
|
|
|
IpTemp->Layers[3].FontNumChars = Cfg->Layer3FontNumChars;
|
|
|
|
IpTemp->Layers[3].FontWidth = Cfg->Layer3FontWidth;
|
|
|
|
IpTemp->Layers[3].FontHeight = Cfg->Layer3FontHeight;
|
|
|
|
IpTemp->Layers[3].FontBitsPerPixel = Cfg->Layer3FontBitsPerPixel;
|
|
|
|
IpTemp->Layers[3].FontAsciiOffset = Cfg->Layer3FontAsciiOffset;
|
|
|
|
IpTemp->Layers[3].TextNumStrings = Cfg->Layer3TextNumStrings;
|
|
|
|
IpTemp->Layers[3].TextMaxStringLength = Cfg->Layer3TextMaxStringLength;
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Layer #4 */
|
2014-07-18 12:45:33 +05:30
|
|
|
IpTemp->Layers[4].LayerType = Cfg->Layer4Type;
|
|
|
|
IpTemp->Layers[4].InstructionNum = Cfg->Layer4InstructionMemSize;
|
|
|
|
IpTemp->Layers[4].InstructionBoxEnable = Cfg->Layer4InstructionBoxEnable;
|
|
|
|
IpTemp->Layers[4].InstructionLineEnable = Cfg->Layer4InstructionLineEnable;
|
|
|
|
IpTemp->Layers[4].InstructionTextEnable = Cfg->Layer4InstructionTextEnable;
|
|
|
|
IpTemp->Layers[4].ColorLutSize = Cfg->Layer4ColorLutSize;
|
|
|
|
IpTemp->Layers[4].ColorLutMemoryType = Cfg->Layer4ColorLutMemoryType;
|
|
|
|
IpTemp->Layers[4].FontNumChars = Cfg->Layer4FontNumChars;
|
|
|
|
IpTemp->Layers[4].FontWidth = Cfg->Layer4FontWidth;
|
|
|
|
IpTemp->Layers[4].FontHeight = Cfg->Layer4FontHeight;
|
|
|
|
IpTemp->Layers[4].FontBitsPerPixel = Cfg->Layer4FontBitsPerPixel;
|
|
|
|
IpTemp->Layers[4].FontAsciiOffset = Cfg->Layer4FontAsciiOffset;
|
|
|
|
IpTemp->Layers[4].TextNumStrings = Cfg->Layer4TextNumStrings;
|
|
|
|
IpTemp->Layers[4].TextMaxStringLength = Cfg->Layer4TextMaxStringLength;
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Layer #5 */
|
2014-07-18 12:45:33 +05:30
|
|
|
IpTemp->Layers[5].LayerType = Cfg->Layer5Type;
|
|
|
|
IpTemp->Layers[5].InstructionNum = Cfg->Layer5InstructionMemSize;
|
|
|
|
IpTemp->Layers[5].InstructionBoxEnable = Cfg->Layer5InstructionBoxEnable;
|
|
|
|
IpTemp->Layers[5].InstructionLineEnable = Cfg->Layer5InstructionLineEnable;
|
|
|
|
IpTemp->Layers[5].InstructionTextEnable = Cfg->Layer5InstructionTextEnable;
|
|
|
|
IpTemp->Layers[5].ColorLutSize = Cfg->Layer5ColorLutSize;
|
|
|
|
IpTemp->Layers[5].ColorLutMemoryType = Cfg->Layer5ColorLutMemoryType;
|
|
|
|
IpTemp->Layers[5].FontNumChars = Cfg->Layer5FontNumChars;
|
|
|
|
IpTemp->Layers[5].FontWidth = Cfg->Layer5FontWidth;
|
|
|
|
IpTemp->Layers[5].FontHeight = Cfg->Layer5FontHeight;
|
|
|
|
IpTemp->Layers[5].FontBitsPerPixel = Cfg->Layer5FontBitsPerPixel;
|
|
|
|
IpTemp->Layers[5].FontAsciiOffset = Cfg->Layer5FontAsciiOffset;
|
|
|
|
IpTemp->Layers[5].TextNumStrings = Cfg->Layer5TextNumStrings;
|
|
|
|
IpTemp->Layers[5].TextMaxStringLength = Cfg->Layer5TextMaxStringLength;
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Layer #6 */
|
2014-07-18 12:45:33 +05:30
|
|
|
IpTemp->Layers[6].LayerType = Cfg->Layer6Type;
|
|
|
|
IpTemp->Layers[6].InstructionNum = Cfg->Layer6InstructionMemSize;
|
|
|
|
IpTemp->Layers[6].InstructionBoxEnable = Cfg->Layer6InstructionBoxEnable;
|
|
|
|
IpTemp->Layers[6].InstructionLineEnable = Cfg->Layer6InstructionLineEnable;
|
|
|
|
IpTemp->Layers[6].InstructionTextEnable = Cfg->Layer6InstructionTextEnable;
|
|
|
|
IpTemp->Layers[6].ColorLutSize = Cfg->Layer6ColorLutSize;
|
|
|
|
IpTemp->Layers[6].ColorLutMemoryType = Cfg->Layer6ColorLutMemoryType;
|
|
|
|
IpTemp->Layers[6].FontNumChars = Cfg->Layer6FontNumChars;
|
|
|
|
IpTemp->Layers[6].FontWidth = Cfg->Layer6FontWidth;
|
|
|
|
IpTemp->Layers[6].FontHeight = Cfg->Layer6FontHeight;
|
|
|
|
IpTemp->Layers[6].FontBitsPerPixel = Cfg->Layer6FontBitsPerPixel;
|
|
|
|
IpTemp->Layers[6].FontAsciiOffset = Cfg->Layer6FontAsciiOffset;
|
|
|
|
IpTemp->Layers[6].TextNumStrings = Cfg->Layer6TextNumStrings;
|
|
|
|
IpTemp->Layers[6].TextMaxStringLength = Cfg->Layer6TextMaxStringLength;
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Layer #7 */
|
2014-07-18 12:45:33 +05:30
|
|
|
IpTemp->Layers[7].LayerType = Cfg->Layer7Type;
|
|
|
|
IpTemp->Layers[7].InstructionNum = Cfg->Layer7InstructionMemSize;
|
|
|
|
IpTemp->Layers[7].InstructionBoxEnable = Cfg->Layer7InstructionBoxEnable;
|
|
|
|
IpTemp->Layers[7].InstructionLineEnable = Cfg->Layer7InstructionLineEnable;
|
|
|
|
IpTemp->Layers[7].InstructionTextEnable = Cfg->Layer7InstructionTextEnable;
|
|
|
|
IpTemp->Layers[7].ColorLutSize = Cfg->Layer7ColorLutSize;
|
|
|
|
IpTemp->Layers[7].ColorLutMemoryType = Cfg->Layer7ColorLutMemoryType;
|
|
|
|
IpTemp->Layers[7].FontNumChars = Cfg->Layer7FontNumChars;
|
|
|
|
IpTemp->Layers[7].FontWidth = Cfg->Layer7FontWidth;
|
|
|
|
IpTemp->Layers[7].FontHeight = Cfg->Layer7FontHeight;
|
|
|
|
IpTemp->Layers[7].FontBitsPerPixel = Cfg->Layer7FontBitsPerPixel;
|
|
|
|
IpTemp->Layers[7].FontAsciiOffset = Cfg->Layer7FontAsciiOffset;
|
|
|
|
IpTemp->Layers[7].TextNumStrings = Cfg->Layer7TextNumStrings;
|
|
|
|
IpTemp->Layers[7].TextMaxStringLength = Cfg->Layer7TextMaxStringLength;
|
2014-06-24 16:45:01 +05:30
|
|
|
|
|
|
|
/* Convert instruction memory sizes into the maximum numbers of
|
|
|
|
* instructions supported
|
|
|
|
*/
|
2014-07-18 12:45:33 +05:30
|
|
|
IpTemp->Layers[0].InstructionNum /= (XOSD_INS_MEM_SIZE_TO_NUM);
|
|
|
|
IpTemp->Layers[1].InstructionNum /= (XOSD_INS_MEM_SIZE_TO_NUM);
|
|
|
|
IpTemp->Layers[2].InstructionNum /= (XOSD_INS_MEM_SIZE_TO_NUM);
|
|
|
|
IpTemp->Layers[3].InstructionNum /= (XOSD_INS_MEM_SIZE_TO_NUM);
|
|
|
|
IpTemp->Layers[4].InstructionNum /= (XOSD_INS_MEM_SIZE_TO_NUM);
|
|
|
|
IpTemp->Layers[5].InstructionNum /= (XOSD_INS_MEM_SIZE_TO_NUM);
|
|
|
|
IpTemp->Layers[6].InstructionNum /= (XOSD_INS_MEM_SIZE_TO_NUM);
|
|
|
|
IpTemp->Layers[7].InstructionNum /= (XOSD_INS_MEM_SIZE_TO_NUM);
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
|
|
|
*
|
2014-07-18 12:45:33 +05:30
|
|
|
* This function returns the Version of the OSD core.
|
|
|
|
*
|
|
|
|
* @param InstancePtr is a pointer to the XOsd instance to be worked on.
|
|
|
|
*
|
|
|
|
* @return Contents of the Version register.
|
|
|
|
*
|
|
|
|
* @note None.
|
2014-06-24 16:45:01 +05:30
|
|
|
*
|
|
|
|
******************************************************************************/
|
2014-07-18 12:45:33 +05:30
|
|
|
u32 XOsd_GetVersion(XOsd *InstancePtr)
|
2014-06-24 16:45:01 +05:30
|
|
|
{
|
2014-07-18 12:45:33 +05:30
|
|
|
u32 Data;
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Verify arguments. */
|
|
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
/* Read core version */
|
|
|
|
Data = XOsd_ReadReg(InstancePtr->Config.BaseAddress, XOSD_VER_OFFSET);
|
2014-06-24 16:45:01 +05:30
|
|
|
|
2014-07-18 12:45:33 +05:30
|
|
|
return Data;
|
2014-06-24 16:45:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
2014-07-18 12:45:33 +05:30
|
|
|
/**
|
|
|
|
*
|
|
|
|
* This function is a stub for the asynchronous callbacks. The stub is here in
|
|
|
|
* case the upper layer forgot to set the handlers. On initialization, All
|
|
|
|
* handlers except error handler are set to this callback. It is considered an
|
|
|
|
* error for this handler to be invoked.
|
|
|
|
*
|
|
|
|
* @param CallBackRef is a callback reference passed in by the upper
|
|
|
|
* layer when setting the callback functions and passed back
|
|
|
|
* to the upper layer when the callback is invoked.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
2014-06-24 16:45:01 +05:30
|
|
|
static void StubCallBack(void *CallBackRef)
|
|
|
|
{
|
2014-07-18 12:45:33 +05:30
|
|
|
(void)CallBackRef;
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoidAlways();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
2014-07-18 12:45:33 +05:30
|
|
|
/**
|
|
|
|
*
|
|
|
|
* This routine is a stub for the asynchronous error interrupt callback. The
|
|
|
|
* stub is here in case the upper layer forgot to set the handler. On
|
|
|
|
* initialization, error interrupt handler is set to this callback. It is
|
|
|
|
* considered an error for this handler to be invoked.
|
|
|
|
*
|
|
|
|
* @param CallBackRef is a callback reference passed in by the upper
|
|
|
|
* layer when setting the callback functions and passed back
|
|
|
|
* to the upper layer when the callback is invoked.
|
|
|
|
* @param ErrorMask is a bit mask indicating the cause of the error. Its
|
|
|
|
* value equals 'OR'ing one or more XOSD_IXR_* values defined
|
|
|
|
* in xosd_hw.h.
|
|
|
|
*
|
|
|
|
* @return None.
|
|
|
|
*
|
|
|
|
* @note None.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
2014-06-24 16:45:01 +05:30
|
|
|
static void StubErrCallBack(void *CallBackRef, u32 ErrorMask)
|
|
|
|
{
|
2014-07-18 12:45:33 +05:30
|
|
|
(void)CallBackRef;
|
|
|
|
(void)ErrorMask;
|
2014-06-24 16:45:01 +05:30
|
|
|
Xil_AssertVoidAlways();
|
|
|
|
}
|