1、概述:

对多种红外遥控器的信号进行分析,其发出的红外指令中,引导码各不相同,而且后面的控制指令也有较大差别,甚至指令码的位数也不相同,原因是这些红外设计没有遵守相同的红外标准。但是其基本思想是相同的,即采用不同周期和不同占空比的脉冲分别表示逻辑0及1,只要根据期占空比及脉冲周期进行解析即可得到具体的按键码值。

2、协议种类:

市面上基本上有如下几大类协议:

NEC with simple repeat code

NEC with full repeat code

TC9012

松下7051码

SONY码

RC5/RC6A

3、协议datasheet表(引用hisi整理的统计表)

NEC with simple repeat code 码

NEC with full repeat code 码

TC9012和SONY码:

4、数据格式

基本上红外都是以38MHz作为载波频率,即每一位时间为1.12ms或2.25ms

NEC with simple repeat code数据格式由START(引导码)+数据码+burst突发帧三部分组成

发送单个帧格式:

发送重复帧格式,收到第一个完整帧数据后,接下来收到的数据帧由简化的引导码和burst信号组成

其它的编码本质上都差不多,例如松下7051编码:

遥控器红外发射信号的编码格式:引导码+设备码+键码+循环延时

引导码 = 3640us (高电平)+ 1800us(低电平)

"高电平"为红外线载波调制,"低电平"为无红外线载波调制。

设备码 = 32位:

格式 = 码0(S)8位 + 码1(Z)8位 + 码2(Y)8位 + 码3(X)8位;

键值码 = 16位:

格式 = 数据码0(8位)+数据码1(8位);

逻辑'0':= 380us (高电平)+ 380us(低电平);

逻辑'1'= 380us (高电平)+ 1350us(低电平);

循环延时=50ms,其误差≤5%;

表示先检测到引导码,然后进入开始统计设备码及键值码共48位,最后按下不入进入repeat模式进行延时50ms。

5、基本编程方法

1、注册ISR中断

request_irq(IR_IRQ_NO, (irq_handler_t)Ir_Isr, IRQF_DISABLED, NULL, HI_NULL);

2、处理Ir_Isr函数,根据寄存器IR_RCV状态将获得的键值(高低电平值)写入队列(data_l,data_h)

3、在定时器中处理队列数据,如每隔10ms或者50ms时间检测并将队列值送入到ir decode器中

4、ir decode处理,本质就是比较高低电平持续时间确定出具体的键值

/* d1 寄存器中读取的值,d2为协议定义的标准值,margin为误差码值 */

#define FACTOR        15/100

static inline int pulse_eq_margin(unsigned int d1, unsigned int d2, unsigned int margin)

{

return ((d1 > (d2 - margin)) && (d1 < (d2 + margin)));

}

首先判定引导码:

3640us (高电平)+ 1800us(低电平)引导码

pulse_eq_margin(data_l,header_pulse,header_pulse*FACTOR)

pulse_eq_margin(data_l,header_space,header_space*FACTOR)

然后再根据其状态进行取值

比如松下7051码可定义如下状态:

IR_STATE_INACTIVE, // 空闲状态

IR_STATE_HEADER_SPACE,

IR_STATE_BIT_PULSE,

IR_STATE_BIT_SPACE,

IR_STATE_FRAME_PULSE,

IR_STATE_FRAME_SPACE,

IR_STATE_REPEAT_PULSE,

IR_STATE_REPEAT_SPACE,

定义的重要数据结构如下:

unsigned int wanted_bits;        /* 需要等待接收的位数,比如7051就需要接收48位*/

unsigned int header_pulse;       /* Unit:μs 3640*/

unsigned int header_space;       /* Unit:μs 1800*/

unsigned int bit0_pulse;         /* Unit:μs 380*/

unsigned int bit0_space;

/* Unit:μs 380*/

unsigned int bit1_pulse;

/* Unit:μs 380*/

unsigned int bit1_space;

/* Unit:μs 1350*/

unsigned int frame_units;

/* Unit:μs 380*/

unsigned int frame_end_space;    /* more than frame_end_space 50ms即 50000μs*/

unsigned int repeat_pulse;

/* no repeat 0 ex>NEC:9000*/

unsigned int repeat_space;

/* no repeat 0 ex>NEC:2250*/

然后就是求值:

if(pulse_eq_margin(data_time,bit1_space,frame_units>>1)){

data->bits |= (unsigned long long)(((unsigned long long)1)<count)

}

其中bits用于保存键值,只有出现逻辑'1'时才须对其赋值,count用于计算位于STATE_BIT_SPACE累加值

其中会涉及到一些较细节的知识就不在此复述了,提供一种思路给大家,都有规律可偱。

android 红外驱动,Android内核驱动-红外驱动IR相关推荐

  1. android驱动之旅-在Ubuntu上为Android系统编写Linux内核驱动程序(3)

    Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节.也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空 ...

  2. Android蓝牙内核级设备驱动设计

    蓝牙内核级设备驱动设计 1.Android 蓝牙架构 1)蓝牙设备驱动的位置 – 内核之中 2)协议位于内核中的有哪些 -- HCI接口实现.L2CAP.RFCOMM 3) C++ 中的是怎样通信的 ...

  3. Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记

    Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记     本章学习了使用git下载两套源代码并搭建两个开发环境.分别为Android源代码和Linux内核源代码.A ...

  4. android 电容屏(二):驱动调试之基本概念篇

    关键词:android  电容屏 tp 工作队列 中断 多点触摸协议 平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0  平台:S5PV310(sams ...

  5. Android深度探索(卷1)HAL与驱动开发第六章总结

    操作系统是通过各种驱动程序赖家与硬件设备的,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式.设备驱动程序是操作系统最基本的组成部分之一,在Linux内核源程序中也 ...

  6. Android深度探索(卷1)HAL与驱动开发 心得体会 第十章 嵌入式Linux的调用技术

    Android深度探索(卷1)HAL与驱动开发 心得体会 第十章  嵌入式Linux的调用技术 对于复杂的Linux驱动以及HAL等程序库,需要使用各种方法对其进行调试.例如,设置断点,逐步跟踪代码. ...

  7. Android 系统(4)---Android HAL层与Linux Kernel层驱动开发简介

    Android HAL层与Linux Kernel层驱动开发简介 近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记. HAL:Hardw ...

  8. Android HAL层与Linux Kernel层驱动开发简介

    Android HAL层与Linux Kernel层驱动开发简介 阅读数:5070 近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记. ...

  9. android音量加减驱动,android下调试声卡驱动之概述

    在Android中音频系统使用的是ALSA系统架构.ASoC--ALSA System on Chip .是建立在标准ALSA驱动层上,为了更好地支持 嵌入式处理器和移动设备中的音频Codec的一套软 ...

  10. 飞思卡尔i.MX 6Quad Android 4.2.2的LVDS屏幕驱动移植

    http://blog.csdn.net/xnwyd/article/details/11671123 1      概述 平台:freescale i.MX 6Quad 4核开发板MCIMX6Q-S ...

最新文章

  1. Keil中RO-data、RW-data、ZI-data意义
  2. 为什么计算机模拟不了人脑,为什么计算机永远不会拥有人类的意识?听完科学家的解释恍然大悟...
  3. Leetcode 148. 排序链表 解题思路及C++实现
  4. 使用vue.js devtools遇到的磕磕绊绊
  5. python太难_传说中Python最难理解的点,看这完篇就够了
  6. CentOS7防火墙firewalld和iptable的设置和使用
  7. php前台用户权限开通,vue实现网站前台的权限管理
  8. python清洗文本数据_02.数据预处理之清洗文本信息
  9. python 系统架构_Python之优化系统架构的方案
  10. Intent实现页面跳转
  11. 11.频域里的卷积——介绍,傅里叶变换和卷积,快速傅里叶变换(FFT)_1
  12. 深度学习的推荐模型(DLRMs):设计孪生掩码层高效学习维度自适应的Embedding...
  13. python软件_Python软件的下载与安装
  14. Spring Framework 官方文档学习(一)介绍
  15. 阮一峰ES6入门学习笔记~~变量的解构赋值
  16. MyEclipse 不提示jsp代码
  17. 电脑ps计算机磨皮,ps脸部磨皮教程
  18. 新版升级 DAEMON Tools v4.10 X86 32 Bits (with SPTD 1.50)
  19. KeyShot 11.1 现已推出
  20. java什么是适配器类?作用是什么?_软件设计模式之适配器模式(JAVA)

热门文章

  1. STM32系列(HAL库)——F103C8T6驱动WS2812全彩RGB模块(PWM+DMA方式)
  2. 姜小白的python日记Day3 初识模块与数据运算
  3. php 站内信 类
  4. 解决No thread-bound request found: Are you referring to request attributes outside of an actual web...
  5. 题源报刊第三季--Lesson 3--Gender equality at work is a matter of respect,not just money
  6. 初学者吉他怎么选?适合男女生新手吉他入门品牌推荐!
  7. Flex布局和gird布局
  8. python的文件操作:文件定位读写,重命名,删除等操作
  9. 共阴极数码管,学号显示实验
  10. 计算机组成原理学习笔记(四)指令系统(学习王道)