键盘驱动程序源码_键盘驱动程序源码是什么
大家好,今天我将为大家讲解键盘驱动程序源码的问题。为了让大家更好地理解这个问题,我将相关资料进行了整理,现在就让我们一起来看看吧。
1.为什么键盘拆开再装上就不能打字了?开机时上面的灯还会闪
2.c语言中的头文件
3.51单片机怎样用键盘控制数码管显示
4.android怎么实现后台对按键事件的监控
为什么键盘拆开再装上就不能打字了?开机时上面的灯还会闪
械式键盘
机械式键盘它一般类似金属接触式开关的原理使触点导通或断开。在实际应用中机械开头的结构形式很多,最常用的是交叉接触式。它的优点是结实耐用, 缺点是不防水。敲击比较费力,打字速度快时容易漏字。不过现在比较好的机械键盘都增加了Click功能, click功能实际上就是从机械结构上进行了改进,加大了缓存,防止快速打字时漏掉字符。它的使用寿命5000万到一亿次左右,普通用户10年大约键盘敲击20万次左右。所以一款好的机械键盘够用一辈子了。
塑料薄膜式键盘
塑料薄膜式键盘内有四层,塑料薄膜一层有凸起的导电橡胶,当中一层为隔离层,上下两层有触点。通过按键使橡胶凸起按下,使其上下两层触点接触,输出编码。这种键盘无机械磨损,可靠性较高,目前在市场占相当大的比重,不过很多JS也将这种成本相对较低的键盘当成电容式键盘。它最大的特点就是低价格, 低噪音,低成本。
导电橡胶式键盘
导电橡胶式键盘触点的接触是通过导电的橡胶接通。其结构是有一层带有凸起的导电橡胶,凸起部分导电,而这部分对准每个按键,互相连接的平面部分不导电,当键帽按下去时,由于凸起部分导电,把下面的触点按通,不按时,凸起部分会弹起。目前使用的也较多。
电容式键盘
电容式键盘它是一种类似电容式开关的原理,通过按键改变电极间的距离而产生电容量的变化,暂时形成震荡脉冲允许通过的条件。我们知道,电容的容量是由介质,两极的距离及两极的面积来决定的。所以当键帽按下时,两极的距离发生变化,这就引起电容容量发生改变,当参数设计合适时,按键时就有输出,而不按键就无输出,这个输出再经过整形放大,去驱动编码器。由于电容器无接触,所以这种键在工作过程中不存在磨损、接触不良等问题,耐久性、灵敏度和稳定性都比较好。为了避免电极间进入灰尘,电容式按键开关采用了密封组装。1000万到3000万次寿命。但目前市场上真正的电容式键盘并不多,大部分是前面两种键盘,一款真正的电容键盘价格是比较高的。
无线键盘
当然最先进的就是无线键盘,顾名思义这种键盘与电脑间没有直接的物理连线,通过红外线或无线电波将输入信息传送给特制的接收器。接收器的连接与普通键盘基本相同,也只需简单地连接到PS/2或COM口、USB口等上,购买时必须注意区别,一般无线的键盘在标识后有"RF"后缀(radio frequency),表示支持无线电波传输。现在大部分产品频点都在900 MHz,455 MHz, 330MHz。左右。
无线键盘需要使用干电池供电,对于红外线型的无线键盘具有较严格的方向性,尤其是水平位置的关系更为敏感,由于接收器接收角度有限(中心直线范围内6公尺)在键盘距离接收器太近时,会出现失灵的情况,同时灵敏度低时不能快速敲键,否则肯定会漏字符。而采用无线电的键盘要灵活得多,考虑到无线电是辐射状传播的,为了避免在近距离内有同类型(同频率)的键盘工作,导致互相干扰,一般都备有4个以上的频道,如遇干扰可以手动转频。无线键盘为了配合移动的需要,一般体积较小巧并集成有鼠标的功能,注意接收器和主机连接有两个接口,一个是PS2、一个是COM口,把这两个接口一一对应都接在主机上就可以了,但如果你不想使用键盘上的鼠标,那就只需把接收器的PS2口接在主机上就可以了,COM不接!接收器不需要外接电源,而键盘里内置的3号碱性电池可以正常使用3个月。
键盘的发展趋势
就键盘的发展来看,键盘的键位是逐渐的增多(但不是无限制的增加毕竟键盘的面积是有限的),而且是向着多功能多媒体的方向发展。从早期推出的电脑采用83键键盘,随后又推出了84键的设计标准,该标准将键盘分为三个区,即功能区、打字键区、负责光标控制和编辑的副键盘区。其中功能键区的光标键与数字键作为双功能符号键使用,使用一个"Numlock"键来控制这两种功能的切换。虽然两种规格的键盘现在已经不多见了,但是键盘主要区域的划分仍然沿用当时的标准,至今没有什么变化。直到1986年IBM公司推出了101键键盘,才在功能上实现了进一步的扩充,除了添加了F11、F12两个功能键之外,还在键盘的中部多加了一组专用的光标控制和编辑的键,在微软推出WIN95操作系统之后,出现Windows启动键,时至今日大量带各种附加功能键的键盘出现在我们的面前。例如Fn键、快捷键、带鼠标和手写板的键盘等等。
常用的键盘的接口有AT接口、PS/2接口和USB接口,现在绝大部分主板都是提供PS/2键盘接口,也称为"小口"。而兼容机尤其是较老的主板常常提供AT接口也被称为"大口",所幸的是市场上有一种大小口键盘转换连接器,售价只有区区几元钱,它一举解决了两种接口键盘的兼容性问题。一些公司还推出了USB接口的键盘。根据最新公布的 PC2001规范,以后所有通过ISA 总线工作的接口都会随着ISA总线的消亡而被USB取代。USB 允许同时将其他一些设备接入,相当于集成了一个HUB,比如可以将鼠标接入,这实际上节约了主板的COM或PS/2口。有的键盘甚至本身就集成了PS/2 转USB的电路,这样就更方便了。目前阻碍其普及的原因还是价格太高。集成USB HUB的键盘,这类键盘大多采用USB接口,由于外设使用USB的机会增加,为了使用更多的USB设备,需要添加一种USB HUB的装置扩展USB接口数量,但是专业的USB HUB价格比较昂贵,所以人们尝试将USB HUB集成到键盘或显示器中并得到成功。集成USB HUB的键盘往往自身占用一个USB接口,用以保持键盘信号与主机的传输,同时提供2到4个USB接口供其他设备连结,简单地说是一进多出,价格上要比专业的USB HUB便宜得多。
在单片机系统中,经常使用的键盘都是专用键盘。这类键盘都是单独设计制作的,成本高,连线多,且可靠性不高。这些问题在那些要求键盘按键较多的应用系统中显得更加突出。与此相比,在PC系统中广泛使用的PS/2键盘具有价格低、通用可靠,且使用的连线少(仅使用2根信号线)的特点,并可满足多数系统的要求。因此,在单片机系统中应用PS/2键盘是一种很好的选择。
本文在分析PS/2协议和PS/2键盘工作原理与特点的基础上,给出在AT89C51单片机上实现对PS/2键盘支持的硬件连接方法以及驱动程序的设计实现。
1PS/2协议
现在PC机广泛采用的PS/2接口为miniDIN 6引脚的连接器。其引脚如图1所示。
1—数据线(DATA);2—未用;3—电源地(GND);
4—电源(+5 V);5—时钟(CLK);6—未用。
图1PS/2连接器PS/2设备有主从之分,主设备采用female插座,从设备采用male插座。现在广泛使用的PS/2键盘鼠标均工作在从设备方式下。PS/2接口的时钟与数据线都是集电极开路结构的,必须外接上拉电阻。一般上拉电阻设置在主设备中。主从设备之间数据通信采用双向同步串行方式传输,时钟信号由从设备产生。
(1) 从设备到主设备的通信
当从设备向主设备发送数据时,首先会检查时钟线,以确认时钟线是否是高电平。如果是高电平,从设备就可以开始传输数据;否则,从设备要等待获得总线的控制权,才能开始传输数据。传输的每一帧由11位组成,发送时序及每一位的含义如图2所示。
图2从设备到主设备的通信每一帧数据中开始位总是为0,数据校验采用奇校验方式,停止位始终为1。从设备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在时钟下降沿读入数据线状态。
(2) 主设备到从设备的通信
主设备与从设备进行通信时,主设备首先会把时钟线和数据线设置为“请求发送”状态。具体方式为:首先下拉时钟线至少100 μs来抑制通信,然后下拉数据线“请求发送”,最后释放时钟线。在此过程中,从设备在不超过10 μs的间隔内就要检查这个状态。当设备检测到这个状态时,将开始产生时钟信号。
此时数据传输的每一帧由12位构成,其时序和每一位含义如图3所示。
图3主设备到从设备的通信与从设备到主设备通信相比,其每帧数据多了一个ACK位。这是从设备应答接收到的字节的应答位,由从设备通过拉低数据线产生,应答位ACK总是为0。主设备到从设备通信过程中,主设备总是在时钟为低电平时改变数据线的状态,从设备在时钟的上升沿读入数据线状态。
2PS/2键盘的编码与命令集
(1) PS/2键盘的编码
现在PC机使用的PS/2键盘都默认采用第二套扫描码集。该扫描码集可参考文献\[1\]。扫描码有两种不同的类型:通码(make code)和断码(break code)。当一个键被按下或持续按住时,键盘会将该键的通码发送给主机;而当一个键被释放时,键盘会将该键的断码发送给主机。
根据键盘按键扫描码的不同,在此可将按键分为如下几类:
第一类按键,通码为1字节,断码为0xF0+通码形式。如A键,其通码为0x1C,断码为0xF0 0x1C。
第二类按键,通码为2字节0xE0+0xXX形式,断码为0xE0+0xF0+0xXX形式。如right ctrl键,其通码为0xE0 0x14,断码为0xE0 0xF0 0x14。
第三类特殊按键有两个,print screen键通码为0xE0 0x12 0xE0 0x7C,断码为0xE0 0xF0 0x7C 0xE0 0xF0 0x12; pause键通码为0x E1 0x14 0x77 0xE1 0xF0 0x14 0xF0 0x77,断码为空。
组合按键的扫描码发送按照按键发生的次序,如以下面顺序按左SHIFT+A键:1按下左SHIFT键,2按下A键,3释放A键,4释放左SHIFT键,那么计算机上接收到的一串数据为0x12 0x1C 0xF0 0x1C 0xF0 0x12。
在驱动程序设计中,就是根据这样的分类来对不同的按键进行不同处理的。
(2) PS/2键盘的命令集
主机可以通过向PS/2键盘发送命令来对键盘进行设置或者获得键盘的状态等操作。每发送一个字节,主机都会从键盘获得一个应答0xFA(“重发 resend”和“回应echo”命令例外)。下面简要介绍驱动程序在键盘初始化过程中所用的指令(详细键盘命令集见参考文献\[1\]):
0xED主机在本命令后跟随发送一个参数字节,用于指示键盘上num lock, caps lock, scroll lock led的状态;
0xF3主机在这条命令后跟随发送一个字节参数来定义键盘机打的速率和延时;
0xF4用于在当主机发送0xF5禁止键盘后,重新使能键盘。
3PS/2键盘与单片机的连接电路
PS/2键盘与AT89C51单片机的连接方式如图4所示。P1.0接PS/2数据线,P3.2(INT0)接PS/2时钟线。因为单片机的P1、P3口内部是带上拉电阻的,所以PS/2的时钟线和数据线可以直接与单片机的P1、P3相连接。
4驱动程序设计
驱动程序使用Keil C51语言,Keil uVision2编程环境。PS/2 104键盘驱动程序的主要任务,是实现单片机与键盘间PS/2通信,以及将接收到的按键扫描码转换为该按键的键值KeyVal,提供给系统上层软件使用。
(1) 单片机与键盘间PS/2通信的程序设计
在PS/2通信过程中,主设备(单片机)是在时钟信号为低时发送和接收数据信号的。因为单片机到键盘发送的是指令,需要键盘回应,所以这部分程序采用查询方式;而单片机接收键盘数据时,数据线上的信号在时钟为低时已经稳定,所以这部分程序采用中断方式,且不需要在程序中加入延时程序。单片机的键盘发送接口程序见本刊网站www.dpj.com.cn。
(2) 键盘扫描码转换程序设计
由于键盘扫描码无规律可循,因此由键盘扫描码获得相应按键的键值(字符键为其ASCII值,控制键如F1、CTRL等为自定义值),只能通过查表的方式。由于按键的三种类型及部分按键对应着两个键值(如A键的键值根据CAPS和SHIFT键状态有0x41(A)和0x61(a)两种),因此综合考虑查表转换速度和资源消耗,设计中使用4个键盘表:键盘扫描码转换基本集和切换集kb_plain_map\[NR_KEYS\]与 kb_shift_map\[NR_KEYS\];包含E0前缀的键盘扫描码转换基本集和切换集kbe0_plain_map\[NR_KEYS\]与 kbe0_shift_map\[NR_KEYS\]。PS/2 104键盘按键扫描码最大值为0x83,所以设置NR_KEYS为132。所有四个键盘表的定义均为如下形式:KB_MAP\[MAKE CODE\]=KEYVAL,如果扫描码对应的按键为空,如KB_MAP\[0x00\],则定义相应键值为NULL_KEY(0x00)。以下是键盘扫描码基本集的部分代码实例:kb_plain_map\[NR_KEYS\]={……
NULL_KEY;0x2C;0x6B;0x69;0x6F;0x30;0x39;NULL_KEY;// 扫描码0x40~0x47
file://对应按键空,逗号,K,I,O,0,9,空
file://对应键值 0x00,’,’,’k’,’i’,’o’,’0’,’9’,0x00
……};图4硬件连接电路如此设计键盘转换表的另一个好处在于,以后如需扩展支持有ACPI、Windows多媒体按键键盘时,只需要将键表中相应处修改即可。如ACPI power按键通码为0xE0 0x37,修改kbe0_plain_map\[0x37\]=KB_ACPI_PWR即可。
特殊按键PAUSE使用单独程序处理,如果接收到0xE1就转入这段程序;而print screen键则将其看作是两个通码分别为0xE0 0x12和0xE0 0x7C的“虚键”的组合键来处理。
在驱动程序中声明如下全局变量:led_status其bit0-scroll lock led关0、开1;bit1-num lock led关为0,开为1;bit2-caps lock led关为0,开为1;bit3~bit7总是0;agcs_status记录左右shift ctrl gui alt状态,bit0-左shift键,bit1-左ctrl键,bit2-左gui键,bit3-左alt键,bit4-右shift键,bit5-右 ctrl键,bit6-右gui键,bit7-右alt键,相应键按下则对应位为1,释放为0。E0_FLAG接到0xE0置1;E1_FLAG接收到 0xE1置1;F0_FLAG接收到0xF0置1。按键键值通过KeyVal提供给上层使用。
PS/2键盘扫描码键值转换程序ps2_codetrans()流程如图5所示。
图5扫描码键值转换程序流程第一类按键的扫描码键值转换程序代码:if (F0_FLAG) {//接收扫描码为断码
switch (mcu_revchar){//处理控制键
case 0x11: agcs_status&=0xF7;break;//左alt释放
case 0x12: agcs_status&=0xFE;break;//左shift释放
case 0x14: agcs_status&=0xFD;break;//左ctrl释放
case 0x58: if(led_status&0x04)
led_status&=0x03;//caps lock键
else led_status =0x04;
ps2_ledchange();
break;
case 0x59: agcs_status&=0xEF;break;//右shift释放
case 0x77: if(led_status&0x02)
led_status&=0x05;//num lock键
else led_status =0x02;
ps2_ledchange();
break;
case 0x7E: if(led_status&0x01)
led_status&=0x06;//scroll lock键
else led_status =0x01;
ps2_ledchange();
break;
default:break;
}
F0_FLAG = 0;
}
else {//接收扫描码为通码
if (led_status & 0x04) caps_flag = 1; else caps_flag = 0;
if (led_status & 0x02) num_flag = 1; else num_flag = 0;
if (scga_status & 0x11) shift_flag = 1; else shift_flag = 0;
file://扫描码键值转换
if ((caps_flag == shift_flag) (!num_flag)) KeyVal=kb_plain_map\[mcu_revchar\];
else KeyVal=kb_shift_map\[mcu_revchar\];
switch(mcu_revchar){//处理控制键或状态键
case 0x11: agcs_status = 0x08;//左alt按下
case 0x12: agcs_status = 0x01;//左shift按下
case 0x14: agcs_status = 0x02;//左ctrl按下
case 0x59: agcs_status = 0x10;//右shift按下
default: break;
}
}第二类按键的扫描码键值转换程序与上相似。要注意的是在退出该程序段时对E0_FLAG和F0_FLAG标志的清0。
PAUSE键的处理程序:如果接收到0xE1,置E1_FLAG=1,然后顺次将后续接收到的7个字节数据和PAUSE的通码后7个字节比较,一致则返回KeyVal=KB_PAUSE。在比较完所有7个字节后清除E1_FLAG标志。
键盘初始化程序kb_init()流程:
① 上电后,接收键盘上电自检通过信号0xAA,或者自检出错信号0xFC。单片机接收为0xAA,进入下一步,否则,进行出错处理。
② 关LED指示,单片机发送0xED,然后接收键盘回应0xFA,接着发送送0x00接收0xFA。
③ 设置机打延时和速率。 单片机发送0xF3,接收0xFA,发送0x00(250ms,2.0cps),接收0xFA。
④ 检查LED,发送0xED,接收0xFA,发送0x07(开所有LED),接收0xFA。发送0xED,接收0xFA,发送0x00(关LED),接收0xFA。
⑤ 允许键盘发送0xF4,接收0xFA。
键盘LED改变ps2_ledchange()函数流程:发送0xED→接收0xFA→发送led_status→接收0xFA。
结语
该驱动程序经Keil uVision2编译,在AT89C51单片机上运行通过,实现了对PS/2 104键盘的支持,以及对字符按键大小写切换,num lock切换,控制键及组合按键的支持。该程序对其他嵌入式或单片机系统中PS/2键盘的应用也有借鉴意义。
参考文献
1Adam Chapweske. The ATPS/2 Keyboard Interface. /ps2prots.html
4 Linux 2.4.10内核程序 defkeymap.c dn_keyb.c kbd.c keybdev.c keyboard.c kbd_kern.h kd.h keyboard.h
PS/2帧的第一位是起始位,为0,然后是8位数据位,发送键盘扫描码的一个字节(扫描码为1-4个字节),然后是奇偶校验位,最后是停止位,为1。这些是在数据线(即1号引脚线)上发送的。无键按下时,数据线和始终线都保持为1。当有键按下时,时钟线CLOCK送出脉冲,同时数据线送出数据。主机(此处是89c51 MCU)在始终脉冲的下降沿对数据线采样获得数据。键盘扫描码包括通码和断码,当键按下时发送通码,抬起时发送断码。更详细的内容可参考所附的《PS/2 技术参考》。
根据上述原理,我们可以将键盘的脉冲线接至89c51的外部中断输入口(INT0或INT1),当键按下和抬起时有脉冲产生,此脉冲引发MCU 中断。将键盘的DATA线连至89c51的输入口(如P1.0)。在中断处理程序中,从输入口读入数据,然后通过循环移位对读进的数据位进行处理,1(起始位)、10(奇偶校验)、11(停止位)可抛弃,如不嫌麻烦也可将奇偶校验位加以应用。当一个数据帧收完后,将处理后剩下的2-9位(即扫描码)通过串口发至PC机,通过PC机的串口监视软件(如“串口调试助手”)来查看。硬件连线和源码如下:
源码:
ORG 0000H
AJMP MAIN;转入主程序
ORG 0003H ;外部中断P3.2脚INT0入口地址
AJMP INT ;转入外部中断服务子程序
;以下为主程序进行CPU中断方式设置
MAIN:MOV SCON,#50H;设置成串口1方式
MOV TMOD,#20H;波特率发生器T1工作在模式2上
MOV PCON,#80H;波特率翻倍为2400x2=4800BPS
MOV TH1,#0F3H;预置初值(按照波特率2400BPS预置初值)
MOV TL1,#0F3H;预置初值(按照波特率2400BPS预置初值)
SETB EA ;打开CPU总中断请求
SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发
SETB EX0 ;打开INT0中断请求
SJMP $
INT: CLR EA ;暂时关闭CPU的所有中断请求
CJNE R0,#0,L1
L3: INC R0
SJMP L5
L1: CJNE R0,#9,L2
SJMP L3
L2: CJNE R0,#10,L4
SETB TR1;启动定时器T1
MOV SBUF,A
MOV R0,#0
L5: SETB EA ;允许中断
RETI ;退出子程序
L4: MOV C,P1.0
RRC A
SJMP L3
END
搞定后,当按下和释放键时,会在PC机上显示其扫描码。
通电时键盘会自检,此时键盘上三个灯全亮,自检完成后熄灭,并向主机发送十六进制字符AA.。
c语言中的头文件
第1篇 系统移植基础篇第1章 linux内核介绍 2
1.1 系统调用接口 2
1.1.1 linux系统调用 2
1.1.2 用户编程接口 2
1.1.3 系统调用与服务例程的对应关系 3
1.1.4 系统调用过程 3
1.1.5 系统调用传递的参数 4
1.2 进程管理 4
1.2.1 进程 4
1.2.2 进程描述符 5
1.2.3 进程状态 6
1.2.4 进程调度 6
1.2.5 进程地址空间 8
1.3 内存管理 10
1.3.1 内存管理技术 10
1.3.2 内存区管理 12
1.3.3 内核中获取内存的几种方式 13
1.4 虚拟文件系统 14
1.4.1 虚拟文件系统作用 14
.1.4.2 文件系统的注册 15
1.4.3 文件系统的安装和卸载 15
1.5 设备驱动程序 17
1.5.1 字符设备驱动程序 17
1.5.2 块设备驱动程序 18
1.5.3 网络设备驱动程序 21
1.5.4 内存与i/o操作 22
1.6 小结 23
第2章 嵌入式linux开发环境搭建 24
2.1 虚拟机及linux安装 24
2.1.1 虚拟机的安装 24
2.1.2 单独分区安装系统 30
2.1.3 虚拟机和主机通信设置 31
2.1.4 vmware tools工具安装 33
2.1.5 虚拟机与主机共享文件 35
2.1.6 虚拟机与主机文件传输 36
2.2 交叉编译工具 38
2.2.1 交叉编译工具安装 38
2.2.2 交叉编译器测试 43
2.3 超级终端和minicom 44
2.3.1 超级终端软件的安装 44
2.3.2 minicom使用 45
2.3.3 securecrt使用 48
2.4 内核、文件系统加载工具 48
2.4.1 烧写bootloader 48
2.4.2 内核和文件系统下载 52
2.4.3 应用程序和文件传输 54
2.5 在开发中使用网络文件系统(nfs) 56
2.5.1 虚拟机设置 56
2.5.2 虚拟机的ip地址设置 56
2.5.3 验证网络连接 59
2.5.4 设置共享目录 59
2.5.5 启动nfs服务 60
2.5.6 修改共享配置后 61
2.5.7 挂载nfs 61
2.5.8 双网卡挂载nfs 61
2.6 小结 62
第2篇 系统移植技术篇
第3章 bootloader移植 64
3.1 bootloader介绍 64
3.1.1 bootloader与嵌入式linux系统的关系 64
3.1.2 bootloader基本概念 64
3.1.3 bootloader启动过程 66
3.2 bootloader之u-boot 67
3.2.1 u-boot优点 67
3.2.2 u-boot的主要功能 68
3.2.3 u-boot目录结构 68
3.3 u-boot移植过程 69
3.3.1 环境配置 69
3.3.2 修改cpu/arm920t/start.s 70
3.3.4 具体平台相关修改 79
3.3.5 其他部分修改 81
3.3.6 u-boot的编译 84
3.4 bootloader之vivi 85
3.4.1 vivi简介 85
3.4.2 vivi配置与编译 85
3.4.3 代码分析 88
3.5 vivi的运行 88
3.5.1 bootloader启动的阶段一 89
3.5.2 bootloader启动的阶段二 95
3.6 小结 95
第4章 linux内核裁剪与移植 96
4.1 linux内核结构 96
4.1.1 内核的主要组成部分 96
4.1.2 内核源码目录介绍 97
4.2 内核配置选项 99
4.2.1 一般选项 99
4.2.2 内核模块加载方式支持选项 100
4.2.3 系统调用、类型、特性、启动相关选项 101
4.2.4 网络协议支持相关选项 102
4.2.5 设备驱动支持相关选项 102
4.2.6 文件系统类型支持相关选项 103
4.2.7 安全相关选项 104
4.2.8 其他选项 104
4.3 内核裁剪及编译 105
4.3.1 安装内核源代码 105
4.3.2 检查编译环境设置 105
4.3.3 配置内核 106
4.3.4 编译内核 115
4.4 内核映像文件移植到arm板 116
4.4.1 移植准备 116
4.4.2 烧写系统 118
4.5 内核升级 121
4.5.1 准备升级内核文件 121
4.5.2 移植过程 122
4.6 小结 125
第5章 嵌入式文件系统制作 126
5.1 文件系统选择 126
5.1.1 flash硬件方案比较 126
5.1.2 嵌入式文件系统的分层结构 127
5.2 基于flash的文件系统 127
5.2.1 jffs文件系统(journalling flash filesystem) 128
5.2.2 yaffs文件系统(yet another flash file system) 130
5.2.3 cramfs文件系统(compressed rom file system) 133
5.2.4 romfs文件系统(rom file system) 134
5.3 基于ram的文件系统 135
5.4 文件系统的制作 135
5.4.1 制作ramdisk文件系统 136
5.4.2 制作yaffs2文件系统 144
5.4.3 制作jffs2文件系统 150
5.4.4 其他文件系统制作 152
5.5 小结 153
第3篇 系统移植与驱动篇
第6章 lcd驱动移植 156
6.1 认识lcd相关硬件原理 156
6.1.1 lcd概述 156
6.1.2 lcd控制器 157
6.1.3 lcd控制器方块图 157
6.1.4 lcd控制器操作 158
6.1.5 lcd控制寄存器 163
6.2 lcd参数设置 166
6.3 内核lcd驱动机制 167
6.3.1 framebuffer概述 167
6.3.2 framebuffer 设备驱动的结构 167
6.4 linux 2.6.25的lcd驱动源码分析 171
6.4.1 lcd驱动开发的主要工作 171
6.4.2 s3c2410fb_init()函数分析 172
6.4.3 s3c2410fb_probe()函数分析 173
6.4.4 s3c2410fb_remove()函数分析 178
6.5 移植内核中的lcd驱动 179
6.5.1 lcd硬件电路图 179
6.5.2 修改lcd源码 179
6.5.3 配置内核 184
6.6 小结 187
第7章 触摸屏驱动移植 188
7.1 触摸屏概述 188
7.1.1 触摸屏工作原理 188
7.1.2 触摸屏的主要类型 188
7.2 s3c2440 adc接口使用 191
7.2.1 s3c2440触摸屏接口概述 191
7.2.2 s3c2440触摸屏接口操作 192
7.3 2.6内核触摸屏驱动源码分析(s3c2410_ts.c源码分析) 196
7.4 linux内核输入子系统介绍 201
7.4.1 input子系统概述 202
7.4.2 输入设备结构体 202
7.4.3 输入链路的创建过程 205
7.4.4 使用input子系统 206
7.4.5 编写输入设备驱动需要完成的工作 208
7.5 触摸屏驱动移植和内核编译 209
7.5.1 修改初始化源码 209
7.5.2 修改硬件驱动源码s3c2440_ts.c 211
7.5.3 修改kconfig和makefile 213
7.5.4 配置编译内核 214
7.5.5 触摸屏测试程序设计 215
7.6 小结 216
第8章 usb设备驱动移植 217
8.1 usb协议 217
8.1.1 usb协议的系统主要组成部分 217
8.1.2 总线物理拓扑结构 219
8.1.3 usb设备、配置、接口、端点 219
8.1.4 usb设备状态 222
8.1.5 usb枚举过程 223
8.1.6 usb请求块(urb) 226
8.2 usb主机驱动 230
8.2.1 usb主机驱动结构和功能 230
8.2.2 主机控制器驱动(usb_hcd) 231
8.2.3 ohci主机控制器驱动 233
8.2.4 s3c24xx ohci主机控制器驱动实例 234
8.3 usb设备驱动 237
8.3.1 usb骨架程序分析 237
8.3.2 usb驱动移植的时钟设置 241
8.4 usb鼠标键盘驱动 242
8.4.1 usb鼠标驱动代码分析 242
8.4.2 usb键盘驱动代码分析 245
8.4.3 内核中添加usb鼠标键盘驱动 248
8.5 u盘驱动 249
8.5.1 内核配置 249
8.5.2 移植和测试 250
8.6 小结 252
第9章 网卡驱动程序移植 253
9.1 以太网概述 253
9.1.1 以太网连接 253
9.1.2 以太网技术概述 254
9.1.3 以太网的帧结构 256
9.2 网络设备驱动程序体系结构 258
9.2.1 嵌入式linux网络驱动程序介绍 258
9.2.2 linux网络设备驱动的体系结构 259
9.2.3 网络设备驱动程序编写方法 259
9.2.4 网络设备驱动程序应用实例 261
9.3 net_device 数据结构 262
9.3.1 全局信息 262
9.3.2 硬件信息 263
9.3.3 接口信息 263
9.3.4 设备方法 266
9.3.5 公用成员 268
9.4 dm9000网卡概述 268
9.4.1 dm9000网卡总体介绍 269
9.4.2 dm9000网卡的特点 269
9.4.3 内部寄存器 270
9.4.4 功能描述 274
9.5 dm9000网卡驱动程序移植 275
9.5.1 dm9000网卡连接 275
9.5.2 驱动分析——硬件的数据结构 276
9.5.3 驱动分析——数据读写函数 277
9.5.4 驱动分析——重置网卡 277
9.5.5 驱动分析——初始化网卡 277
9.5.6 驱动分析——打开和关闭网卡 282
9.5.7 驱动分析——数据包的发送与接收 283
9.5.8 dm9000网卡驱动程序移植 285
9.6 小结 288
第10章 音频设备驱动程序移植 289
10.1 音频设备接口 289
10.1.1 pcm(脉冲编码调制)接口 289
10.1.2 iis(inter-ic sound)接口 289
10.1.3 ac97(audio codec 1997)接口 289
10.1.4 linux音频设备驱动框架 290
10.2 linux音频设备驱动——oss驱动框架 291
10.2.1 oss驱动架构硬件 291
10.2.2 oss驱动架构代码 291
10.2.3 oss初始化函数oss_init() 293
10.2.4 oss释放函数oss_cleanup() 294
10.2.5 打开设备文件函数sound_open() 295
10.2.6 录音函数sound_read() 296
10.2.7 播放函数sound_write() 297
10.2.8 控制函数sound_ioctl() 297
10.3 linux音频设备驱动——alsa驱动框架 298
10.3.1 card和组件 299
10.3.2 pcm设备 303
10.3.3 控制接口 306
10.3.4 ac97 api音频接口 308
10.4 音频设备应用程序编写 312
10.4.1 dsp接口编程 312
10.4.2 mixer接口编程 315
10.4.3 alsa应用程序编程 316
10.5 音频设备驱动移植 318
10.5.1 添加uda1341结构体 318
10.5.2 修改录音通道 319
10.5.3 内核中添加uda1341驱动支持 320
10.5.4 移植新内核并进行测试 321
10.6 音频播放程序madplay的移植 322
10.6.1 准备移植需要的源文件 322
10.6.2 交叉编译 322
10.6.3 移植和测试 323
10.6.4 编译中可能遇到的问题 324
10.7 小结 324
第11章 sd卡驱动移植 325
11.1 sd卡简介 325
11.1.1 sd卡系统概念 325
11.1.2 sd卡寄存器 325
11.1.3 sd功能描述 326
11.2 sd卡驱动程序分析 329
11.2.1 host驱动部分 330
11.2.2 core驱动部分 333
11.2.3 card驱动部分 337
11.3 sd卡移植步骤 339
11.3.1 添加延时和中断 339
11.3.2 配置内核 340
11.3.3 烧写新内核 341
11.4 小结 342
第12章 nandflash驱动移植 343
12.1 nandflash介绍 343
12.1.1 nandflash命令介绍 343
12.1.2 nandflash控制器 344
12.2 nandflash驱动介绍 345
12.2.1 nand芯片结构 345
12.2.2 nandflash驱动分析 346
12.3 nandflash驱动移植 351
12.3.1 内核的修改 351
12.3.2 内核的配置和编译 353
12.4 小结 353
第4篇 系统移植高级篇
第13章 minigui与移植 356
13.1 minigui在上位机中的安装 356
13.1.1 安装需要的安装文件 356
13.1.2 minigui的运行模式 357
13.1.3 编译并安装minigui 357
13.1.4 编译安装minigui需要的支持库 360
13.1.5 编译minigui应用程序例子 360
13.2 eclipse开发minigui程序 361
13.2.1 linux下安装eclipse介绍 361
13.2.2 使用eclipse编译minigui程序 363
13.2.3 设置外部工具 367
13.2.4 运行程序 368
13.3 vc++6.0开发minigui程序 368
13.3.1 安装windows开发库 368
13.3.2 建立新工程 369
13.3.3 添加文件和设置工程 370
13.3.4 编译和运行程序 371
13.3.5 minigui程序编程风格举例 372
13.4 minigui的交叉编译和移植 374
13.4.1 交叉编译minigui 375
13.4.2 移植minigui程序 376
13.5 小结 378
第14章 qt开发与qtopia移植 379
14.1 qt安装与编程 379
14.1.1 下载安装qt 379
14.1.2 qt编程 380
14.1.3 使用qmake生成makefile 382
14.2 qtopia core在x86平台上的安装和应用 383
14.2.1 qtopia core安装准备 383
14.2.2 编译qtopia core 384
14.2.3 qtopia在x86平台上的应用开发 385
14.3 qtopia core在嵌入式linux上的移植 388
14.3.1 qtopia core移植准备 389
14.3.2 交叉编译qtopia core 389
14.3.3 编译内核 392
14.3.4 应用程序开发 392
14.3.5 应用程序移植 395
14.4 小结 395
第15章 嵌入式数据库berkeley db移植 396
15.1 数据库的基本概念 396
15.1.1 利用文档和源代码 396
15.1.2 创建环境句柄 396
15.1.3 创建数据库句柄 397
15.1.4 打开数据库 398
15.1.5 dbt结构 398
15.1.6 存取数据 399
15.1.7 关闭数据库 400
15.2 berkeley db数据库安装 400
15.2.1 安装成c库 400
15.2.2 安装成c++库 401
15.2.3 交叉编译安装berkeley db 401
15.3 使用berkeley db数据库 403
15.3.1 代码分析 403
15.3.2 编译运行程序 406
15.4 移植berkeley db数据库 407
15.4.1 数据库设计 407
15.4.2 编写应用程序 407
15.4.3 调试和交叉编译应用程序 409
15.4.4 数据库的移植和测试 410
15.5 小结 410
第16章 嵌入式数据库sqlite移植 411
16.1 sqlite支持的sql语句 411
16.1.1 数据定义语句 411
16.1.2 数据操作语句 412
16.2 sqlite数据库编译、安装和使用 412
16.2.1 安装sqlite 413
16.2.2 利用sql语句操作sqlite数据库 413
16.2.3 利用c接口访问sqlite数据库 414
16.3 移植sqlite 417
16.3.1 交叉编译sqlite 417
16.3.2 交叉编译应用程序 418
16.4 移植sqlite数据库 418
16.4.1 文件移植 419
16.4.2 运行应用程序 419
16.4.3 测试sqlite3 419
16.5 小结 421
第17章 嵌入式web服务器boa移植 422
17.1 boa介绍 422
17.1.1 boa的功能 422
17.1.2 boa流程分析 423
17.1.3 boa配置信息 426
17.2 boa编译和html页面测试 428
17.2.1 编译boa源代码 428
17.2.2 设置boa配置信息 429
17.2.3 测试boa 429
17.3 cgi脚本测试 431
17.3.1 编写测试代码 431
17.3.2 编译测试程序 431
17.3.3 测试cgi脚本 431
17.4 boa交叉编译与移植 431
17.4.1 交叉编译boa 432
17.4.2 准备测试程序 432
17.4.3 配置boa 432
17.4.4 测试 433
17.5 boa与sqlite结合 433
17.5.1 通过cgi程序访问sqlite 434
17.5.2 编译和测试 436
17.6 小结 437
第18章 嵌入式web服务器ting) transaction)状态机 499
20.3.4 nist(non-invite server (incoming) transaction)状态机 500
20.4 osip解析器 500
20.4.1 初始化解析类型函数osip_body_init() 500
20.4.2 释放函数osip_body_free() 501
20.4.3 字符串到body类型转换函数osip_body_parse() 501
20.4.4 body类型到字符串类型转换函数osip_body_to_str() 502
20.4.5 克隆函数osip_body_clone() 504
20.4.6 osip解析器分类 505
20.5 osip事务层 506
20.6 sip建立会话的过程 508
20.7 rtp协议 510
20.7.1 rtp基本概念 510
20.7.2 发送rtp 511
20.7.3 接收rtp 513
20.8 linphone编译与测试 515
20.8.1 编译linphone需要的软件包 516
20.8.2 x86平台上编译和安装 516
20.8.3 linphone测试 519
20.8.4 进一步的测试和开发 523
20.9 linphone交叉编译 523
20.9.1 linphone的交叉编译 523
20.9.2 linphone的测试 526
20.10 小结 527
51单片机怎样用键盘控制数码管显示
c语言中的头文件:#include<stdio.h>。头文件的作用:
1.头文件可以定义所用的函数列表,方便查阅你可以调用的函数。
2.头文件可以定义很多宏定义,就是一些全局静态变量的定义,在这样的情况下,只要修改头文件的内容,程序就可以做相应的修改,不用亲自跑到繁琐的代码内去搜索。
3.头文件只是声明,不占内存空间,要知道其执行过程,要看你头文件所申明的函数是在哪个.c文件里定义的,才知道。
:C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
android怎么实现后台对按键事件的监控
51单片机怎样用键盘控制数码管显示的方法。如下参考:
1.首先,编写代码并点亮数码管。
2.在编写源代码之后,确保原始代码是正确的。
3.确认代码正确后,进入下一步,就是在这一行代码(箭头所指)中,删除这四个单词。
4.然后如图所示,四个单词已被删除,只要修改相应的代码编号即可。
5.表示数字0的代码在这里进行了更改,如图所示。
6、最后写代码,将生成的十六进制文件写进单片机应答,数码管显示的数字变为0。
为了实现键盘的监控,从新开发一个输入法是不现实的,一般的操作就是在系统的输入法机制中添加接口回调。我们知道,再应用程序中拿到按键的回调一般是监听onKeyDown的接口,如下所示:public boolean onKeyDown(int keyCode, KeyEvent event)
开发者就可以根据回调方法中的参数, keyCode与KeyEvent来判断具体事件。但是,由于事件的回调机制在其的沙箱中运行,在其他应用中是无法拿到当前应用事件回调的。
那么我们就从上到下,具体的看看事件的传递机制。如下图所示,用户点击后,软键盘或物理按键的输入驱动就会产生一个中断,且向/dev/input/event*中写入一个相应的信号量。Android操作系统则会循环的读取其中的事件,再分发给WindowManagerServer。由WindowManagerServer根据事件的来源分发到各个不同的ViewGroup与View中,从而产生不同的OnClick、OnKeyDown和OnTouch等事件。
这个时候很自然的想到,黑客们希望做键盘监控,一定会向Linux底层增加自定义的事件。这里我们使用的是Linux中的getevent获得/dev/input/eventX设备汇报的事件,这个命令还会输出所有event设备的基本信息。包括触屏、按键、耳机插入等等。其基本用法如下:
Usage: getevent [-t] [-n] [-sswitchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]
? -t: show time stamps
? -n: don't print newlines
? -s: print switch states for given bits
? -S: print all switch states
? -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32,props=64)
? -d: show HID descriptor, if available
? -p: show possible events (errs, dev, name, pos. events)
? -i: show all device info and possible events
? -l: label event types and names in plain text
? -q: quiet (clear verbosity mask)
? -c: print given number of events then exit
? -r: print rate events are received
键入getevent后,我们能够看到设备中的一些列输入硬件驱动信息,同样下面会出现很多输入指令信号,通常情况下,这些信号量都在刷屏,如下图所示:
这些信号量的表示我们无法直接看懂,输入getevent –l加入Label我们能够看到一些添加的标签,如下所示:
其实这些Lable已经在其input.h头文件中定义好,其中type的定义如下:
/*
* Event types
*/
? #define EV_SYN ?0x00
? #define EV_KEY ?0x01
? #define EV_REL ?0x02
? #define EV_ABS ?0x03
? #define EV_MSC ?0x04
? #define EV_SW ? 0x05
? #define EV_LED ?0x11
? #define EV_SND ?0x12
? #define EV_REP ?0x14
? #define EV_FF ? 0x15
? #define EV_PWR ?0x16
? #define EV_FF_STATUS ? 0x17
? #define EV_MAX ?0x1f
? #define EV_CNT (EV_MAX+1)
一般来说,常用的是EV_KEY、EV_REL、EV_ABS、EV_SYN,分别对应键盘按键、相对坐标、绝对坐标、同步事件。EV_SYN则表示一组完整事件已经完成,需要处理,EV_SYN的code定义事件分发的类型。
今天关于“键盘驱动程序源码”的讲解就到这里了。希望大家能够更深入地了解这个主题,并从我的回答中找到需要的信息。如果您有任何问题或需要进一步的信息,请随时告诉我。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。