IRM3800 红外遥控器解码 linux驱动

这一次还是接在 Cemera 上。用 中断引脚 EINT20 也就是 GPG12.

之前焊的 51 板子上有一个红外接收器。

请注意了,是

标准的 NEC 码规范:
首次发送的是9ms的高电平脉冲,其后是4.5ms的低电平,接下来就是8bit的地址码(从低有效位开始发),
而后是8bit的地址码的反码(主要是用于校验是否出错)。然后是8bit 的命令码(也是从低有效位开始发),
而后也是8bit 的命令码的反码。其“0”为载波发射0.56ms,不发射0.565ms,其“1”为载波发射0.56ms,
不发射1.69ms。

这是一种不太好的实现方式,以后会更新其它更好的算法。

原理比较简单,当有中断发生中,将GPG12设为输入功能,通过读引脚的电平,配合时间,就能得到 红外遥控器发出的代码。

代码共4个,厂家ID 高, 厂家ID 低, 命令 , 命令反码

经过试验,发现,命令只有低6个bit 是正常的,

驱动源码

 1 #include <linux/consolemap.h>
 2 #include <linux/module.h>
 3 #include <linux/sched.h>
 4 #include <linux/tty.h>
 5 #include <linux/tty_flip.h>
 6 #include <linux/mm.h>
 7 #include <linux/string.h>
 8 #include <linux/init.h>
 9 #include <linux/slab.h>
10
11 #include <linux/kbd_kern.h>
12 #include <linux/kbd_diacr.h>
13 #include <linux/vt_kern.h>
14 #include <linux/input.h>
15 #include <linux/reboot.h>
16 #include <linux/notifier.h>
17 #include <linux/jiffies.h>
18 #include <linux/uaccess.h>
19
20 #include <asm/irq_regs.h>
21 #include <linux/interrupt.h>
22 #include <linux/irq.h>
23 #include <linux/delay.h>
24
25 #include <linux/gpio.h>
26 #include <mach/regs-gpio.h>
27 #include <mach/gpio-samsung.h>
28 #include <mach/hardware.h>
29 #include <plat/gpio-cfg.h>
30
31 /*
32 标准的 NEC 码规范:
33 首次发送的是9ms的高电平脉冲,其后是4.5ms的低电平,接下来就是8bit的地址码(从低有效位开始发),
34 而后是8bit的地址码的反码(主要是用于校验是否出错)。然后是8bit 的命令码(也是从低有效位开始发),
35 而后也是8bit 的命令码的反码。其“0”为载波发射0.56ms,不发射0.565ms,其“1”为载波发射0.56ms,
36 不发射1.69ms。
37 */
38
39 #define IR gpio_get_value(S3C2410_GPG(12))
40
41 static irqreturn_t irm_irq(int irq, void *dev_id)
42 {
43     int k,i;
44     unsigned char irm_code[4] = {0, 0, 0, 0};
45
46     /* 操作原理 当有中断发生中 配置引脚功能为 GPIO 输入型 直接读IRM信号电平高低 */
47     s3c_gpio_cfgpin(S3C2410_GPG(12), S3C2410_GPIO_INPUT);
48     mdelay(5); //9ms 内必须是低电平否则就不是头信息
49     if(0 == IR)
50      {
51          while(! IR);//等待4.5ms的高电平
52
53          //检测是否是 2.5ms 重码
54          mdelay(3);
55          if(1 == IR)
56          {
57              //k 4位编码
58              for(k=0; k<4; k++)
59              {
60                  //i 每一个编码的 8bit
61                  for(i=0;i<8;i++)
62                  {
63                      while(IR);     //等待变为低电平时
64                      while(! IR);   //等待变为高电平后
65                      udelay(700);  //休眠700us 后读值
66                      irm_code[k] |= (IR & 1)<<i;//先存低位
67                  }
68              }
69
70              //计算反码 code码是否正确
71              if((irm_code[2]&0x3f) == (~(irm_code[3]) & 0x3f))
72              {
73                  printk("FID:0x%x 0x%x CID: 0x%x 0x%x\n", irm_code[0], irm_code[1], irm_code[2], irm_code[3]);
74              }
75          }
76      }
77     s3c_gpio_cfgpin(S3C2410_GPG(12), S3C2410_GPIO_IRQ);
78     return IRQ_HANDLED;
79 }
80
81 static int irm_init(void)
82 {
83     int ret;
84     //注册中断 上升沿触发
85     ret = request_irq(IRQ_EINT20, irm_irq, IRQF_TRIGGER_RISING, "irm_irq", NULL);
86     return 0;
87 }
88
89 static void irm_exit(void)
90 {
91     free_irq(IRQ_EINT20, NULL);
92 }
93
94 module_init(irm_init);
95 module_exit(irm_exit);
96 MODULE_LICENSE("GPL");
时间: 2024-10-13 07:52:15

IRM3800 红外遥控器解码 linux驱动的相关文章

linux驱动面试题整理

资料来自网上,简单整理,答案后续补充...... 1.字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件? 答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件. 评:这只是其中一种方式,也叫手动创建设备文件.还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后.那么在系统启动期间还有devfs创建了设备文件.一共有三种方式可

16.3 NEC协议红外遥控器

家电遥控器通信距离往往要求不高,而红外的成本比其它无线设备要低的多,所以家电遥控器应用中红外始终占据着一席之地.遥控器的基带通信协议很多,大概有几十种,常用的就有 ITT 协议.NEC 协议.Sharp 协议.Philips RC-5 协议.Sony SIRC 协议等.用的最多的就是 NEC 协议了,因此我们 KST-51 开发板配套的遥控器直接采用 NEC 协议,我们这节课也以 NEC 协议标准来讲解一下. NEC 协议的数据格式包括了引导码.用户码.用户码(或者用户码反码).按键键码和键码反

linux驱动程序设计的硬件基础(一)

linux驱动程序设计的硬件基础(一) 本章讲总结学习linux设备程序设计的硬件基础. 一.处理器 1.1通用处理器 通用处理器(GPP)并不针对特定的应用领域进行体系结构和指令集的优化,它们具有一般化的通用体系结构和指令集,以支持复杂的运算并易于新开发功能的添加.一般而言,在嵌入式微控制器(MCU)和微处理器(MPU)中会包含一个通用处理器核.  MPU 通常代表一个 CPU(中央处理器) ,而 MCU 则强调把中央处理器.存储器和外围电路集成在一个芯片中.嵌入式微控制器一般由一个 CPU

linux驱动面试题目汇总

http://blog.csdn.net/blueice8601/article/details/7666427 1.linux驱动分类 2.信号量与自旋锁 3.platform总线设备及总线设备如何编写 4.kmalloc和vmalloc的区别 5.module_init的级别 6.添加驱动 7.IIC原理,总线框架,设备编写方法,i2c_msg 8.kernel panic 9.USB总线,USB传输种类,urb等 10.android boot 流程 11.android init解析in

嵌入式linux驱动开发之给你的linux系统添加温度传感器模块

忙了几天,终于可以让ds18b20在自己的开发板的linux系统上跑了!虽然ds18b20不是什么新鲜玩意,但是想想知己可以给linux系统添加模块了还是有点小鸡冻呢! 虽然说现在硬件的资源非常丰富而且剩余很多,可以用软件资源来代替硬件资源,比如说可以用视频编解码软件取代硬件来工作.但有很多模块需要实时的采集数据这都是软件永远无法代替的,而且随着互联网的进一步发展,智能化也是一个必然的趋势,因此大量的传感器和控制芯片将被应用到生产生活中,所以个人觉得驱动开发还是个不错的方向.同时,作为学习者,再

Linux代码的重用与强行卸载Linux驱动

(一)Linux代码的重用 重用=静态重用(将要重用的代码放到其他的文件的头文件中声明)+动态重用(使用另外一个Linux驱动中的资源,例如函数.变量.宏等) 1.编译是由多个文件组成的Linux驱动(静态重用) 对于复杂的Linux驱动,需要使用多个源代码文件存放不同的功能代码,这样做有利于代码分类和管理,那么就不得不编译多个源代码文件,最终生成.ko文件或编译进Linux内核 下面,就介绍将3个.c文件分别编译为3个.o文件,并将这3个.o文件链接(link)成一个.ko文件——静态重用 假

第六章——使用实例来理解Linux驱动开发及心得

在这一章中主要介绍了一个Linux驱动程序,以实战的方式向我们介绍了一个Linux驱动程序的例子. Linux驱动的工作和访问方式是Linux的亮点之一,同时受到了业界的广泛好评. Linux系统 将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中.这种 设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易.当然,也比访问LinuxAPI 更容易. 由于大多数Linux驱动都有与其对应的设备文件, 因此与Linux驱动交换数据就变成了与 设备文件交

Linux驱动开发盲点笔记1

1. vim中在找到搜索目标后,使用n与N进行定位查找 2. vim中使用gg到最好第一行,使用xxxG到某一行,否则G直接到最后一行: 3. ln -s 产生的链接文件最终指向的目标文件src 新产生的当前软链接文件dst. ln -s project(磁盘上实际存在的文件或者目录) a.lnk ln -s src dst(新产生的文件dst,dst链接到src) symlink功能类似 4 tar -czvf 最终生产的tar打包好的文件 待打包的文件或者文件夹 tar czvf a.tar

常见 wifi热点的linux 驱动

小度Wifi.360Wifi Windows.linux驱动 小度wifi什么的就是一个无线网卡,当然可以自由使用,然官方却说不支持无限网卡功能… 现提供Windows平台和linux平台的驱动安装方法. Windows 驱动下载:http://pan.baidu.com/s/1GcFF1 Linux 使用lsusb命令可以获取USB设备ID.小度wifi为2955:0001或2955:1001 360WIFI2为148F:760B 二者均使用Mediatek Ralink MT7601芯片,都