From 6eb74b2a31c358dca4b145a883ad1c41110c31fd Mon Sep 17 00:00:00 2001 From: Rohit Consul Date: Thu, 16 Jul 2015 17:04:59 -0700 Subject: [PATCH] v_letterbox: Updated driver to align with hip flow This patch supports HIP based video processing subsystem by reorganizing the HLS generated code to align with xilinx driver guidelines. Signed-off-by: Rohit Consul Reviewed-by: Andrei Simion --- .../drivers/v_letterbox/data/v_letterbox.mdd | 0 .../drivers/v_letterbox/data/v_letterbox.tcl | 61 +++++++++---- .../drivers/v_letterbox/src/xv_letterbox.c | 89 ++++++++++--------- .../drivers/v_letterbox/src/xv_letterbox.h | 12 +-- .../drivers/v_letterbox/src/xv_letterbox_g.c | 60 +++++++++++++ .../drivers/v_letterbox/src/xv_letterbox_l2.c | 5 +- .../drivers/v_letterbox/src/xv_letterbox_l2.h | 3 +- .../v_letterbox/src/xv_letterbox_linux.c | 18 ++-- .../v_letterbox/src/xv_letterbox_sinit.c | 40 +++++---- 9 files changed, 195 insertions(+), 93 deletions(-) mode change 100644 => 100755 XilinxProcessorIPLib/drivers/v_letterbox/data/v_letterbox.mdd mode change 100644 => 100755 XilinxProcessorIPLib/drivers/v_letterbox/data/v_letterbox.tcl create mode 100644 XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_g.c diff --git a/XilinxProcessorIPLib/drivers/v_letterbox/data/v_letterbox.mdd b/XilinxProcessorIPLib/drivers/v_letterbox/data/v_letterbox.mdd old mode 100644 new mode 100755 diff --git a/XilinxProcessorIPLib/drivers/v_letterbox/data/v_letterbox.tcl b/XilinxProcessorIPLib/drivers/v_letterbox/data/v_letterbox.tcl old mode 100644 new mode 100755 index d4857db2..821b215c --- a/XilinxProcessorIPLib/drivers/v_letterbox/data/v_letterbox.tcl +++ b/XilinxProcessorIPLib/drivers/v_letterbox/data/v_letterbox.tcl @@ -1,9 +1,33 @@ -# ============================================================== -# File generated by Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC -# Version: 2015.1 -# Copyright (C) 2015 Xilinx Inc. All rights reserved. +############################################################################## # -# ============================================================== +# Copyright (C) 2015 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 +# XILINX 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. +############################################################################### proc generate {drv_handle} { xdefine_include_file $drv_handle "xparameters.h" "XV_letterbox" \ @@ -11,26 +35,29 @@ proc generate {drv_handle} { "DEVICE_ID" \ "C_S_AXI_CTRL_BASEADDR" \ "C_S_AXI_CTRL_HIGHADDR" \ - "SAMPLES_PER_CLOCK" \ - "MAX_COLS" \ - "MAX_ROWS" \ - "MAX_DATA_WIDTH" + "SAMPLES_PER_CLOCK" \ + "NUM_VIDEO_COMPONENTS" \ + "MAX_COLS" \ + "MAX_ROWS" \ + "MAX_DATA_WIDTH" xdefine_config_file $drv_handle "xv_letterbox_g.c" "XV_letterbox" \ "DEVICE_ID" \ "C_S_AXI_CTRL_BASEADDR" \ - "SAMPLES_PER_CLOCK" \ - "MAX_COLS" \ - "MAX_ROWS" \ - "MAX_DATA_WIDTH" + "SAMPLES_PER_CLOCK" \ + "NUM_VIDEO_COMPONENTS" \ + "MAX_COLS" \ + "MAX_ROWS" \ + "MAX_DATA_WIDTH" xdefine_canonical_xpars $drv_handle "xparameters.h" "XV_letterbox" \ "DEVICE_ID" \ "C_S_AXI_CTRL_BASEADDR" \ "C_S_AXI_CTRL_HIGHADDR" \ - "SAMPLES_PER_CLOCK" \ - "MAX_COLS" \ - "MAX_ROWS" \ - "MAX_DATA_WIDTH" + "SAMPLES_PER_CLOCK" \ + "NUM_VIDEO_COMPONENTS" \ + "MAX_COLS" \ + "MAX_ROWS" \ + "MAX_DATA_WIDTH" } diff --git a/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox.c b/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox.c index 78cd5ad6..294fee46 100644 --- a/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox.c +++ b/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox.c @@ -11,16 +11,21 @@ /************************** Function Implementation *************************/ #ifndef __linux__ -int XV_letterbox_CfgInitialize(XV_letterbox *InstancePtr, XV_letterbox_Config *ConfigPtr) { +int XV_letterbox_CfgInitialize(XV_letterbox *InstancePtr, + XV_letterbox_Config *ConfigPtr, + u32 EffectiveAddr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(ConfigPtr != NULL); + Xil_AssertNonvoid(EffectiveAddr != (u32)0x0); - /* Setup the instance */ - (void)memset((void *)InstancePtr, 0, sizeof(XV_letterbox)); - (void)memcpy((void *)&(InstancePtr->Config), (const void *)ConfigPtr, - sizeof(XV_letterbox_Config)); + /* Setup the instance */ + (void)memset((void *)InstancePtr, 0, sizeof(XV_letterbox)); + (void)memcpy((void *)&(InstancePtr->Config), (const void *)ConfigPtr, + sizeof(XV_letterbox_Config)); - InstancePtr->Ctrl_BaseAddress = ConfigPtr->Ctrl_BaseAddress; + InstancePtr->Config.BaseAddress = EffectiveAddr; + + /* Set the flag to indicate the driver is ready */ InstancePtr->IsReady = XIL_COMPONENT_IS_READY; return XST_SUCCESS; @@ -33,8 +38,8 @@ void XV_letterbox_Start(XV_letterbox *InstancePtr) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Data = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL) & 0x80; - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL, Data | 0x01); + Data = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL) & 0x80; + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL, Data | 0x01); } u32 XV_letterbox_IsDone(XV_letterbox *InstancePtr) { @@ -43,7 +48,7 @@ u32 XV_letterbox_IsDone(XV_letterbox *InstancePtr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Data = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL); + Data = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL); return (Data >> 1) & 0x1; } @@ -53,7 +58,7 @@ u32 XV_letterbox_IsIdle(XV_letterbox *InstancePtr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Data = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL); + Data = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL); return (Data >> 2) & 0x1; } @@ -63,7 +68,7 @@ u32 XV_letterbox_IsReady(XV_letterbox *InstancePtr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Data = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL); + Data = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL); // check ap_start to see if the pcore is ready for next input return !(Data & 0x1); } @@ -72,21 +77,21 @@ void XV_letterbox_EnableAutoRestart(XV_letterbox *InstancePtr) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL, 0x80); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL, 0x80); } void XV_letterbox_DisableAutoRestart(XV_letterbox *InstancePtr) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL, 0); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL, 0); } void XV_letterbox_Set_HwReg_width(XV_letterbox *InstancePtr, u32 Data) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_WIDTH_DATA, Data); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_WIDTH_DATA, Data); } u32 XV_letterbox_Get_HwReg_width(XV_letterbox *InstancePtr) { @@ -95,7 +100,7 @@ u32 XV_letterbox_Get_HwReg_width(XV_letterbox *InstancePtr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Data = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_WIDTH_DATA); + Data = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_WIDTH_DATA); return Data; } @@ -103,7 +108,7 @@ void XV_letterbox_Set_HwReg_height(XV_letterbox *InstancePtr, u32 Data) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_HEIGHT_DATA, Data); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_HEIGHT_DATA, Data); } u32 XV_letterbox_Get_HwReg_height(XV_letterbox *InstancePtr) { @@ -112,7 +117,7 @@ u32 XV_letterbox_Get_HwReg_height(XV_letterbox *InstancePtr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Data = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_HEIGHT_DATA); + Data = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_HEIGHT_DATA); return Data; } @@ -120,7 +125,7 @@ void XV_letterbox_Set_HwReg_video_format(XV_letterbox *InstancePtr, u32 Data) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_VIDEO_FORMAT_DATA, Data); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_VIDEO_FORMAT_DATA, Data); } u32 XV_letterbox_Get_HwReg_video_format(XV_letterbox *InstancePtr) { @@ -129,7 +134,7 @@ u32 XV_letterbox_Get_HwReg_video_format(XV_letterbox *InstancePtr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Data = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_VIDEO_FORMAT_DATA); + Data = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_VIDEO_FORMAT_DATA); return Data; } @@ -137,7 +142,7 @@ void XV_letterbox_Set_HwReg_col_start(XV_letterbox *InstancePtr, u32 Data) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_COL_START_DATA, Data); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_COL_START_DATA, Data); } u32 XV_letterbox_Get_HwReg_col_start(XV_letterbox *InstancePtr) { @@ -146,7 +151,7 @@ u32 XV_letterbox_Get_HwReg_col_start(XV_letterbox *InstancePtr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Data = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_COL_START_DATA); + Data = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_COL_START_DATA); return Data; } @@ -154,7 +159,7 @@ void XV_letterbox_Set_HwReg_col_end(XV_letterbox *InstancePtr, u32 Data) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_COL_END_DATA, Data); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_COL_END_DATA, Data); } u32 XV_letterbox_Get_HwReg_col_end(XV_letterbox *InstancePtr) { @@ -163,7 +168,7 @@ u32 XV_letterbox_Get_HwReg_col_end(XV_letterbox *InstancePtr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Data = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_COL_END_DATA); + Data = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_COL_END_DATA); return Data; } @@ -171,7 +176,7 @@ void XV_letterbox_Set_HwReg_row_start(XV_letterbox *InstancePtr, u32 Data) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_ROW_START_DATA, Data); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_ROW_START_DATA, Data); } u32 XV_letterbox_Get_HwReg_row_start(XV_letterbox *InstancePtr) { @@ -180,7 +185,7 @@ u32 XV_letterbox_Get_HwReg_row_start(XV_letterbox *InstancePtr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Data = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_ROW_START_DATA); + Data = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_ROW_START_DATA); return Data; } @@ -188,7 +193,7 @@ void XV_letterbox_Set_HwReg_row_end(XV_letterbox *InstancePtr, u32 Data) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_ROW_END_DATA, Data); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_ROW_END_DATA, Data); } u32 XV_letterbox_Get_HwReg_row_end(XV_letterbox *InstancePtr) { @@ -197,7 +202,7 @@ u32 XV_letterbox_Get_HwReg_row_end(XV_letterbox *InstancePtr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Data = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_ROW_END_DATA); + Data = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_ROW_END_DATA); return Data; } @@ -205,7 +210,7 @@ void XV_letterbox_Set_HwReg_Y_R_value(XV_letterbox *InstancePtr, u32 Data) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_Y_R_VALUE_DATA, Data); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_Y_R_VALUE_DATA, Data); } u32 XV_letterbox_Get_HwReg_Y_R_value(XV_letterbox *InstancePtr) { @@ -214,7 +219,7 @@ u32 XV_letterbox_Get_HwReg_Y_R_value(XV_letterbox *InstancePtr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Data = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_Y_R_VALUE_DATA); + Data = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_Y_R_VALUE_DATA); return Data; } @@ -222,7 +227,7 @@ void XV_letterbox_Set_HwReg_Cb_G_value(XV_letterbox *InstancePtr, u32 Data) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_CB_G_VALUE_DATA, Data); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_CB_G_VALUE_DATA, Data); } u32 XV_letterbox_Get_HwReg_Cb_G_value(XV_letterbox *InstancePtr) { @@ -231,7 +236,7 @@ u32 XV_letterbox_Get_HwReg_Cb_G_value(XV_letterbox *InstancePtr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Data = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_CB_G_VALUE_DATA); + Data = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_CB_G_VALUE_DATA); return Data; } @@ -239,7 +244,7 @@ void XV_letterbox_Set_HwReg_Cr_B_value(XV_letterbox *InstancePtr, u32 Data) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_CR_B_VALUE_DATA, Data); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_CR_B_VALUE_DATA, Data); } u32 XV_letterbox_Get_HwReg_Cr_B_value(XV_letterbox *InstancePtr) { @@ -248,7 +253,7 @@ u32 XV_letterbox_Get_HwReg_Cr_B_value(XV_letterbox *InstancePtr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Data = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_CR_B_VALUE_DATA); + Data = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_HWREG_CR_B_VALUE_DATA); return Data; } @@ -256,14 +261,14 @@ void XV_letterbox_InterruptGlobalEnable(XV_letterbox *InstancePtr) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_GIE, 1); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_GIE, 1); } void XV_letterbox_InterruptGlobalDisable(XV_letterbox *InstancePtr) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_GIE, 0); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_GIE, 0); } void XV_letterbox_InterruptEnable(XV_letterbox *InstancePtr, u32 Mask) { @@ -272,8 +277,8 @@ void XV_letterbox_InterruptEnable(XV_letterbox *InstancePtr, u32 Mask) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Register = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_IER); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_IER, Register | Mask); + Register = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_IER); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_IER, Register | Mask); } void XV_letterbox_InterruptDisable(XV_letterbox *InstancePtr, u32 Mask) { @@ -282,27 +287,27 @@ void XV_letterbox_InterruptDisable(XV_letterbox *InstancePtr, u32 Mask) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - Register = XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_IER); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_IER, Register & (~Mask)); + Register = XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_IER); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_IER, Register & (~Mask)); } void XV_letterbox_InterruptClear(XV_letterbox *InstancePtr, u32 Mask) { Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - XV_letterbox_WriteReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_ISR, Mask); + XV_letterbox_WriteReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_ISR, Mask); } u32 XV_letterbox_InterruptGetEnabled(XV_letterbox *InstancePtr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - return XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_IER); + return XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_IER); } u32 XV_letterbox_InterruptGetStatus(XV_letterbox *InstancePtr) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - return XV_letterbox_ReadReg(InstancePtr->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_ISR); + return XV_letterbox_ReadReg(InstancePtr->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_ISR); } diff --git a/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox.h b/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox.h index c5afcd47..5b8cd300 100644 --- a/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox.h +++ b/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox.h @@ -44,11 +44,12 @@ typedef uint32_t u32; */ typedef struct { u16 DeviceId; /**< Unique ID of device */ - u32 Ctrl_BaseAddress; /**< The base address of the core instance. */ - int PixPerClk; /**< Samples Per Clock supported by core instance */ + u32 BaseAddress; /**< The base address of the core instance. */ + u16 PixPerClk; /**< Samples Per Clock supported by core instance */ + u16 NumVidComponents; /**< Number of Video Components */ u16 MaxWidth; /**< Maximum columns supported by core instance */ u16 MaxHeight; /**< Maximum rows supported by core instance */ - int MaxDataWidth; /**< Maximum Data width of each channel */ + u16 MaxDataWidth; /**< Maximum Data width of each channel */ } XV_letterbox_Config; #endif @@ -57,7 +58,6 @@ typedef struct { */ typedef struct { XV_letterbox_Config Config; /**< Hardware Configuration */ - u32 Ctrl_BaseAddress; /**< The base address of the core instance. */ u32 IsReady; /**< Device is initialized and ready */ } XV_letterbox; @@ -86,7 +86,9 @@ typedef struct { #ifndef __linux__ int XV_letterbox_Initialize(XV_letterbox *InstancePtr, u16 DeviceId); XV_letterbox_Config* XV_letterbox_LookupConfig(u16 DeviceId); -int XV_letterbox_CfgInitialize(XV_letterbox *InstancePtr, XV_letterbox_Config *ConfigPtr); +int XV_letterbox_CfgInitialize(XV_letterbox *InstancePtr, + XV_letterbox_Config *ConfigPtr, + u32 EffectiveAddr); #else int XV_letterbox_Initialize(XV_letterbox *InstancePtr, const char* InstanceName); int XV_letterbox_Release(XV_letterbox *InstancePtr); diff --git a/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_g.c b/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_g.c new file mode 100644 index 00000000..cb456d93 --- /dev/null +++ b/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_g.c @@ -0,0 +1,60 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2015 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 +*XILINX 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. +* + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xv_letterbox.h" + +/* +* The configuration table for devices +*/ + +XV_letterbox_Config XV_letterbox_ConfigTable[] = +{ + { +#ifdef XPAR_XV_LETTERBOX_NUM_INSTANCES + XPAR_V_PROC_SS_0_V_LETTERBOX_DEVICE_ID, + XPAR_V_PROC_SS_0_V_LETTERBOX_S_AXI_CTRL_BASEADDR, + XPAR_V_PROC_SS_0_V_LETTERBOX_SAMPLES_PER_CLOCK, + XPAR_V_PROC_SS_0_V_LETTERBOX_NUM_VIDEO_COMPONENTS, + XPAR_V_PROC_SS_0_V_LETTERBOX_MAX_COLS, + XPAR_V_PROC_SS_0_V_LETTERBOX_MAX_ROWS, + XPAR_V_PROC_SS_0_V_LETTERBOX_MAX_DATA_WIDTH +#endif + } +}; diff --git a/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_l2.c b/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_l2.c index c7a38f26..b712c1fc 100644 --- a/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_l2.c +++ b/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_l2.c @@ -35,6 +35,7 @@ * @file xv_letterbox_l2.c * @addtogroup v_letterbox_v1_0 * @{ +* @details * * The Letterbox Layer-2 Driver. * The functions in this file provides an abstraction from the register peek/poke @@ -46,7 +47,7 @@ * * Ver Who Date Changes * ----- ---- -------- ------------------------------------------------------- -* 1.00 rc 05/01/15 Initial Release +* 1.00 rco 07/21/15 Initial Release * * @@ -223,7 +224,7 @@ void XV_LBoxDbgReportStatus(XV_letterbox *InstancePtr) done = XV_letterbox_IsDone(pLbox); idle = XV_letterbox_IsIdle(pLbox); ready = XV_letterbox_IsReady(pLbox); - ctrl = XV_letterbox_ReadReg(pLbox->Ctrl_BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL); + ctrl = XV_letterbox_ReadReg(pLbox->Config.BaseAddress, XV_LETTERBOX_CTRL_ADDR_AP_CTRL); colstart = XV_letterbox_Get_HwReg_col_start(pLbox); colend = XV_letterbox_Get_HwReg_col_end(pLbox); diff --git a/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_l2.h b/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_l2.h index 0da7c2d6..6cb98966 100644 --- a/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_l2.h +++ b/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_l2.h @@ -35,6 +35,7 @@ * @file xv_letterbox_l2.h * @addtogroup v_letterbox_v1_0 * @{ +* @details * * This header file contains layer 2 API's of the letter box sub-core driver. * The functions contained herein provides a high level implementation of @@ -89,7 +90,7 @@ * * Ver Who Date Changes * ----- ---- -------- ------------------------------------------------------- -* 1.00 rc 05/01/15 Initial Release +* 1.00 rco 07/21/15 Initial Release * * diff --git a/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_linux.c b/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_linux.c index 49c2af5a..2f41c227 100644 --- a/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_linux.c +++ b/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_linux.c @@ -87,8 +87,8 @@ static int uio_info_read_map_size(XV_letterbox_uio_info* info, int n) { } int XV_letterbox_Initialize(XV_letterbox *InstancePtr, const char* InstanceName) { - XV_letterbox_uio_info *InfoPtr = &uio_info; - struct dirent **namelist; + XV_letterbox_uio_info *InfoPtr = &uio_info; + struct dirent **namelist; int i, n; char* s; char file[ MAX_UIO_PATH_SIZE ]; @@ -100,9 +100,9 @@ int XV_letterbox_Initialize(XV_letterbox *InstancePtr, const char* InstanceName) n = scandir("/sys/class/uio", &namelist, 0, alphasort); if (n < 0) return XST_DEVICE_NOT_FOUND; for (i = 0; i < n; i++) { - strcpy(file, "/sys/class/uio/"); - strcat(file, namelist[i]->d_name); - strcat(file, "/name"); + strcpy(file, "/sys/class/uio/"); + strcat(file, namelist[i]->d_name); + strcat(file, "/name"); if ((line_from_file(file, name) == 0) && (strcmp(name, InstanceName) == 0)) { flag = 1; s = namelist[i]->d_name; @@ -126,8 +126,8 @@ int XV_letterbox_Initialize(XV_letterbox *InstancePtr, const char* InstanceName) } // NOTE: slave interface 'Ctrl' should be mapped to uioX/map0 - InstancePtr->Ctrl_BaseAddress = (u32)mmap(NULL, InfoPtr->maps[0].size, PROT_READ|PROT_WRITE, MAP_SHARED, InfoPtr->uio_fd, 0 * getpagesize()); - assert(InstancePtr->Ctrl_BaseAddress); + InstancePtr->Config.BaseAddress = (u32)mmap(NULL, InfoPtr->maps[0].size, PROT_READ|PROT_WRITE, MAP_SHARED, InfoPtr->uio_fd, 0 * getpagesize()); + assert(InstancePtr->Config.BaseAddress); InstancePtr->IsReady = XIL_COMPONENT_IS_READY; @@ -135,12 +135,12 @@ int XV_letterbox_Initialize(XV_letterbox *InstancePtr, const char* InstanceName) } int XV_letterbox_Release(XV_letterbox *InstancePtr) { - XV_letterbox_uio_info *InfoPtr = &uio_info; + XV_letterbox_uio_info *InfoPtr = &uio_info; assert(InstancePtr != NULL); assert(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); - munmap((void*)InstancePtr->Ctrl_BaseAddress, InfoPtr->maps[0].size); + munmap((void*)InstancePtr->Config.BaseAddress, InfoPtr->maps[0].size); close(InfoPtr->uio_fd); diff --git a/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_sinit.c b/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_sinit.c index 3e8bafe6..92443b52 100644 --- a/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_sinit.c +++ b/XilinxProcessorIPLib/drivers/v_letterbox/src/xv_letterbox_sinit.c @@ -11,35 +11,41 @@ #include "xparameters.h" #include "xv_letterbox.h" +#ifndef XPAR_XV_LETTERBOX_NUM_INSTANCES +#define XPAR_XV_LETTERBOX_NUM_INSTANCES 0 +#endif + extern XV_letterbox_Config XV_letterbox_ConfigTable[]; XV_letterbox_Config *XV_letterbox_LookupConfig(u16 DeviceId) { - XV_letterbox_Config *ConfigPtr = NULL; + XV_letterbox_Config *ConfigPtr = NULL; - int Index; + int Index; - for (Index = 0; Index < XPAR_XV_LETTERBOX_NUM_INSTANCES; Index++) { - if (XV_letterbox_ConfigTable[Index].DeviceId == DeviceId) { - ConfigPtr = &XV_letterbox_ConfigTable[Index]; - break; - } - } + for (Index = 0; Index < XPAR_XV_LETTERBOX_NUM_INSTANCES; Index++) { + if (XV_letterbox_ConfigTable[Index].DeviceId == DeviceId) { + ConfigPtr = &XV_letterbox_ConfigTable[Index]; + break; + } + } - return ConfigPtr; + return ConfigPtr; } int XV_letterbox_Initialize(XV_letterbox *InstancePtr, u16 DeviceId) { - XV_letterbox_Config *ConfigPtr; + XV_letterbox_Config *ConfigPtr; - Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr != NULL); - ConfigPtr = XV_letterbox_LookupConfig(DeviceId); - if (ConfigPtr == NULL) { - InstancePtr->IsReady = 0; - return (XST_DEVICE_NOT_FOUND); - } + ConfigPtr = XV_letterbox_LookupConfig(DeviceId); + if (ConfigPtr == NULL) { + InstancePtr->IsReady = 0; + return (XST_DEVICE_NOT_FOUND); + } - return XV_letterbox_CfgInitialize(InstancePtr, ConfigPtr); + return XV_letterbox_CfgInitialize(InstancePtr, + ConfigPtr, + ConfigPtr->BaseAddress); } #endif