MiniGUI ial 移植指南
2.1 ial的定义
ial是一个通用的抽象输入接口,可以输入统一的数据的结构,也就是说在MiniGUI的核心代码里输入的数据的格式是固定的,不管输入设备是鼠标 还是触摸屏。简单地讲, 就是不管MiniGUI移植到什么操作系统之上,ial在MiniGUI中的代码是相同的,只需重新写入ial接口到操作系统设备之间的代码,这也就是所 谓的移植,这个类似与操作系统以下的驱动。驱动是为了连接系统内核和各种硬件,而ial是为了连接MiniGU和不同的操作系统,如果MiniGUI不需 要移植,也就没有必要定义ial接口。
2.2 ial中的INPUT数据结构
ial中的INPUT数据结构是移植的关键所在,这个结构体里面有好多指向函数的指针,ial初始化的时候从MiniGUI内核会送出一个 INPUT结构的数据指针, 用户把自己编写的各种函数指针赋给它,这样MiniGUI就可以间接调用用户的函数,这个方法特别类似Linux下驱动的编写方法。这个数据在 src/include/ial.h 定义:
 typedef struct tagINPUT
 {
    char*   id;
    // Initialization and termination
    BOOL (*init_input) (struct tagINPUT *input, const char* mdev, const char* mtype);
    void (*term_input) (void);
    // Mouse operations
    int  (*update_mouse) (void);
    void (*get_mouse_xy) (int* x, int* y);
    void (*set_mouse_xy) (int x, int y);
    int  (*get_mouse_button) (void);
    void (*set_mouse_range) (int minx, int miny, int maxx, int maxy);
    void (*suspend_mouse) (void);
    int (*resume_mouse) (void);
    // Keyboard operations
    int  (*update_keyboard) (void);
    const char* (*get_keyboard_state) (void);
    void (*suspend_keyboard) (void);
    int (*resume_keyboard) (void);
    void (*set_leds) (unsigned int leds);
    // Event
 #ifdef _LITE_VERSION
    int (*wait_event) (int which, int maxfd, fd_set *in, fd_set *out, fd_set *except,
            struct timeval *timeout);
 #else
    int (*wait_event) (int which, fd_set *in, fd_set *out, fd_set *except,
  char mdev [MAX_PATH + 1];
  }INPUT;
可以看到这个结构体里面的内容主要可以分为两大类:键盘和鼠标,还有一个等待函数,这个函数的作用就是从设备中读取数据,包括鼠标和键盘的数据。
2.3 工作流程
MiniGUI初始化的时候会调用ial的初始化函数。以2410的为例:
 BOOL Init2410Input (INPUT* input, const char* mdev, const char* mtype)
 input就是从内核传递出来的INPUT 结构数据,
 mdev是设备的路径,
 mtype是设备类型。
下面是源码:
   BOOL Init2410Input (INPUT* input, const char* mdev, const char* mtype)
   {
      ts = open (mdev, O_RDONLY); //打开 操作系统的设备文件,
    if (ts update_mouse = mouse_update;  //注册自己的update_mouse 函数
    input->get_mouse_xy = mouse_getxy;   // 注册自己的get_mouse_xy 函数
    input->set_mouse_xy = NULL;                     // 触摸屏不需要这个函数,所以指为 NULL
    input->get_mouse_button = mouse_getbutton; //得到鼠标的按钮状态
    input->set_mouse_range = NULL;  //这个一般也没用
    input->wait_event = wait_event;  //这个是必备的,内核就是利用这个函数接收数据。
    mousex = 0;
    mousey = 0;
    ts_event.x = ts_event.y = ts_event.pressure = 0;
    return TRUE;
    }
和这个函数相对应的是void Term2410Input(void),这个类似C++里面的析构函数,在退出的时候作一些释放资源的动作,源码为:
  void Term2410Input(void)
  {
    if (ts >= 0)
        close(ts);  //关闭设备文件
  }
大家可能会问,系统是靠这两个函数把自己的函数传递给系统,那么系统又是怎样调用这两个函数的呢。从这两个函数的名字可以看出,它们不是标准的, 在文件src/ial/ial.c也可以看到
  #ifdef _SMDK2410_IAL
    {"SMDK2410", Init2410Input, Term2410Input},
  #endif
表示:如果打开宏_SMDK2410_IAL并且ial_engine为“SMDK2410”就调用这两个函数,而且ial_engine是在 MiniGUI.cfg里,或者在src/sysres/mgetc-xxx.c文件里被指定的,前者是非内嵌的,后者是内嵌的。
2.4 注册的子函数的功能
static int wait_event (int which, fd_set *in, fd_set *out, fd_set *except, struct timeval *timeout)
由于这个函数同时处理键盘和者鼠标的信息,所以在这个函数里用到了select函数,主要是为了解决i/o复用的问题。wait_event() 主要是读取数据,处理数据,如何处理根据自己的清况去写。
static int mouse_getbutton(void)
源码:
 static int mouse_getbutton(void)
 {
    return ts_event.pressure;
 }
这个函数一般返回鼠标的键值,4代表左键。ts_event.pressure已经在wait_event函数里被处理过了。
static int mouse_update
源码:
 static int mouse_update(void)
 {
     return 1;
  }
对于触摸屏,这个函数一般是直接返回。
static void mouse_getxy
 static void mouse_getxy(int *x, int* y)
 {
    if (mousex  239) mousex = 239;
    if (mousey > 319) mousey = 319;
    *x = mousex;
    *y = mousey;
 }
这个函数返回鼠标的坐标值在wait_event中被处理。
如果需要参考一个完整功能的例子,可以参考 src/ial/native/native.c 文件,它是一个全功能的例子,输入包括键盘和鼠标,而且用户还可以根据自己的要求来设计。

  

MiniGUI ial 移植指南的更多相关文章

  1. Hello China操作系统STM32移植指南(一)

    Hello China操作系统移植指南 首先说明一下,为了适应更多的文化背景,对Hello China操作系统的名字做了修改,修改为"Hello X",或者连接在一起,写为&quo ...

  2. Unity5和WebGL移植指南的一些总结

    对于手游开发者来说,更新版本往往意味着非常复杂的过程,你需要根据反馈做更新.测试.提交然后等待审核,而由于不需要客户端依赖,页游往往是快速测试游戏版本的最佳途径,很多人可能都知道Unity 5可以再不 ...

  3. Hello China操作系统STM32移植指南(三)

    移植到STM32的源代码,可从下列链接下载: http://download.csdn.net/detail/hellochina15/7049909 包含两个包:一个是移植前的Hello China ...

  4. Hello China操作系统STM32移植指南(二)

    移植步骤详解 下面就以MDK 4.72为开发环境,详细说明Hello China内核向STM32的移植过程.MDK 4.72评估版只支持32K代码的编译,这对Hello China的内核来说,裁剪掉一 ...

  5. ucos移植指南

    指定堆栈数据类型(宽度) typedef unsigned int OS_STK; 指定Ucos移植方法3中保存cpu状态寄存器的变量的宽度 typedef unsigned int OS_CPU_S ...

  6. 在秉火STM32F429挑战者开发板上移植Huawei LiteOS指南

    昨天在B站上突然看到了一个短视频,是在正点原子的战舰V3开发板上移植华为的Huawei LiteOS操作系统,就是这个视频:看完鸿蒙OS发布会,试用华为的物联网操作系统Lite OS(B站),于是呢, ...

  7. 初学者的Android移植:在Debian上建立一个稳定的构建环境

    介绍 通过在chrooted环境中设置开发环境,避免依赖冲突和沙箱您的Android开发从您的Debian GNU/Linux系统.这是为通配符类别准备的,因为从源代码构建Android似乎没有在其他 ...

  8. OpenHarmony LiteOS C-SKY指令集移植指北

    摘要:本文介绍在OpenHarmony社区LiteOS-M项目中新增C-SKY指令集的开发流程,以及适配相应qemu工程的方法和步骤,供LiteOS内核相关开发者学习交流. 本文分享自华为云社区< ...

  9. 把php上传sae问题要使用IO

    应用移植指南 一,为什么要移植应用 SAE禁止IO写操作,代码目录不能写入.这意味着普通程序的上传图片.生成缓存等操作都不能在SAE上正常运行,这时候你需要对这些代码进行修改后才能让你的程序运行在SA ...

随机推荐

  1. Linux 中 &、jobs、fg、bg 等命令

    参考  Unix 或 Linux 中 &.jobs.fg.bg 等命令的使用方法 对之前文章的一个补充: linux 命令后台运行 这篇还是比较简单的,稍微一带而过 fg.bg.jobs.&a ...

  2. ASP.NET WebAPI 01-Demo

    WebAPI作为构建RESTful的平台出来有段时间了,加上最近也在用,所以想把自己的心得记录下来.我就以一个简单的增删查改作为开篇. 准备 实体类(Figure)的定义. public class ...

  3. 如何通过Spring读取Properties文件

    1 在Spring中配置文件中, 配置配置文件的引用     <util:properties id="settings" location="/WEB-INF/c ...

  4. 【LOJ】#2306. 「NOI2017」蔬菜

    题解 从后往前递推 如果我们知道了第i天的最优方案和第i天选择的蔬菜,加入第i天选择的蔬菜数量为S,我们只需要减去最小的S - (i - 1) * M 个蔬菜即可 所以我们只要求出最后一天的蔬菜选择 ...

  5. USACO 6.4 The Primes

    The PrimesIOI'94 In the square below, each row, each column and the two diagonals can be read as a f ...

  6. myql root用户远程访问

    虚拟机搭建的lnmp开发环境,mysql在虚拟机正常访问,想在物理机通过数据库管理工具Navicat远程登录,方便建表查询等操作.经网上一查,有答案了. [以下是转载]http://www.cnblo ...

  7. 网络图片嗅探工具driftnet

    网络图片嗅探工具driftnet   图片是网络数据传输的重要内容.Kali Linux内置了一款专用工具drifnet.该工具可以支持实时嗅探和离线嗅探.它可以从数据流中提取JPEG和GIF这两种网 ...

  8. BZOJ 3172 [Tjoi2013]单词 AC自动机Fail树

    题目链接:[http://www.lydsy.com/JudgeOnline/problem.php?id=3172] 题意:给出一个文章的所有单词,然后找出每个单词在文章中出现的次数,单词用标点符号 ...

  9. [LOJ2541][PKUWC2018]猎人杀(容斥+分治+FFT)

    https://blog.csdn.net/Maxwei_wzj/article/details/80714129 n个二项式相乘可以用分治+FFT的方法,使用空间回收可以只开log个数组. #inc ...

  10. 仅100行的JavaScript DOM操作类库

    如果你构建过Web引用程序,你可能处理过很多DOM操作.访问和操作DOM元素几乎是每一个Web应用程序的通用需求.我们我们经常从不同的控件收集信息,我们需要设置value值,修改div或span标签的 ...