Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92736
  • 博文数量: 16
  • 博客积分: 1466
  • 博客等级: 上尉
  • 技术积分: 187
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-27 11:48
文章分类

全部博文(16)

文章存档

2012年(1)

2011年(2)

2010年(5)

2008年(8)

我的朋友

分类:

2008-11-09 13:57:44


    我的链接中“如何用MiniGUI设计小键盘输入”讲解了如何编写自己的小键盘并注册到minigui中,而我要觉得根本就不必那么麻烦。我用的是libminigui-1.3.0,首先我们要正确配置minigui,由于我是修改minigui自带的ipaq引擎,所以我们只需要正确映射我们的键值,并在交叉编译之前配置输入引擎为ipaq,就可以识别我们的小键盘了,这里我就不讲如何编写小键盘的驱动了。我的资源中“key.tar.gz”为我的小键盘驱动,“ial-of-minigui.tar.gz”为我配置的minigui键盘输入引擎。
 

<1>首先修改libminigui/src/ial/ipaq.c ,
 下面我修改的部分源代码:
 其中在below 和 above之间是我添加或取消注释的。
#define KEY_RELEASED   0x80
#define KEY_NUM  0x0f//这里我修改了原程序,因为我只有16个键值,所以4位就够了,原程序为:0x7f
#define MAX_KEY_EVENTS 4
上面的宏定义在ipaq.h中定义

ipaq.c
#include "ial.h"
#include "ipaq.h"
#include "common.h"
static unsigned char btn_state=0;
  .
  .
  .
static int keyboard_update(void)
{
    char *statinfo;
    int status;
    unsigned char key;
    //Attention!
//below
    statinfo = (btn_state & KEY_RELEASED)? "UP":"DOWN";//判断按键是按下还是抬起
    status = (btn_state & KEY_RELEASED)? 0 : 1;//获得bit状态,和上面一样,看你用哪个
    key = btn_state & KEY_NUM;//获得键值
//above
#ifdef _DEBUG
    fprintf(stderr, "key %d is %s", key, statinfo);
#endif
//bellow
switch (key)
    {
    case 0:
        state[SCANCODE_0] = status;//case X state[Y]
    break;                         //其中X为我键盘传过来的数值
    case 1:                        //Y为common.h中系统默认的键值
        state[SCANCODE_1] = status;//有个说Y可以自己设定,不过我觉得不行
    break;                         //最起码像"回车"这种事件minigui就无法捕捉了
    case 2:
        state[SCANCODE_2] = status;
    break;
    case 3:
        state[SCANCODE_3] = status;
    break;
    case 4:
        state[SCANCODE_4] = status;
    break;
    case 5:
        state[SCANCODE_5] = status;
    break;
    case 6:
        state[SCANCODE_6] = status;
    break;
    case 7:
        state[SCANCODE_7] = status;
    break;
    case 8:
        state[SCANCODE_8] = status;
    break;
    case 9:
        state[SCANCODE_9] = status;
    break;
    case 10:
        state[SCANCODE_A] = status;
    break;
    case 11:
        state[SCANCODE_B] = status;
    break;
    case 12:
        state[SCANCODE_C] = status;
    break;
    case 13:
        state[SCANCODE_D] = status;
    break;
    case 14:
        state[SCANCODE_BACKSPACE] = status;
    break;
    case 15:
        state[SCANCODE_ENTER] = status;
    break;
    }
    return NR_KEYS;
    //return 1;
}

static const char* keyboard_getstate(void)
{
    return (char *)state;
}

#ifdef _LITE_VERSION //select查询函数,这就要求你的键盘驱动要有poll方法和read方法
static int wait_event (int which, int maxfd, fd_set *in, fd_set *out, fd_set *except,
                struct timeval *timeout)
#else
static int wait_event (int which, fd_set *in, fd_set *out, fd_set *except,
                struct timeval *timeout)
#endif
{
    fd_set rfds;
    int    retvalue = 0;
    int    e;

    if (!in)
    {
        in = &rfds;
        FD_ZERO (in);
    } //判断是不是键盘事件
  if ((which & IAL_KEYEVENT) && btn_fd >= 0)
     {
        FD_SET (btn_fd, in);
#ifdef _LITE_VERSION
        if(btn_fd > maxfd) maxfd = btn_fd;
#endif
    }
     //判断是不是鼠标事件
  if ((which & IAL_MOUSEEVENT) && ts >= 0)
    {
        FD_SET (ts, in);
#ifdef _LITE_VERSION
        if (ts > maxfd) maxfd = ts;
#endif
    }
   

#ifdef _LITE_VERSION
    e = select (maxfd + 1, in, out, except, timeout) ;
#else
    e = select (FD_SETSIZE, in, out, except, timeout) ;
#endif

    if (e > 0) { //键盘事件,读取键值
      if (btn_fd >= 0 && FD_ISSET(btn_fd, in))
           {
            unsigned char key;
            FD_CLR(btn_fd, in);
            read(btn_fd, &key, sizeof(key));
            btn_state = key;
            retvalue |= IAL_KEYEVENT;
           }
               //鼠标事件,读取键值
        if (ts >= 0 && FD_ISSET (ts, in))
        {
            FD_CLR (ts, in);
            pos.x=0;
            pos.y=0;
            // FIXME: maybe failed due to the struct alignment.
            //read (ts, &pos, sizeof (POS));
           
            //qiyao add code
            read(ts,&tsPos,sizeof(tsEvent));
            //transform the data
            pos.b=(unsigned short)tsPos.pressure;
            pos.x=(unsigned short)tsPos.x;
            pos.y=(unsigned short)tsPos.y;
            pos.pad=0;//i dont know the meaning of pad

           printf("x=%d,y=%d,b=%x\n",pos.x,pos.y,pos.b);
           
               
            //if (pos.x != -1 && pos.y != -1) {
            if (pos.b > 0)
            if(tsPos.pressure>0)
            {
                mousex = pos.x;
                mousey = pos.y;
            }
            //}
#ifdef _DEBUG
            if (pos.b > 0)
            if(tsPos.pressure>0)
            {
                printf ("mouse down: pos.x = %d, pos.y = %d\n", pos.x, pos.y);
            }
#endif
            pos.b = ( pos.b > 0 ? 4:0);
            retvalue |= IAL_MOUSEEVENT;
        }

    } else if (e < 0) {
        return -1;
    }

    return retvalue;
}

BOOL InitIPAQInput (INPUT* input, const char* mdev, const char* mtype)
{
    ts = open ("/dev/h3600_ts", O_RDONLY);
    if (ts < 0)
    {
        fprintf (stderr, "MX1: Can not open touch screen!\n");
        return FALSE;
    }
//now just open it ,but do nothing to it
    btn_fd = open ("/dev/key", O_RDONLY);
    if (btn_fd < 0 ) //注意这里,要正确设置你的键盘路径
    {
        fprintf (stderr, "MX1: Can not open button key!\n");
        return FALSE;
    }

    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;
//now ignore the keyborad
//bellow
    input->update_keyboard = keyboard_update;//初始还键盘更新函数
    input->get_keyboard_state = keyboard_getstate;//初始还键盘获取状态函数
    input->set_leds = NULL; //这些是minigui输入引擎提供的接口函数
//above
  input->wait_event = wait_event;
    mousex = 0;
    mousey = 0;
    pos.x = pos.y = pos.b = 0;
    return TRUE;
}

void TermIPAQInput (void)
{
    if (ts >= 0)
        close(ts);
    if (btn_fd >= 0)
        close(btn_fd);
}

#endif /* _IPAQ_IAL */
  
    
<2>正确配置minigui
  make menuconfig
    System wide options  --->
      [*] Build MiniGUI-Lite
    IAL engine options  --->  
     [*] iPAQ H3600 (also H3800)
    Font options  --->
     [ ] Var bitmap font//注意这项不能选
    Image options  --->   
     [*] Includes SaveBitmap-related functions                   
     [ ] PCX file support                               
     [ ] LBM/PBM file support                                 
     [ ] TGA file support                                         
     [*] GIF file support                                          
     [*] JPG file support//注意这些图形格式是必选的,不然会有问题,如果系统没有这些    
     [*] PNG file support//库的话可以从新安装一下
   Development environment options  ---> 
     (Linux) platform 
     (arm-linux-gcc) compiler
     (glibc) libc  //这里一定要配置正确,默认的是PC版本
     --- Installation options
         install prefix: "/usr/local/arm-linux/arm-linux"//编译完输出路径
    
     
阅读(2046) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-11-01 17:44:51

非常感谢分享!

chinaunix网友2010-05-25 15:52:08

大虾 !驱动在在哪里!

chinaunix网友2009-03-21 15:46:17

请问资源在哪 驱动和引擎