龙芯参考资料1B开发板一体化红外接收头 20键迷你红外遥控器驱动.docx
- 文档编号:6522499
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:32
- 大小:1.13MB
龙芯参考资料1B开发板一体化红外接收头 20键迷你红外遥控器驱动.docx
《龙芯参考资料1B开发板一体化红外接收头 20键迷你红外遥控器驱动.docx》由会员分享,可在线阅读,更多相关《龙芯参考资料1B开发板一体化红外接收头 20键迷你红外遥控器驱动.docx(32页珍藏版)》请在冰豆网上搜索。
龙芯参考资料1B开发板一体化红外接收头20键迷你红外遥控器驱动
版本
更新日期
更新内容
V1.0
2014.4.5
创建
1.
红外知识简介
个人认为XX文库中的文档《全面了解红外遥控(中文版).pdf》讲得很好。
我这里只是把要点提一下。
1.1.怎么判断遥控板是否发射了红外命令(是否有电)
我们时常会碰到一个问题——到底遥控器还有电没有。
对于电视遥控器可以取下电池看看,但是对于这里使用的迷你遥控器怎么办?
使用的是锂电池。
办法是通过手机的摄像头看遥控器的红外发射管。
当按下遥控器按键时,如果有电会发射红外命令,遥控器上的红外发射管会发出红外光,手机的摄像头能看到这种光。
下图《全面了解红外遥控(中文版).pdf》为通过手机摄像头看遥控器的图片
1.2.红外遥控器是怎样解决干扰问题的
只要有发热的物体都有红外光,问题是这么多红外光源,遥控器是怎样进行准确的传递信息的呢?
采取了两种措施:
一、采用指定波长(940nm)的红外光;二、对940nm的红外光进行调制,调制到38Khz上。
虽然发出红外光的光源有很多,但是每个发出红外光的波长不一定一样,就算是都发出940nm的红外光,通常也没有什么规律,为了排除干扰能够进行准确的通信,遥控器还将940nm的红外光调制到38Khz上。
2.硬件简介
说了这么久,还不知道开发板和遥控器到底是哪一款,来个合影吧。
注意:
本驱动是针对图中所示的遥控器的驱动。
2.1.一体化红外接收头
2.1.1.一体化红外接收头在开发板上的位置
先来看一下开发板上一体化红外接收头在哪里
位于电源和网口之间。
2.1.2.一体化红外接收头原理图
再来看看原理图中的一体化红外接收头的电路
由图可知,一体化红外接收头有3个引脚,分别为5v电源,地和信号输出引脚。
注意:
原理图中信号输出引脚为GPIO60,这是原理图中的标注,实际上是龙芯1B处理器的GPIO61,这点很重要。
原理图中也有说明,如下图所示
2.1.3.一体化红外接收头原理
左边为遥控器发射的38khz的红外信号,右边为一体化红外接收头收到信号后,解调得到的信号。
即没有38khz红外信号时,一体化红外接收头输出高电平;有38khz红外信号时,输出低电平。
2.2.迷你20键38K红外遥控板
2.2.1.遥控器按键编码表
为了在linux驱动中能够正确解析遥控器的红外命令,并判断出具体是哪个按键被按下,必须知道遥控器按键编码。
这里选择的这款遥控器的按键编码是已知的,如下图所示
注意:
第一行中间那个(编码为46的)按键本遥控器没有。
其它的编码都正确,详细请看后面的测试结果。
如果不幸没有这个编码表,只有通过示波器来找出每个按键的编码值了。
2.2.2.NEC编码分析
参考文档《全面了解红外遥控(中文版).pdf》中给出了NEC编码格式,如下图所示
针对这里使用的遥控器,对应的编码如下
其中address就是用户码0x00,按键编码为按键编码表中的值,比如“开关”按键的编码值为0x45,“menu”按键的编码值为0x47,“Test”按键的编码值为0x44,“倒退”按键的编码值为0x43等等。
驱动中要得到的就是按键编码。
上图中的逻辑‘1’和逻辑‘0’对应红外接收头信号引脚的高低电平,NEC编码规定:
560us高电平+1690us低电平表示逻辑‘1’,560高电平+560低电平表示逻辑‘0’。
如下图所示。
3.源码分析
3.1.主要思路
简单来说,应用程序执行read()函数,然后阻塞,直到有红外命令并解析后,驱动才将获取的“按键编码”返回给应用程序,应用程序的read()才返回。
获取按键编码的方法是:
一体化红外接收头在收到遥控器信号后,在信号输出引脚输出高低电平,并产生中断,中断程序中计算两次中断间隔的时间如果为2.25ms则表示逻辑‘1’,间隔时间为1.12ms则为逻辑‘0’,再转换为4字节的十六进制,其中第三字节为按键编码。
在实现上,为了实现快速中断,使用了tasklet机制。
在中断程序中只记录了当前时间,就调用中断的下半部并返回了。
在下半部中计算两次中断的时间间隔并保存起来。
为了判断一条红外命令是否结束,这里采用了一个内核定时器,如果两次中断时间超过50ms,则认为一条红外命令已经结束。
这里没有考虑按键一直按住遥控器会在110ms发射重复码的情况,所以最长的间隔时间为引导码的9ms,即这里把定时器超时时间设置为50ms是合理的,经过实际测试也证明了这点。
3.2.阻塞IO
在接收完一条红外命令后,应该唤醒驱动中的read()函数,并将解析结果返回给应用程序。
这里采用的是wake_up_interruptible()和wait_event_interruptible()的形式,具体参考LDD3的第六章第二节BlockingI/O,相关原文截图如下
截图已经完整展示了wait_event()的使用方法。
3.3.中断的上下半部
这里也按照规范把中断实现分为上半部和下半部。
实现方式有tasklet和workqueue,这两种方式的区别是tasklet在软中断上下文中执行,很快,是以原子模式执行,但是workqueue可以休眠。
LDD3中经典原文如下
Tasklet的使用方法也在LDD3中可以找到,如下所示
3.4.内核定时器
同样,LDD3中也有内核定时器的相关介绍,如下所示。
4.运行效果
4.1.打开调试开关的效果
Freeingunusedkernelmemory:
184kfreed
Algorithmics/MIPSFPUEmulatorv1.5
#mountall.....
#Startingmdev.....
Processing/etc/profile.....
Done!
[LOONSON@Loongson-gz:
/]#echo8>/proc/sys/kernel/printk
[LOONSON@Loongson-gz:
/]#cdtest/
[LOONSON@Loongson-gz:
/test]#./ls1b_ir_test_app
----------onecmd---------
interval=0,inteval_binary=2
interval=13437,inteval_binary=2
interval=1084,inteval_binary=0
interval=1149,inteval_binary=0
interval=1084,inteval_binary=0
interval=1119,inteval_binary=0
interval=1154,inteval_binary=0
interval=1084,inteval_binary=0
interval=1119,inteval_binary=0
interval=1125,inteval_binary=0
interval=2261,inteval_binary=1
interval=2235,inteval_binary=1
interval=2226,inteval_binary=1
interval=2258,inteval_binary=1
interval=2210,inteval_binary=1
interval=2274,inteval_binary=1
interval=2208,inteval_binary=1
interval=2258,inteval_binary=1
interval=2225,inteval_binary=1
interval=1123,inteval_binary=0
interval=2236,inteval_binary=1
interval=1143,inteval_binary=0
interval=1095,inteval_binary=0
interval=1117,inteval_binary=0
interval=2259,inteval_binary=1
interval=1104,inteval_binary=0
interval=1107,inteval_binary=0
interval=2277,inteval_binary=1
interval=1082,inteval_binary=0
interval=2261,inteval_binary=1
interval=2220,inteval_binary=1
interval=2267,inteval_binary=1
interval=1095,inteval_binary=0
interval=2262,inteval_binary=1
interval=40320,inteval_binary=2
interval=11203,inteval_binary=2
ircmdcode=0x0,0xff,0x45,0xba
------------end-------------
key=0x45
----------onecmd---------
interval=0,inteval_binary=2
interval=13422,inteval_binary=2
interval=1092,inteval_binary=0
interval=1153,inteval_binary=0
interval=1081,inteval_binary=0
interval=1119,inteval_binary=0
interval=1123,inteval_binary=0
interval=1144,inteval_binary=0
interval=1097,inteval_binary=0
interval=1121,inteval_binary=0
interval=2246,inteval_binary=1
interval=2225,inteval_binary=1
interval=2281,inteval_binary=1
interval=2204,inteval_binary=1
interval=2259,inteval_binary=1
interval=2246,inteval_binary=1
interval=2209,inteval_binary=1
interval=2263,inteval_binary=1
interval=1099,inteval_binary=0
interval=1120,inteval_binary=0
interval=2267,inteval_binary=1
interval=1097,inteval_binary=0
interval=1106,inteval_binary=0
interval=1154,inteval_binary=0
interval=2204,inteval_binary=1
interval=1154,inteval_binary=0
interval=2207,inteval_binary=1
interval=2274,inteval_binary=1
interval=1084,inteval_binary=0
interval=2243,inteval_binary=1
interval=2265,inteval_binary=1
interval=2235,inteval_binary=1
interval=1100,inteval_binary=0
interval=2228,inteval_binary=1
ircmdcode=0x0,0xff,0x44,0xbb
------------end-------------
key=0x44
----------onecmd---------
interval=0,inteval_binary=2
interval=13435,inteval_binary=2
interval=1082,inteval_binary=0
interval=1104,inteval_binary=0
interval=1156,inteval_binary=0
interval=1098,inteval_binary=0
interval=1101,inteval_binary=0
interval=1125,inteval_binary=0
interval=1157,inteval_binary=0
interval=1082,inteval_binary=0
interval=2273,inteval_binary=1
interval=2211,inteval_binary=1
interval=2258,inteval_binary=1
interval=2226,inteval_binary=1
interval=2254,inteval_binary=1
interval=2209,inteval_binary=1
interval=2279,inteval_binary=1
interval=2204,inteval_binary=1
interval=2259,inteval_binary=1
interval=2254,inteval_binary=1
interval=2206,inteval_binary=1
interval=1123,inteval_binary=0
interval=1140,inteval_binary=0
interval=1097,inteval_binary=0
interval=1120,inteval_binary=0
interval=1140,inteval_binary=0
interval=1100,inteval_binary=0
interval=1122,inteval_binary=0
interval=1106,inteval_binary=0
interval=2263,inteval_binary=1
interval=2258,inteval_binary=1
interval=2199,inteval_binary=1
interval=2278,inteval_binary=1
interval=2204,inteval_binary=1
interval=40346,inteval_binary=2
interval=11205,inteval_binary=2
ircmdcode=0x0,0xff,0x7,0xf8
------------end-------------
key=0x7
----------onecmd---------
interval=0,inteval_binary=2
interval=13428,inteval_binary=2
interval=1110,inteval_binary=0
interval=1086,inteval_binary=0
interval=1118,inteval_binary=0
interval=1156,inteval_binary=0
interval=1080,inteval_binary=0
interval=1122,inteval_binary=0
interval=1123,inteval_binary=0
interval=1143,inteval_binary=0
interval=2222,inteval_binary=1
interval=2259,inteval_binary=1
interval=2205,inteval_binary=1
interval=2277,inteval_binary=1
interval=2208,inteval_binary=1
interval=2258,inteval_binary=1
interval=2252,inteval_binary=1
interval=2205,inteval_binary=1
interval=1125,inteval_binary=0
interval=2260,inteval_binary=1
interval=2233,inteval_binary=1
interval=1102,inteval_binary=0
interval=2228,inteval_binary=1
interval=1155,inteval_binary=0
interval=1100,inteval_binary=0
interval=1104,inteval_binary=0
interval=2283,inteval_binary=1
interval=1081,inteval_binary=0
interval=1121,inteval_binary=0
interval=2245,inteval_binary=1
interval=1119,inteval_binary=0
interval=2265,inteval_binary=1
interval=2218,inteval_binary=1
interval=2260,inteval_binary=1
interval=40305,inteval_binary=2
interval=11217,inteval_binary=2
ircmdcode=0x0,0xff,0x16,0xe9
------------end-------------
key=0x16
----------onecmd---------
interval=0,inteval_binary=2
interval=13420,inteval_binary=2
interval=1093,inteval_binary=0
interval=1102,inteval_binary=0
interval=1157,inteval_binary=0
interval=1098,inteval_binary=0
interval=1104,inteval_binary=0
interval=1125,inteval_binary=0
interval=1154,inteval_binary=0
interval=1084,inteval_binary=0
interval=2245,inteval_binary=1
interval=2250,inteval_binary=1
interval=2254,inteval_binary=1
interval=2218,inteval_binary=1
interval=2243,inteval_binary=1
interval=2222,inteval_binary=1
interval=2284,inteval_binary=1
interval=2204,inteval_binary=1
interval=1149,inteval_binary=0
interval=1084,inteval_binary=0
interval=2277,inteval_binary=1
interval=2204,inteval_binary=1
interval=1120,inteval_binary=0
interval=1139,inteval_binary=0
interval=1102,inteval_binary=0
interval=1118,inteval_binary=0
interval=2262,inteval_binary=1
interval=2205,inteval_binary=1
interval=1155,inteval_binary=0
interval=1099,inteval_binary=0
interval=2230,inteval_binary=1
interval=2260,inteval_binary=1
interval=2254,inteval_binary=1
interval=2209,inteval_binary=1
interval=40339,inteval_binary=2
interval=11196,inteval_binary=2
ircmdcode=0x0,0xff,0xc,0xf3
------------end-------------
key=0xc
4.2.不打开调试开关的效果
devtmpfs:
mounted
Freeingunusedkernelmemory:
184kfreed
Algorithmics/MIPSFPUEmulatorv1.5
#mountall.....
#Startingmdev.....
Processing/etc/profile.....
Done!
[LOONSON@Loongson-gz:
/]#/test/ls1b_ir_test_app
key=0x45
key=0x44
key=0x7
key=0x16
key=0xc
key=0x8
key=0x42
key=0x40
key=0x15
key=0x19
key=0x18
key=0x1c
key=0x52
key=0x47
key=0x43
key=0x9
key=0xd
key=0x5e
key=0x5a
key=0x4a
^C
[LOONSON@Loongson-gz:
/]#
5.源码清单
5.1.驱动程序
5.1.1.ls1b_ir.h
#ifndef_LS1B_IR_H_
#define_LS1B_IR_H_
#endif
5.1.2.ls1b_ir.c
#include
#include
#include
#include
#include
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 龙芯参考资料1B开发板一体化红外接收头 20键迷你红外遥控器驱动 参考资料 开发 一体化 红外 接收 20 迷你 遥控器 驱动