Linux紅外驅(qū)動重點解析
時間:2021-08-19 16:29:22
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]紅外遙控是我們經(jīng)常見到的一種無線收發(fā)設備,比如電視遙控,空調(diào)遙控,現(xiàn)在電視遙控有些慢慢變成了藍牙裝置。昨天是在知識星球里面看到有人提問,今天來解析一份網(wǎng)友寫的驅(qū)動程序。調(diào)試紅外需要注意幾個細節(jié)1、我們發(fā)射的遙控器用肉眼是看不到的,需要拿相機來觀察。2、紅外接收管和普通的二極管不同...
紅外遙控是我們經(jīng)常見到的一種無線收發(fā)設備,比如電視遙控,空調(diào)遙控,現(xiàn)在電視遙控有些慢慢變成了藍牙裝置。昨天是在知識星球里面看到有人提問,今天來解析一份網(wǎng)友寫的驅(qū)動程序。
調(diào)試紅外需要注意幾個細節(jié)
1、我們發(fā)射的遙控器用肉眼是看不到的,需要拿相機來觀察。2、紅外接收管和普通的二極管不同,如果用錯物料也是不行的。
1.NEC協(xié)議無線傳輸數(shù)據(jù)原理
NEC協(xié)議的特征:?
1、8位地址和8位指令長度;?2、地址和命令兩次傳輸;(確??煽啃裕?3、PWM脈沖寬度調(diào)制,以發(fā)射紅外載波的占空比代表“0”和“1”;?4、載波頻率為38KHz?5、位時間為1.125ms和2.25ms?
NEC碼位的定義:一個脈沖對應560us的連續(xù)載波,一個邏輯1傳輸需要2.25ms(560us脈沖 1680us低電平),一個邏輯0的 傳輸需要1.125ms(560us脈沖 560us低電平)。
而遙控接收頭在收到脈沖時為低電平,在沒有收到脈沖時為高電平,因此, 我們在接收頭端收到的信號為:邏輯1應該是560us低 1680us高,邏輯0應該是560us低 560us高。
如下圖:
硬件
2. Linux下的驅(qū)動接收程序
參考原文:
https://blog.csdn.net/wllw7176/article/details/110506677
兩個驅(qū)動文件
gpio-ir-recv.c
調(diào)試紅外需要注意幾個細節(jié)
1、我們發(fā)射的遙控器用肉眼是看不到的,需要拿相機來觀察。2、紅外接收管和普通的二極管不同,如果用錯物料也是不行的。
1.NEC協(xié)議無線傳輸數(shù)據(jù)原理
NEC協(xié)議的特征:?
1、8位地址和8位指令長度;?2、地址和命令兩次傳輸;(確??煽啃裕?3、PWM脈沖寬度調(diào)制,以發(fā)射紅外載波的占空比代表“0”和“1”;?4、載波頻率為38KHz?5、位時間為1.125ms和2.25ms?
NEC碼位的定義:一個脈沖對應560us的連續(xù)載波,一個邏輯1傳輸需要2.25ms(560us脈沖 1680us低電平),一個邏輯0的 傳輸需要1.125ms(560us脈沖 560us低電平)。
而遙控接收頭在收到脈沖時為低電平,在沒有收到脈沖時為高電平,因此, 我們在接收頭端收到的信號為:邏輯1應該是560us低 1680us高,邏輯0應該是560us低 560us高。
如下圖:
硬件
2. Linux下的驅(qū)動接收程序
參考原文:
https://blog.csdn.net/wllw7176/article/details/110506677
兩個驅(qū)動文件
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,?