diff --git a/meta-digi-del/recipes-digi/fbtest/fbtest.bb b/meta-digi-del/recipes-digi/fbtest/fbtest.bb new file mode 100644 index 000000000..2e5d36781 --- /dev/null +++ b/meta-digi-del/recipes-digi/fbtest/fbtest.bb @@ -0,0 +1,23 @@ +SUMMARY = "Digi's framebuffer test utility" +SECTION = "base" +LICENSE = "GPL-2.0" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" + +PR = "r0" + +DEPENDS = "microwindows" + +FILESEXTRAPATHS_append := "${THISDIR}/files:" +SRC_URI = "file://fbtest.c \ + " + +S = "${WORKDIR}" + +do_compile() { + ${CC} -O2 -Wall -I usr/include/ -L usr/lib fbtest.c -lnano-X -o fbtest +} + +do_install() { + install -d ${D}${bindir} + install -m 0755 fbtest ${D}${bindir} +} diff --git a/meta-digi-del/recipes-digi/fbtest/files/fbtest.c b/meta-digi-del/recipes-digi/fbtest/files/fbtest.c new file mode 100644 index 000000000..ac4d37546 --- /dev/null +++ b/meta-digi-del/recipes-digi/fbtest/files/fbtest.c @@ -0,0 +1,187 @@ +/* + * fbtest.c + * + * Copyright (C) 2006-2009 by Digi International Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * Description: draws some test patterns (R,G,B and white colorbars) + * + */ +#include +#include +#include /* fprintf */ +#include /* EXIT_SUCCESS */ +#include /* strcpy */ +#include +#include + +#define MWINCLUDECOLORS +#include /* GrOpen */ + +#ifdef S_SPLINT_S +typedef /*@abstract@ */ MWCOLORVAL; +typedef /*@abstract@ */ GR_EVENT; +typedef /*@abstract@ */ GR_EVENT_EXPOSURE; +typedef /*@abstract@ */ GR_WINDOW_ID; +typedef /*@abstract@ */ GR_GC_ID; +#endif + +static void draw(const GR_EVENT * e); +static void draw_colorbar(GR_WINDOW_ID wid, GR_GC_ID gc, + int x, int y, int height, int dred, int dgreen, int dblue, char *label); + +static GR_SCREEN_INFO l_xSIP; + +static int dX = 0; +static int dY = 0; + +int main(int argc, char *argv[]) +{ + GR_EVENT event; + GR_WINDOW_ID w; + + printf("fbtest $Revision: 1.3 $ " __TIME__ "\n"); + + if ((argc != 1) && (argc != 3)) { + fprintf(stderr, "Usage: %s [dX dY]\n", argv[0]); + exit(EXIT_FAILURE); + } + + /* Disable framebuffer console cursor */ + int fd = open("/sys/class/graphics/fbcon/cursor_blink", O_WRONLY); + if (fd >= 0) { + write(fd, "0", 1); + close(fd); + } + + if (3 == argc) { + /* dX and dY is for testing the display to see that lines + * vanish from display */ + dX = atoi(argv[1]); + dY = atoi(argv[2]); + } + + if (GrOpen() < 0) { + fprintf(stderr, "cannot open graphics\n"); + exit(EXIT_FAILURE); + } + + GrGetScreenInfo(&l_xSIP); + /* create window, center it in display */ + w = GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE, + (unsigned char *)"nanox_mini", GR_ROOT_WINDOW_ID, + dX, dY, l_xSIP.vs_width, l_xSIP.vs_height, GR_RGB(0, 0, 0)); + GrSelectEvents(w, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_CLOSE_REQ); + GrMapWindow(w); + + while (1) { + GrGetNextEvent(&event); + + switch (event.type) { + case GR_EVENT_TYPE_EXPOSURE: + /* now do the actual display work */ + draw(&event); + break; + case GR_EVENT_TYPE_CLOSE_REQ: + GrClose(); + exit(EXIT_SUCCESS); + } + } + /* @notreached@ */ +} + +/*********************************************************************** + * @Function: draw + * @Return: n/a + * @Descr: displays colorbar + ***********************************************************************/ +static void draw(const GR_EVENT * e) +{ + GR_WINDOW_ID wid = ((GR_EVENT_EXPOSURE *) e)->wid; + GR_GC_ID gc = GrNewGC(); + char szResolution[64]; + int iY = 40; + int idY = ((l_xSIP.vs_height - (2 * iY)) / 4) - 10; + int i; + + GrSetGCForeground(gc, WHITE); + + /* border frame */ + GrRect(wid, gc, 0, 0, l_xSIP.vs_width, l_xSIP.vs_height); + for (i = 0; i < l_xSIP.vs_height; i += 10) { + int iLength; + + if (!(i % 100)) + iLength = 10; + else if (!(i % 50)) + iLength = 5; + else + iLength = 2; + + GrLine(wid, gc, 0, i, iLength, i); + GrLine(wid, gc, l_xSIP.vs_width, i, l_xSIP.vs_width - iLength - 1, i); + } + + for (i = 0; i < l_xSIP.vs_width; i += 10) { + int iLength; + + if (!(i % 100)) + iLength = 10; + else if (!(i % 50)) + iLength = 5; + else + iLength = 2; + + GrLine(wid, gc, i, 0, i, iLength); + GrLine(wid, gc, i, l_xSIP.vs_height, i, l_xSIP.vs_height - iLength - 1); + } + + /* resolution */ + sprintf(szResolution, "%ix%i", l_xSIP.vs_width, l_xSIP.vs_height); + GrText(wid, gc, l_xSIP.vs_width / 2 - 20, 20, szResolution, -1, GR_TFASCII | GR_TFTOP); + + /* display colorbards */ + draw_colorbar(wid, gc, 10, iY, idY, 1, 0, 0, "red"); + iY += idY + 10; + draw_colorbar(wid, gc, 10, iY, idY, 0, 1, 0, "green"); + iY += idY + 10; + draw_colorbar(wid, gc, 10, iY, idY, 0, 0, 1, "blue"); + iY += idY + 10; + draw_colorbar(wid, gc, 10, iY, idY, 1, 1, 1, "white"); + + GrDestroyGC(gc); +} + +/*********************************************************************** + * @Function: draw_colorbar + * @Return: n/a + * @Descr: draws a colorbar with RGB modified by dred/dgreen/dblue + ***********************************************************************/ +static void draw_colorbar(GR_WINDOW_ID wid, GR_GC_ID gc, + int x, int y, int height, int dred, int dgreen, int dblue, char *label) +{ + int i; + int red = 0; + int green = 0; + int blue = 0; + + GrSetGCForeground(gc, WHITE); + GrText(wid, gc, x, y, label, -1, GR_TFASCII | GR_TFTOP); + + x += 40; /* leave room for text */ + + for (i = x; i < l_xSIP.vs_width - 20; i++) { + GrSetGCForeground(gc, MWRGB(red, green, blue)); + GrLine(wid, gc, x, y, x, y + height); + + red += dred; + green += dgreen; + blue += dblue; + + x++; + } +}