当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]基于Android平台的鼠标的设计方案

摘要:针对当前基于Android 平台的电子产品的市场需求,以谷歌发布的Gingerbread 源码为软件平台,以东南大学国家专用集成电路系统工程技术研究中心设计的基于国产CPU 的sep6200 芯片为硬件平台,在分析Android 输入系统框架的基础上,设计并实现了软件鼠标和硬件鼠标功能,方案设计灵活。对于手持终端设备来说,鼠标的支持大大提高了用户的体验性能,具有一定的市场应用价值。

随着嵌入式系统产业的高速发展,智能手持终端设备的操作系统也越来越多样化。目前市场上倍受广大用户青睐的是Google 的Android、微软的WindowMobile、诺基亚的Symbian、RIM 的黑莓和苹果的iOS。

Android 是Google 于2007 年11 月05 日宣布的基于Linux 平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。凭借开放源码完全免费等特性,其在嵌入式领域异军突起,如今占据智能手持终端设备领域的半壁江山。

以Android 系统为搭载平台的电子产品越来越流行,特别是平板电脑的出现,使用户对产品硬件配置和体验性能方面的要求越来越高。而Android 本身提供的交互方式仅限于按键,触摸屏和轨迹球,无法满足用户的需求。针对其输入装置的不足,本文实现了一种用户熟悉的交互方式:鼠标,其无疑是最完美的人机交互方式。鼠标的实现使Android 系统应用在其他领域成为可能,并同时提高了Android产品的市场竞争力。

1 输入系统

1. 1输入系统驱动框架

如图1 所示,Android 输入系统中的驱动框架由事件处理层(Event Handler),核心层(Input Core)和驱动层(Input Driver)三部份组成。

Event Handler 用于用户空间获取输入事件。用户空间打开输入设备的设备节点,然后对节点进行读写操作以获得鼠标移动信息,或者键盘信息等等。这里对设备节点的文件操作函数就是由该层提供;Input driver 具体设备的驱动;Input Core 负责管理所有的资源并连接驱动层和事件处理层。

图1 输入系统驱动框图

1. 2 输入系统上层框架

随着Android 系统的不断升级,其输入系统框架也发生变化,相对于2. 1 版本来说,Gingerbread 的输入系统比较复杂,同时创建了三个线程,并用了匿名共享内存机制,且很多在Java 层的数据处理都放到了c++底层,然而这样却可以使性能明显增加,节省系统资源。

如图2 所示,WindowManagerService 创建了三个线程:

InputReaderThread 通过EventHub 读取输入事件,并通过不同事件类型的InputMapper 进行数据处理,然后放到输入事件队列;InputDispatcherThread 将队列中的输入事件取出通过InputPublisher 放到匿名共享内存里;PolicyThread 管理当前窗口显示等。

图2 输入系统上层框图

InputPublisher 和InputCONsumer 通过InputChannel进行双向通信。当InputPublisher 把输入事件放到共享内存时会通知InputConsumer 有事件传入,InputConsumer 收到通知后会从共享内存取出事件数据,通过InputQueue 传给ViewRoot,ViewRoot 对事件进行分类后传给当前具有焦点的View(Focus View)处理。InputConsumer 处理完事件后会通知InputPublisher 已处理完成,InputPublisher 接到通知后会开始向共享内存传输下一次输入事件。

2 鼠标实现

无论是软鼠标还是硬鼠标,其实现机制都是一样的。都需要读取事件进行数据处理,唯一不同的是当实现鼠标移动时,软鼠标是把鼠标坐标值传给上层,而硬鼠标则是把鼠标坐标值传给驱动。鼠标事件的读取和处理过程的实现:

(1)在EventHub 中对鼠标事件加鼠标类型标志位;

(2) 在InputReader 中创建MouseInputMapper类,该类主要对鼠标的数据进行处理,主要成员函数定义如下:

编写该类的成员函数,实现鼠标事件数据的处理,并把该类的实例化对象与鼠标事件对应起来。

这样当输入事件是鼠标事件时就可以调用对应的处理函数。

2. 1软鼠标实现

上面已经实现了鼠标事件的处理,这里只要绘制鼠标并把把鼠标坐标传给绘制的鼠标即可。

(1)在WindowManagerService 中绘制鼠标,并实现设置鼠标位置的函数;(2)从上面分析可知, 最终的事件会发送到ViewRoot 进行分类,所以在这里当输入事件是鼠标事件时,利用进程间通信机制把鼠标的坐标值传给鼠标,设置其正确位置。[!--empirenews.page--]

2. 2硬鼠标实现

本文的硬件平台sep6200 是一款定位于手持视频播放设备、卫星导航产品的高性能芯片。其LCDC 支持16bpp、18bpp、24bpp 格式rgb 图像显示;支持yuv420、yuv422、yuv444 格式视频图像显示;支持1080p 高清视频输出;支持HDMI 输出接口;支持最多四层Overlay 透明显示:基层(800× 600,24bpp/18bpp/16bpp rgb 图像), 覆盖层1 ( 800 × 600,yuv422/420/424 视频图像), 覆盖层2 (800 × 600,24bpp/18bpp/16bpprgb 图像), 鼠标层(1bpp/2bpp图像)。因此通过为鼠标层分配内存并实现相应的ioctl 操作即可实现硬件鼠标。下面介绍的是整个Overlay 驱动的实现,包括鼠标的实现。

2. 2. 1 Overlay 驱动实现

Overlay 驱动的核心结构体是platform_driver 和miscdevice,他们定义如下:

其中sep6200_overlay_fops 的定义如下:

结构体sep6200 _overlay_misc_device 用于为Overlay 创建一个字符设备节点以便与用户空间通信,而sep6200_overlay_fops 是对该设备节点的操作函数,我们要对这个结构体进行填充并编写所有与Overlay 相关的功能函数,以使Overlay 层能够正常工作。

对于鼠标层来说最主要的是在sep6200_overlay_probe 中调用dma_alloc_writecombine( )为鼠标层分配内存以及在sep6200_overlay_ioctl 中实现两个ioctl 操作:

OVERLAY_SHOW_CURSOR显示鼠标,即画鼠标图形并复制到上面分配的内存中。

OVERLAY_SETPOS_CURSOR设置鼠标位置。

2. 2. 2硬鼠标上层实现

鼠标驱动实现后,用户空间就可以调用相应的接口操作实现鼠标功能。由于硬件鼠标的坐标值只需要传给底层Overlay 驱动即可,所以主要是在上面已经实现好的MouseInputMapper 类的构造函数里调用OVERLAY_SHOW_CURSOR 显示鼠标,在其成员函数sync ( nsecs _ t when) 处理数据之后调用OVERLAY_SETPOS_CURSOR 把鼠标坐标值传给Overlay 驱动的鼠标层,配置相应的寄存器设置鼠标的位置,就可以实现硬鼠标的精确移动。

2. 3 软鼠标和硬鼠标的对比

由上面实现可知,软鼠标和硬鼠标的实现机制是一样的:绘制鼠标和设置鼠标位置。但是软鼠标由软件来绘制,性能比较差,且消耗CPU 资源;而硬鼠标完全由硬件控制,性能高。通过实验验证,当玩大型游戏或者播放视频时,软鼠标反应迟钝,有时几乎不动,而硬鼠标则反应灵敏,移动位置精确。

3 总结

本文面向当前Android 手持终端市场,充分考虑到了实际产品的需要,有针对性地提出了实现鼠标的两种不同方案:软鼠标和硬鼠标,并指出了其优缺点。这两种方案根据不同的硬件平台有不同的应用。本文基于实际产品研发,项目中的芯片支持硬鼠标功能,采用了硬鼠标方案,产品具有一定的市场竞争力。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

其他电脑(比如安卓手机/平板电脑)的屏幕坏了,你可能想在安排维修之前紧急访问一些东西。你可以使用android的USB OTG功能(是的,几乎每个android都支持这个功能,你可以将鼠标和键盘连接到它)。

关键字: USB 鼠标 Android 树莓派

Google 宣布与中国 AR 科技公司 XREAL 达成深度战略合作,联合推出全球首款专为 Android XR 平台打造的旗舰级 AR 眼镜 Project Aura。

关键字: Google XREAL Android XR眼镜 AR

继停止维护AOSP开源项目后,谷歌母公司Alphabet近日被曝在其安卓系统(Android)、Pixel手机以及Chrome浏览器等部门裁员数百人。这一举措引发了业界的广泛关注,也引发了对谷歌未来业务布局的诸多猜测。

关键字: 谷歌 AOSP Android 裁员

在本教程中,我们将使用Capacitor 6、Angular和TypeScript构建一个Android应用程序,该应用程序通过串行端口连接到BleuIO USB加密狗。该应用程序允许用户直接从Android设备发送和接...

关键字: Android USB 电容器 BLE设备

早前媒体报道谷歌将停止维护Android开源项目(AOSP),将Android开发全面转向内部闭源分支,目前这一消息已经得到谷歌官方确认。

关键字: 谷歌 Android 开源

本项目演示了如何通过OTG (on - go) USB在Android设备上使用BleuIO USB加密狗作为串行端口。使用电容器6和@adeunis/电容器-串行插件,我们建立串行连接,发送AT命令,并实时读取响应。该...

关键字: 电容器 Android 传感器 微控制器 嵌入式系统

在Linux操作系统中,Android Debug Bridge(ADB)是一个功能强大的命令行工具,它允许开发者在计算机和Android设备之间建立通信,从而进行调试、管理、安装应用等操作。本文将详细介绍在Linux系...

关键字: Linux系统 Android Debug ADB

随着Android操作系统的进步,智能手机的使用日益增加。随后,有报道称,恶意个人和黑客利用 Android 提供的漏洞来访问用户珍视的数据。例如,此类威胁包括 2021 年针对 Android 设备发布的 Flubot...

关键字: Android 恶意软件

在本教程中,我们将构建超出电子领域的东西。作为一名电子工程师,我们大多数人都想为我们的物联网应用程序构建一些用户界面,在大多数情况下,Android应用程序将是用户与我们的物联网设备交互的正确选择。所以,如果你想为你的物...

关键字: 物联网 Android
关闭