版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1 .紅外知識(shí)簡(jiǎn)介31.1. 怎么判斷遙控板是否發(fā)射了紅外命令(是否有電)31.2. 紅外遙控器是怎樣解決干擾問(wèn)題的32 .硬件簡(jiǎn)介32.1. 一體化紅外接收頭42.1.1. 一體化紅外接收頭在開(kāi)發(fā)板上的位置42.1.2. 一體化紅外接收頭原理圖52.1.3. 一體化紅外接收頭原理72.2. 迷你20鍵38K紅外遙控板72.2.1. 遙控器按鍵編碼表72.2.2. NEC編碼分析83 .源碼分析93.1. 主要思路93.2. 阻塞IO103.3. 中斷的上下半部103.4. 內(nèi)核定時(shí)器114 .運(yùn)行效果124.1. 打開(kāi)調(diào)試開(kāi)關(guān)的效果124.2. 不打開(kāi)調(diào)試開(kāi)關(guān)的效果175 .源碼清單185.
2、1. 驅(qū)動(dòng)程序185.1.1. ls1b_ir.h185.1.2. ls1b_ir.c185.1.3. Platform.c295.2. 應(yīng)用程序305.2.1.ls1b_ir_test_app.c306 .參考文檔3131版本更新日期更新內(nèi)容V1.02014.4.5創(chuàng)建1 .紅外知識(shí)簡(jiǎn)介個(gè)人認(rèn)為百度文庫(kù)中的文檔全面了解紅外遙控(中文版).pdf講得很好。我這里只是把要點(diǎn)提一下。1.1. 怎么判斷遙控板是否發(fā)射了紅外命令(是否有電)我們時(shí)常會(huì)碰到一個(gè)問(wèn)題一一到底遙控器還有電沒(méi)有。對(duì)于電視遙控器可以取下電池看看,但是對(duì)于這里使用的迷你遙控器怎么辦?使用的是鋰電池。辦法是通過(guò)手機(jī)的攝像頭看遙控器的
3、紅外發(fā)射管。當(dāng)按下遙控器按鍵時(shí),如果有電會(huì)發(fā)射紅外命令,遙控器上的紅外發(fā)射管會(huì)發(fā)出紅外光,手機(jī)的攝像頭能看到這種光。下圖全面了解紅外遙控(中文版).pdf為通過(guò)手機(jī)攝像頭看遙控器的圖片1.2. 紅外遙控器是怎樣解決干擾問(wèn)題的只要有發(fā)熱的物體都有紅外光,問(wèn)題是這么多紅外光源,遙控器是怎樣進(jìn)行準(zhǔn)確的傳遞信息的呢?采取了兩種措施:一、采用指定波長(zhǎng)(940nm)的紅外光;二、對(duì)940nm的紅外光進(jìn)行調(diào)制,調(diào)制到38Khz上。雖然發(fā)出紅外光的光源有很多,但是每個(gè)發(fā)出紅外光的波長(zhǎng)不一定一樣,就算是都發(fā)出940nm的紅外光,通常也沒(méi)有什么規(guī)律,為了排除干擾能夠進(jìn)行準(zhǔn)確的通信,遙控器還將940nm的紅外光調(diào)制
4、到38Khz上。2 .硬件簡(jiǎn)介說(shuō)了這么久,還不知道開(kāi)發(fā)板和遙控器到底是哪一款,來(lái)個(gè)合影吧。注意:本驅(qū)動(dòng)是針對(duì)圖中所示的遙控器的驅(qū)動(dòng)。2.1. 一體化紅外接收頭2.1.1. 一體化紅外接收頭在開(kāi)發(fā)板上的位置先來(lái)看一下開(kāi)發(fā)板上一體化紅外接收頭在哪里位于電源和網(wǎng)口之間。2.1.2. 一體化紅外接收頭原理圖再來(lái)看看原理圖中的一體化紅外接收頭的電路IRM1GIRM川4GPIO60«5VO,G341s.iu10X0402-11|卜I3qIR-IRM-3638T-RH由圖可知,一體化紅外接收頭有3個(gè)引腳,分別為5v電源,地和信號(hào)輸出引腳。注意:原理圖中信號(hào)輸出引腳為GPIO60,這是原理圖中的標(biāo)注
5、,實(shí)際上是龍芯1B處理器的GPIO61,這點(diǎn)很重要。原理圖中也有說(shuō)明,如下圖所示NOTE:GPiog GPIO1 GPIO2 GPIO3GPIO41CANQ_RX CANO二TX CAN1二TX DANI 二RX canQx UARTSTXGPIO38 GPIO39 81041GF1040GPIO41GPZ061子板按鍵子板按鍵子板按鍵BEEPSD CARD偵測(cè)紅外接收S1117-1.8VW83310G0*9V2.1.3. 一體化紅外接收頭原理左邊為遙控器發(fā)射的38khz的紅外信號(hào),右邊為一體化紅外接收頭收到信號(hào)后,解調(diào)得到的信號(hào)。即沒(méi)有38khz紅外信號(hào)時(shí),一體化紅外接收頭輸出高電平;有38
6、khz紅外信號(hào)時(shí),輸出低電平。2.2. 迷你20鍵38K紅外遙控板2.2.1. 遙控器按鍵編碼表為了在linux驅(qū)動(dòng)中能夠正確解析遙控器的紅外命令,并判斷出具體是哪個(gè)按鍵被按下,必須知道遙控器按鍵編碼。這里選擇的這款遙控器的按鍵編碼是已知的,如下圖所示用戶碼:OOFF鍵位碼如下注意:第一行中間那個(gè)(編碼為46的)按鍵本遙控器沒(méi)有。其它的編碼都正確,詳細(xì)請(qǐng)看后面的測(cè)試結(jié)果。如果不幸沒(méi)有這個(gè)編碼表,只有通過(guò)示波器來(lái)找出每個(gè)按鍵的編碼值了。2.2.2. NEC編碼分析參考文檔全面了解紅外遙控(中文版).pdf中給出了NEC編碼格式,如下圖所示1 00 1 101010 01101001 101000
7、011010 0 0 I III I II III I III II II I II Illi III II I I IjLSBMSSLSBSmsj wAddre$?MSB.LSBAddress-Command * MSBCommand針對(duì)這里使用的遙控器,對(duì)應(yīng)的編碼如下9m其中address就是用戶碼0x00,按鍵編碼為按鍵編碼表中的值,比如“開(kāi)關(guān)”按鍵的編碼值為0x45,“menu”按鍵的編碼值為0x47,“Test”按鍵的編碼值為0x44,“倒退”按鍵的編碼值為0x43等等。驅(qū)動(dòng)中要得到的就是按鍵編碼。上圖中的邏輯1'和邏輯0'對(duì)應(yīng)紅外接收頭信號(hào)引腳的高低電平,NEC編碼
8、規(guī)定:560us高電平+1690US低電平表示邏輯'1',560高電平+560低電平表示邏輯0'。如下圖NEC協(xié)說(shuō)根據(jù)脈沖時(shí)間艮短解得.林個(gè)膿沖為560ns氏的38KUZ戰(zhàn)波1約21個(gè)載波周期北 邏輯”“脈沖時(shí)間為工25惠!邏輯中叫冰沖時(shí)間為L(zhǎng)12ms.推薦的載波周期為14或者L3:3 .源碼分析3.1. 主要思路簡(jiǎn)單來(lái)說(shuō),應(yīng)用程序執(zhí)行read()函數(shù),然后阻塞,直到有紅外命令并解析后,驅(qū)動(dòng)才將獲取的“按鍵編碼”返回給應(yīng)用程序,應(yīng)用程序的read()才返回。獲取按鍵編碼的方法是:一體化紅外接收頭在收到遙控器信號(hào)后,在信號(hào)輸出引腳輸出高低電平,并產(chǎn)生中斷,中斷程序中計(jì)算兩
9、次中斷間隔的時(shí)間如果為2.25ms則表示邏輯1',間隔時(shí)間為1.12ms則為邏輯0',再轉(zhuǎn)換為4字節(jié)的十六進(jìn)制,其中第三字節(jié)為按鍵編碼。在實(shí)現(xiàn)上,為了實(shí)現(xiàn)快速中斷,使用了tasklet機(jī)制。在中斷程序中只記錄了當(dāng)前時(shí)間,就調(diào)用中斷的下半部并返回了。在下半部中計(jì)算兩次中斷的時(shí)間間隔并保存起來(lái)。為了判斷一條紅外命令是否結(jié)束,這里采用了一個(gè)內(nèi)核定時(shí)器,如果兩次中斷時(shí)間超過(guò)50ms,則認(rèn)為一條紅外命令已經(jīng)結(jié)束。這里沒(méi)有考慮按鍵一直按住遙控器會(huì)在110ms發(fā)射重復(fù)碼的情況,所以最長(zhǎng)的間隔時(shí)間為引導(dǎo)碼的9ms,即這里把定時(shí)器超時(shí)時(shí)間設(shè)置為50ms是合理的,經(jīng)過(guò)實(shí)際測(cè)試也證明了這點(diǎn)。3.2.
10、 阻塞IO在接收完一條紅外命令后,應(yīng)該喚醒驅(qū)動(dòng)中的read()函數(shù),并將解析結(jié)果返回給應(yīng)用程序。這里采用的是wake_up_interruptible()和wait_event_interruptible()的形式,具體參考LDD3的第六章第二節(jié)BlockingI/O,相關(guān)原文截圖如下Li0£1evice-lritfcrs=3rd=Iditian粵薇留中iee/632+125%,XXrenowknmvenoughtolookatasimpleexanipJt:otsleeping;mdwakingup.Irithesamplesource,youcanfindamodulecalle
11、dsleepy.Itimplementsadevicewithsin-plcbehavior;anyprocess【hataicemptsiureadfromthedeviceisputtosleep.Wheneveraprocesswrites2thedevice,allsleepingprocessesareawakened.Thisbehaviorisimplementedwithrhefollowingicudmulk廣methods;staticDECLAN£_WMI_Q(JEUE_HEAD(wq);staticintflag«Oj$size_tsleepyrea
12、d($tructfileilp,char_u$er"buf.5ize_tount,loff_t(prlntk(KERN_DBUG"processZi(Xs)goingGc即In".current->pid>current-omni);wait_event_inteiruptible(wqtflagl0);Hag-Ojprintk(KERN_DEBUG''aHuken"cjrient-ipidturrent-icomni);returnG;/*EOF*/jsiietsleepywrite(structfileconstchar_
13、usertbufjcount,Lo+ft*jpos)(printk(KLRN_D£BUG"process%i(Xs)awakeningthereaders.An"»current->piicurrent->coimi);Hag-1;wakc_up_iftterruptible(Swq);returncount;/*succeeditoavoidretrial*/)NotetheuseofrheHagvariableinthisexample.Sincewait_event_interruptiblechecksforaconditiontha
14、tmustbecometrueTweusefkgtocreatethatcondition.Itisinterestingtoconsiderwhathappensiftwoprocessesarewaitingwheniscalled.Sincesleepyjrcadresetsflgco0onceitwakesup,youmightthinkchatthesecondprocesstowakeupwouldimmediatelygobacktosleep.Onasingle-processor截圖已經(jīng)完整展示了wait_event()的使用方法。3.3. 中斷的上下半部這里也按照規(guī)范把中斷
15、實(shí)現(xiàn)分為上半部和下半部。實(shí)現(xiàn)方式有tasklet和workqueue,這兩種方式的區(qū)別是tasklet在軟中斷上下文中執(zhí)行,很快,是以原子模式執(zhí)行,但是workqueue可以休眠。LDD3中經(jīng)典原文如下ctubkdduritij;executionoithebottonhaltihjfswhyhrunsatasatertime.Incherypicalscenario,thetophalfsavesdevicedatacoadevice-speuifitbuffer*schedulesitshottoinhalt,andexits:thisoperationisveryfast.Thebott
16、omhjltthenperformswhdtevtrotlwr謁”rk圖required,suchasakciiitproccbes*stdriingupanother1'Qoperanon,andsoon.Thissetuppermirsdietophalftoserviceanewinterruptwhilethebattomhalfisstillworking.Alm”耳cv<iy"'Iin%iiikiiup:hjiiiilt.:is可由【i:nsm訃,1hm弋聞八一whenjm:-workinterfacereportsrhe口nivalofanewpa
17、cket,rhehandlerjustretrievesthednlii3ndpushtsi(uptochtprococo!layer;actualprocessingofchepacketi$perfbemedmabotronrihalf.TheLinuxkernelhastwodifferentmechanismsthatmaybeusedtoimplementboi-ronfi-halfprocessing,bothofwhichwereintroducedinChapter7,Tasklctsarcotrentht:preferredmechanismforbottom-halfpro
18、cessing:theyart?veryfdst,butalltaskktcodemustbtaiomicThtjlicrnativctotisklctsiswcirkquciics.tvhichmayhavea11版1】“LnwKThu【chaiareallowed凸帛lekmTasklet的使用方法也在LDD3中可以找到,如下所示TskktsmustbedrehredwilhtheDECLARETASKLETinieru:DECLMETASKLETCname.function,datj);nameisthenum亡tobe卬tntothetasklet1functionisthefunct
19、ionthatiscjllcdtoextcincthe(mtake、uneunsignedlongargiinieniandminiwnold】.貓ndd5taisanunsignedlongvaluetnbepassedrnchi;必山1門(mén)funcrion.TheshortdriverdeclaresitstaskletastoIlows;void$boit_dc_tasklet(unsignedlong);DtCLARTASKLET(5hort_t*sklctfsfiortdotasklet+o);ThefunctiontasHeudied曲isusedtoscheduleatasklec
20、forrunning.If阜kortisloadedwithtasklet1,itinstallsadi說(shuō)rentinterruprhandlerthatsavesdataand乂hZuk$thela5kkia5follows:i:rqi:Etnini_tihoit_tl_iritcriupt(intiiqvoid*dcv_id#&Lfuctpt_fEg£*lcgi)do_gettimcofdeiy(struettimeval*)1v_bead);/*ssttostop'volartile'warning*/short_incT_tv(M*_hea(i);ta
21、skletschedule(Ssfiorttasklet);shortwqcount;/*rLoidthatanirtcuuptairived*/returnliq_HWLED;)TheActualtki5klcLroumit.&hort_dij_tdskiet,willbttxtcuitdshortly(sospeak)江【thesystemsconvenien<xj.Asinenrioned甘八flm,hisroiiTineperformsthebulkoftheworkothandlingtheinterrupt;itlookslikethis:voidshort_do_t
22、asklet(urignedIwg-M(intdvcLouiltshoft_bKCDun11wjiLLtni;shortwq_count仁q;/*wphavealreadybeeniemav?dItoaitheqiue7P*Thebottwrtdththetvmayjfilledbythetophjlfj3.4. 內(nèi)核定時(shí)器同樣,LDD3中也有內(nèi)核定時(shí)器的相關(guān)介紹,如下所示。TheTimerAPIThekernelprovidesdriverswithanumberoftunctionsiodeclare,register,andremovekernelriinurs.Thefollowing
23、excerptshowsthebasicbuildingblocks:#includedinijx/timer.h>structtimerlist(unsignedlongexpires;void(*function)(unsignedlong);unsignedlongdata;);voidinit_tinier(structtimer_list*timer);structtiplistTIMERJNITIALIZER(function,expire_data);voidackl_tin»er(structtimerlist*timer);intdel_tiflier(5tr
24、iicttimer:,ttiwr);4 .運(yùn)行效果4.1. 打開(kāi)調(diào)試開(kāi)關(guān)的效果Freeingunusedkernelmemory:184kfreedAlgorithmics/MIPSFPUEmulatorv1.5#mountall.#Startingmdev.Processing/etc/profile.Done!LOONSONLoongson-gz:/#echo8>/proc/sys/kernel/printkLOONSONLoongson-gz:/#cdtest/LOONSONLoongson-gz:/test#./ls1b_ir_test_apponecmdinterval=0,i
25、nteval_binary=2interval=13437,inteval_binary=2interval=1084,inteval_binary=0interval=1149,inteval_binary=0interval=1084,inteval_binary=0interval=1119,inteval_binary=0interval=1154,inteval_binary=0interval=1084,inteval_binary=0interval=1119,inteval_binary=0interval=1125,inteval_binary=0interval=2261,
26、inteval_binary=1interval=2235,inteval_binary=1interval=2226,inteval_binary=1interval=2258,inteval_binary=1interval=2210,inteval_binary=1interval=2274,inteval_binary=1interval=2208,inteval_binary=1interval=2258,inteval_binary=1interval=2225,inteval_binary=1interval=1123,inteval_binary=0interval=2236,
27、inteval_binary=1interval=1143,inteval_binary=0interval=1095,inteval_binary=0interval=1117,inteval_binary=0interval=2259,inteval_binary=1interval=1104,inteval_binary=0interval=1107,inteval_binary=0interval=2277,inteval_binary=1interval=1082,inteval_binary=0interval=2261,inteval_binary=1interval=2220,
28、inteval_binary=1interval=2267,inteval_binary=1interval=1095,inteval_binary=0interval=2262,inteval_binary=1interval=40320,inteval_binary=2interval=11203,inteval_binary=2ircmdcode=0x0,0xff,0x45,0xbaendkey=0x45onecmdinterval=0,inteval_binary=2interval=13422,inteval_binary=2interval=1092,inteval_binary=
29、0interval=1153,inteval_binary=0interval=1081,inteval_binary=0interval=1119,inteval_binary=0interval=1123,inteval_binary=0interval=1144,inteval_binary=0interval=1097,inteval_binary=0interval=1121,inteval_binary=0interval=2246,inteval_binary=1interval=2225,inteval_binary=1interval=2281,inteval_binary=
30、1interval=2204,inteval_binary=1interval=2259,inteval_binary=1interval=2246,inteval_binary=1interval=2209,inteval_binary=1interval=2263,inteval_binary=1interval=1099,inteval_binary=0interval=1120,inteval_binary=0interval=2267,inteval_binary=1interval=1097,inteval_binary=0interval=1106,inteval_binary=
31、0interval=1154,inteval_binary=0interval=2204,inteval_binary=1interval=1154,inteval_binary=0interval=2207,inteval_binary=1interval=2274,inteval_binary=1interval=1084,inteval_binary=0interval=2243,inteval_binary=1interval=2265,inteval_binary=1interval=2235,inteval_binary=1interval=1100,inteval_binary=
32、0interval=2228,inteval_binary=1ircmdcode=0x0,0xff,0x44,0xbbendkey=0x44onecmdinterval=0,inteval_binary=2interval=13435,inteval_binary=2interval=1082,inteval_binary=0interval=1104,inteval_binary=0interval=1156,inteval_binary=0interval=1098,inteval_binary=0interval=1101,inteval_binary=0interval=1125,in
33、teval_binary=0interval=1157,inteval_binary=0interval=1082,inteval_binary=0interval=2273,inteval_binary=1interval=2211,inteval_binary=1interval=2258,inteval_binary=1interval=2226,inteval_binary=1interval=2254,inteval_binary=1interval=2209,inteval_binary=1interval=2279,inteval_binary=1interval=2204,in
34、teval_binary=1interval=2259,inteval_binary=1interval=2254,inteval_binary=1interval=2206,inteval_binary=1interval=1123,inteval_binary=0interval=1140,inteval_binary=0interval=1097,inteval_binary=0interval=1120,inteval_binary=0interval=1140,inteval_binary=0interval=1100,inteval_binary=0interval=1122,in
35、teval_binary=0interval=1106,inteval_binary=0interval=2263,inteval_binary=1interval=2258,inteval_binary=1interval=2199,inteval_binary=1interval=2278,inteval_binary=1interval=2204,inteval_binary=1interval=40346,inteval_binary=2interval=11205,inteval_binary=2ircmdcode=0x0,0xff,0x7,0xf8endkey=0x7onecmdi
36、nterval=0,inteval_binary=2interval=13428,inteval_binary=2interval=1110,inteval_binary=0interval=1086,inteval_binary=0interval=1118,inteval_binary=0interval=1156,inteval_binary=0interval=1080,inteval_binary=0interval=1122,inteval_binary=0interval=1123,inteval_binary=0interval=1143,inteval_binary=0int
37、erval=2222,inteval_binary=1interval=2259,inteval_binary=1interval=2205,inteval_binary=1interval=2277,inteval_binary=1interval=2208,inteval_binary=1interval=2258,inteval_binary=1interval=2252,inteval_binary=1interval=2205,inteval_binary=1interval=1125,inteval_binary=0interval=2260,inteval_binary=1int
38、erval=2233,inteval_binary=1interval=1102,inteval_binary=0interval=2228,inteval_binary=1interval=1155,inteval_binary=0interval=1100,inteval_binary=0interval=1104,inteval_binary=0interval=2283,inteval_binary=1interval=1081,inteval_binary=0interval=1121,inteval_binary=0interval=2245,inteval_binary=1int
39、erval=1119,inteval_binary=0interval=2265,inteval_binary=1interval=2218,inteval_binary=1interval=2260,inteval_binary=1interval=40305,inteval_binary=2interval=11217,inteval_binary=2ircmdcode=0x0,0xff,0x16,0xe9endkey=0x16onecmdinterval=0,inteval_binary=2interval=13420,inteval_binary=2interval=1093,inte
40、val_binary=0interval=1102,inteval_binary=0interval=1157,inteval_binary=0interval=1098,inteval_binary=0interval=1104,inteval_binary=0interval=1125,inteval_binary=0interval=1154,inteval_binary=0interval=1084,inteval_binary=0interval=2245,inteval_binary=1interval=2250,inteval_binary=1interval=2254,inte
41、val_binary=1interval=2218,inteval_binary=1interval=2243,inteval_binary=1interval=2222,inteval_binary=1interval=2284,inteval_binary=1interval=2204,inteval_binary=1interval=1149,inteval_binary=0interval=1084,inteval_binary=0interval=2277,inteval_binary=1interval=2204,inteval_binary=1interval=1120,inte
42、val_binary=0interval=1139,inteval_binary=0interval=1102,inteval_binary=0interval=1118,inteval_binary=0interval=2262,inteval_binary=1interval=2205,inteval_binary=1interval=1155,inteval_binary=0interval=1099,inteval_binary=0interval=2230,inteval_binary=1interval=2260,inteval_binary=1interval=2254,inte
43、val_binary=1interval=2209,inteval_binary=1interval=40339,inteval_binary=2interval=11196,inteval_binary=2ircmdcode=0x0,0xff,0xc,0xf3endkey=0xc4.2. 不打開(kāi)調(diào)試開(kāi)關(guān)的效果devtmpfs:mountedFreeingunusedkernelmemory:184kfreedAlgorithmics/MIPSFPUEmulatorv1.5#mountall.#Startingmdev.Processing/etc/profile.Done!LOONSONLo
44、ongson-gz:/#/test/ls1b_ir_test_appkey=0x45key=0x44key=0x7key=0x16key=0xckey=0x8key=0x42key=0x40key=0x15key=0x19key=0x18key=0x1ckey=0x52key=0x47key=0x43key=0x9key=0xdkey=0x5ekey=0x5akey=0x4aACLOONSONLoongson-gz:/#5 .源碼清單5.1. 驅(qū)動(dòng)程序5.1.1.ls1b_ir.h#ifndef_LS1B_IR_H_#define_LS1B_IR_H_#endif5.1.2.ls1b_ir.c
45、#include<linux/platform_device.h>#include<linux/interrupt.h>#include<linux/ioport.h>#include<linux/miscdevice.h>#include<linux/delay.h>#include<linux/signal.h>#include<linux/sched.h>#include<linux/fs.h>#include<linux/time.h>#include<linux/errn
46、o.h>#include<ls1b_board.h>#include<ls1b_board_int.h>#include<asm/segment.h>#include<asm/ioctl.h>#include<asm/uaccess.h>#include"ls1b_ir.h"/一體化紅外接收頭所在引腳#defineGPIO_IR61/如果一個(gè)中斷后一定時(shí)間還未發(fā)生中斷,則認(rèn)為一條紅外命令已經(jīng)結(jié)束/本驅(qū)動(dòng)是針對(duì)20鍵迷你紅外遙控器的,/該款遙控器使用NEC協(xié)議,該遙控器最長(zhǎng)的是9ms的引導(dǎo)碼/暫不考慮重復(fù)碼的情
47、況/注意超時(shí)時(shí)間一定要加上jiffies#defineLS1B_IR_ONE_CMD_TIME_OUT(jiffies+HZ/20)/50ms/阻塞IODECLARE_WAIT_QUEUE_HEAD(ls1b_ir_wate_queue);/中斷下半部voidls1b_ir_do_tasklet(unsignedlong);DECLARE_TASKLET(ls1b_ir_tasklet,ls1b_ir_do_tasklet,0);/如果一個(gè)中斷后一定時(shí)間還未發(fā)生中斷,則認(rèn)為一條紅外命令已經(jīng)結(jié)束staticstructtimer_listls1b_ir_one_cmd_timer;/static
48、spinlock_tls1b_ir_lock=SPIN_LOCK_UNLOCKED;staticDEFINE_SPINLOCK(ls1b_ir_lock);staticstructresource*ls1b_ir_res=NULL;staticstructls1bboardintcregsvolatile*ls1bboardint0regs=(structls1b_board_intc_regsvolatile*)(KSEG1ADDR(LS1B_BOARD_INTREG_BASE);staticunsignedintls1b_ir_irq=0;/中斷時(shí)間/最近一條中斷發(fā)生的時(shí)間/倒數(shù)第二條中斷
49、發(fā)生的時(shí)間staticstructtimevalls1b_ir_current_tv=0,0;staticstructtimevalls1b_ir_last_tv=0,0;/一條紅外命令的基本信息(512)/ 一條紅外命令最(2250) / 2.25ms 左右為 1(1120) / 1.12ms 左右為 0(200)/ 0.2ms作為誤差界限LS1B_IR_BIT_1_INTERV AL_MIN#defineLS1B_IR_ONE_CMD_MAX_INTERVAL_NUM大的中斷次數(shù)#defineLS1B_IR_ONE_CMD_CODE_MAX_LEN#defineLS1B_IR_BIT_1_
50、INTERVAL#defineLS1B_IR_BIT_0_INTERVAL#defineLS1B_IR_BIT_ERROR_SCOPE#define(LS1B_IR_BIT_1_INTERVAL-LS1B_IR_BIT_ERROR_SCOPE)#defineLS1B_IR_BIT_1_INTERVAL_MAX(LS1B_IR_BIT_1_INTERVAL+LS1B_IR_BIT_ERROR_SCOPE)#defineLS1B_IR_BIT_0_INTERVAL_MIN(LS1B_IR_BIT_0_INTERVAL-LS1B_IR_BIT_ERROR_SCOPE)#defineLS1B_IR_B
51、IT_0_INTERVAL_MAX(LS1B_IR_BIT_0_INTERVAL+LS1B_IR_BIT_ERROR_SCOPE)與標(biāo)準(zhǔn)的2.25ms或1.12ms相比,超過(guò)0.2ms則為非法值typedefenumLS1B_IR_BIT_0=0,/對(duì)應(yīng)的間隔時(shí)間為2.05ms至ij2.45msLS1B_IR_BIT_1=1,/對(duì)應(yīng)的間隔時(shí)間為0.92ms到1.32msLS1B_IR_BIT_INVALID=2,/不在以上兩個(gè)范圍內(nèi)的所有間隔時(shí)間LS1B_IR_BIT_VALUE_ENUM;/每次間隔在一條紅外命令碼中的具體含義本20鍵38k迷你紅外遙控器采用的是NEC編碼/具體編碼規(guī)則為1b
52、it引導(dǎo)碼+2byte用戶碼(固定為0x00ff)+1byte命令碼+1byte命令反碼typedefenum/ 1bit引導(dǎo)碼/ 2byte的用戶碼(固定為0x00ff)/ 1byte命令碼/ 1byte命令碼反碼/緩存中的第一個(gè)間隔固定為0LS1B_IR_BIT_USER_CODE_BYTE_0=0,LS1B_IR_BIT_USER_CODE_BYTE_1,LS1B_IR_BIT_CMD_CODE,LS1B_IR_BIT_CMD_OPPOSITE_CODE,LS1B_IR_BIT_CODE_ENUM;typedefstruct/相鄰中斷的間隔unsignedintintevalLS1B_I
53、R_ONE_CMD_MAX_INTERVAL_NUM;/根據(jù)間隔長(zhǎng)度,轉(zhuǎn)換為具體的0或者1/2.25ms左右,則為1;1.12ms左右則為0unsignedcharinteval_binaryLS1B_IR_ONE_CMD_MAX_INTERVAL_NUM;/十六進(jìn)制的編碼值,由inteval_binary轉(zhuǎn)換得到unsignedcharcodeLS1B_IR_ONE_CMD_CODE_MAX_LEN;unsignedintinterval_num;/有效間隔的總個(gè)數(shù)LS1B_IR_ONE_CMD_STRU;LS1B_IR_ONE_CMD_STRUls1b_ir_cmd_buff;/接收完一條
54、紅外命令typedefenumLS1B_IR_ONE_CMD_RECEIVE_OK=0,LS1B_IR_ONE_CMD_RECEIVE_NOT_OK=1,LS1B_IR_ONE_CMD_RECEIVE_ENUM;staticintls1b_ir_one_cmd_received_ok_flag=LS1B_IR_ONE_CMD_RECEIVE_NOT_OK;/一條紅外命令的第一次中斷標(biāo)志typedefenumLS1B_IR_ONE_CMD_FIRST_INTR_INIT=0,LS1B_IR_ONE_CMD_FIRST_INTR_TRUE=1,LS1B_IR_ONE_CMD_FIRST_INTR_
55、FALSE=2,LS1B_IR_ONE_CMD_FIRST_INTR_FLAG;staticintls1b_ir_one_cmd_first_flag=LS1B_IR_ONE_CMD_FIRST_INTR_INIT;voidls1b_ir_one_cmd_timer_stop(void);/初始化定時(shí)器voidls1b_ir_one_cmd_timer_init(void)init_timer(&ls1b_ir_one_cmd_timer);/定時(shí)器超時(shí)處理器函數(shù)voidls1b_ir_one_cmd_timer_handler(unsignedlongdata)/停止定時(shí)器ls1b_ir_one_cmd_timer_stop();/重置標(biāo)志ls1b_ir_one_c
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 衢州2025年浙江衢州龍游縣招聘公辦幼兒園勞動(dòng)合同制教師25人筆試歷年參考題庫(kù)附帶答案詳解
- 潮州2025年廣東潮州市委黨校招聘專業(yè)技術(shù)人員6人筆試歷年參考題庫(kù)附帶答案詳解
- 淮安2025年江蘇淮安生態(tài)文化旅游區(qū)社會(huì)事業(yè)局招聘初中教師59人筆試歷年參考題庫(kù)附帶答案詳解
- 河南2025年河南黃淮學(xué)院碩士專任教師招聘20人筆試歷年參考題庫(kù)附帶答案詳解
- 棗莊2025年山東棗莊市口腔醫(yī)院急需緊缺人才引進(jìn)4人筆試歷年參考題庫(kù)附帶答案詳解
- 文山2025年云南文山馬關(guān)縣第二幼兒園招聘編外教師12人筆試歷年參考題庫(kù)附帶答案詳解
- 廣西2025年廣西醫(yī)科大學(xué)招聘項(xiàng)目聘用制工作人員筆試歷年參考題庫(kù)附帶答案詳解
- 山東2025年山東省公共衛(wèi)生臨床中心醫(yī)療類(lèi)崗位招聘67人筆試歷年參考題庫(kù)附帶答案詳解
- 孝感2025年湖北孝感市云夢(mèng)縣城區(qū)學(xué)校面向農(nóng)村中小學(xué)遴選教師25人筆試歷年參考題庫(kù)附帶答案詳解
- 職業(yè)人群熱健康管理方案
- 2025年高中語(yǔ)文必修上冊(cè)《登泰山記》文言文對(duì)比閱讀訓(xùn)練(含答案)
- 2025年金蝶AI蒼穹平臺(tái)新一代企業(yè)級(jí)AI平臺(tái)報(bào)告-
- 2026屆山東菏澤一中高三化學(xué)第一學(xué)期期末達(dá)標(biāo)測(cè)試試題含解析
- 2025中國(guó)機(jī)械工業(yè)集團(tuán)有限公司(國(guó)機(jī)集團(tuán))社會(huì)招聘19人筆試參考題庫(kù)附答案
- 二年級(jí)上冊(cè)100以內(nèi)的數(shù)學(xué)加減混合口算題500道-A4直接打印
- 2025年二級(jí)造價(jià)師《土建工程實(shí)務(wù)》真題卷(附解析)
- 智慧農(nóng)業(yè)管理中的信息安全對(duì)策
- 港口安全生產(chǎn)知識(shí)培訓(xùn)課件
- 通信凝凍期間安全培訓(xùn)課件
- 股東查賬申請(qǐng)書(shū)規(guī)范撰寫(xiě)范文
- 腎囊腫護(hù)理查房要點(diǎn)
評(píng)論
0/150
提交評(píng)論