LINUX驱动开发中的红外(IRDA)程序

2023-10-31 17:10

本文主要是介绍LINUX驱动开发中的红外(IRDA)程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

红外遥控简介简介

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。
由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影响临近的无线电设备。

红外遥控的编码目前广泛使用的是:NEC Protocol 的 PWM(脉冲宽度调制)和 Philips RC-5 Protocol的 PPM(脉冲位置调制)。 我使用的的遥控器使用的是NEC 协议,其特征如下:

  1. 8位地址和8位指令长度;
  2. 地址和命令2次传输(确保可靠性);
  3. PWM脉冲位置调制,以发射红外载波的占空比代表“ 0”和“ 1”;
  4. 载波频率为38Khz;
  5. 位时间为1.125ms或2.25ms;

NEC 码的位定义:一个脉冲对应560us的连续载波,一个逻辑 1 传输需要2.25ms(560us 脉冲+1680us 低电平),一个逻辑0的传输需要 1.125ms(560us 脉冲+560us 低电平)。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑1应该是560us低+1680us高,逻辑0应该是560us低+560us高。
NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步码由一个9ms的低电平和一个4.5ms的高电平组成,地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。

【文章福利】小编推荐自己的Linux内核源码交流群:【869634926】整理了一些个人觉得比较好的学习书籍、视频资料共享在群里面,有需要的可以自行添加哦!!

1. ENC 协议的时序图

ENC特点如下:
1),协议规定低位首先发送。一串信息首先发送9ms的AGC(自动增益控制)的高脉冲,接着发送4.5ms的起始低电平,接下来是发送四个字节的地址码和命令码,这四个字节分别为:地址码;地址码反码;命令码;命令码反码。
2),如果你一直按那个按键,一串信息也只能发送一次,一直按着,发送的则是以110ms为周期的重复码。
3),接收到的信号是跟发送信号正好反向的。

2.重复码的格式

重复码的格式是由9ms的AGC高电平和4.5ms的低电平及一个560us的高电平组成。

3.逻辑“1”的表示

逻辑1的是由560us的高电平和1.69ms的低电平组成的脉冲表示。

4.逻辑“0”的表示

逻辑0的是有560us的高电平和565us的低电平组成的脉冲表示。

5.ENC的解码过程

一般ENC的解码过程为:
1),产生下降沿,进入外部中断15的中断函数,延时一下之后检测IO口是否还是低电平,是就等待9ms的低电平过去。
2),等待完9ms低电平过去,再去等待4.5ms的高电平过去。
3),接着开始接收传送的4组数据
①先等待560us的低电平过去
②检测高电平的持续时间,如果超过1.12ms那么是高电平(高电平的的持续时间为1.69ms,低电平的持续时间为565us。
4),检测接收到的数据和数据的反码进行比较,是否等到的数据是一样的。

6,下面直接写驱动程序

#include <linux/init.h>
#include <linux/module.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/ktime.h>#include <mach/gpio.h>#define IRDA_GPIO   EXYNOS4_GPX3(2)int flag = 0;               // 表示数据帧的开始
int num = 0;                // 表示数据帧里的第几位数据
static long long prev = 0;  // 64bit,记录上次的时间
unsigned int times[40];     // 记录每位数据的时间irqreturn_t 
infrared_irq_handler(int irqno, void *dev_id)
{long long now = ktime_to_us(ktime_get());unsigned int offset;int i, j, tmp;if(!flag){  // 数据开始flag = 1;prev = now;return IRQ_HANDLED;}offset = now - prev;prev = now;if((offset > 13000) && (offset < 14000)){   // 判断是否收到引导码num = 0;return IRQ_HANDLED;}if(num < 32)times[num++] = offset;if(num >= 32){for(i = 0; i < 4; i++){ // 一共4个字节tmp = 0;for(j = 0; j < 8; j++){if(times[i * 8 + j] > 2000) // 如果数据位的信号周期大于20ms,则是二进制数据1tmp |= 1 << j;}printk("%02x ", tmp);}printk("\n");flag = 0;}return IRQ_HANDLED;
}static void __exit
infrared_drv_exit(void)
{free_irq(gpio_to_irq(IRDA_GPIO), NULL);
}static int __init
infrared_drv_init(void)
{int ret = -1;ret = request_irq(gpio_to_irq(IRDA_GPIO), infrared_irq_handler, IRQF_TRIGGER_FALLING, "infrared", NULL);if(ret < 0){printk("request irq failed !\n");return ret;}return 0;
}module_init(infrared_drv_init);
module_exit(infrared_drv_exit);MODULE_LICENSE("GPL");

还有对应的Makefile:

#指定内核源码路径
KERNEL_DIR = /home/george/1702/exynos/linux-3.5#指定当前路径
CUR_DIR = $(shell pwd)#MYAPP = dht11_app
MODULE = IRDA_for_irqall:make -C $(KERNEL_DIR) M=$(CUR_DIR) modules
#	arm-none-linux-gnueabi-gcc -o $(MYAPP) $(MYAPP).c
clean:make -C $(KERNEL_DIR) M=$(CUR_DIR) clean$(RM) $(MYAPP)
install:cp -raf *.ko $(MYAPP) /home/george/1702/exynos/filesystem/1702#指定编译当前目录下那个源文件
obj-m = $(MODULE).o

编译生成.ko文件之后,装载,然后进行实物测试,验证效果图如下:

这篇关于LINUX驱动开发中的红外(IRDA)程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/316853

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal