注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

deisp的博客

 
 
 

日志

 
 

移植MiniGUI1.33手记 - guanshangming的专栏 - CSDNBlog  

2008-07-28 12:01:08|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 | 

在移植Minigui到远峰的YFDVK-2440-I板的过程中遇到很多问题,在网上的资料又找不能一个完整一点的。故移植后把移植的过程总结一下,希望对大家有点帮助 。MiniGUI1.33版本可以有编译成两种形式,Lite和Threads,按我的理解是Lite方式适用于同时运行多个MiniGUI程序,而Threads适用于目标系统只需要运行单一的MiniGUI程序。mde我理解成桌面管理模块。由于我只需要在目标系统上运行单一的一个程序,所以编译成 Threads的方式,也没有编译mde模块。MiniGUI是一组动态链接库,可以理解成 Windows的动态链接库,移植MiniGUI的过程相当于在宿主机上交叉编译目标机上的库文件。

       宿主机平台使用Red hat Linux9,安装arm-linux-gcc到下面。并修改/etc/profile加入

在飞漫公司下载libminigui-1.3.3.tar.tar、minigui-res-1.3.3.tar.tar。假定保存在~/minigui下面。

释放libminigui-1.3.3.tar.tar,并将文件夹重命名为minigui

cd ~/minigui

tar -zxvf libminigui-1.3.3.tar.tar

mv libminigui-1.3.3 minigui

cd minigui

make menuconfig

system wide options中取消Build MiniGUI-Lite,Use incore (built-in) resource选项。

Gal engine options 图形引擎根据目标机的显示方式确认,我用三星的S3C2410只勾选了 NEWGal engine on Linux FrameBuffer console,其它的不选。

输入引擎我可用触摸屏所以只选了SMDK2410 Touch Screen。

Font Options 中取消选择Var bitmap font ,可能是因为为Bug的原因,当选择了该选项后,编译测试例子的时候总是提示vbfcon …错误。

Image options 我只选择了Includes SaveBitmap-related functions。其它图形格式我没有选择。

Development environment options 我使用Linux平台,arm-linux-gcc编译器,安装路径设置在~/mingui/target

退出配置界面,提示是否保存配置,选是。

make

make install

如果编译成功,将在目标文件夹~/mingui/target下面生成include、lib、etc三个文件夹。

#include

#include

#include

#include

#include

static int TestWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)

       hdc = BeginPaint (hWnd);

        TextOut(hdc,100,100,"hello\n!");

        DestroyMainWindow (hWnd);

        PostQuitMessage (hWnd);

    return DefaultMainWinProc(hWnd, message, wParam, lParam);

void InitCreateInfo(MAINWINCREATE * pCreateInfo)

    pCreateInfo->dwStyle = WS_CAPTION|WS_VISIBLE;

    pCreateInfo->dwExStyle = WS_EX_NONE;

    pCreateInfo->spCaption = "Hello world!";

    pCreateInfo->hMenu = 0;

    pCreateInfo->hCursor = GetSystemCursor(0);

    pCreateInfo->hIcon = 0;

    pCreateInfo->MainWindowProc = TestWinProc;

    pCreateInfo->rx = 319;

    pCreateInfo->by = 239;

    pCreateInfo->iBkColor = PIXEL_lightwhite;

    pCreateInfo->dwAddData = 0;

    pCreateInfo->hHosting = HWND_DESKTOP;

int MiniGUIMain (int argc, const char* argv[])

    MAINWINCREATE CreateInfo;

    SetDesktopRect(0, 0, 240, 320);

    InitCreateInfo(&CreateInfo);

    hMainWnd = CreateMainWindow (&CreateInfo);

    printf ("The main window created.\n");

    if (hMainWnd == HWND_INVALID)

    ShowWindow(hMainWnd, SW_SHOWNORMAL);

    printf ("The main window showed.\n");

    while (GetMessage(&Msg, hMainWnd)) {

    MainWindowThreadCleanup (hMainWnd);

arm-linux-gcc -o guitest guitest.c -I/usr/local/arm/2.95.3/arm-linux/include -lminigui -lpthread –I~/mingui/target/include -L~/mingui/target/lib

调整~/mingui/target/etc/MiniGUI.cfg配置文件。我的如下

mtype=none

上面/dev/touchscreen/0raw是触摸屏的驱动,mtype是键盘驱动,我没有使用。

将~/mingui/target/lib 下面的MiniGUI库文件复制到目标平台的/lib下面,把~/mingui/target/etc下面的MiniGUI.cfg复制到目标平台的/etc下面。这样,MiniGUI就算是在目标机上安装好了。

由于我使用的7”液晶屏是800X480,而1.33版本的MiniGUI不支持这一分辨率。需要修改~/minigui/mingui/src/newgal/fbcon/fbvideo.c文件,加入这个分辨率。

static const GAL_Rect checkres[] = {

    {  0, 0, 1600, 1200 },       

    {  0, 0, 1408, 1056 },       

    {  0, 0, 1280, 1024 },       

    {  0, 0, 1152,  864 },       

    {  0, 0, 1024,  768 },       

    {  0, 0,  960,  720 },       

    {  0, 0,  800,  600 },       

    {  0, 0,  800,  480 },        /* 新添加的

    {  0, 0,  768,  576 },       

    {  0, 0,  640,  480 },       

    {  0, 0,  640,  400 },       

#ifdef USE_VESA_TIMINGS    /* Only tested on Matrox Millenium I */

    {  640,  400, 39771,  48, 16, 39,  8,  96, 2, 2, 0 },   

    {  640,  480, 39683,  48, 16, 33, 10,  96, 2, 0, 0 },

    {  768,  576, 26101, 144, 16, 28,  6, 112, 4, 0, 0 },   

    {  800,  600, 24038, 144, 24, 28,  8, 112, 6, 0, 0 },   

    {  960,  720, 17686, 144, 24, 28,  8, 112, 4, 0, 0 },   

    { 1024,  768, 15386, 160, 32, 30,  4, 128, 4, 0, 0 },   

    { 1152,  864, 12286, 192, 32, 30,  4, 128, 4, 0, 0 },   

    { 1280, 1024,  9369, 224, 32, 32,  4, 136, 4, 0, 0 },   

    { 1408, 1056,  8214, 256, 40, 32,  5, 144, 5, 0, 0 }, 

    { 1600, 1200,/*?*/0, 272, 48, 32,  5, 152, 5, 0, 0 },   

    /* You can generate these timings from your XF86Config file using

       the 'modeline2fb' perl script included with the fbset package.

       These timings were generated for Matrox Millenium I, 15" monitor.

    {  320,  200, 79440,  16, 16, 20,  4,  48, 1, 0, 2 },   

    {  320,  240, 63492,  16, 16, 16,  4,  48, 2, 0, 2 },   

    {  512,  384, 49603,  48, 16, 16,  1,  64, 3, 0, 0 },   

    {  640,  400, 31746,  96, 32, 41,  1,  64, 3, 2, 0 },   

    {  640,  480, 31746, 120, 16, 16,  1,  64, 3, 0, 0 },   

    {  768,  576, 26101, 144, 16, 28,  6, 112, 4, 0, 0 },   

    {  800,  480, 39721,  64, 56, 23, 37, 120, 6, 3, 0 },    /*新添加的是显示每像素时钟

{  800,  600, 20000,  64, 56, 23, 37, 120, 6, 3, 0 },   

像素时钟请参考显示驱动程序,远峰的显示驱动文件是drivers/video/s3c2440fb.c文件。

MiniGUI的触摸屏驱动可能也需要调整。我是用MiniGUI1.62版下面远峰带embest2410.c和embest2410.h拷贝到~/minigui/mingui/src/ial,将替换掉原2410.c和2410.h文件并对2410.c进行修改。如下

#define TS_DEVICE   "/dev/touchscreen/0raw"

#include

/* for data reading from /dev/keyboard/0raw */

static unsigned char state[NR_KEYS];

static

static unsigned char keycode_scancode[MAX_KEYPAD_CODE + 1];

/************************  Low Level Input Operations **********************/

*  Mouse operations -- Event

static

static void mouse_getxy(int *x, int* y)

static

static int wait_event (int which, int maxfd, fd_set *in, fd_set *out, fd_set *except,

                struct timeval *timeout)

static int wait_event (int which, fd_set *in, fd_set *out, fd_set *except,

                struct timeval *timeout)

    if ((which & IAL_MOUSEEVENT) && ts >= 0) {

        if (ts > maxfd) maxfd = ts;

    e = select (maxfd + 1, in, out, except, timeout) ;

    e = select (FD_SETSIZE, in, out, except, timeout) ;

        if (ts >= 0 && FD_ISSET (ts, in)) {

            FD_CLR (ts, in);

            read (ts, data, sizeof (data));

                pos.x = data[1];

                pos.y = data[2];

printf ("posx = %d, posy = %d\n", pos.x, pos.y);

                mousex = (pos.x - 100) * 800 / (931 - 100);

         mousey = (pos.y - 835) * 480 / (191 - 835);  /*这里是修正,说明见下

                printf ("mouse down: pos.x = %d, pos.y = %d\n", pos.x, pos.y);

            pos.b = (data[0] ? 4 : 0);

            retvalue |= IAL_MOUSEEVENT;

BOOL Init2410Input (INPUT* input, const char* mdev, const char* mtype)

    ts = open (TS_DEVICE, O_RDONLY | O_NONBLOCK);

        fprintf (stderr, "EMBEST2410: Can not open touch screen!\n");

    input->update_mouse = mouse_update;

    input->get_mouse_xy = mouse_getxy;

    input->set_mouse_xy = NULL;

    input->get_mouse_button = mouse_getbutton;

    input->set_mouse_range = NULL;

   input->wait_event = wait_event;

    pos.x = pos.y = pos.b = 0;

#endif

坐标修正值可以打开MiniGUI的调试取得,在Make menuconfig时,system wide options里有打开调试信息的选项。

 | 



引文来源  移植MiniGUI1.33手记 - guanshangming的专栏 - CSDNBlog

----------------------------
一键转贴,快速捕捉生活精彩,赢每周好礼!查看活动首页>>

  评论这张
 
阅读(209)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017