红外线知识点介绍
红外线是指光谱中波长从760nm到400um的电磁波,属于不可见光范畴。目前,绝大多数的视频和音频设备都支持通过红外遥控进行操作,例如电视机、空调和影碟机等,红外遥控技术因其广泛应用和低成本,成为日常设备控制的首选方式。
红外线遥控是目前最常见的通信和遥控手段之一。由于红外线遥控装置具有体积小、功耗低、功能强大且成本低廉的特点,因此在彩电、录像机之后,录音机、音响设备、空调以及玩具等小型电器中也广泛采用了红外线遥控技术。在工业环境中,如高压、辐射、有毒气体和粉尘等场合,红外线遥控不仅可靠,还能有效隔离电气干扰。
NEC协议是众多红外线协议中的一种,曾经广泛应用于电视机和投影仪设备中,早期的万能电视遥控器通常采用的是NEC协议。
本文将介绍如何在Linux系统下,通过红外线接收模块编写一个NEC协议的红外线解码驱动,解析遥控器传输的各种控制指令,并完成相应的动作响应。驱动中使用外部中断接收数据,并通过定时器计算间隔时间来完成解码。
NEC协议的特点如下:
单个码分为五个部分(不包括重复码):引导码+用户码+用户反码+按键码+按键反码。
对于接收方,引导码为9ms的低电平和4.5ms的高电平。
接收的数据为0时,表现为560us的低电平和560us的高电平。
接收的数据为1时,表现为560us的低电平和1680us的高电平。


硬件环境
当前开发板采用的是友善之臂的Tiny4412,搭载三星的EXYNOS4412处理器,最高主频为1.5GHz,运行的Linux内核版本为3.5。
以下是红外线接收模块的原理图:
快写红薯通AI
快写红薯通AI,专为小红书而生的AI写作工具
57 查看详情

通过杜邦线连接到开发板的中断输入脚上(GPX1_0接口,第9个排针)。

驱动安装后的解码效果如下:

案例代码
驱动代码的思路是通过外部中断接收NEC协议的数据,在工作队列中完成协议解析,并最终通过printk函数打印出来。
代码语言:javascript代码运行次数:0
运行复制“`javascript#include linux>#include #include #include #include #include #include #include
static int irq;
define NEC_INFRARED_GPIO EXYNOS4_GPX1(0)
static struct work_struct work;
/获取高电平持续时间–us单位/static u32 GetTimeH(void){ktime_t my_time,my_time2;unsigned int i,j;my_time=ktime_get(); //获取当前时间i=ktime_to_us(my_time); //转 uswhile(gpio_get_value(NEC_INFRARED_GPIO)){}my_time2=ktime_get(); //获取当前时间j=ktime_to_us(my_time2); //转 usreturn j-i;}
/获取低电平持续时间–us单位/static u32 GetTimeL(void){ktime_t my_time,my_time2;unsigned int i,j;my_time=ktime_get(); //获取当前时间i=ktime_to_us(my_time); //转 uswhile(gpio_get_value(NEC_INFRARED_GPIO)==0){}my_time2=ktime_get(); //获取当前时间j=ktime_to_us(my_time2); //转 usreturn j-i;}
/工作函数/static u8 buf[4];//[0]用户码 [1]用户反码 [2]按键码 [3]按键反码static void new_work_func(struct work_struct *work){u8 data=0;u32 time_us;
/*1. 判断引导码*/time_us=GetTimeL();if(time_us>12000 || time_us700 || time_us<400) // 0 :标准560 return;/*2. 接收数据*/for(int i=0;i1500) // 1 :标准1680 data |= (1<<i); else data &= ~(1<1500) // 1 :标准1680 data |= (1<<i); else data &= ~(1<> 8) & 0xFF; // 用户反码buf[2] = (data >> 16) & 0xFF; // 按键码buf[3] = (data >> 24) & 0xFF; // 按键反码/*4. 打印数据*/printk("用户码:0x%02x, 用户反码:0x%02x, 按键码:0x%02x, 按键反码:0x%02xn", buf[0], buf[1], buf[2], buf[3]);
}
以上就是Linux驱动开发-编写NEC红外线协议解码驱动的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/470579.html
微信扫一扫
支付宝扫一扫