/****************************************************************************** * * 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 example.c * * This file demonstrates how to use Xilinx Video On-Screen-Display (OSD) * driver on Xilinx MVI OSD device. * * This code makes the following assumptions: * * - The OSD device contains at least 2 layers * - Layer 0 has type GPU * - Each layer has the following configuration during the hardware build * - Font width = 8 * - Font height = 8 * - Font bits per pixel = 1 * - Number of the font characters = 128 * - Caching is disabled. Flushing and Invalidation operations for data buffer * need to be added to this code if it is not the case. * *
 * MODIFICATION HISTORY:
 *
 * Ver   Who  Date     Changes
 * ----- ---- -------- -------------------------------------------------------
 * 1.00a xd   05/12/09 First release
 * 
* * **************************************************************************** */ #include "xosd.h" #include "xparameters.h" /* * Device related constants. Defined in xparameters.h */ #define OSD_DEVICE_ID XPAR_OSD_0_DEVICE_ID /* * OSD Device related data structures */ XOSD Osd; /* OSD Device driver instance */ XOSD_Config *OsdCfgPtr; /* OSD device configuration pointer */ /* * Color table definition */ u32 ColorData[16] = { 0x00000000, 0xa0a25f58, 0xa08080ff, 0xa0808010, 0xa0ef5a51, 0x00000000, 0xa0465289, 0x00000000, 0xa065ba6b, 0x00000000, 0xa09017c5, 0xa0a9c860, 0xa0bc3198, 0xa010a5a9, 0xa0808080, 0xa0ada1ab }; /* * Text table definition */ char __attribute__ ((aligned (4))) TextData[8][32] = { "String #1", "String #2", "String #3", "String #4", "String #5", "String #6", "String #7", "String #8" }; /* * Font definition */ unsigned char __attribute__ ((aligned (4))) Font[128][8] = { {0x00, 0x36, 0x7F, 0x7F, 0x3E, 0x1C, 0x08, 0x00}, // NULL {0x18, 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, 0x18}, {0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03}, {0x18, 0x18, 0x18, 0xF8, 0xF8, 0x00, 0x00, 0x00}, {0x18, 0x18, 0x18, 0xF8, 0xF8, 0x18, 0x18, 0x18}, {0x00, 0x00, 0x00, 0xF8, 0xF8, 0x18, 0x18, 0x18}, {0x03, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0xC0}, {0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03}, {0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F}, {0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF}, {0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00}, {0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00}, {0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0}, {0x00, 0x1C, 0x1C, 0x77, 0x77, 0x08, 0x1C, 0x00}, {0x00, 0x00, 0x00, 0x1F, 0x1F, 0x18, 0x18, 0x18}, {0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00}, {0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18}, {0x00, 0x00, 0x3C, 0x7E, 0x7E, 0x7E, 0x3C, 0x00}, {0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF}, {0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0}, {0x00, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x18, 0x18}, {0x18, 0x18, 0x18, 0xFF, 0xFF, 0x00, 0x00, 0x00}, {0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0}, {0x18, 0x18, 0x18, 0x1F, 0x1F, 0x00, 0x00, 0x00}, {0x78, 0x60, 0x78, 0x60, 0x7E, 0x18, 0x1E, 0x00}, {0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x00}, {0x00, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00}, {0x00, 0x18, 0x30, 0x7E, 0x30, 0x18, 0x00, 0x00}, {0x00, 0x18, 0x0C, 0x7E, 0x0C, 0x18, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Space {0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00}, {0x00, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x66, 0xFF, 0x66, 0x66, 0xFF, 0x66, 0x00}, {0x18, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0x18, 0x00}, {0x00, 0x66, 0x6C, 0x18, 0x30, 0x66, 0x46, 0x00}, {0x1C, 0x36, 0x1C, 0x38, 0x6F, 0x66, 0x3B, 0x00}, {0x00, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x0E, 0x1C, 0x18, 0x18, 0x1C, 0x0E, 0x00}, {0x00, 0x70, 0x38, 0x18, 0x18, 0x38, 0x70, 0x00}, {0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00}, {0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30}, {0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00}, {0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00}, {0x00, 0x3C, 0x66, 0x6E, 0x76, 0x66, 0x3C, 0x00}, {0x00, 0x18, 0x38, 0x18, 0x18, 0x18, 0x7E, 0x00}, {0x00, 0x3C, 0x66, 0x0C, 0x18, 0x30, 0x7E, 0x00}, {0x00, 0x7E, 0x0C, 0x18, 0x0C, 0x66, 0x3C, 0x00}, {0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0x7E, 0x0C, 0x00}, {0x00, 0x7E, 0x60, 0x7C, 0x06, 0x66, 0x3C, 0x00}, {0x00, 0x3C, 0x60, 0x7C, 0x66, 0x66, 0x3C, 0x00}, {0x00, 0x7E, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x00}, {0x00, 0x3C, 0x66, 0x3C, 0x66, 0x66, 0x3C, 0x00}, {0x00, 0x3C, 0x66, 0x3E, 0x06, 0x0C, 0x38, 0x00}, {0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00}, {0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x30}, {0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00}, {0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00}, {0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00}, {0x00, 0x3C, 0x66, 0x0C, 0x18, 0x00, 0x18, 0x00}, {0x00, 0x3C, 0x66, 0x6E, 0x6E, 0x60, 0x3E, 0x00}, // @ {0x00, 0x18, 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x00}, // A {0x00, 0x7C, 0x66, 0x7C, 0x66, 0x66, 0x7C, 0x00}, {0x00, 0x3C, 0x66, 0x60, 0x60, 0x66, 0x3C, 0x00}, {0x00, 0x78, 0x6C, 0x66, 0x66, 0x6C, 0x78, 0x00}, {0x00, 0x7E, 0x60, 0x7C, 0x60, 0x60, 0x7E, 0x00}, {0x00, 0x7E, 0x60, 0x7C, 0x60, 0x60, 0x60, 0x00}, {0x00, 0x3E, 0x60, 0x60, 0x6E, 0x66, 0x3E, 0x00}, {0x00, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00}, {0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00}, {0x00, 0x06, 0x06, 0x06, 0x06, 0x66, 0x3C, 0x00}, {0x00, 0x66, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0x00}, {0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7E, 0x00}, {0x00, 0x63, 0x77, 0x7F, 0x6B, 0x63, 0x63, 0x00}, {0x00, 0x66, 0x76, 0x7E, 0x7E, 0x6E, 0x66, 0x00}, {0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00}, {0x00, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x00}, {0x00, 0x3C, 0x66, 0x66, 0x66, 0x6C, 0x36, 0x00}, {0x00, 0x7C, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0x00}, {0x00, 0x3C, 0x60, 0x3C, 0x06, 0x06, 0x3C, 0x00}, {0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00}, {0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7E, 0x00}, {0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00}, {0x00, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00}, {0x00, 0x66, 0x66, 0x3C, 0x3C, 0x66, 0x66, 0x00}, {0x00, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x00}, {0x00, 0x7E, 0x0C, 0x18, 0x30, 0x60, 0x7E, 0x00}, {0x00, 0x1E, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00}, {0x00, 0x40, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00}, {0x00, 0x78, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00}, {0x00, 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00}, {0x40, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00}, // ` {0x00, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00}, // a {0x00, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x00}, {0x00, 0x00, 0x3C, 0x60, 0x60, 0x60, 0x3C, 0x00}, {0x00, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3E, 0x00}, {0x00, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00}, {0x00, 0x0E, 0x18, 0x3E, 0x18, 0x18, 0x18, 0x00}, {0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x7C}, {0x00, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x00}, {0x00, 0x18, 0x00, 0x38, 0x18, 0x18, 0x3C, 0x00}, {0x00, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x3C}, {0x00, 0x60, 0x60, 0x6C, 0x78, 0x6C, 0x66, 0x00}, {0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00}, {0x00, 0x00, 0x66, 0x7F, 0x7F, 0x6B, 0x63, 0x00}, {0x00, 0x00, 0x7C, 0x66, 0x66, 0x66, 0x66, 0x00}, {0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00}, {0x00, 0x00, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60}, {0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x06}, {0x00, 0x00, 0x7C, 0x66, 0x60, 0x60, 0x60, 0x00}, {0x00, 0x00, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0x00}, {0x00, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x0E, 0x00}, {0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00}, {0x00, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00}, {0x00, 0x00, 0x63, 0x6B, 0x7F, 0x3E, 0x36, 0x00}, {0x00, 0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x00}, {0x00, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x0C, 0x78}, {0x00, 0x00, 0x7E, 0x0C, 0x18, 0x30, 0x7E, 0x00}, {0x14, 0x10, 0x10, 0x40, 0x10, 0x10, 0x14, 0x00}, // { {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}, {0x50, 0x10, 0x10, 0x04, 0x10, 0x10, 0x50, 0x00}, // } {0x11, 0x11, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00}, // ~ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 127 DEL }; /* * Function prototypes */ static int OsdExample(int DeviceID); static int OsdInit(int DeviceID); static void OsdConfig(void); static void OsdDrawBox(void); /*****************************************************************************/ /** * * This is the main function for the OSD example. * * @param None. * * @return 0 to indicate success, otherwise 1. * * @note None. * ******************************************************************************/ int main(void) { int Status; /* * Call the OSD example, use the Device IDs generated in xparameters.h */ Status = OsdExample(OSD_DEVICE_ID); if (Status != 0) return 1; return 0; } /*****************************************************************************/ /** * * This function is the entry of the feature demonstrations on MVI Video OSD * device. It initialized an OSD device, configures 2 layers, load * text/color/font information, and draws a box to the OSD output. * * @param DeviceID is the device ID of the OSD device. * * @return 0 if all tests pass, 1 otherwise. * * @note None. * ******************************************************************************/ static int OsdExample(int DeviceID) { int Status; /* Initialize the OSD instance */ Status = OsdInit(DeviceID); if (Status != XST_SUCCESS) return 1; /* Configure the OSD instance */ OsdConfig(); /* Draw a box */ OsdDrawBox(); /* Return success */ return 0; } /*****************************************************************************/ /** * * This function initializes the OSD device and its driver instance. * * @param DeviceID is the device ID of the OSD device. * * @return 0 if the initialization is successful; 1 otherwise. * * @note None. * ******************************************************************************/ int OsdInit(int DeviceID) { int Status; /* Initialize the OSD instance */ OsdCfgPtr = XOSD_LookupConfig(DeviceID); Status = XOSD_CfgInitialize(&Osd, OsdCfgPtr, OsdCfgPtr->BaseAddress); if (Status != XST_SUCCESS) return 1; /* Reset the devices */ XOSD_Reset(&Osd); /* Enable the OSD device and tell it to pick up the register changes */ XOSD_Enable(&Osd); XOSD_RegUpdateEnable(&Osd); return 0; } /*****************************************************************************/ /** * * This function does the general configuration on an OSD device. The * configuration includes: * * - Screen Size * - Background Color * - Layer 0 setup: Alpha, Priority, Dimension and enabling * - Layer 1 setup: Alpha, Priority, Dimension and enabling * - Loading Color/Font/Text configuration * * @param None. * * @return None. * * @note None. * ******************************************************************************/ static void OsdConfig(void) { /* Dimension definition */ int Width = 1280; int Height = 720; /* Background color definition */ u8 Red = 0xFF; u8 Blue = 0; u8 Green = 0; /* Layer 0/1 property definition */ int Layer0AlphaValue = 0xFF; int Layer0Priority = XOSD_LAYER_PRIORITY_0; int Layer0GlobalAlphaEnable = 1; int Layer1AlphaValue = 0x80; /* 50% transparent */ int Layer1Priority = XOSD_LAYER_PRIORITY_1; int Layer1GlobalAlphaEnable = 0; /* Set screen size */ XOSD_SetScreenSize(&Osd, Width, Height); /* Set Background color */ XOSD_SetBackgroundColor(&Osd, Red, Blue, Green); /* Set up Layer 0's Alpha, Priority, Dimension and enable it */ XOSD_SetLayerAlpha(&Osd, 0, Layer0GlobalAlphaEnable, Layer0AlphaValue); XOSD_SetLayerPriority(&Osd, 0, Layer0Priority); XOSD_SetLayerDimension(&Osd, 0, 0, 0, Width, Height); XOSD_EnableLayer(&Osd, 0); /* Set up Layer 1's Alpha, Priority, Dimension and enable it */ XOSD_SetLayerAlpha(&Osd, 1, Layer1GlobalAlphaEnable, Layer1AlphaValue); XOSD_SetLayerPriority(&Osd, 1, Layer1Priority); XOSD_SetLayerDimension(&Osd, 1, 0, 0, Width, Height); XOSD_EnableLayer(&Osd, 1); /* Load color, font and text and set the active banks */ XOSD_LoadColorLUTBank(&Osd, 0, 0, ColorData); XOSD_LoadCharacterSetBank(&Osd, 0, 0, (u32 *)Font); XOSD_LoadTextBank(&Osd, 0, 0, (u32 *)TextData); XOSD_SetActiveBank(&Osd, 0, 0, 0, 0, 0); return; } /*****************************************************************************/ /** * * This function draws a box using the OSD device * * @param None. * * @return None. * * @note None. * ******************************************************************************/ static void OsdDrawBox(void) { /* Instruction buffer */ u32 Instruction[XOSD_INS_SIZE]; /* Instruction property definition */ u16 ObjType = XOSD_INS_OPCODE_BOX; /* A box */ u8 ObjSize = 1; /* Box boarder width */ u16 XStart = 100; /* Horizontal start pixel of the box */ u16 YStart = 100; /* Vertical start line of the box */ u16 XEnd = 200; /* Horizontal end pixel of the box */ u16 YEnd = 200; /* Vertical end line of the box */ u8 TextIndex = 0; /* Ignored in box instruction case */ u8 ColorIndex = 0; /* Draw the box w/ the 1st color */ /* Create a box command instruction for GC #0 */ XOSD_CreateInstruction(&Osd, Instruction, 0, ObjType, ObjSize, XStart, YStart, XEnd, YEnd, TextIndex, ColorIndex); /* Load the instruction to draw the box in the OSD output */ XOSD_LoadInstructionList(&Osd, 0, 0, Instruction, 1); return; }