From: Jens Scharsig <esw@bus-elektronik.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/2] new video driver for bus vcxk framebuffers
Date: Wed, 22 Apr 2009 16:36:22 +0200 [thread overview]
Message-ID: <gsna1j$2tm$2@ger.gmane.org> (raw)
This patch adds a new video driver
* adds common bus_vcxk framebuffer driver
Signed-off-by: Jens Scharsig <esw@bus-elektronik.de>
---
diff --git a/doc/README.bus_vcxk b/doc/README.bus_vcxk
new file mode 100644
index 0000000..44e1238
--- /dev/null
+++ b/doc/README.bus_vcxk
@@ -0,0 +1,95 @@
+/*
+ * (C) Copyright 2008-2009
+ * BuS Elektronik GmbH & Co. KG <www.bus-elektronik.de>
+ * Jens Scharsig <esw@bus-elektronik.de>
+ *
+ * Configuation settings for the EB+CPUx9K2 board.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+U-Boot vcxk video controller driver
+======================================
+
+The driver can use with VC2K, VC4K and VC8K devices on following boards:
+
+board | ARCH | Vendor
+-----------------------------------------------------------------------
+EB+CPU5282-T1 | MCF5282 | BuS Elektronik GmbH & Co. KG
+EB+MCF-EVB123 | MCF5282 | BuS Elektronik GmbH & Co. KG
+EB+CPUx9K2 | AT91RM9200 | BuS Elektronik GmbH & Co. KG
+ZLSA | AT91RM9200 | Ruf Telematik AG
+
+by define CONFIG_VIDEO_VCXK
+
+Driver configuration
+--------------------
+
+The driver needs some defines to descrip the target hardware:
+
+CONFIG_SYS_VCXK_BASE
+
+base address of VCxK hardware memory
+
+CONFIG_SYS_VCXK_DEFAULT_LINEALIGN
+
+defines the physical alignment of a pixel row
+
+CONFIG_SYS_VCXK_DOUBLEBUFFERED
+
+some boards that use vcxk prevent read from framebuffer memory.
+define this option to enable double buffering (needs 16KiB RAM)
+
+CONFIG_SYS_VCXK_ACKNOWLEDGE_INIT
+
+initialize the acknowledge line from vcxk hardware
+
+#define CONFIG_SYS_VCXK_ACKNOWLEDGE
+
+should return true (1), if vcxk hardware acknowledges a viewing reqest
+
+CONFIG_SYS_VCXK_ENABLE_INIT
+
+initialize the enable line to vcxk hardware
+
+CONFIG_SYS_VCXK_DISABLE
+
+set vcxk enable line to disable level / display off
+
+CONFIG_SYS_VCXK_ENABLE
+
+set vcxk enable line enable level / display on
+
+CONFIG_SYS_VCXK_REQUEST_INIT
+
+initialize the request line to vcxk hardware
+
+CONFIG_SYS_VCXK_REQUEST
+
+should be send an request impulse to vcxk hardware
+
+CONFIG_SYS_VCXK_INVERT_INIT
+
+should initialize the invert line to vcxk hardware and set it to
+non invers mode
+
+CONFIG_SYS_VCXK_RESET_INIT
+
+initialize the reset line to vcxk hardware and release it from reset
+
diff --git a/drivers/video/Makefile b/drivers/video/Makefile
index bc00852..bb6b5a0 100644
--- a/drivers/video/Makefile
+++ b/drivers/video/Makefile
@@ -36,6 +36,7 @@ COBJS-$(CONFIG_VIDEO_SED13806) += sed13806.o
COBJS-$(CONFIG_SED156X) += sed156x.o
COBJS-$(CONFIG_VIDEO_SM501) += sm501.o
COBJS-$(CONFIG_VIDEO_SMI_LYNXEM) += smiLynxEM.o
+COBJS-$(CONFIG_VIDEO_VCXK) += bus_vcxk.o
COBJS-y += videomodes.o
COBJS := $(COBJS-y)
diff --git a/drivers/video/bus_vcxk.c b/drivers/video/bus_vcxk.c
new file mode 100644
index 0000000..db49c83
--- /dev/null
+++ b/drivers/video/bus_vcxk.c
@@ -0,0 +1,469 @@
+/*
+ * (C) Copyright 2005-2009
+ * Jens Scharsig @ BuS Elektronik GmbH & Co. KG, <esw@bus-elektronik.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <bmp_layout.h>
+#include <asm/io.h>
+
+vu_char *vcxk_bws = ((vu_char *) (CONFIG_SYS_VCXK_BASE));
+vu_short *vcxk_bws_word = ((vu_short *)(CONFIG_SYS_VCXK_BASE));
+vu_long *vcxk_bws_long = ((vu_long *) (CONFIG_SYS_VCXK_BASE));
+
+#ifdef CONFIG_AT91RM9200
+ #include <asm/arch/hardware.h>
+ #ifndef VCBITMASK
+ #define VCBITMASK(bitno) (0x0001 << (bitno % 16))
+ #endif
+#elif defined(CONFIG_MCF52x2)
+ #include <asm/m5282.h>
+ #ifndef VCBITMASK
+ #define VCBITMASK(bitno) (0x8000 >> (bitno % 16))
+ #endif
+#else
+ #error not vcxk support for selected ARCH
+#endif
+
+#ifndef CONFIG_SYS_VCXK_DOUBLEBUFFERED
+ #define VCXK_BWS(x,data) vcxk_bws[x] = data;
+ #define VCXK_BWS_WORD_SET(x,mask) vcxk_bws_word[x] |= mask;
+ #define VCXK_BWS_WORD_CLEAR(x,mask) vcxk_bws_word[x] &= ~mask;
+ #define VCXK_BWS_LONG(x,data) vcxk_bws_long[x] = data;
+#else
+ u_char double_bws[16384];
+ u_short *double_bws_word;
+ u_long *double_bws_long;
+ #define VCXK_BWS(x,data) \
+ double_bws[x] = data; vcxk_bws[x] = data;
+ #define VCXK_BWS_WORD_SET(x,mask) \
+ double_bws_word[x] |= mask; vcxk_bws_word[x] = double_bws_word[x];
+ #define VCXK_BWS_WORD_CLEAR(x,mask) \
+ double_bws_word[x] &= ~mask; vcxk_bws_word[x] = double_bws_word[x];
+ #define VCXK_BWS_LONG(x,data) \
+ double_bws_long[x] = data; vcxk_bws_long[x] = data;
+#endif
+
+#define VC4K16_Bright1 vcxk_bws_word[0x20004 / 2]
+#define VC4K16_Bright2 vcxk_bws_word[0x20006 / 2]
+#define VC2K_Bright vcxk_bws[0x8000]
+#define VC8K_BrightH vcxk_bws[0xC000]
+#define VC8K_BrightL vcxk_bws[0xC001]
+
+static vu_long vcxk_driver;
+vu_char VC4K16;
+
+u_long display_width;
+u_long display_height;
+u_long display_bwidth;
+
+ulong search_vcxk_driver(void);
+void vcxk_cls(void);
+void vcxk_setbrightness(unsigned int side, short brightness);
+int vcxk_request(void);
+int vcxk_acknowledge_wait(void);
+void vcxk_clear(void);
+
+/*----------------------------------------------------------------------------
+ ****f* bus_vcxk/vcxk_init
+ * FUNCTION
+ * initialalize Video Controller
+ * PARAMETERS
+ * width visible display width in pixel
+ * height visible display height in pixel
+ ***
+----------------------------------------------------------------------------*/
+
+int vcxk_init(unsigned long width, unsigned long height)
+{
+ CONFIG_SYS_VCXK_RESET_INIT;
+
+#ifdef CONFIG_SYS_VCXK_DOUBLEBUFFERED
+ double_bws_word = (u_short *) double_bws;
+ double_bws_long = (u_long *)double_bws;
+ debug("%lx %lx %lx \n",double_bws,double_bws_word,double_bws_long);
+#endif
+
+ display_width = width;
+ display_height = height;
+ #if (CONFIG_SYS_VCXK_DEFAULT_LINEALIGN==4)
+ display_bwidth =((width+31) / 8) & ~0x3;
+ #elif (CONFIG_SYS_VCXK_DEFAULT_LINEALIGN==2)
+ display_bwidth =((width+15) / 8) & ~0x1;
+ #else
+ #error CONFIG_SYS_VCXK_DEFAULT_LINEALIGN is invalid
+ #endif
+ debug("linesize ((%d + 15)/8 & ~0x1) = %d\n",display_width,display_bwidth);
+
+ #ifdef CONFIG_SYS_VCXK_AUTODETECT
+ VC4K16 = 0;
+ vcxk_bws_long[1] = 0x0;
+ vcxk_bws_long[1] = 0x55AAAA55;
+ vcxk_bws_long[5] = 0x0;
+ if (vcxk_bws_long[1] == 0x55AAAA55)
+ {
+ VC4K16 = 1;
+ }
+ #else
+ VC4K16 = 1;
+ debug("No autodetect: use vc4k\n");
+ #endif
+
+ CONFIG_SYS_VCXK_INVERT_INIT;
+
+ CONFIG_SYS_VCXK_REQUEST_INIT;
+
+ CONFIG_SYS_VCXK_ACKNOWLEDGE_INIT;
+
+ CONFIG_SYS_VCXK_DISABLE;
+ CONFIG_SYS_VCXK_ENABLE_INIT;
+
+ vcxk_driver = search_vcxk_driver();
+ if (vcxk_driver)
+ {
+ /* use flash resist driver */
+ }
+ else
+ {
+ vcxk_cls();
+ vcxk_cls();
+ }
+
+ vcxk_setbrightness(3,1000);
+ CONFIG_SYS_VCXK_ENABLE;
+ return 1;
+}
+
+/*----------------------------------------------------------------------------
+ ****f* bus_vcxk/vcxk_setpixel
+ * FUNCTION
+ * set the pixel[x,y] with the given color
+ * PARAMETER
+ * x pixel colum
+ * y pixel row
+ * color <0x40 off/black
+ * >0x40 on
+ ***
+----------------------------------------------------------------------------*/
+
+void vcxk_setpixel (int x, int y, unsigned long color)
+{
+ vu_short dataptr;
+
+ if (vcxk_driver)
+ {
+ /* use flash resist driver */
+ }
+ else
+ {
+ if ((x<display_width) && (y<display_height))
+ {
+
+ dataptr = ((x / 16)) + (y * (display_bwidth>>1));
+
+ color = ((color >> 16) & 0xFF) |
+ ((color >> 8) & 0xFF) | (color & 0xFF);
+
+ if (color > 0x40)
+ {
+ VCXK_BWS_WORD_SET(dataptr,VCBITMASK(x));
+ }
+ else
+ {
+ VCXK_BWS_WORD_CLEAR(dataptr,VCBITMASK(x));
+ }
+ }
+ }
+}
+
+/*----------------------------------------------------------------------------
+ ****f* bus_vcxk/vcxk_loadimage
+ * FUNCTION
+ * copies a binary image to display memory
+ ***
+----------------------------------------------------------------------------*/
+
+void vcxk_loadimage(ulong source)
+{
+ int cnt;
+ vcxk_acknowledge_wait();
+ if (vcxk_driver)
+ {
+ /* use flash resist driver */
+ }
+ else
+ {
+ if (VC4K16)
+ {
+ for (cnt=0; cnt< (16384/4); cnt++)
+ {
+ VCXK_BWS_LONG(cnt,(*(ulong*) source));
+ source = source + 4;
+ }
+ }
+ else
+ {
+ for (cnt=0; cnt<16384; cnt++)
+ {
+ VCXK_BWS_LONG(cnt*2,(*(vu_char*) source));
+ source++;
+ }
+ }
+ }
+ vcxk_request();
+}
+
+/*----------------------------------------------------------------------------
+ ****f* bus_vcxk/vcxk_cls
+ * FUNCTION
+ * clear the display
+ ***
+----------------------------------------------------------------------------*/
+
+void vcxk_cls(void)
+{
+ vcxk_acknowledge_wait();
+ vcxk_clear();
+ vcxk_request();
+}
+
+/*----------------------------------------------------------------------------
+ ****f* bus_vcxk/vcxk_clear(void)
+ * FUNCTION
+ * clear the display memory
+ ***
+----------------------------------------------------------------------------*/
+
+void vcxk_clear(void)
+{
+ int cnt;
+ if (vcxk_driver)
+ {
+ /* use flash resist driver */
+ }
+ else
+ {
+ for (cnt=0; cnt< (16384/4); cnt++)
+ {
+ VCXK_BWS_LONG(cnt,0);
+ }
+ }
+}
+
+/*----------------------------------------------------------------------------
+ ****f* bus_vcxk/vcxk_setbrightness
+ * FUNCTION
+ * set the display brightness
+ * PARAMETER
+ * side 1 set front side brightness
+ * 2 set back side brightness
+ * 3 set brightness for both sides
+ * brightness 0..1000
+ ***
+----------------------------------------------------------------------------*/
+
+void vcxk_setbrightness(unsigned int side, short brightness)
+{
+ if (vcxk_driver)
+ {
+ /* use flash resist driver */
+ }
+ else
+ {
+ if (VC4K16)
+ {
+ if ((side==0) || (side & 0x1)) VC4K16_Bright1 = brightness + 23;
+ if ((side==0) || (side & 0x2)) VC4K16_Bright2 = brightness + 23;
+ }
+ else
+ {
+ VC2K_Bright = (brightness >> 4) +2;
+ VC8K_BrightH = (brightness + 23) >> 8;
+ VC8K_BrightL = (brightness + 23) & 0xFF;
+ }
+ }
+}
+
+/*----------------------------------------------------------------------------
+ ****f* bus_vcxk/vcxk_request
+ * FUNCTION
+ * requests viewing of display memory
+ ***
+----------------------------------------------------------------------------*/
+
+int vcxk_request(void)
+{
+ if (vcxk_driver)
+ {
+ /* use flash resist driver */
+ }
+ else
+ {
+ CONFIG_SYS_VCXK_REQUEST;
+ }
+ return 1;
+}
+
+/*----------------------------------------------------------------------------
+ ****f* bus_vcxk/vcxk_acknowledge_wait
+ * FUNCTION
+ * wait for acknowledge viewing requests
+ ***
+----------------------------------------------------------------------------*/
+
+int vcxk_acknowledge_wait(void)
+{
+ if (vcxk_driver)
+ {
+ /* use flash resist driver */
+ }
+ else
+ {
+ while (CONFIG_SYS_VCXK_ACKNOWLEDGE);
+ }
+ return 1;
+}
+
+/*----------------------------------------------------------------------------
+ ****f* bus_vcxk/search_vcxk_driver
+ * FUNCTION
+ * search for driver extentions (not implement for U-Boot)
+ ***
+----------------------------------------------------------------------------*/
+
+ulong search_vcxk_driver(void)
+{
+ return 0;
+}
+
+/*----------------------------------------------------------------------------
+ ****f* bus_vcxk/vcxk_display_bitmap
+ * FUNCTION
+ * copies a bitmap (BMP-Format) to the given position
+ * PARAMETER
+ * addr pointer to bitmap
+ * x output bitmap @ columne
+ * y output bitmap @ row
+ ***
+----------------------------------------------------------------------------*/
+
+int vcxk_display_bitmap (ulong addr, int x, int y)
+{
+ bmp_image_t *bmp;
+ unsigned long width;
+ unsigned long height;
+ unsigned long bpp;
+ unsigned long compression;
+
+ unsigned long xcnt,ycnt;
+ unsigned long linewidth;
+
+ unsigned long cp_width;
+ unsigned long cp_height;
+ unsigned char *dataptr;
+ unsigned char *lineptr;
+
+ bmp = (bmp_image_t *) addr;
+ if ((bmp->header.signature[0] == 'B') &&
+ (bmp->header.signature[1] == 'M'))
+ {
+ compression = le32_to_cpu (bmp->header.compression);
+ width = le32_to_cpu (bmp->header.width);
+ height = le32_to_cpu (bmp->header.height);
+ bpp = le16_to_cpu (bmp->header.bit_count);
+
+ dataptr = (unsigned char *) bmp + le32_to_cpu(bmp->header.data_offset);
+
+ if (display_width < (width + x))
+ {
+ cp_width = display_width - x;
+ }
+ else
+ {
+ cp_width = width;
+ }
+ if (display_height < (height + y))
+ {
+ cp_height = display_height - y;
+ }
+ else
+ {
+ cp_height = height;
+ }
+ linewidth = (((width + 7) / 8)+3) & ~0x3;
+ if (cp_height < height)
+ {
+ dataptr=dataptr + linewidth * (height-cp_height);
+ }
+ switch (bpp)
+ {
+ case 1:
+ for (ycnt=cp_height;ycnt>0; ycnt--)
+ {
+ lineptr = dataptr;
+ for (xcnt=0;xcnt<cp_width; xcnt++)
+ {
+ if ((*lineptr << (xcnt % 8)) & 0x80)
+ {
+ vcxk_setpixel(xcnt,ycnt-1,0xFFFFFF);
+ }
+ else
+ {
+ vcxk_setpixel(xcnt,ycnt-1,0);
+ }
+ if ((xcnt % 8) == 7) { lineptr++; }
+ } /* endfor xcnt */
+ dataptr=dataptr + linewidth;
+ } /* endfor ycnt */
+ break;
+ default:
+ printf("Error: %ld bit per pixel not supported by VCxK\n",
+ bpp);
+ return 0;
+ }
+ }
+ else
+ {
+ printf("Error: no valid bmp at %lx\n", (ulong) bmp);
+ return 0;
+ }
+ return 1;
+}
+
+/*----------------------------------------------------------------------------
+ ****f* bus_vcxk/video_display_bitmap
+ ***
+----------------------------------------------------------------------------*/
+
+int video_display_bitmap (ulong addr, int x, int y)
+{
+ vcxk_acknowledge_wait();
+ if (vcxk_display_bitmap (addr,x, y))
+ {
+ vcxk_request();
+ return 0;
+ }
+ return 1;
+}
+
+/*---------------------------------------------------------------------------*/
+/* EOF */
+/*---------------------------------------------------------------------------*/
diff --git a/include/bus_vcxk.h b/include/bus_vcxk.h
new file mode 100644
index 0000000..8d6a25c
--- /dev/null
+++ b/include/bus_vcxk.h
@@ -0,0 +1,36 @@
+/*
+ * (C) Copyright 2005-2009
+ * Jens Scharsig @ BuS Elektronik GmbH & Co. KG, <esw@bus-elektronik.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __BUS_VCXK_H_
+#define __BUS_VCXK_H_
+
+extern int vcxk_init(unsigned long width, unsigned long height);
+extern void vcxk_setpixel (int x, int y, unsigned long color);
+extern int vcxk_acknowledge_wait(void);
+extern int vcxk_request(void);
+extern void vcxk_loadimage(ulong source);
+extern int vcxk_display_bitmap (ulong addr, int x, int y);
+extern void vcxk_setbrightness(unsigned int side, short brightness);
+extern int video_display_bitmap (ulong addr, int x, int y);
+
+#endif
next reply other threads:[~2009-04-22 14:36 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-22 14:36 Jens Scharsig [this message]
2009-07-17 22:16 ` [U-Boot] [PATCH 1/2] new video driver for bus vcxk framebuffers Wolfgang Denk
2009-07-18 16:54 ` Anatolij Gustschin
2009-07-20 6:45 ` Jens Scharsig
2009-07-21 11:08 ` [U-Boot] [PATCH 1/2 V2] " Jens Scharsig
2009-07-23 19:40 ` Wolfgang Denk
2009-07-24 8:09 ` Jens Scharsig
2009-07-24 8:09 ` [U-Boot] [PATCH 1/2 V3] " Jens Scharsig
2009-07-26 11:46 ` Anatolij Gustschin
2009-07-27 3:06 ` [U-Boot] [PATCH 1/2 V3] new video driver for bus vcxkframebuffers Robin Getz
2009-07-27 7:49 ` Anatolij Gustschin
2009-08-09 20:46 ` Wolfgang Denk
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='gsna1j$2tm$2@ger.gmane.org' \
--to=esw@bus-elektronik.de \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.