ir9561.c 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368
  1. #include <linux/module.h>
  2. #include <linux/types.h>
  3. #include <linux/init.h>
  4. #include <linux/pci.h>
  5. #include <linux/interrupt.h>
  6. #include <linux/spinlock.h>
  7. #include <linux/version.h>
  8. #include <asm/irq.h>
  9. #include "ir9561.h"
  10. #include <drv_spi_flashalloc_internal.h>
  11. #include <drv_gpio.h>
  12. #include <Customization.h>
  13. #include <drv_types.h>
  14. #include <drv_ir_def.h>
  15. #include <drv_gated_clk.h>
  16. #ifdef CONFIG_SUPPORT_IR_INI
  17. #include <drv_kmf_interface.h>
  18. #endif
  19. #define _DRIVER_INCLUDE
  20. #include "ir_map.h"
  21. IR_IOC_IOData AndroidDataBuf;
  22. IRdatas irdatas;
  23. IRdatas irdatas2;
  24. UINT8 rpt_cnt=0, first_rpt=1, singleKey=0;
  25. UINT8 tmp_irCmd=0xFF, tmp_irAddress=0,tmp_irAddress_=0;
  26. UINT8 ir_timer_flag =0;
  27. struct timer_list IR_ContiTimer;
  28. IR_IOC_IOData* datBuf;
  29. IR_Hardware_Parameter ir_parameter;
  30. IRDEVPTR pIRDev;
  31. UINT8 IRProtocolNum, IRProtocolNum2;
  32. spinlock_t IR_lock;
  33. ULONG IR_irq_flag;
  34. ULONG IR_protocol_selection_value;
  35. void (*IR_ISRCallBackFun)(UINT8* mmiobase, IR_IOC_IOData* dataBuf)=NULL;
  36. //********************************************************************
  37. //*
  38. //* Misc Interface
  39. //*
  40. //********************************************************************
  41. static inline void SetMMIO_DWORD(UINT8* mmiobase, ULONG dwIndex, ULONG dwData)
  42. {
  43. writel(dwData, mmiobase+dwIndex);
  44. }
  45. #ifdef CONFIG_AUTO_USB_STORE_IRSEQ
  46. static inline void SetMMIO_DWORD_MASK(UINT8* mmiobase, ULONG dwIndex, ULONG dwData, ULONG dwMask)
  47. {
  48. ULONG dwRes, dwValue;
  49. dwRes = readl(mmiobase+dwIndex);
  50. dwValue = ((dwData & dwMask) | (dwRes & ~dwMask));
  51. writel(dwValue, mmiobase+dwIndex);
  52. }
  53. #endif
  54. static inline ULONG GetMMIO_DWORD(UINT8* mmiobase, ULONG dwIndex)
  55. {
  56. ULONG dwRes;
  57. dwRes = readl(mmiobase+dwIndex);
  58. return dwRes;
  59. }
  60. //**********************************************************
  61. //*
  62. //* Device Opreation
  63. //*
  64. //**********************************************************
  65. static void IR_conti_routine(ULONG dumy)
  66. {
  67. spin_lock_irqsave(&IR_lock, IR_irq_flag);
  68. if(IRProtocolNum == Sharp || IRProtocolNum == Sharp2) //#if defined(IR_PROTOCOL_SHARP)
  69. {
  70. if (singleKey)
  71. {
  72. singleKey = 0;
  73. datBuf->Databuf[datBuf->Length].ContinueKey = SINGLE_KEY_END; // single end
  74. DBG_MSG1(DBGCFG_IR, "[IR]reg_single_end received\n");
  75. }
  76. else
  77. {
  78. first_rpt = 1;
  79. rpt_cnt = 0;
  80. datBuf->Databuf[datBuf->Length].ContinueKey = CONTINUE_KEY_START_END; // continue end
  81. DBG_MSG1(DBGCFG_IR, "[IR]reg_rpt_end received\n");
  82. }
  83. tmp_irCmd = 0xFF;
  84. }
  85. else if(IRProtocolNum == Toshiba || IRProtocolNum == TC9012) //#elif defined(IR_PROTOCOL_TOSHIBA)
  86. {
  87. ir_timer_flag = 0;
  88. if ( singleKey == 1 )
  89. {
  90. singleKey = 0;
  91. datBuf->Databuf[datBuf->Length].ContinueKey = SINGLE_KEY_END; // single end
  92. DBG_MSG1(DBGCFG_IR, "[IR]Single_end received!!\n");
  93. }
  94. else
  95. {
  96. datBuf->Databuf[datBuf->Length].ContinueKey = CONTINUE_KEY_START_END; // continue end
  97. DBG_MSG1(DBGCFG_IR, "[IR]reg_rpt_end received!!\n");
  98. }
  99. rpt_cnt = 0;
  100. }
  101. else //#else
  102. {
  103. singleKey = 0;
  104. datBuf->Databuf[datBuf->Length].ContinueKey = SINGLE_KEY_END; // single end
  105. DBG_MSG1(DBGCFG_IR, "[IR]reg_single_end received (timeout) %d\n", datBuf->Databuf[datBuf->Length].ContinueKey);
  106. }
  107. //#endif
  108. datBuf->Databuf[datBuf->Length].Command = tmp_irCmd;
  109. datBuf->Databuf[datBuf->Length].Address = tmp_irAddress;
  110. datBuf->Databuf[datBuf->Length].Address_ = tmp_irAddress_;
  111. datBuf->Length++;
  112. spin_unlock_irqrestore(&IR_lock, IR_irq_flag);
  113. }
  114. void init_IR_cont_timer(int ContiKeyDelaytime)
  115. {
  116. // initial timer, Key_conti_routine * 0.01 (sec)
  117. init_timer(&IR_ContiTimer);
  118. IR_ContiTimer.expires = jiffies + ContiKeyDelaytime*HZ/1000; //Continue Key shot after ContiKeyDelaytime ms
  119. IR_ContiTimer.data = 0;
  120. IR_ContiTimer.function = IR_conti_routine;
  121. add_timer(&IR_ContiTimer);
  122. }
  123. #ifdef CONFIG_DVD_COMBO
  124. INT32 SEND_DVD_IR_COMBO( UINT8 ir_protocol, UINT32 ir_keycode )
  125. {
  126. *(volatile UINT32 *)(0xa0000028) = ir_protocol;
  127. *(volatile UINT32 *)(0xa000002c) = ir_keycode;
  128. DBG_MSG1(DBGCFG_IR, "ir protocol:0x%08x\tkeycode:0x%08x\n", (unsigned int)(*(volatile UINT32 *)(0xa0000028)), (unsigned int)(*(volatile UINT32 *)(0xa000002c)) );
  129. *(volatile ULONG *)(0xbe01011c) |= 0x00080000; // trigger interrupt 51
  130. return 0;
  131. }
  132. EXPORT_SYMBOL(SEND_DVD_IR_COMBO);
  133. #endif
  134. void sisir_toshiba_ParseData(UINT8* mmiobase, IR_IOC_IOData* dataBuf)
  135. {
  136. volatile UINT32 IR_Data, IR_Custom, IR_bit_len, tmp_data, tmp_Custom, i;
  137. datBuf = dataBuf;
  138. IR_Data = irdatas.Value & 0xffff;
  139. IR_Custom = GetMMIO_DWORD(mmiobase, 0x54); //read from IR decoder recevied custom code
  140. IR_Custom = IR_Custom & 0x1ffff;
  141. IR_bit_len = (GetMMIO_DWORD(mmiobase, 0x50) & 0x3f00) >> 8; //read from IR decoder recevied bit length
  142. DBG_MSG1(DBGCFG_IR, "[IR]IR_ISR\tIR_len:%d\treg0C:0x%08x\treg54:0x%08x\n", IR_bit_len, IR_Data, IR_Custom);
  143. IR_Data = IR_Data >> 1;
  144. if ( (IR_Custom & 0x1 ) == 1 )
  145. {
  146. IR_Data = IR_Data | 0x8000;
  147. }
  148. IR_Custom = IR_Custom >> 1;
  149. tmp_data = 0;
  150. tmp_Custom = 0;
  151. DBG_MSG1(DBGCFG_IR, "[IR]0\tIR:%08x\ttmpData:%08x\tIR_Custom:%08x\n", IR_Data, tmp_data, IR_Custom);
  152. for ( i=0;i<7;i++ )
  153. {
  154. if ( IR_Data & 0x8000 )
  155. {
  156. tmp_data = tmp_data | 0x8000;
  157. }
  158. tmp_data = tmp_data >> 1;
  159. IR_Data = IR_Data << 1;
  160. }
  161. if ( IR_Data & 0x8000 )
  162. {
  163. tmp_data = tmp_data | 0x8000;
  164. }
  165. for ( i=0;i<15; i++ )
  166. {
  167. if ( IR_Custom & 0x8000 )
  168. {
  169. tmp_Custom = tmp_Custom | 0x8000;
  170. }
  171. tmp_Custom = tmp_Custom >> 1;
  172. IR_Custom = IR_Custom << 1;
  173. }
  174. if ( IR_Custom & 0x8000 )
  175. {
  176. tmp_Custom = tmp_Custom | 0x8000;
  177. }
  178. DBG_MSG1(DBGCFG_IR, "[IR]1\tIR:%08x\ttmp:%08x\ttmp_Custom:%08x\n", IR_Data, tmp_data, tmp_Custom);
  179. //IR_Data = tmp_data;
  180. if ( IR_bit_len == 33)
  181. { // Single start
  182. if ( (singleKey == 1) || (rpt_cnt != 0) )
  183. {
  184. if ( ir_timer_flag )
  185. {
  186. del_timer(&IR_ContiTimer);
  187. }
  188. if ( singleKey == 1 )
  189. {
  190. DBG_MSG1(DBGCFG_IR, "[IR]2nd reg_single_sts received!!\n");
  191. datBuf->Databuf[datBuf->Length].ContinueKey = SINGLE_KEY_END; // single end
  192. }
  193. else
  194. {
  195. DBG_MSG1(DBGCFG_IR, "[IR]reg_single_sts received during repeat!!\n");
  196. datBuf->Databuf[datBuf->Length].ContinueKey = CONTINUE_KEY_START_END; // continue end
  197. }
  198. datBuf->Databuf[datBuf->Length].Command = tmp_irCmd;
  199. datBuf->Databuf[datBuf->Length].Address = tmp_irAddress;
  200. datBuf->Databuf[datBuf->Length].Address_ = tmp_irAddress_;
  201. datBuf->Length++;
  202. }
  203. else
  204. {
  205. DBG_MSG1(DBGCFG_IR, "[IR]1st reg_single_sts received!!\n");
  206. }
  207. tmp_irCmd = dataBuf->Databuf[dataBuf->Length].Command = (unsigned char)(tmp_data >> 8);
  208. tmp_irAddress = dataBuf->Databuf[dataBuf->Length].Address = (unsigned char)(tmp_Custom >> 8);
  209. tmp_irAddress_ = dataBuf->Databuf[dataBuf->Length].Address_ = (unsigned char)(tmp_Custom);;
  210. DBG_MSG1(DBGCFG_IR, "[IR]Single Start Address Address_ Cmd: %x,%x, %x!!\n", tmp_irAddress, tmp_irAddress_, tmp_irCmd);
  211. dataBuf->Databuf[dataBuf->Length].ContinueKey = CONTINUE_KEY_HEAD;
  212. dataBuf->Length++;
  213. singleKey = 1;
  214. rpt_cnt = 0;
  215. init_IR_cont_timer(150); // 150 ms
  216. ir_timer_flag = 1;
  217. }
  218. else if ( IR_bit_len == 2 )
  219. {
  220. DBG_MSG1(DBGCFG_IR, "[IR]repeat key received!!\n");
  221. if ( ir_timer_flag == 1 )
  222. {
  223. del_timer(&IR_ContiTimer);
  224. }
  225. if ( rpt_cnt == 0xff )
  226. {
  227. rpt_cnt = 1;
  228. }
  229. rpt_cnt ++;
  230. if ( (rpt_cnt == 4) && (singleKey == 1) )
  231. {
  232. singleKey = 0;
  233. dataBuf->Databuf[dataBuf->Length].Command = tmp_irCmd;
  234. dataBuf->Databuf[dataBuf->Length].Address = tmp_irAddress;
  235. dataBuf->Databuf[dataBuf->Length].Address_= tmp_irAddress_;
  236. dataBuf->Databuf[dataBuf->Length].ContinueKey = CONTINUE_KEY_START;
  237. dataBuf->Length++;
  238. DBG_MSG1(DBGCFG_IR, "[IR][IR]Continue_key_start\n");
  239. }
  240. init_IR_cont_timer(150); // 150 ms
  241. ir_timer_flag = 1;
  242. }
  243. }
  244. void sisir_TC9012_ParseData(UINT8* mmiobase, IR_IOC_IOData* dataBuf)
  245. {
  246. volatile UINT32 IR_Data,IR_bit_len, tmp_data, i;
  247. datBuf = dataBuf;
  248. IR_Data = ((GetMMIO_DWORD(mmiobase, 0x0c)>>8) & 0xfe);
  249. tmp_data = 0;
  250. for ( i=0;i<6;i++ )
  251. {
  252. if ( IR_Data & 0x80 )
  253. {
  254. tmp_data = tmp_data | 0x80;
  255. }
  256. tmp_data = tmp_data >> 1;
  257. IR_Data = IR_Data << 1;
  258. }
  259. if ( IR_Data & 0x80 )
  260. {
  261. tmp_data = tmp_data | 0x80;
  262. }
  263. dataBuf->Databuf[dataBuf->Length].Command = (unsigned char)((tmp_data) | ((GetMMIO_DWORD(mmiobase, 0x54)& 0x1)));
  264. IR_Data = (GetMMIO_DWORD(mmiobase, 0x54)>>9)& 0xff;
  265. tmp_data = 0;
  266. for ( i=0;i<7;i++ )
  267. {
  268. if ( IR_Data & 0x80 )
  269. {
  270. tmp_data = tmp_data | 0x80;
  271. }
  272. tmp_data = tmp_data >> 1;
  273. IR_Data = IR_Data << 1;
  274. }
  275. if ( IR_Data & 0x80 )
  276. {
  277. tmp_data = tmp_data | 0x80;
  278. }
  279. dataBuf->Databuf[dataBuf->Length].Address = (unsigned char)(tmp_data);
  280. IR_Data = (GetMMIO_DWORD(mmiobase, 0x54)>>1)& 0xff;
  281. tmp_data = 0;
  282. for ( i=0;i<7;i++ )
  283. {
  284. if ( IR_Data & 0x80 )
  285. {
  286. tmp_data = tmp_data | 0x80;
  287. }
  288. tmp_data = tmp_data >> 1;
  289. IR_Data = IR_Data << 1;
  290. }
  291. if ( IR_Data & 0x80 )
  292. {
  293. tmp_data = tmp_data | 0x80;
  294. }
  295. dataBuf->Databuf[dataBuf->Length].Address_ = (unsigned char)(tmp_data);
  296. IR_bit_len = (GetMMIO_DWORD(mmiobase, 0x50) & 0x3f00) >> 8; //read from IR decoder recevied bit length
  297. DBG_MSG1(DBGCFG_IR, "[IR]1\tTC9012 Add:%08x\tAdd_:%08x\tCmd:%08x\n", dataBuf->Databuf[dataBuf->Length].Address, dataBuf->Databuf[dataBuf->Length].Address_, dataBuf->Databuf[dataBuf->Length].Command);
  298. //IR_Data = tmp_data;
  299. if ( IR_bit_len == 33)
  300. { // Single start
  301. if ( (singleKey == 1) || (rpt_cnt != 0) )
  302. {
  303. if ( ir_timer_flag )
  304. {
  305. del_timer(&IR_ContiTimer);
  306. }
  307. if ( singleKey == 1 )
  308. {
  309. DBG_MSG1(DBGCFG_IR, "[IR]2nd reg_single_sts received!!\n");
  310. datBuf->Databuf[datBuf->Length].ContinueKey = SINGLE_KEY_END; // single end
  311. }
  312. else
  313. {
  314. DBG_MSG1(DBGCFG_IR, "[IR]reg_single_sts received during repeat!!\n");
  315. datBuf->Databuf[datBuf->Length].ContinueKey = CONTINUE_KEY_START_END; // continue end
  316. }
  317. datBuf->Databuf[datBuf->Length].Command = tmp_irCmd;
  318. datBuf->Databuf[datBuf->Length].Address = tmp_irAddress;
  319. datBuf->Databuf[datBuf->Length].Address_ = tmp_irAddress_;
  320. datBuf->Length++;
  321. }
  322. else
  323. {
  324. DBG_MSG1(DBGCFG_IR, "[IR]1st reg_single_sts received!!\n");
  325. }
  326. tmp_irCmd = dataBuf->Databuf[dataBuf->Length].Command;
  327. tmp_irAddress = dataBuf->Databuf[dataBuf->Length].Address;
  328. tmp_irAddress_ = dataBuf->Databuf[dataBuf->Length].Address_;
  329. DBG_MSG1(DBGCFG_IR, "[IR]Single Start Address Address_ Cmd: %x,%x, %x!!\n", tmp_irAddress, tmp_irAddress_, tmp_irCmd);
  330. dataBuf->Databuf[dataBuf->Length].ContinueKey = CONTINUE_KEY_HEAD;
  331. dataBuf->Length++;
  332. singleKey = 1;
  333. rpt_cnt = 0;
  334. init_IR_cont_timer(150); // 150 ms
  335. ir_timer_flag = 1;
  336. }
  337. else if ( IR_bit_len == 2 )
  338. {
  339. DBG_MSG1(DBGCFG_IR, "[IR]repeat key received!!\n");
  340. if ( ir_timer_flag == 1 )
  341. {
  342. del_timer(&IR_ContiTimer);
  343. }
  344. if ( rpt_cnt == 0xff )
  345. {
  346. rpt_cnt = 1;
  347. }
  348. rpt_cnt ++;
  349. if ( (rpt_cnt == 4) && (singleKey == 1) )
  350. {
  351. singleKey = 0;
  352. dataBuf->Databuf[dataBuf->Length].Command = tmp_irCmd;
  353. dataBuf->Databuf[dataBuf->Length].Address = tmp_irAddress;
  354. dataBuf->Databuf[dataBuf->Length].Address_= tmp_irAddress_;
  355. dataBuf->Databuf[dataBuf->Length].ContinueKey = CONTINUE_KEY_START;
  356. dataBuf->Length++;
  357. DBG_MSG1(DBGCFG_IR, "[IR][IR]Continue_key_start\n");
  358. }
  359. init_IR_cont_timer(150); // 150 ms
  360. ir_timer_flag = 1;
  361. }
  362. }
  363. void sisir_ParseData(UINT8 IRProtocolNum,UINT8* mmiobase)
  364. {
  365. #if defined(IR_PROTOCOL_TOSHIBA2)
  366. volatile UINT32 IR_Data, IR_Custom, IR_bit_len, tmp_data, tmp_Custom, i;
  367. #endif
  368. #if defined(IR_PROTOCOL_PANASONIC)
  369. volatile UINT8 IR_Data, tmp_data, i;
  370. #endif
  371. if(IRProtocolNum == Phillips)
  372. {
  373. /* Set 0 (RC-5)*/
  374. // addr = 0xbe08000c[12:8] data = 0xbe08000c[5:0]
  375. datBuf->Databuf[datBuf->Length].Command = GetMMIO_DWORD(mmiobase, 0x0c) & 0x3f;
  376. datBuf->Databuf[datBuf->Length].Address = GetMMIO_DWORD(mmiobase, 0x0d) & 0x1f;
  377. datBuf->Databuf[datBuf->Length].Address_ = 0;
  378. }
  379. else if(IRProtocolNum == Sony)
  380. {
  381. /* Sony SIRC Protocol */
  382. // addr = 0xbe08000c[15:8] data = 0xbe08000c[7:0]
  383. datBuf->Databuf[datBuf->Length].Command = GetMMIO_DWORD(mmiobase, 0x0c);
  384. datBuf->Databuf[datBuf->Length].Address = GetMMIO_DWORD(mmiobase, 0x0d);
  385. datBuf->Databuf[datBuf->Length].Address_ = 0;
  386. }
  387. else if(IRProtocolNum == JVC)
  388. {
  389. #if 0
  390. /* Set 3 (X-sat protocol)*/
  391. // addr = [0xbe080056[6:0] : 0xbe080055[7]] data = 0xbe080057
  392. datBuf->Databuf[datBuf->Length].Command = GetMMIO_DWORD(mmiobase, 0x57);
  393. datBuf->Databuf[datBuf->Length].Address = (UINT8) ((GetMMIO_DWORD(mmiobase, 0x56) << 1) | (GetMMIO_DWORD(mmiobase, 0x55) >> 7));
  394. datBuf->Databuf[datBuf->Length].Address_ = 0;
  395. #endif
  396. // addr = [0xbe08000c[15:8] data = 0xbe08000c[7:0]
  397. datBuf->Databuf[datBuf->Length].Command = GetMMIO_DWORD(mmiobase, 0x0c);
  398. datBuf->Databuf[datBuf->Length].Address = GetMMIO_DWORD(mmiobase, 0x0d);
  399. datBuf->Databuf[datBuf->Length].Address_ = 0;
  400. }
  401. else if(IRProtocolNum == Sharp)
  402. {
  403. /* Set 3 (Sharp protocol)*/
  404. // addr = 0xbe080056[5:1], data = 0xbe080057[5:0] : 0xbe080056[7:6]
  405. if ( (GetMMIO_DWORD(mmiobase, 0x57) & 0xc0) == 0x40 )
  406. {
  407. datBuf->Databuf[datBuf->Length].Command = (UINT8) ((GetMMIO_DWORD(mmiobase, 0x56)>>6) | ((GetMMIO_DWORD(mmiobase, 0x57)&0x3f)<<2));
  408. }
  409. else
  410. {
  411. datBuf->Databuf[datBuf->Length].Command = (UINT8) (~((GetMMIO_DWORD(mmiobase, 0x56)>>6) | ((GetMMIO_DWORD(mmiobase, 0x57)&0x3f)<<2)));
  412. }
  413. datBuf->Databuf[datBuf->Length].Address = (GetMMIO_DWORD(mmiobase, 0x56)>>1) &0x1f;
  414. datBuf->Databuf[datBuf->Length].Address_ = 0;
  415. }
  416. else if(IRProtocolNum == Phillips_RC6)
  417. {
  418. datBuf->Databuf[datBuf->Length].Command = (UINT8) ((GetMMIO_DWORD(mmiobase, 0x0c)) & 0xff) ;
  419. datBuf->Databuf[datBuf->Length].Address = (UINT8) ((GetMMIO_DWORD(mmiobase, 0x0c)>>8));
  420. datBuf->Databuf[datBuf->Length].Address_ = 0;
  421. }
  422. else if(IRProtocolNum == RCA)
  423. {
  424. /* Set 7 (RCA) */
  425. /*datBuf->Databuf[datBuf->Length].Command = ((*(UINT8 *)(0xbe080054) & 0x0f)<<4) | ((*(UINT8 *)(0xbe08000d) & 0xf0)>>4);
  426. datBuf->Databuf[datBuf->Length].Address = (*(UINT8 *)(0xbe080054)) >> 4;
  427. datBuf->Databuf[datBuf->Length].Address_ = *(UINT8 *)(0xbe08000d) & 0x0f;*/
  428. datBuf->Databuf[datBuf->Length].Command = GetMMIO_DWORD(mmiobase, 0x0c);
  429. datBuf->Databuf[datBuf->Length].Address = (GetMMIO_DWORD(mmiobase, 0x54)) >> 4;
  430. datBuf->Databuf[datBuf->Length].Address_ = 0;
  431. }
  432. else if(IRProtocolNum == X_SAT)
  433. {
  434. /* X-Sat/Mitsubishi protocol */
  435. // addr = 0xbe08000c[15:9] [29], data = 0xbe08000c[7:0]
  436. datBuf->Databuf[datBuf->Length].Command = GetMMIO_DWORD(mmiobase, 0x57);
  437. datBuf->Databuf[datBuf->Length].Address = (UINT8) ((GetMMIO_DWORD(mmiobase, 0x56) << 1) | (GetMMIO_DWORD(mmiobase, 0x55) >> 7));
  438. //datBuf->Databuf[datBuf->Length].Command = GetMMIO_DWORD(mmiobase, 0x0c);
  439. //datBuf->Databuf[datBuf->Length].Address = (((GetMMIO_DWORD(mmiobase, 0x0f) & 0x20) << 2) | ((GetMMIO_DWORD(mmiobase, 0x0d) >> 1)& 0x7f)) & 0xff;
  440. datBuf->Databuf[datBuf->Length].Address_ = 0;
  441. }
  442. #if defined(IR_PROTOCOL_TOSHIBA2)
  443. else if(IRProtocolNum == Toshiba2)
  444. {
  445. IR_bit_len = (GetMMIO_DWORD(mmiobase, 0x50) & 0x3f00) >> 8; //read from IR decoder recevied bit length
  446. IR_Data = irdatas.Value & 0xffff;
  447. IR_Custom = GetMMIO_DWORD(mmiobase, 0x54); //read from IR decoder recevied custom code
  448. DBG_MSG1(DBGCFG_IR, "[IR]IR_ISR\tIR_len:%d\treg0C:0x%08x\treg54:0x%08x\n", IR_bit_len, IR_Data, IR_Custom);
  449. if(IR_bit_len == 33)
  450. {
  451. IR_Custom = IR_Custom & 0x1ffff;
  452. }
  453. else if(IR_bit_len == 37)
  454. {
  455. IR_Data = (IR_Custom << 16) | IR_Data;
  456. IR_Data = (IR_Data >> 4) & 0xffff;
  457. IR_Custom = (IR_Custom >> 4) & 0x1ffff;
  458. }
  459. DBG_MSG1(DBGCFG_IR, "[IR]IR_ISR\tIR_len:%d\treg0C:0x%08x\treg54:0x%08x\n", IR_bit_len, IR_Data, IR_Custom);
  460. IR_Data = IR_Data >> 1;
  461. if ( (IR_Custom & 0x1 ) == 1 )
  462. {
  463. IR_Data = IR_Data | 0x8000;
  464. }
  465. IR_Custom = IR_Custom >> 1;
  466. tmp_data = 0;
  467. tmp_Custom = 0;
  468. DBG_MSG1(DBGCFG_IR, "[IR]0\tIR:%08x\ttmpData:%08x\tIR_Custom:%08x\n", IR_Data, tmp_data, IR_Custom);
  469. for ( i=0;i<7;i++ )
  470. {
  471. if ( IR_Data & 0x8000 )
  472. {
  473. tmp_data = tmp_data | 0x8000;
  474. }
  475. tmp_data = tmp_data >> 1;
  476. IR_Data = IR_Data << 1;
  477. }
  478. if ( IR_Data & 0x8000 )
  479. {
  480. tmp_data = tmp_data | 0x8000;
  481. }
  482. for ( i=0;i<15; i++ )
  483. {
  484. if ( IR_Custom & 0x8000 )
  485. {
  486. tmp_Custom = tmp_Custom | 0x8000;
  487. }
  488. tmp_Custom = tmp_Custom >> 1;
  489. IR_Custom = IR_Custom << 1;
  490. }
  491. if ( IR_Custom & 0x8000 )
  492. {
  493. tmp_Custom = tmp_Custom | 0x8000;
  494. }
  495. DBG_MSG1(DBGCFG_IR, "[IR]1\tIR:%08x\ttmp:%08x\ttmp_Custom:%08x\n", IR_Data, tmp_data, tmp_Custom);
  496. datBuf->Databuf[datBuf->Length].Command = tmp_irCmd = (unsigned char)(tmp_data >> 8);
  497. datBuf->Databuf[datBuf->Length].Address = tmp_irAddress = (unsigned char)(tmp_Custom >> 8);
  498. datBuf->Databuf[datBuf->Length].Address_ = tmp_irAddress_ = (unsigned char)(tmp_Custom);;
  499. DBG_MSG1(DBGCFG_IR, "[IR]Single Start Address Address_ Cmd: %x,%x, %x!!\n", tmp_irAddress, tmp_irAddress_, tmp_irCmd);
  500. }
  501. #endif
  502. else if(IRProtocolNum == Konka)
  503. {
  504. //addr = 0c[15:8], cmd = [7:0]
  505. datBuf->Databuf[datBuf->Length].Command = GetMMIO_DWORD(mmiobase, 0x0c);
  506. datBuf->Databuf[datBuf->Length].Address = GetMMIO_DWORD(mmiobase, 0x0d);
  507. datBuf->Databuf[datBuf->Length].Address_ = 0;
  508. }
  509. #if defined(IR_PROTOCOL_PANASONIC)
  510. else if(IRProtocolNum == Panasonic)
  511. {
  512. //addr = 54[9:12], addr_:54[1:8], data = 0c[9:15],0c[29]
  513. IR_Data = (((GetMMIO_DWORD(mmiobase, 0x0f) & 0x20) << 2) | ((GetMMIO_DWORD(mmiobase, 0x0d) >> 1)& 0x7f)) & 0xff;
  514. tmp_data = 0;
  515. for ( i=0;i<7;i++ )
  516. {
  517. if ( IR_Data & 0x80 )
  518. {
  519. tmp_data = tmp_data | 0x80;
  520. }
  521. tmp_data = tmp_data >> 1;
  522. IR_Data = IR_Data << 1;
  523. }
  524. if ( IR_Data & 0x80 )
  525. {
  526. tmp_data = tmp_data | 0x80;
  527. }
  528. datBuf->Databuf[datBuf->Length].Command = (unsigned char)(tmp_data);//((*(UINT8 *)(0xbe08000f) & 0x20) << 2) | (*(UINT8 *)(0xbe08000d) >> 1);
  529. //DBG_MSG1(DBGCFG_IR, "Command=%x=========\n",datBuf->Databuf[datBuf->Length].Command);
  530. IR_Data = ((GetMMIO_DWORD(mmiobase, 0x55) >> 1) & 0xf) & 0xf;
  531. tmp_data = 0;
  532. for ( i=0;i<3;i++ )
  533. {
  534. if ( IR_Data & 0x8 )
  535. {
  536. tmp_data = tmp_data | 0x8;
  537. }
  538. tmp_data = tmp_data >> 1;
  539. IR_Data = IR_Data << 1;
  540. }
  541. if ( IR_Data & 0x8 )
  542. {
  543. tmp_data = tmp_data | 0x8;
  544. }
  545. datBuf->Databuf[datBuf->Length].Address = (unsigned char)(tmp_data);//((*(UINT8 *)(0xbe080055)) >> 1) & 0xf;
  546. //DBG_MSG1(DBGCFG_IR, "Address=%x=========\n",datBuf->Databuf[datBuf->Length].Address);
  547. IR_Data = ((GetMMIO_DWORD(mmiobase, 0x55)&0x1)<<7 |(GetMMIO_DWORD(mmiobase, 0x54) >> 1)) & 0xff;
  548. tmp_data = 0;
  549. for ( i=0;i<7;i++ )
  550. {
  551. if ( IR_Data & 0x80 )
  552. {
  553. tmp_data = tmp_data | 0x80;
  554. }
  555. tmp_data = tmp_data >> 1;
  556. IR_Data = IR_Data << 1;
  557. }
  558. if ( IR_Data & 0x80 )
  559. {
  560. tmp_data = tmp_data | 0x80;
  561. }
  562. datBuf->Databuf[datBuf->Length].Address_ = (unsigned char)(tmp_data);//(*(UINT8 *)(0xbe080055)&0x1)<<7 |(*(UINT8 *)(0xbe080054) >> 1);// | (*(UINT8 *)(0xbe08000f)&0x80);
  563. //DBG_MSG1(DBGCFG_IR, "Address_=%x=========\n",datBuf->Databuf[datBuf->Length].Address_);
  564. }
  565. #endif
  566. else if(IRProtocolNum == Sharp2)
  567. {
  568. // addr = 0xbe080057[7:0], add_ = 0xbe080056[7:0] , data = 0xbe08000c[15:8]
  569. datBuf->Databuf[datBuf->Length].Command = (UINT8) ((GetMMIO_DWORD(mmiobase, 0x0c)>>8));
  570. datBuf->Databuf[datBuf->Length].Address = (UINT8) ((GetMMIO_DWORD(mmiobase, 0x57)));
  571. datBuf->Databuf[datBuf->Length].Address_ = (UINT8) ((GetMMIO_DWORD(mmiobase, 0x56)));
  572. }
  573. else if(IRProtocolNum == Phillips_RC6_6A)
  574. {
  575. datBuf->Databuf[datBuf->Length].Command = (UINT8) ((GetMMIO_DWORD(mmiobase, 0x0c)) & 0xff) ;
  576. datBuf->Databuf[datBuf->Length].Address = (UINT8) ((GetMMIO_DWORD(mmiobase, 0x54)>>8));
  577. datBuf->Databuf[datBuf->Length].Address_ = (UINT8) ((GetMMIO_DWORD(mmiobase, 0x54) & 0xff));
  578. }
  579. else
  580. {
  581. datBuf->Databuf[datBuf->Length].Command = GetMMIO_DWORD(mmiobase, 0x0c);
  582. datBuf->Databuf[datBuf->Length].Address = GetMMIO_DWORD(mmiobase, 0x0d);
  583. datBuf->Databuf[datBuf->Length].Address_ = GetMMIO_DWORD(mmiobase, 0x55);
  584. }
  585. }
  586. void sisir_isrfun(UINT8* mmiobase, UINT8* mmiobase2, IR_IOC_IOData* dataBuf)
  587. {
  588. #if 0
  589. UINT32 SecondSingle = 0;
  590. #endif
  591. #if 0//defined(IR_PROTOCOL_TOSHIBA) || defined(IR_PROTOCOL_TOSHIBA2) // TOSHIBA protocol only
  592. volatile UINT32 IR_Data, IR_Custom, IR_bit_len, tmp_data, tmp_Custom, i;
  593. #endif
  594. datBuf = dataBuf;
  595. if(mmiobase == NULL)
  596. {
  597. DBG_MSG1(DBGCFG_IR, "\n\n\n ERR IR Receive an Int Status without Init\n\n\n");
  598. return;
  599. }
  600. if(mmiobase2 == NULL)
  601. {
  602. DBG_MSG1(DBGCFG_IR, "\n\n\n ERR IR2 Receive an Int Status without Init\n\n\n");
  603. return;
  604. }
  605. irdatas.Value= GetMMIO_DWORD(mmiobase, 0x0c); //read from IR decoder recevied data
  606. irdatas2.Value= GetMMIO_DWORD(mmiobase2, 0x0c); //read from IR decoder recevied data
  607. //#if defined(IR_PROTOCOL_TOSHIBA) // TOSHIBA protocol only
  608. if(IRProtocolNum == Toshiba && irdatas.Reg.reg_intr_sts)// || IRProtocolNum2 == Toshiba)
  609. {
  610. sisir_toshiba_ParseData(mmiobase, dataBuf);
  611. SetMMIO_DWORD(mmiobase, 0x0c, irdatas.Value); // Clear reg_intr_sts (reg_intr_sts is Write-1-Clear)
  612. return;
  613. }
  614. else if(IRProtocolNum2 == Toshiba && irdatas2.Reg.reg_intr_sts)
  615. {
  616. sisir_toshiba_ParseData(mmiobase2, dataBuf);
  617. SetMMIO_DWORD(mmiobase2, 0x0c, irdatas2.Value); // Clear reg_intr_sts (reg_intr_sts is Write-1-Clear)
  618. return;
  619. }
  620. else if(IRProtocolNum == TC9012 && irdatas.Reg.reg_intr_sts)// || IRProtocolNum2 == Toshiba)
  621. {
  622. sisir_TC9012_ParseData(mmiobase, dataBuf);
  623. SetMMIO_DWORD(mmiobase, 0x0c, irdatas.Value); // Clear reg_intr_sts (reg_intr_sts is Write-1-Clear)
  624. return;
  625. }
  626. else if(IRProtocolNum2 == TC9012 && irdatas2.Reg.reg_intr_sts)
  627. {
  628. sisir_TC9012_ParseData(mmiobase2, dataBuf);
  629. SetMMIO_DWORD(mmiobase2, 0x0c, irdatas2.Value); // Clear reg_intr_sts (reg_intr_sts is Write-1-Clear)
  630. return;
  631. }
  632. else
  633. {
  634. if(irdatas.Reg.reg_intr_sts == 0 && irdatas2.Reg.reg_intr_sts == 0)
  635. {
  636. DBG_MSG1(DBGCFG_IR, "\n\n\n ERR IR triggered an Int without reg_intr_sts\n\n\n");
  637. }
  638. else
  639. {
  640. DBG_MSG1(DBGCFG_IR, "\nsisir_isrfun ==>\n");
  641. // ir 1
  642. if(irdatas.Reg.reg_intr_sts)
  643. {
  644. DBG_MSG1(DBGCFG_IR, "\n ir 1 datas ==>\n");
  645. if(dataBuf->Length >= (30 - 2))
  646. {
  647. DBG_MSG1(DBGCFG_IR, "\n\n\n IR data buffer full\n\n\n");
  648. dataBuf->Length = 0;
  649. }
  650. if(irdatas.Reg.reg_rpt_start_sts)
  651. {
  652. DBG_MSG1(DBGCFG_IR, " reg_rpt_start_sts received\n");
  653. rpt_cnt = 0;
  654. first_rpt = 0;
  655. dataBuf->Databuf[dataBuf->Length].Command = tmp_irCmd;
  656. dataBuf->Databuf[dataBuf->Length].Address = tmp_irAddress;
  657. dataBuf->Databuf[dataBuf->Length].Address_= tmp_irAddress_;
  658. dataBuf->Databuf[dataBuf->Length].ContinueKey = CONTINUE_KEY_START;
  659. dataBuf->Length++;
  660. }
  661. if(irdatas.Reg.reg_rpt_end_sts)
  662. {
  663. DBG_MSG1(DBGCFG_IR, " reg_rpt_end received\n");
  664. if ( first_rpt == 1 )
  665. {
  666. DBG_MSG1(DBGCFG_IR, " reg_single_end received\n");
  667. dataBuf->Databuf[dataBuf->Length].Command = tmp_irCmd;
  668. dataBuf->Databuf[dataBuf->Length].Address = tmp_irAddress;
  669. dataBuf->Databuf[dataBuf->Length].Address_= tmp_irAddress_;
  670. dataBuf->Databuf[dataBuf->Length].ContinueKey = SINGLE_KEY_END; // single end
  671. dataBuf->Length++;
  672. }
  673. else
  674. {
  675. DBG_MSG1(DBGCFG_IR, " reg_rpt_end_sts received\n");
  676. dataBuf->Databuf[dataBuf->Length].Command = tmp_irCmd;
  677. dataBuf->Databuf[dataBuf->Length].Address = tmp_irAddress;
  678. dataBuf->Databuf[dataBuf->Length].Address_= tmp_irAddress_;
  679. dataBuf->Databuf[dataBuf->Length].ContinueKey = CONTINUE_KEY_START_END;
  680. dataBuf->Length++;
  681. }
  682. }
  683. if(irdatas.Reg.reg_single_sts)
  684. {
  685. if ( ir_timer_flag )
  686. {
  687. del_timer(&IR_ContiTimer);
  688. ir_timer_flag = 0;
  689. }
  690. if ( singleKey == 1 )
  691. {
  692. DBG_MSG1(DBGCFG_IR, " 2nd \tCMD:%x\n", tmp_irCmd);
  693. datBuf->Databuf[datBuf->Length].Command = tmp_irCmd;
  694. datBuf->Databuf[datBuf->Length].Address = tmp_irAddress;
  695. datBuf->Databuf[datBuf->Length].Address_ = tmp_irAddress_;
  696. datBuf->Databuf[datBuf->Length].ContinueKey = SINGLE_KEY_END; // single end
  697. datBuf->Length++;
  698. }
  699. sisir_ParseData(IRProtocolNum, mmiobase);
  700. #if defined(IR_PROTOCOL_SHARP)|| defined(IR_PROTOCOL_SHARP2)
  701. if ( tmp_irCmd == dataBuf->Databuf[dataBuf->Length].Command )
  702. {
  703. if ( first_rpt )
  704. {
  705. rpt_cnt = rpt_cnt + 1;
  706. }
  707. if ( rpt_cnt > 10 )
  708. {
  709. singleKey = 0;
  710. first_rpt = 0;
  711. rpt_cnt = 0;
  712. dataBuf->Databuf[dataBuf->Length].Command = tmp_irCmd;
  713. dataBuf->Databuf[dataBuf->Length].Address = tmp_irAddress;
  714. dataBuf->Databuf[dataBuf->Length].Address_= tmp_irAddress_;
  715. dataBuf->Databuf[dataBuf->Length].ContinueKey = CONTINUE_KEY_START;
  716. dataBuf->Length++;
  717. DBG_MSG1(DBGCFG_IR, " reg_rpt_sts received %d\n", rpt_cnt);
  718. }
  719. }
  720. else
  721. {
  722. tmp_irCmd = datBuf->Databuf[datBuf->Length].Command;
  723. tmp_irAddress = datBuf->Databuf[datBuf->Length].Address;
  724. tmp_irAddress_ = datBuf->Databuf[datBuf->Length].Address_;
  725. DBG_MSG1(DBGCFG_IR, "Single int\nAddr Addr_: %x,%x\nCMD: %x\n", tmp_irAddress, tmp_irAddress_, tmp_irCmd);
  726. dataBuf->Databuf[dataBuf->Length].ContinueKey = CONTINUE_KEY_HEAD;
  727. dataBuf->Length++;
  728. rpt_cnt = 0;
  729. first_rpt = 1;
  730. singleKey = 1;
  731. }
  732. init_IR_cont_timer(150); // 150 ms
  733. ir_timer_flag = 1;
  734. DBG_MSG1(DBGCFG_IR, "IR Receive : 0x%08x\tIR reg54:0x%08x\n<==\n", (UINT32)irdatas.Value, (UINT32)*(ULONG *)(0xbe080054));
  735. SetMMIO_DWORD(mmiobase, 0x0c, (*(unsigned int *)(0xbe08000c))); // Clear reg_intr_sts (reg_intr_sts is Write-1-Clear)
  736. return;
  737. #else
  738. tmp_irCmd = datBuf->Databuf[datBuf->Length].Command;
  739. tmp_irAddress = datBuf->Databuf[datBuf->Length].Address;
  740. tmp_irAddress_ = datBuf->Databuf[datBuf->Length].Address_;
  741. DBG_MSG1(DBGCFG_IR, "Single int\nAddr Addr_: %x,%x\nCMD: %x\n", tmp_irAddress, tmp_irAddress_, tmp_irCmd);
  742. dataBuf->Databuf[dataBuf->Length].ContinueKey = CONTINUE_KEY_HEAD;
  743. dataBuf->Databuf[dataBuf->Length].Protocol = IRProtocolNum;
  744. dataBuf->Length++;
  745. rpt_cnt = 0;
  746. first_rpt = 1;
  747. singleKey = 1;
  748. #endif
  749. }
  750. DBG_MSG1(DBGCFG_IR, "IR Receive : 0x%08x\tIR reg54:0x%08x\n<==\n", (unsigned int)(irdatas.Value), (unsigned int)(*(ULONG *)(0xbe080054)));
  751. DBG_MSG1(DBGCFG_IR, "\n ir 1 datas <==\n");
  752. }
  753. // ir 2
  754. else if(irdatas2.Reg.reg_intr_sts)
  755. {
  756. DBG_MSG1(DBGCFG_IR, "\n ir 2 datas ==>\n");
  757. if(dataBuf->Length >= (30 - 2))
  758. {
  759. DBG_MSG1(DBGCFG_IR, "\n\n\n IR2 data buffer full\n\n\n");
  760. dataBuf->Length = 0;
  761. }
  762. if(irdatas2.Reg.reg_rpt_start_sts)
  763. {
  764. DBG_MSG1(DBGCFG_IR, "22 reg_rpt_start_sts received\n");
  765. rpt_cnt = 0;
  766. first_rpt = 0;
  767. dataBuf->Databuf[dataBuf->Length].Command = tmp_irCmd;
  768. dataBuf->Databuf[dataBuf->Length].Address = tmp_irAddress;
  769. dataBuf->Databuf[dataBuf->Length].Address_= tmp_irAddress_;
  770. dataBuf->Databuf[dataBuf->Length].ContinueKey = CONTINUE_KEY_START;
  771. dataBuf->Length++;
  772. }
  773. if(irdatas2.Reg.reg_rpt_end_sts)
  774. {
  775. DBG_MSG1(DBGCFG_IR, "222 reg_rpt_end received\n");
  776. if ( first_rpt == 1 )
  777. {
  778. DBG_MSG1(DBGCFG_IR, "222 reg_single_end received\n");
  779. dataBuf->Databuf[dataBuf->Length].Command = tmp_irCmd;
  780. dataBuf->Databuf[dataBuf->Length].Address = tmp_irAddress;
  781. dataBuf->Databuf[dataBuf->Length].Address_= tmp_irAddress_;
  782. dataBuf->Databuf[dataBuf->Length].ContinueKey = SINGLE_KEY_END; // single end
  783. dataBuf->Length++;
  784. }
  785. else
  786. {
  787. DBG_MSG1(DBGCFG_IR, "222 reg_rpt_end_sts received\n");
  788. dataBuf->Databuf[dataBuf->Length].Command = tmp_irCmd;
  789. dataBuf->Databuf[dataBuf->Length].Address = tmp_irAddress;
  790. dataBuf->Databuf[dataBuf->Length].Address_= tmp_irAddress_;
  791. dataBuf->Databuf[dataBuf->Length].ContinueKey = CONTINUE_KEY_START_END;
  792. dataBuf->Length++;
  793. }
  794. }
  795. if(irdatas2.Reg.reg_single_sts)
  796. {
  797. if ( ir_timer_flag )
  798. {
  799. del_timer(&IR_ContiTimer);
  800. ir_timer_flag = 0;
  801. }
  802. if ( singleKey == 1 )
  803. {
  804. DBG_MSG1(DBGCFG_IR, "222 2nd \tCMD:%x\n", tmp_irCmd);
  805. datBuf->Databuf[datBuf->Length].Command = tmp_irCmd;
  806. datBuf->Databuf[datBuf->Length].Address = tmp_irAddress;
  807. datBuf->Databuf[datBuf->Length].Address_ = tmp_irAddress_;
  808. datBuf->Databuf[datBuf->Length].ContinueKey = SINGLE_KEY_END; // single end
  809. datBuf->Length++;
  810. }
  811. sisir_ParseData(IRProtocolNum2, mmiobase2);
  812. #if defined(IR_PROTOCOL_SHARP)|| defined(IR_PROTOCOL_SHARP2)
  813. if ( tmp_irCmd == dataBuf->Databuf[dataBuf->Length].Command )
  814. {
  815. if ( first_rpt )
  816. {
  817. rpt_cnt = rpt_cnt + 1;
  818. }
  819. if ( rpt_cnt > 10 )
  820. {
  821. singleKey = 0;
  822. first_rpt = 0;
  823. rpt_cnt = 0;
  824. dataBuf->Databuf[dataBuf->Length].Command = tmp_irCmd;
  825. dataBuf->Databuf[dataBuf->Length].Address = tmp_irAddress;
  826. dataBuf->Databuf[dataBuf->Length].Address_= tmp_irAddress_;
  827. dataBuf->Databuf[dataBuf->Length].ContinueKey = CONTINUE_KEY_START;
  828. dataBuf->Length++;
  829. DBG_MSG1(DBGCFG_IR, "222 reg_rpt_sts received %d\n", rpt_cnt);
  830. }
  831. }
  832. else
  833. {
  834. tmp_irCmd = datBuf->Databuf[datBuf->Length].Command;
  835. tmp_irAddress = datBuf->Databuf[datBuf->Length].Address;
  836. tmp_irAddress_ = datBuf->Databuf[datBuf->Length].Address_;
  837. DBG_MSG1(DBGCFG_IR, "222Single int\nAddr Addr_: %x,%x\nCMD: %x ,CMDCMD: %x\n", tmp_irAddress, tmp_irAddress_, tmp_irCmd, datBuf->Databuf[datBuf->Length].Command);
  838. dataBuf->Databuf[dataBuf->Length].ContinueKey = CONTINUE_KEY_HEAD;
  839. dataBuf->Length++;
  840. rpt_cnt = 0;
  841. first_rpt = 1;
  842. singleKey = 1;
  843. }
  844. init_IR_cont_timer(150); // 150 ms
  845. ir_timer_flag = 1;
  846. DBG_MSG1(DBGCFG_IR, "222IR Receive : 0x%08x\tIR reg54:0x%08x\n<==\n", (UINT32)irdatas2.Value, (UINT32)*(ULONG *)(0xbe080554));
  847. SetMMIO_DWORD(mmiobase2, 0x0c, (*(unsigned int *)(0xbe08050c))); // Clear reg_intr_sts (reg_intr_sts is Write-1-Clear)
  848. return;
  849. #else
  850. tmp_irCmd = datBuf->Databuf[datBuf->Length].Command;
  851. tmp_irAddress = datBuf->Databuf[datBuf->Length].Address;
  852. tmp_irAddress_ = datBuf->Databuf[datBuf->Length].Address_;
  853. DBG_MSG1(DBGCFG_IR, "222Single int\nAddr Addr_: %x,%x\nCMD: %x\n", tmp_irAddress, tmp_irAddress_, tmp_irCmd);
  854. dataBuf->Databuf[dataBuf->Length].ContinueKey = CONTINUE_KEY_HEAD;
  855. dataBuf->Databuf[dataBuf->Length].Protocol = IRProtocolNum2;
  856. dataBuf->Length++;
  857. rpt_cnt = 0;
  858. first_rpt = 1;
  859. singleKey = 1;
  860. #endif
  861. }
  862. DBG_MSG1(DBGCFG_IR, "222IR Receive : 0x%08x\tIR reg54:0x%08x\n<==\n", (unsigned int)(irdatas2.Value), (unsigned int)(*(ULONG *)(0xbe080554)));
  863. DBG_MSG1(DBGCFG_IR, "\n ir 2 datas <==\n");
  864. }
  865. }
  866. // 20100407 Magic modify for single end
  867. if ( (dataBuf->Length > 0) && ( dataBuf->Databuf[dataBuf->Length-1].ContinueKey == CONTINUE_KEY_HEAD ) && (rpt_cnt==0) && irdatas.Reg.reg_intr_sts)
  868. {
  869. if(IRProtocolNum == NEC_SAMSUNG || IRProtocolNum2 == NEC_SAMSUNG)
  870. init_IR_cont_timer(350); // 350 ms
  871. else
  872. init_IR_cont_timer(285); // 285 ms
  873. ir_timer_flag = 1;
  874. }
  875. else
  876. {
  877. singleKey = 0;
  878. if ( ir_timer_flag )
  879. {
  880. del_timer(&IR_ContiTimer);
  881. }
  882. }
  883. SetMMIO_DWORD(mmiobase, 0x0c, irdatas.Value); // Clear reg_intr_sts (reg_intr_sts is Write-1-Clear)
  884. SetMMIO_DWORD(mmiobase2, 0x0c, irdatas2.Value); // Clear reg_intr_sts (reg_intr_sts is Write-1-Clear)
  885. return;
  886. }
  887. }
  888. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,8))
  889. long sisir_ioctl(struct file *file, unsigned int cmd, ULONG arg)
  890. #else
  891. int sisir_ioctl(struct inode *inode, struct file *file, unsigned int cmd, ULONG arg)
  892. #endif
  893. {
  894. IRDEVPTR pir = (IRDEVPTR)(file->private_data);
  895. switch(cmd)
  896. {
  897. case IR_IOC_Get_Data:
  898. //DBG_MSG1(DBGCFG_IR, "sisir_ioctl IR_IOC_Get_Data\n");
  899. //spin_lock_irqsave(&IR_lock, IR_irq_flag);
  900. disable_irq(IRQ_IR);
  901. if (copy_to_user((void *)arg, &pir->dataBuf, sizeof(IR_IOC_IOData)))
  902. {
  903. //spin_unlock_irqrestore(&IR_lock, IR_irq_flag);
  904. enable_irq(IRQ_IR);
  905. return -EFAULT;
  906. }
  907. pir->dataBuf.Length=0;
  908. //spin_unlock_irqrestore(&IR_lock, IR_irq_flag);
  909. enable_irq(IRQ_IR);
  910. break;
  911. #if 0
  912. case IR_IOC_Get_Protocol:
  913. if (copy_to_user((void *)arg, &IRProtocolNum, sizeof(IR_CODING)))
  914. {
  915. return -EFAULT;
  916. }
  917. break;
  918. #endif
  919. #ifdef UI
  920. case IR_IOC_Set_Protocol:
  921. if (copy_from_user( &IRProtocolNum, (void *)arg,sizeof(IR_CODING)))
  922. {
  923. return -EFAULT;
  924. }
  925. //sisir_initfun(IRProtocolNum);
  926. break;
  927. #endif
  928. #ifdef CONFIG_AUTO_USB_STORE_IRSEQ
  929. case IR_IOC_Set_Data:
  930. {
  931. PMessage pMessage = &pir->userMessage;
  932. IR_IOC_IOData* tbuf;
  933. //DBG_MSG1(DBGCFG_IR, "sisir_ioctl IR_IOC_Set_Data\n");
  934. if (copy_from_user(pMessage, (void *)arg, sizeof(Message)))
  935. {
  936. DBG_MSG1(DBGCFG_IR, "IR_IOC_Set_Data copy failed\n");
  937. return -EFAULT;
  938. }
  939. tbuf = &pIRDev->dataBuf;
  940. if(tbuf->Length>=30)
  941. {
  942. DBG_MSG1(DBGCFG_IR, "data buffer full\n");
  943. tbuf->Length=0;
  944. }
  945. memcpy(&tbuf->Databuf[tbuf->Length],pMessage,sizeof(Message));
  946. tbuf->Length++;
  947. if (pMessage->ContinueKey == CONTINUE_KEY_HEAD)
  948. {
  949. DBG_MSG1(DBGCFG_IR, "1. This is CONTINUE_KEY_HEAD.\nAddr = 0x%02x, Cmd = 0x%02x\n", pMessage->Address,pMessage->Command);
  950. }
  951. else if (pMessage->ContinueKey == CONTINUE_KEY_START_END)
  952. {
  953. DBG_MSG1(DBGCFG_IR, "2. This is CONTINUE_KEY_START_END.\nAddr = 0x%02x, Cmd = 0x%02x\n", pMessage->Address,pMessage->Command);
  954. }
  955. else if (pMessage->ContinueKey == CONTINUE_KEY_START)
  956. {
  957. DBG_MSG1(DBGCFG_IR, "3. This is CONTINUE_KEY_START.\nAddr = 0x%02x, Cmd = 0x%02x\n", pMessage->Address,pMessage->Command);
  958. }
  959. else if (pMessage->ContinueKey == CONTINUE_KEY_END)
  960. {
  961. DBG_MSG1(DBGCFG_IR, "4. This is CONTINUE_KEY_END.\nAddr = 0x%02x, Cmd = 0x%02x\n", pMessage->Address,pMessage->Command);
  962. }
  963. memset(pMessage,0,sizeof(Message));
  964. break;
  965. }
  966. case IR_IOC_EnableIR:
  967. IRHardwareEnableFun();
  968. break;
  969. case IR_IOC_DisableIR:
  970. IRHardwareDisableFun();
  971. break;
  972. #endif
  973. #if 0
  974. case IR_IOC_Get_AndroidData:
  975. //wait_event_interruptible(wq, dataBuf.Length!=0); //no data in buff
  976. //spin_lock_irqsave(&IR_lock, IR_irq_flag);
  977. disable_irq(IRQ_IR);
  978. if (copy_to_user((void *)arg, &AndroidDataBuf, sizeof(IR_IOC_IOData)))
  979. {
  980. //spin_unlock_irqrestore(&IR_lock, IR_irq_flag);
  981. enable_irq(IRQ_IR);
  982. return -EFAULT;
  983. }
  984. AndroidDataBuf.Length=0;
  985. //spin_unlock_irqrestore(&IR_lock, IR_irq_flag);
  986. enable_irq(IRQ_IR);
  987. break;
  988. case IR_IOC_ClsAndroid:
  989. break;
  990. #endif
  991. }
  992. return 0;
  993. }
  994. #ifdef CONFIG_AUTO_USB_STORE_IRSEQ
  995. void IRHardwareEnableFun(void)
  996. {
  997. UINT8 *mmiobase = (UINT8*)MMIOBASE_IR;
  998. //ULONG W_Data = 0;
  999. DBG_MSG1(DBGCFG_IR, "IRHwEn\n");
  1000. SetMMIO_DWORD_MASK(mmiobase, 0x4, IR_protocol_selection_value, 0xFF);
  1001. /*Enable IR global interrupt */
  1002. SetMMIO_DWORD(mmiobase, 0x8, (( GetMMIO_DWORD(mmiobase, 0x08) )|0x00010000));
  1003. }
  1004. void IRHardwareDisableFun(void)
  1005. {
  1006. UINT8 *mmiobase = (UINT8*)MMIOBASE_IR;
  1007. //ULONG W_Data = 0;
  1008. DBG_MSG1(DBGCFG_IR, "IRHwDisable\n");
  1009. IR_protocol_selection_value = GetMMIO_DWORD(mmiobase, 0x04);
  1010. SetMMIO_DWORD_MASK(mmiobase, 0x4, 0x0, 0xFF);
  1011. /*disable IR global interrupt */
  1012. SetMMIO_DWORD(mmiobase, 0x8, (( GetMMIO_DWORD(mmiobase, 0x08) )&0xFFFEFFFF));
  1013. }
  1014. #endif
  1015. int sisir_open(struct inode *inode, struct file *file)
  1016. {
  1017. unsigned int minor = MINOR(inode->i_rdev);
  1018. //DBG_MSG1(DBGCFG_IR, "sisir_open ==>");
  1019. if(minor>=SISIR_DEV_NUM)
  1020. {
  1021. DBG_MSG1(DBGCFG_IR, "sisir_open <== 0");
  1022. return -ENODEV;
  1023. }
  1024. file->private_data = pIRDev;
  1025. //DBG_MSG1(DBGCFG_IR, "sisir_open <==");
  1026. return 0;
  1027. }
  1028. static struct file_operations sisir_fops=
  1029. {
  1030. owner: THIS_MODULE,
  1031. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,8))
  1032. .unlocked_ioctl = sisir_ioctl,
  1033. #else
  1034. ioctl: sisir_ioctl,
  1035. #endif
  1036. // mmap: sisir_mmap,
  1037. open: sisir_open,
  1038. // release: sisir_release,
  1039. };
  1040. #if defined(CONFIG_SUPPORT_IR_INI) || defined(CONFIG_SUPPORT_LOAD_KERNEL_FROM_USB) || defined(CONFIG_SUPPORT_IR_FAC_REMOTE)
  1041. #define OP_IR_Protocol_reg 0x88930324 /* 0xbe080004 */
  1042. #define OP_IR_Interrupt_en_reg 0x000f0000 /* 0xbe080008 */
  1043. #define OP_IR_Interrupt_staus 0x00000000 /* 0xbe08000c */
  1044. #define OP_IR_MinSpaceBetweenPacket 0x01b001b0 /* 0xbe080010 */
  1045. #define OP_IR_Max_Min_Symbol 0x01250046 /* 0xbe080014 */
  1046. #define OP_IR_Max_Min_Short_Mark 0x00490023 /* 0xbe080018 */
  1047. #define OP_IR_Max_Min_Short_Space 0x00490023 /* 0xbe08001c */
  1048. #define OP_IR_Max_Min_Long_Mark 0x00dd006a /* 0xbe080020 */
  1049. #define OP_IR_Max_Min_Head_Mark 0x04900232 /* 0xbe080024 */
  1050. #define OP_IR_Max_Min_Head_Space 0x02490119 /* 0xbe080028 */
  1051. #define OP_IR_REG_2C 0x00000000 /* 0xbe08002c */
  1052. #define OP_IR_Max_Min_Repeat_Space 0x0125008d /* 0xbe080030 */
  1053. #define OP_IR_Extra_Decode_Option 0x00000002 /* 0xbe080034 */
  1054. #define OP_IR_REG_38 0x00000000 /* 0xbe080038 */
  1055. #define OP_IR_WatchDog_Timeout 0x00000000 /* 0xbe08003c (unused now) */
  1056. #define OP_IR_Repeat_Threshold 0x00020102 /* 0xbe080040 */
  1057. #define OP_IR_Packet_Timeout_Threshold 0x16022d60 /* 0xbe080044 */
  1058. #define OP_IR_Key_Press_Counter 0x00000000 /* 0xbe080048 */
  1059. #define OP_IR_Protocol_Type_Option 0x00b02009 /* 0xbe08004c */
  1060. #define OP_IR_Internal_Counter 0x00000000 /* 0xbe080050 */
  1061. #define OP_IR_Bit47_to_Bit16 0x00000000 /* 0xbe080054 */
  1062. #define OP_IR_Receiver_Signal 0x00000000 /* 0xbe080058 */
  1063. #define OP_IR_Power_Code_Option 0x00000003 /* 0xbe08005c */
  1064. #define OP_IR_Power_Code_A_Low_Channel 0x906fa25d /* 0xbe080060 */
  1065. #define OP_IR_Power_Code_A_High_Channel 0x00000000 /* 0xbe080064 */
  1066. #define OP_IR_Power_Code_B_Low_Channel 0x00000000 /* 0xbe080068 */
  1067. #define OP_IR_Power_Code_B_High_Channel 0x00000000 /* 0xbe08006c */
  1068. #define OP_IR_Power_Code_C_Low_Channel 0x00000000 /* 0xbe080070 */
  1069. #define OP_IR_Power_Code_C_High_Channel 0x00000000 /* 0xbe080074 */
  1070. #define OP_IR_Power_Code_D_Low_Channel 0x00000000 /* 0xbe080078 */
  1071. #define OP_IR_Power_Code_D_High_Channel 0x00000000 /* 0xbe08007c */
  1072. #define OP_IR_Max_Min_Long1_MarkSpace 0x00000000 /* 0xbe080080 */
  1073. #define OP_IR_Max_Min_Long2_MarkSpace 0x00000000 /* 0xbe080084 */
  1074. UINT32 irNecTable[33] =
  1075. { \
  1076. OP_IR_Protocol_reg, \
  1077. OP_IR_Interrupt_en_reg, \
  1078. OP_IR_Interrupt_staus, \
  1079. OP_IR_MinSpaceBetweenPacket, \
  1080. OP_IR_Max_Min_Symbol, \
  1081. OP_IR_Max_Min_Short_Mark, \
  1082. OP_IR_Max_Min_Short_Space, \
  1083. OP_IR_Max_Min_Long_Mark, \
  1084. OP_IR_Max_Min_Head_Mark, \
  1085. OP_IR_Max_Min_Head_Space, \
  1086. OP_IR_REG_2C, \
  1087. OP_IR_Max_Min_Repeat_Space, \
  1088. OP_IR_Extra_Decode_Option, \
  1089. OP_IR_REG_38, \
  1090. OP_IR_WatchDog_Timeout, \
  1091. OP_IR_Repeat_Threshold, \
  1092. OP_IR_Packet_Timeout_Threshold, \
  1093. OP_IR_Key_Press_Counter, \
  1094. OP_IR_Protocol_Type_Option, \
  1095. OP_IR_Internal_Counter, \
  1096. OP_IR_Bit47_to_Bit16, \
  1097. OP_IR_Receiver_Signal, \
  1098. OP_IR_Power_Code_Option, \
  1099. OP_IR_Power_Code_A_Low_Channel, \
  1100. OP_IR_Power_Code_A_High_Channel, \
  1101. OP_IR_Power_Code_B_Low_Channel, \
  1102. OP_IR_Power_Code_B_High_Channel, \
  1103. OP_IR_Power_Code_C_Low_Channel, \
  1104. OP_IR_Power_Code_C_High_Channel, \
  1105. OP_IR_Power_Code_D_Low_Channel, \
  1106. OP_IR_Power_Code_D_High_Channel, \
  1107. OP_IR_Max_Min_Long1_MarkSpace, \
  1108. OP_IR_Max_Min_Long2_MarkSpace, \
  1109. };
  1110. #endif
  1111. void sisir_initfun( void )
  1112. {
  1113. ULONG i;
  1114. #if defined(CONFIG_SUPPORT_IR_INI) || defined(CONFIG_SUPPORT_LOAD_KERNEL_FROM_USB) || defined (CONFIG_SUPPORT_IR_FAC_REMOTE)
  1115. UINT8 bootType = 0;
  1116. #endif
  1117. CUSTIMIZATION_TABLEPTR pCustTAB = (volatile CUSTIMIZATION_TABLEPTR)SPI_OPTIONDATA_SHADOWADDR;
  1118. *(volatile ULONG *)(0xbe080008) &= ~(1<<16); //reset IR
  1119. *(volatile ULONG *)(0xbe080508) &= ~(1<<16); //reset IR 2
  1120. udelay(10);
  1121. //DBG_MSG1(DBGCFG_IR, "sisir_init ==>");
  1122. //if(pCustTAB->IRCommandType > 7) pCustTAB->IRCommandType = 1; //default setting = Nec
  1123. #ifdef CONFIG_SUPPORT_IR_INI
  1124. bootType = *(UINT8*)(0xbe000088+0x3)>>4;
  1125. if(bootType == BootType_AC_SPECIAL_FILE)
  1126. {
  1127. IRProtocolNum= Nec;
  1128. // fill the initial settings but disable the IR first (to clear its status)
  1129. SetMMIO_DWORD(pIRDev->mmio_vbase, 0x04, (irNecTable[0] & ~(0x1f))); // disable the protocol (receiving) enable bit first, and
  1130. SetMMIO_DWORD(pIRDev->mmio_vbase, 0x08, (irNecTable[1] & ~(0x1f << 16))); // then disable the interrupt enable bit
  1131. for ( i=0;i<33;i++ )
  1132. {
  1133. SetMMIO_DWORD(pIRDev->mmio_vbase, (i+1)*4, irNecTable[i]);
  1134. //DBG_MSG1(DBGCFG_IR, "AC reg add=%x===%d=\n",irNecTable[i], __LINE__);
  1135. }
  1136. IR_protocol_selection_value = irNecTable[0]; //default protocol vaule for IRHardwareEnableFun
  1137. }
  1138. else
  1139. #endif
  1140. {
  1141. #if defined (CONFIG_SUPPORT_LOAD_KERNEL_FROM_USB)
  1142. bootType = (*(UINT8*)(0xbe0f0523) & 0x40) >>6; //0xbe0f0523[6]
  1143. #elif defined (CONFIG_SUPPORT_IR_FAC_REMOTE)
  1144. bootType = (*(UINT8*)(0xbe0f0523) & 0x80) >>7; //0xbe0f0523[7]
  1145. #endif
  1146. #if defined(CONFIG_SUPPORT_LOAD_KERNEL_FROM_USB) || defined(CONFIG_SUPPORT_IR_FAC_REMOTE)
  1147. //printk("bootType = %d, reg0xbe0f0523:%lx \n\n",bootType, *(volatile ULONG *)(0xbe0f0523));
  1148. if(bootType == true)
  1149. {
  1150. IRProtocolNum= Nec;
  1151. // fill the initial settings but disable the IR first (to clear its status)
  1152. SetMMIO_DWORD(pIRDev->mmio_vbase, 0x04, (irNecTable[0] & ~(0x1f))); // disable the protocol (receiving) enable bit first, and
  1153. SetMMIO_DWORD(pIRDev->mmio_vbase, 0x08, (irNecTable[1] & ~(0x1f << 16))); // then disable the interrupt enable bit
  1154. for ( i=0;i<33;i++ )
  1155. {
  1156. SetMMIO_DWORD(pIRDev->mmio_vbase, (i+1)*4, irNecTable[i]);
  1157. //DBG_MSG1(DBGCFG_IR, "AC reg add=%x===%d=\n",irNecTable[i], __LINE__);
  1158. }
  1159. IR_protocol_selection_value = irNecTable[0]; //default protocol vaule for IRHardwareEnableFun
  1160. }
  1161. else
  1162. #endif
  1163. {
  1164. IRProtocolNum =pCustTAB->IRCommandType; //ir_parameter.code;
  1165. // fill the initial settings but disable the IR first (to clear its status)
  1166. SetMMIO_DWORD(pIRDev->mmio_vbase, 0x04, (pCustTAB->pIR_Set[0] & ~(0x1f))); // disable the protocol (receiving) enable bit first, and
  1167. SetMMIO_DWORD(pIRDev->mmio_vbase, 0x08, (pCustTAB->pIR_Set[1] & ~(0x1f << 16))); // then disable the interrupt enable bit
  1168. for ( i=0;i<33;i++ )
  1169. {
  1170. SetMMIO_DWORD(pIRDev->mmio_vbase, (i+1)*4, pCustTAB->pIR_Set[i]);
  1171. //DBG_MSG1(DBGCFG_IR, "reg add=%x===%d=\n",pCustTAB->pIR_Set[i], __LINE__);
  1172. }
  1173. IR_protocol_selection_value = pCustTAB->pIR_Set[0]; //default protocol vaule for IRHardwareEnableFun
  1174. IRProtocolNum2= pCustTAB->IR2CommandType;
  1175. // fill the initial settings but disable the IR first (to clear its status)
  1176. SetMMIO_DWORD(pIRDev->mmio_vbase2, 0x04, (pCustTAB->pIR2_Set[0] & ~(0x1f))); // disable the protocol (receiving) enable bit first, and
  1177. SetMMIO_DWORD(pIRDev->mmio_vbase2, 0x08, (pCustTAB->pIR2_Set[1] & ~(0x1f << 16))); // then disable the interrupt enable bit
  1178. for ( i=0;i<33;i++ )
  1179. {
  1180. SetMMIO_DWORD(pIRDev->mmio_vbase2, (i+1)*4, pCustTAB->pIR2_Set[i]);
  1181. //DBG_MSG1(DBGCFG_IR, "AC reg add=%x===%d=\n",irNecTable[i], __LINE__);
  1182. }
  1183. //IR_protocol_selection_value = irNecTable[0]; //default protocol vaule for IRHardwareEnableFun
  1184. //printk("IRProtocolNum=%d, IRProtocolNum2=%d-----------\n\n",IRProtocolNum, IRProtocolNum2);
  1185. }
  1186. }
  1187. #if IR_Auto_Test
  1188. memset(&pIRDev->userMessage,0,sizeof(Message));
  1189. #endif
  1190. //DBG_MSG1(DBGCFG_IR, "sisir_init code %d<== ",IRProtocolNum);
  1191. }
  1192. static irqreturn_t IR_ISR(int irq, void* dev_id, struct pt_regs *regs)
  1193. {
  1194. sisir_isrfun(pIRDev->mmio_vbase, pIRDev->mmio_vbase2, &pIRDev->dataBuf);
  1195. return IRQ_HANDLED;
  1196. }
  1197. static void mips_ir_dispatch(struct pt_regs *regs)
  1198. {
  1199. do_IRQ(IRQ_IR);
  1200. }
  1201. static struct irqaction ir_irqaction = {
  1202. .handler = (irq_handler_t)&IR_ISR,
  1203. .flags = IRQF_DISABLED,
  1204. .name = "ir",
  1205. };
  1206. #ifndef INIT_BY_KMF
  1207. static int __init IRInit(void)
  1208. #else
  1209. int IRInit(void)
  1210. #endif
  1211. {
  1212. int err,devno;
  1213. #if 1
  1214. pIRDev = (IRDEVPTR)kmalloc(sizeof(IRDEV), GFP_KERNEL);
  1215. #else
  1216. pIRDev = (IRDEVPTR)drv_kmalloc(sizeof(IRDEV), GFP_KERNEL, MODULEID_IR);
  1217. #endif
  1218. memset(pIRDev, 0, sizeof(IRDEV));
  1219. //DBG_MSG1(DBGCFG_IR, "[IR] ========>IRInit");
  1220. pIRDev->mmio_vbase = (UINT8*)MMIOBASE_IR;
  1221. pIRDev->mmio_vbase2 = (UINT8*)MMIOBASE_IR2;
  1222. pIRDev->irq = IRQ_IR;
  1223. // init variable
  1224. rpt_cnt = 0;
  1225. first_rpt = 1;
  1226. singleKey = 0;
  1227. tmp_irCmd = 0xff;
  1228. tmp_irAddress = 0;
  1229. tmp_irAddress_= 0;
  1230. ir_timer_flag = 0;
  1231. //
  1232. set_vi_handler(IRQ_IR, (vi_handler_t)mips_ir_dispatch);
  1233. setup_irq(IRQ_IR, &ir_irqaction);
  1234. //////////////////////////////////////////////
  1235. devno = MKDEV(SISIR_DEV_MAJOR, 0);
  1236. cdev_init(&pIRDev->cdev, &sisir_fops);
  1237. pIRDev->cdev.owner = THIS_MODULE;
  1238. err = cdev_add(&pIRDev->cdev, devno, 1);
  1239. if(err)
  1240. {
  1241. DBG_MSG1(DBGCFG_IR, "IRInit Failed\n");
  1242. return -EIO;
  1243. }
  1244. pIRDev->dataBuf.Length = 0;
  1245. #if IR_Auto_Test
  1246. IR_protocol_selection_value = GetMMIO_DWORD((UINT8*)MMIOBASE_IR, 0x04);
  1247. #endif
  1248. // To init spin lock
  1249. spin_lock_init(&IR_lock);
  1250. sisir_initfun();
  1251. #ifdef CONFIG_DVD_COMBO
  1252. {
  1253. #define c0count_per_msec_reg 0xbe000040
  1254. #if (CONFIG_CHIPID != 0x533)
  1255. #if (CONFIG_CHIPID == 0x131)
  1256. int PREPLL = ((*(UINT8 *)0xbe000107 +1)*24000) ;
  1257. int CPUPLL = PREPLL / ((*(UINT8 *)0xbe000108 & 0x7f) + 1);
  1258. if ((*(unsigned char *)0xbe000105)&0x10)
  1259. CPUPLL = CPUPLL/2;
  1260. if ((*(unsigned char *)0xbe0001bd)&0x04)
  1261. CPUPLL = CPUPLL/2;
  1262. #elif (CONFIG_CHIPID == 0x8506) || (CONFIG_CHIPID == 0x6710)
  1263. int CPUPLL = drv_get_device_clock(CPUACLK)/1000;
  1264. #else
  1265. int MEMPLL = ((*(UINT8 *)0xbe0001a4 +1)*24576) / ((*(UINT8 *)0xbe0001a5 & 0x1f)+1);
  1266. int CPUPLL = MEMPLL / ((*(UINT8 *)0xbe000108 & 0x7f) + 1);
  1267. #endif
  1268. #else
  1269. int cpu_pll = ((*(UINT8 *)0xbe0001b8 +1)*24576) / ((*(UINT8 *)0xbe0001b9 & 0x01)+1);
  1270. int CPUPLL = cpu_pll / ((*(UINT8 *)0xbe000108 & 0x7f) + 1);
  1271. #endif
  1272. *(volatile ULONG *)c0count_per_msec_reg = CPUPLL/2; //c0count_per_msec_reg
  1273. *(volatile ULONG *)(0xbe010104) |= 0x00080000; // enable software interrupt 51
  1274. }
  1275. #endif
  1276. //DBG_MSG1(DBGCFG_IR, "[IR] IRInit <======== \n");
  1277. return 0;
  1278. }
  1279. #ifndef INIT_BY_KMF
  1280. module_init (IRInit);
  1281. module_exit (IRExit);
  1282. #endif
  1283. MODULE_LICENSE("Dual BSD/GPL");