From bcb631ee21ebb4952337ed46d996dadcab1668cd Mon Sep 17 00:00:00 2001 From: Vincent Wei Date: Wed, 17 Apr 2019 18:17:05 +0800 Subject: [PATCH] CommLCD engine --- Comm-Engines.md | 114 +++++++++++++++++++++++++++++++++++++++++++++--- Home.md | 4 +- 2 files changed, 110 insertions(+), 8 deletions(-) diff --git a/Comm-Engines.md b/Comm-Engines.md index f323fc7..bb3bc68 100644 --- a/Comm-Engines.md +++ b/Comm-Engines.md @@ -1,6 +1,7 @@ # Using CommLCD NEWGAL Engine and Comm IAL Engine -_How to define external stubs to implement your CommLCD engine and Comm IAL engine outside MiniGUI Core._ +_How to define external stubs to implement your CommLCD engine and +Comm IAL engine outside MiniGUI Core._ ## Introduction @@ -17,11 +18,112 @@ two engines. ## Key Points * Use MiniGUI 3.2.2 or later. -* Enable the engines when configuring MiniGUI: `--enable-videocommlcd` and `--enable-commial`). -* Implement the external stubs in your app side (`#include `). -* Specify `gal_engine=commlcd` and `ial_engine=comm` in your runtime configuration. +* Enable the engines when configuring MiniGUI: + * `--enable-videocommlcd`: enable CommLCD NEWGAL engine. + * `--enable-commial`: enable Comm IAL engine. + * `--with-targetname=external`: define target name to be `external`. +* Implement the external stubs in your app side: + * `#include ` +* Specify the following runtime configuration options: + * `gal_engine=commlcd`: use CommLCD NEWGAL engine. + * `ial_engine=comm`: use comm IAL engine. * Sample code: [`commlcd` in `mg-samples`](https://github.com/VincentWei/mg-samples/tree/master/commlcd) -## +## Functions to be Implemented -TBC +In MiniGUI header file ``, we declare the function +prototypes you need to implement for these two engines. You must +include this header in your C source file(s), and implement all +of the functions correctly. + +In the `commlcd` sample of `mg-samples` package, the file `commlcd_ops.c` +implements the functions for CommLCD NEWGAL engine, and the file `comminput_ops.c` +implements the functions for Comm IAL engine: + +* [`commlcd_ops.c`](https://github.com/VincentWei/mg-samples/blob/master/commlcd/commlcd_ops.c) +* [`comminput_ops.c`](https://github.com/VincentWei/mg-samples/blob/master/commlcd/comminput_ops.c) + +The former implementation does not connect to any real device; it creates +an anonymous memory map and returns the address of the memory map as +the frame buffer to MiniGUI. However, when there is a update, this engine +will save the whole frame buffer content to a Windows bitmap file. So you +can observe the behaviors of the engine. + +The latter implementation gives you a sample which gets input events +from a touch screen on Linux, and passed the events to MiniGUI. If you +have no such device, the engine will fails to initialize. + +### CommLCD NEWGAL engine + +#### Initializing the engine + +`__commlcd_drv_init` will be called when initializing your +CommLCD engine implementation. In the `commlcd` sample, it does nothing +and just returns zero: + + int __commlcd_drv_init (void) + { + return 0; + } + + +Note that, all external methods for CommLCD engine should return zero for success. + +#### Setting video mode + +`__commlcd_drv_getinfo` will be called when MiniGUI trying to set the video +mode according to your settings in the MiniGUI runtime configuration, e.g., +`defaultmode=240x320-32bpp`. + +In our sample, it creates the anonymous memory map by calling `mmap` system +call and returns the video information via `struct commlcd_info* li`: + + int __commlcd_drv_getinfo (struct commlcd_info *li, int width, int height, int depth) + { + sg_fb = (BYTE*) mmap (0, FB_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (sg_fb == MAP_FAILED) { + perror ("Failed calling __commlcd_drv_getinfo: "); + return -1; + } + + li->type = COMMLCD_TRUE_ARGB8888; + li->height = SCREEN_HEIGHT; + li->width = SCREEN_WIDTH; + li->bpp = COLOR_DEPTH; + li->pitch = SCREEN_WIDTH * BYTES_PER_PIXEL; + li->update_method = COMMLCD_UPDATE_ASYNC; + li->fb = sg_fb; + return 0; + } + +You need fill the all fields of `struct commlcd_info* li` by the correct +values: + +* `type`: The video mode type. Currently, CommLCD supports the following modes: + - `COMMLCD_PSEUDO_RGB332`: 256-color video mode. + - `COMMLCD_TRUE_RGB555`: RGB555 15-bit video mode. + - `COMMLCD_TRUE_RGB565`: RGB565 16-bit video mode. + - `COMMLCD_TRUE_RGB888`: RGB888 24-bit video mode. + - `COMMLCD_TRUE_RGB0888`: RGB0888 32-bit video mode (without alpha component). + - `COMMLCD_TRUE_ARGB1555`: RGB1555 16-bit video mode (the alpha component use 1 bit only). + - `COMMLCD_TRUE_ARGB8888`: RGB8888 32-bit video mode (the alpha, red, green, blue components all use 8 bits). +* `height`: The vertical resolution in pixels. +* `width`: The horizontal resolution in pixels. +* `bpp`: The color depth in bits per pixels. Actually, this field is a redundancy, + because the type already contains the depth information. +* `pitch`: The length in bytes of one scan line. Generally, it should be a + times of 4, i.e., the address of each scan line should be 4-byte aligned. +* `update_method`: The update method when there is a dirty rectangle, can be + one of the following values: + - `COMMLCD_UPDATE_NONE`: do not call `__commlcd_drv_update` (see below). + - `COMMLCD_UPDATE_SYNC`: call `__commlcd_drv_update` synchronously. + - `COMMLCD_UPDATE_ASYNC`: call `__commlcd_drv_update` asynchronously. +* `fb`: The address of the frame buffer. + +### Comm IAL engine + +## Summary + +## References + +* [GAL and IAL Engines](http://wiki.minigui.com/twiki/bin/view/Products/MiniGUIPGV32Part5Chapter03) diff --git a/Home.md b/Home.md index 5248322..7d9dabe 100644 --- a/Home.md +++ b/Home.md @@ -32,8 +32,6 @@ We call these documents "MiniGUI Supplementary Documents". ## Supplementary Documents -* [Using SyncUpdateDC to Reduce Screen Flicker](https://github.com/VincentWei/minigui/wiki/Sync-Update) - - How to use MiniGUI's synchronous update mechanism to reduce screen flicker. * [Using CommLCD NEWGAL Engine and Comm IAL Engine](https://github.com/VincentWei/minigui/wiki/Comm-Engines) - How to define external stubs to implement your CommLCD engine and Comm IAL engine outside MiniGUI Core. @@ -42,6 +40,8 @@ We call these documents "MiniGUI Supplementary Documents". your MiniGUI apps. * [Using Enhanced LOGFONT and DEVFONT Interfaces](https://github.com/VincentWei/minigui/wiki/Enhanced-Font) - Understand and use enhanced LOGFONT and DEVFONT intefaces of MiniGUI 4.0. +* [Using SyncUpdateDC to Reduce Screen Flicker](https://github.com/VincentWei/minigui/wiki/Sync-Update) - + How to use MiniGUI's synchronous update mechanism to reduce screen flicker. * [Laying out, Shaping, and Rendering Text in Complex/Mixed Scripts](https://github.com/VincentWei/minigui/wiki/Complex-Scripts) - How to lay out, shape, and render text in complex or mixed scripts on MiniGUI 4.0. * [Writing MiniGUI Apps for 64-bit Platforms](https://github.com/VincentWei/minigui/wiki/64-bit-Platform) -