塔希米德
我最近一直在康奈尔机器人项目团队(该项目的联合主持人)使用英特尔爱迪生 美国英特尔康奈尔杯比赛)。基于我以前对嵌入式系统的了解,我开始学习在Linux上使用和编程的知识。使用的发行版是Yocto(有关所有信息,请参见 英特尔爱迪生网站)。
我们工作的原型之一是使用无线Playstation 4控制器移动用户界面。在Linux上使用输入设备的概念并不复杂,但是对于刚接触Linux编程的人来说,这可能是艰巨的任务。我决定写这篇文章,给出在嵌入式Linux平台上使用输入设备的示例。我正在演示的演示应用程序使用USB鼠标作为连接到Intel Edison的输入设备。
先决条件
我假设您有一块闪动的Intel Edison主板,知道如何(通过USB COM端口或SSH)访问该终端,并已安装Eclipse IDE并可以对其进行编程。当然如果你不这样做’没有IDE,您可以通过终端编译代码,而我’最后告诉您如何做。如果您使用的平台不是Edison,则细节可能会有所变化,但总体思路是相似的。此外,假定您对C编程有基本的了解。
连接USB鼠标时,首先要注意的是,必须将板上的开关(标为SW1)从面向microUSB端口的默认位置切换到USB-A连接器。
的Linux中的设备驱动程序抽象化了与输入设备的接口的底层细节,并通过可与文件接口的文件描述符显示输入。如前所述,可以在Linux环境中查看和读取输入设备,就像文件一样。输入设备出现在/ dev / input目录中。最初,在插入鼠标之前,您可以看到有一个event0和一个event1文件。连接鼠标后,您可以看到一个event2文件。


通过读取event2文件,可以读取鼠标数据。要从文件中转储数据,可以使用od命令(手册页:http://man7.org/linux/man-pages/man1/od.1.html)
例如,以十六进制格式查看输出转储:

当您按Ctrl + C’re satisfied you’我已经看到足够的垃圾场了。
现在要理解此输入,对其进行解密并有意义地使用它,我编写了一个简单的C应用程序。一世’在提供代码之前,将带您逐步完成开发过程。
首先要做的是将这些参考作为内核文档的一部分:
//www.kernel.org/doc/Documenta…vent-codes.txt
//www.kernel.org/doc/Documenta…nput/input.txt
另外,您应该浏览linux / input.h头文件。您可以在这里找到副本:
http://lxr.free-electrons.com/source…put.h?v=2.6.38
您也可以将其键入Eclipse,在键盘上按Ctrl,然后在标题文件名上单击鼠标左键以查看文件本身。
从内核文档和input.h文件中,您应该发现发生了数据输出,因此每次事件发生时,都可以“fit”转换为以下结构(在linux / input.h中定义):
您可以将它们与看到的值进行比较,看它们是否有意义(它们应该!)。然后,您可以进行模制以读取基于这些的不同代码,类型和值。这是我在演示应用程序中所做的,应该对此进行足够的评论,以使您理解。 (很显然,如果您有任何疑问,请在评论部分告诉我!)
我没有的最后一件事’还没有介绍(但是您可能已经知道)如何读取文件。我已经使用低级文件IO函数打开并阅读:
该演示应用程序将打印出描述鼠标运动,滚轮运动以及左,中(滚轮)和右按钮按下的消息。参见下面的图4。
典型输出如下所示:

不使用Eclipse IDE进行编程
正如我之前提到的,即使您不’如果没有Eclipse IDE(您应该得到),您仍然可以对Edison进行编程。您可以通过几种方法进行操作。
首先,您可以将代码从文本编辑器复制粘贴到终端上(使用PuTTY,鼠标右键单击即可粘贴),甚至可以在终端上编写代码。此外,您可以使用WinSCP之类的程序来传输C文件。注意Windows文件,因为行以换行符和回车符结尾,而在Linux上,它们仅以换行符结尾。如果使用文本编辑器打开文件,则回车符将显示为^ M。将文件放置在Edison文件系统上的某个位置后,将其CD到该文件夹中并进行编译:
海湾合作委员会<output name> <source file name>
eg: 海湾合作委员会mouse mouse.c
然后,您可以运行它:
例如:./ mouse
我试图使代码不言自明,并在此处提供足够的背景细节,以使您理解’继续。通过更改代码和类型检查,您可以将其扩展到其他设备。希望你’会发现这很有用!让我知道你的想法!
关于作者
Tahmid是一位专门从事微控制器和电力电子学的工程师。他是以下组织的积极成员 EDAboard.com 论坛已超过八年,并撰写了几篇有关嵌入式系统,电源系统和模拟电路的文章。您可以从Tahmid找到更多文章 这里.
在哪里可以找到演示代码?我可以’似乎无法在此页面上找到它。它’可能就在我的面前,但为了我的生命,我可以’t see it.
谢谢
我认为打印输出是读者的功课。
反正干得好!