`
carmark
  • 浏览: 160531 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
社区版块
存档分类
最新评论

嵌入式Linux游戏开发一

阅读更多
1、引言

  Linux由于其具有内核强大且稳定,易于扩展和裁减,丰富的硬件支持等诸多优点,在嵌入式系统中得到了广泛的应用。很多嵌入式Linux系统,特别是一些具有与用户强交互的嵌入式系统,往往需要配备一个特殊键盘,此时开发者需要根据实际情况,为自己的特殊键盘编写驱动程序。

  2、Linux键盘驱动简介

  Linux中的大多数驱动程序都采用了层次型的体系结构,键盘驱动程序也不例外。在Linux中,键盘驱动被划分成两层来实现。其中,上层是一个通用的键盘抽象层,完成键盘驱动中不依赖于底层具体硬件的一些功能,并且负责为底层提供服务;下层则是硬件处理层,与具体硬件密切相关,主要负责对硬件进行直接操作。键盘驱动程序的上层公共部分都在driver/keyboard.c中。该文件中最重要的就是内核用EXPORT_SYMBOL这个宏导出的handle_scancode函数。handle_scancode完成的功能是:首先将扫描码转换成键码,接着根据shift, alt等扩展键的按下情况将键码转换成目标码,一般情况下是ASCII码,最后将该ASCII码放到终端设备的缓冲区中,并且调度一个tasklet负责将其在显示器上回显出来。可以看出,这个函数完成的是键盘驱动程序中最核心的一些工作,而这些核心的逻辑功能是不依赖于底层硬件的,所以可以将其独立出来,并且导出给底层的硬件处理函数调用。在这个文件中还定义了其它几个回调函数,它们由键盘驱动程序中的上层公共部分调用,并由底层硬件处理函数实现。比如kbd_init_hw, kbd_translate, kbd_unexpected_up等等。其中kbd_translate由handle_scancode调用,负责将扫描码转换成键码;键盘驱动程序的底层硬件处理部分则根据不同的硬件有不同的实现。例如PC平台上标准键盘的底层硬件处理函数都集中在driver/Pc_keyb.c中。这个文件包括了键盘中断处理函数keyboard_interrupt,扫描码到键码转换函数pckbd_translate等其他一些与底层硬件密切相关的函数。

  在这种体系结构下,要添加一块特殊键盘到系统中就显得格外清晰。开发者只需为其编写驱动程序中的底层硬件处理函数,就可以将该键盘驱动起来。一般说来,底层硬件处理函数中最重要的工作就是在键盘中断处理中获取被按下键的扫描码,并且以它为参数调用handle_scancode,该扫描码可以自己定义,但它必须唯一地标识出被按下键在键盘上的位置。此外,开发者还需要提供对应的从自定义扫描码到键码的转换函数kbd_translate。具体的键码转换,将目标码放到终端的输入缓冲区,以及回显等工作都由handle_scancode负责完成。在此我们也可以看出,内核导出函数handle_scancode在整个键盘驱动程序中,起着将上层通用抽象层和底层硬件处理层粘和起来的关键作用。

  3、应用实例

  下面我们将以一个具体的应用实例来说明在嵌入式Linux系统中给一个特殊键盘编写驱动程序的具体过程。

  3.1 硬件模块描述

  本系统的构建选用了三星公司的S3C2410开发板作为硬件平台。特殊键盘的硬件模块主要由两个SN74hc164芯片和一个4行16列的矩阵扫描电路构成。SN74hc164是一个8位的串形输入并形输出移位寄存器,它的内部由8个D触发器串联而成。其工作原理简单说来是这样的,SN74hc164芯片在时钟CLK脉冲的上升沿将A,B引脚上的串形输入在8个时钟脉冲以后并行输出到输出引脚QA到QH。其真值表见图1所示。

  两个SN74hc164芯片先串联后,将它们的CLK引脚和CLR引脚分别接到S3C2410开发板的GPB2和GPB4端口上,并且将第一个SN74hc164芯片的A,B引脚接到开发板的GPB1端口上,这三个GPIO端口配置成输出端口。这样我们就借助于两个SN74hc164寄存器,实现了只占用3个GPIO端口,给矩阵扫描电路的16列提供输入,从而既节约了成本,又避免了GPIO资源的浪费。但这同时也给键盘驱动程序的实现带来了一定的麻烦,驱动程序首先要将SN74hc164驱动起来,然后才能对矩阵电路的16列进行控制。该矩阵电路的4个行引脚分别被接到S3C2410的GPG6,GPG7,GPG8,GPG9端口上,并且这四个端口被配置成中断源。无键按下时直接读为高电位,使用时通过SN74hc164芯片先将键盘的16列置低电位,任何一个键被按下,相应的行GPG端口就会有从高到低的电压跳变,从而触发一次中断。

  3.2 软件模块描述

  初始化部分。这部分包括硬件层和软件层上的初始化。在本例中,需要先对矩阵电路和SN74hc164芯片所使用到的GPIO端口作配置,以使CPU可以对它们进行控制和访问。为了要将某个GPIO端口配置成输入输出或者是中断源,需要在对应的GPIO控制寄存器中设置正确的值,具体的值可以通过查阅S3C2410开发板手册来获得。比如,为了将GPB1设置成SN74hc164的输入端,需要将GPBCON这个控制字中2,3两位设置成二进制的01,为了将GPG6设置成电压低跳变中断源,需要将GPGCON中12,13两位设置成二进制的10。在完成了硬件初始化操作以后,就是软件层上的初始化了。首先将键盘中断处理函数注册到系统,然后设置好一个定时器结构,以便在中断发生时将其挂到内核的定时器队列中去,该定时器将触发对键盘的扫描操作。最后通过SN74hc164将矩阵电路的16列置零。

  中断处理部分。如前所述,这部分软件应该完成的工作就是扫描特殊键盘,确定哪个键被按下,并且拿到稳定的扫描码,然后调用内核导出函数handle_scancode。在这个应用中,该特殊键盘的布局与PC标准键盘的布局比较相似,所以我们直接将PC键盘上对应键的系统扫描码作为我们特殊键盘上各个键的扫描码,同时我们将PC键盘驱动程序中扫描码到键码的转换函数pckbd_translate作为我们的kbd_translate函数。

  确定哪一个键被按下的算法如下。在中断到来时,我们已经可以根据中断号确定被按下的键在哪一行,我们还需要确定被按下的键在哪一列。为此,我们先给串联的两个SN74hc164芯片送一个CLR信号,清零,然后送16个1,使得特殊键盘的列均为高电位,此时我们在键盘的行端口读到的都是高电位。在16个时钟脉冲下,给SN74hc164芯片送入1个0和15个1,使得0在每一列上都唯一出现一次,于此同时在键盘行端口进行扫描。当被按下键所在列置0时,其所在行就会读到一个低电位。使用这种“走0法”,我们就可以确定出键盘上哪个键被按下了。但是这种简单的扫描算法还不够,因为在这种类型的矩阵扫描键盘中,键的每次按下和抬起都会有10~20ms(这段时间的长短由硬件特性决定)的毛刺抖动存在,如图2所示,所以为了获取稳定的按键信息,必须要想办法去掉这种抖动,才能避免将用户的一次按键误当作几次按键来处理。去毛刺的一种常见的方法是在有键盘中断到达时,并不立即去扫描键盘,而是先等待一段时间,等跳过毛刺抖动以后再去扫描键盘,其伪代码如下所示:

分享到:
评论

相关推荐

    嵌入式Linux游戏机设备课程大纲.pdf

    本课程大纲涵盖了嵌入式Linux游戏机设备的相关知识点,涵盖了硬件平台、Linux开发环境、Linux内核技术、驱动编写、Bootloader等方面的内容。 硬件平台 * 嵌入式Linux游戏机设备的硬件平台由三星公司的S3C2440A-40...

    ARM嵌入式LINUX应用实例开发高清电子书

    基于ARM和嵌入式Linux的开发环境 Qtopia Core编程基础 命令行截屏工具 简单的时钟程序 拼图小游戏 嵌入式桌面管理器 嵌入式数据库 嵌入式Web服务器 嵌入式Linux调试技术 嵌入式Linux性能优化

    keyboard_嵌入式LINUX开发_嵌入式Linux串口_

    在嵌入式Linux系统开发中,串口通信是一种常见的数据传输方式,特别是在游戏开发和设备控制等场景下。本文将详细解析标题“keyboard_嵌入式LINUX开发_嵌入式Linux串口_”所涉及的知识点,并以描述中的游戏快捷键修改...

    嵌入式linux推箱子游戏代码

    嵌入式Linux推箱子游戏代码是一个适合初学者深入了解嵌入式系统开发的开源项目,它结合了设备树、嵌入式Linux和ARM架构等关键知识点。这个项目将经典的推箱子游戏移植到了嵌入式硬件平台上,为学习者提供了一个实际...

    基于L inux的嵌入式五子棋游戏_ 6818开 发板五子棋,基于linux

    在本项目中,我们关注的是一个基于Linux的嵌入式五子棋游戏,它特别针对6818开发板设计。这个项目的核心是利用Linux操作系统的能力,在嵌入式硬件平台上实现一个可玩的五子棋游戏,允许玩家与计算机进行对弈。下面将...

    嵌入式linux知识要点

    2. **SDL图形库**:介绍SDL库的基本使用方法及其在游戏开发中的应用。 - SDL(Simple DirectMedia Layer)是一款用于快速开发多媒体应用程序的跨平台开发库。 3. **GTK+与MiniGUI**:探讨GTK+、MiniGUI等图形用户...

    基于QT4.7的ARM嵌入式Linux的游戏程序开发实现.pdf

    基于QT4.7的ARM嵌入式Linux的游戏程序开发实现 ARM 处理器是当前嵌入式系统中最常用的处理器之一,它占据了32位 RISC 处理器80%以上的市场份额。同时,嵌入式 Linux 系统是发展最快、应用最为广泛的操作系统。QT 是...

    嵌入式linux图形界面开发介绍.doc

    "嵌入式 Linux 图形界面开发介绍" 嵌入式 Linux 图形界面开发是指在嵌入式系统中实现图形用户界面的开发。该领域的基础设施主要包括 SVGALib、X Window、Frame Buffer 等,它们一般是作为其他高级图形或者图形应用...

    嵌入式Linux设备驱动程序开发PPT课件.pptx

    "嵌入式Linux设备驱动程序开发PPT课件" 本资源主要讲解了嵌入式Linux设备驱动程序的开发,包括设备驱动相关概念、字符设备驱动程序的开发、程序框架、实验要求、HelloWorldModule例程和Demo程序设计等。 设备驱动...

    ARM嵌入式LINUX应用实例开发.pdf

    再接下来,书中通过具体的实例,如截屏程序、时钟程序、拼图游戏、桌面管理器、嵌入式数据库和Web服务器等应用开发实例,由浅入深地引导读者理解和掌握实际的嵌入式Linux应用开发过程。这些实例的选择覆盖了从基础到...

    嵌入式Linux程序设计案例与实验教程-实例代码

    实验2.1 嵌入式Linux开发环境的建立14 2.2 Linux C程序设计17 2.2.1 C程序设计概述17 2.2.2 Makefile介绍17 2.2.3 Makefile中的变量18 2.2.4 Makefile隐含规则19 实验2.2 Makefile与helloworld19 2.3 ...

    嵌入式Linux游戏机设备课程大纲.docx

    8. **项目整合与验收**:最后,将所有学到的知识应用于实际项目,开发一个嵌入式Linux游戏机设备,实现游戏选择与操作,通过触摸屏控制游戏的完整功能。 这门课程全面覆盖了从硬件到软件、从底层驱动到上层应用的...

    基于嵌入式Linux的上肢康复机器人用户系统研究.pdf

    1. 嵌入式Linux内核移植和驱动程序开发:文章提到利用Linux内核在特定硬件平台上进行移植,这是开发嵌入式系统的基础步骤。内核移植后还需要开发相应的驱动程序,使得硬件能够正常工作。例如,涉及到的Linux GPIO...

    基于PowerPC的嵌入式linux

    《基于PowerPC的嵌入式Linux》是一份深入探讨嵌入式系统开发的重要资源,尤其关注在PowerPC架构上的Linux操作系统应用。这份资料全面而详细,对于那些希望在嵌入式领域工作,尤其是与PowerPC处理器相关的项目的人来...

    python前端c语言c++java微信小程序Linux嵌入式开发+驱动开发PHP最全资源

    C++被广泛应用于游戏开发、高性能服务器编写等领域。 ### 3. Java Java是一种广泛使用的面向对象编程语言,以其跨平台的特性(“一次编写,到处运行”)而闻名。它适用于各种规模的应用程序开发,包括桌面应用、Web...

    基于linux开发的俄罗斯方块小游戏.rar

    这款小游戏不仅展示了编程技术在游戏开发中的应用,同时也体现了Linux系统强大的软件开发能力。下面将详细介绍这款小游戏的技术要点、开发环境以及可能涉及的知识点。 首先,我们要理解C语言是程序设计的基础。...

    嵌入式linux网关串口网口转发程序

    在嵌入式Linux系统中,开发一个串口到网口数据转发程序是一项常见的任务,尤其在构建物联网(IoT)设备或智能网关时。这个程序通常基于C语言编写,以便在资源有限的ARM平台上高效运行。下面我们将深入探讨标题和描述...

Global site tag (gtag.js) - Google Analytics