Linux紅外驅(qū)動(dòng)重點(diǎn)解析
時(shí)間:2021-08-19 16:29:22
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]紅外遙控是我們經(jīng)常見到的一種無線收發(fā)設(shè)備,比如電視遙控,空調(diào)遙控,現(xiàn)在電視遙控有些慢慢變成了藍(lán)牙裝置。昨天是在知識(shí)星球里面看到有人提問,今天來解析一份網(wǎng)友寫的驅(qū)動(dòng)程序。調(diào)試紅外需要注意幾個(gè)細(xì)節(jié)1、我們發(fā)射的遙控器用肉眼是看不到的,需要拿相機(jī)來觀察。2、紅外接收管和普通的二極管不同...
紅外遙控是我們經(jīng)常見到的一種無線收發(fā)設(shè)備,比如電視遙控,空調(diào)遙控,現(xiàn)在電視遙控有些慢慢變成了藍(lán)牙裝置。昨天是在知識(shí)星球里面看到有人提問,今天來解析一份網(wǎng)友寫的驅(qū)動(dòng)程序。
調(diào)試紅外需要注意幾個(gè)細(xì)節(jié)
1、我們發(fā)射的遙控器用肉眼是看不到的,需要拿相機(jī)來觀察。2、紅外接收管和普通的二極管不同,如果用錯(cuò)物料也是不行的。
1.NEC協(xié)議無線傳輸數(shù)據(jù)原理
NEC協(xié)議的特征:?
1、8位地址和8位指令長度;?2、地址和命令兩次傳輸;(確??煽啃裕?3、PWM脈沖寬度調(diào)制,以發(fā)射紅外載波的占空比代表“0”和“1”;?4、載波頻率為38KHz?5、位時(shí)間為1.125ms和2.25ms?
NEC碼位的定義:一個(gè)脈沖對(duì)應(yīng)560us的連續(xù)載波,一個(gè)邏輯1傳輸需要2.25ms(560us脈沖 1680us低電平),一個(gè)邏輯0的 傳輸需要1.125ms(560us脈沖 560us低電平)。
而遙控接收頭在收到脈沖時(shí)為低電平,在沒有收到脈沖時(shí)為高電平,因此, 我們?cè)诮邮疹^端收到的信號(hào)為:邏輯1應(yīng)該是560us低 1680us高,邏輯0應(yīng)該是560us低 560us高。
如下圖:
硬件
2. Linux下的驅(qū)動(dòng)接收程序
參考原文:
https://blog.csdn.net/wllw7176/article/details/110506677
兩個(gè)驅(qū)動(dòng)文件
gpio-ir-recv.c
調(diào)試紅外需要注意幾個(gè)細(xì)節(jié)
1、我們發(fā)射的遙控器用肉眼是看不到的,需要拿相機(jī)來觀察。2、紅外接收管和普通的二極管不同,如果用錯(cuò)物料也是不行的。
1.NEC協(xié)議無線傳輸數(shù)據(jù)原理
NEC協(xié)議的特征:?
1、8位地址和8位指令長度;?2、地址和命令兩次傳輸;(確??煽啃裕?3、PWM脈沖寬度調(diào)制,以發(fā)射紅外載波的占空比代表“0”和“1”;?4、載波頻率為38KHz?5、位時(shí)間為1.125ms和2.25ms?
NEC碼位的定義:一個(gè)脈沖對(duì)應(yīng)560us的連續(xù)載波,一個(gè)邏輯1傳輸需要2.25ms(560us脈沖 1680us低電平),一個(gè)邏輯0的 傳輸需要1.125ms(560us脈沖 560us低電平)。
而遙控接收頭在收到脈沖時(shí)為低電平,在沒有收到脈沖時(shí)為高電平,因此, 我們?cè)诮邮疹^端收到的信號(hào)為:邏輯1應(yīng)該是560us低 1680us高,邏輯0應(yīng)該是560us低 560us高。
如下圖:
硬件
2. Linux下的驅(qū)動(dòng)接收程序
參考原文:
https://blog.csdn.net/wllw7176/article/details/110506677
兩個(gè)驅(qū)動(dòng)文件
gpio-ir-recv.c
/*?Copyright?(c)?2012,?Code?Aurora?Forum.?All?rights?reserved.
?*
?*?This?program?is?free?software;?you?can?redistribute?it?and/or?modify
?*?it?under?the?terms?of?the?GNU?General?Public?License?version?2?and
?*?only?version?2?as?published?by?the?Free?Software?Foundation.
?*
?*?This?program?is?distributed?in?the?hope?that?it?will?be?useful,
?*?but?WITHOUT?ANY?WARRANTY;?without?even?the?implied?warranty?of
?*?MERCHANTABILITY?or?FITNESS?FOR?A?PARTICULAR?PURPOSE.??See?the
?*?GNU?General?Public?License?for?more?details.
?*/
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#define?GPIO_IR_DRIVER_NAME?"gpio-rc-recv"
#define?GPIO_IR_DEVICE_NAME?"gpio_ir_recv"
struct?gpio_rc_dev?{
?struct?rc_dev?*rcdev;
?int?gpio_nr;
?bool?active_low;
};
#ifdef?CONFIG_OF
/*
?*?Translate?OpenFirmware?node?properties?into?platform_data
?*/
static?int?gpio_ir_recv_get_devtree_pdata(struct?device?*dev,
??????struct?gpio_ir_recv_platform_data?*pdata)
{
?struct?device_node?*np?=?dev->of_node;
?enum?of_gpio_flags?flags;
?int?gpio;
?gpio?=?of_get_gpio_flags(np,?0,?