这一次还是接在 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 是正常的,

驱动源码

 #include <linux/consolemap.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/tty.h>
#include <linux/tty_flip.h>
#include <linux/mm.h>
#include <linux/string.h>
#include <linux/init.h>
#include <linux/slab.h> #include <linux/kbd_kern.h>
#include <linux/kbd_diacr.h>
#include <linux/vt_kern.h>
#include <linux/input.h>
#include <linux/reboot.h>
#include <linux/notifier.h>
#include <linux/jiffies.h>
#include <linux/uaccess.h> #include <asm/irq_regs.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/delay.h> #include <linux/gpio.h>
#include <mach/regs-gpio.h>
#include <mach/gpio-samsung.h>
#include <mach/hardware.h>
#include <plat/gpio-cfg.h> /*
标准的 NEC 码规范:
首次发送的是9ms的高电平脉冲,其后是4.5ms的低电平,接下来就是8bit的地址码(从低有效位开始发),
而后是8bit的地址码的反码(主要是用于校验是否出错)。然后是8bit 的命令码(也是从低有效位开始发),
而后也是8bit 的命令码的反码。其“0”为载波发射0.56ms,不发射0.565ms,其“1”为载波发射0.56ms,
不发射1.69ms。
*/ #define IR gpio_get_value(S3C2410_GPG(12)) static irqreturn_t irm_irq(int irq, void *dev_id)
{
int k,i;
unsigned char irm_code[] = {, , , }; /* 操作原理 当有中断发生中 配置引脚功能为 GPIO 输入型 直接读IRM信号电平高低 */
s3c_gpio_cfgpin(S3C2410_GPG(), S3C2410_GPIO_INPUT);
mdelay(); //9ms 内必须是低电平否则就不是头信息
if( == IR)
{
while(! IR);//等待4.5ms的高电平 //检测是否是 2.5ms 重码
mdelay();
if( == IR)
{
//k 4位编码
for(k=; k<; k++)
{
//i 每一个编码的 8bit
for(i=;i<;i++)
{
while(IR); //等待变为低电平时
while(! IR); //等待变为高电平后
udelay(); //休眠700us 后读值
irm_code[k] |= (IR & )<<i;//先存低位
}
} //计算反码 code码是否正确
if((irm_code[]&0x3f) == (~(irm_code[]) & 0x3f))
{
printk("FID:0x%x 0x%x CID: 0x%x 0x%x\n", irm_code[], irm_code[], irm_code[], irm_code[]);
}
}
}
s3c_gpio_cfgpin(S3C2410_GPG(), S3C2410_GPIO_IRQ);
return IRQ_HANDLED;
} static int irm_init(void)
{
int ret;
//注册中断 上升沿触发
ret = request_irq(IRQ_EINT20, irm_irq, IRQF_TRIGGER_RISING, "irm_irq", NULL);
return ;
} static void irm_exit(void)
{
free_irq(IRQ_EINT20, NULL);
} module_init(irm_init);
module_exit(irm_exit);
MODULE_LICENSE("GPL");

最新文章

  1. matlab ASCII 格式导入
  2. HDU 2147 kiki&#39;s game(博弈)
  3. 快速消除IOS 版本升级带来的警告
  4. PHP检测获取内存信息
  5. sql 如何应对子查询返回数据有多条 我就是要返回数据有多条
  6. 快速失败(fail-fast)和安全失败(fail-safe)的区别
  7. 【Python3爬虫】Scrapy入门教程
  8. /etc/security/limits.conf的相关说明
  9. Linux学习---自定义数据类型
  10. 腾讯发布新版前端组件框架 Omi,全面拥抱 Web Components
  11. RabbitMQ安装(一)
  12. 归并排序(Python实现)
  13. thinkphp链接多个数据库时怎么调用M方法?
  14. Linq 中的 in 与 not in 的使用
  15. 转 java反射详解
  16. 谷歌商店高级搜索 Google play advanced search
  17. usb device address error 110
  18. 什么时候用var关键字
  19. SpringMVC-Controller
  20. 通用Linux内核优化配置

热门文章

  1. linux环境下卸载mysql
  2. sql server 数据库连接方式分析、详解
  3. [LC] 485. Max Consecutive Ones
  4. highcharts 柱状图在柱子顶部显示y轴数据
  5. 解决jar包冲突
  6. js new 与 return
  7. js怎么获取动态链式属性呢?
  8. JXL包大解析;Java程序生成excel文件和解析excel文件内容
  9. 使用Xshell进行vi编辑时,按下end、home和Delete不能使用,解决解决办法
  10. Python-控制语句及函数