国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 3481|回復: 2
打印 上一主題 下一主題

OK210開發板使用感想續之自己設計的紅外驅動

[復制鏈接]
跳轉到指定樓層
樓主
發表于 2013-9-17 15:15:11 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
關鍵詞: 嵌入式
經過幾天的研究,終于把OK210開發板wince紅外驅動的部分給完成了。
開發工具:vs2005,飛凌官方OK210開發板,杜邦線3根,烙鐵一把,焊錫,4.7k電阻一個。
開發軟件:Win CE 6.0
下圖是所需的開發工具
從網上找了好久,不是不能用,就是騙子代碼,根本不能用,最可氣的就是掛羊頭賣狗肉,標著紅外驅動,用自己寶貴的積分,下載下來一看根本就不是,浪費了我很多時間,最后沒辦法只能自己動手了,這里充分體現了毛主席“自己動手,豐衣足食”這句話的重要性。好了廢話不多說吧我自己的這幾天的思路告訴大家讓大家以后少走彎路,在這里我也希望廣大網友能夠不吝惜自己的勞動成果,把自己的奮斗果實奉獻下,這樣能讓很多網友少走彎路,大家慶幸之余也會非常感激”挖井人“的。首先,我是按照單片機解碼的思路,開始制作的Win CE操作系統的紅外驅動,可把我害苦了。我用的是中斷+定時器。思路呢和網上所有的都一樣,但是總是卡死在定時器上,定時器我用的是微秒級別的延時,這樣已進入系統,總是不停地去響應定時器的中斷,這樣就卡死在線程了。系統連起都起不來了,害的我倒騰了好幾天,最后沒辦法只能放棄了,改用延時,網上有現成的函數。解碼的遙控器類型有很多,這里我只做了最通用的NEC遙控器,其他的只需要改一下高低電平時間就行了。NEC紅外協議,作為接收端來講,首先是引導碼,有9ms的低電平,然后是4.5ms的高電平,然后是32位的操作碼,對于按鍵來說我們只需要解第三組就可以了,其他的NEC協議的知識可以從網上搜索下有很多的。現在只做紅外接收模塊,將準備好的杜邦線插在紅外的三個引腳上,引腳順序,大家從網上搜索下,然后就是找一個直插的4.7k上拉電阻,接到hs0038的接受引腳和5v引腳中間。由于我的紅外解碼思路是中斷所以只能找中斷引腳了,但是通篇的找飛凌OK210開發板上中斷引腳真的是太難找了,(o)最后沒辦法只能找已經引出的引腳了,最后發現按鍵上每個引腳都能用,都是中斷引腳,最后我選擇了外部中斷6,開發板的k4按鍵,將按鍵的上拉電阻去掉,然后焊接出一條引線,接到紅外接收器的接收引腳。下面是自己焊的紅外接收模塊。 好了硬件準備完畢,現在開始寫驅動。1.包含的頭文件:
  1. //made in 2013-6-7 by mr wang
  2. #include "stdafx.h"
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include "pmplatform.h"
  10. #include "Pkfuncs.h"
  11. #include
  12. #include
  13. #include "gpioentry_reg.h"
  14. #include
  15. typedef enum
  16. {
  17.     EINT_SIGNAL_LOW_LEVEL = 0,
  18.     EINT_SIGNAL_HIGH_LEVEL,
  19.     EINT_SIGNAL_FALL_EDGE,
  20.     EINT_SIGNAL_RISE_EDGE,
  21.     EINT_SIGNAL_BOTH_EDGE
  22. } EINT_SIGNAL_METHOD;

  23. typedef enum
  24. {
  25.     EINT_FILTER_DISABLE = 0,
  26.     EINT_FILTER_DELAY,
  27.     EINT_FILTER_DIGITAL
  28. } EINT_FILTER_METHOD;


  29. static volatile GPIO_REG *  g_pGPIOReg = NULL;
  30. static DWORD                                 g_dwSysIntrHS38 = SYSINTR_UNDEFINED;
  31. static HANDLE                                 g_hEventHS38 = NULL;
  32. static HANDLE                                 g_hEventResetBtn = NULL;
  33. static HANDLE                                 g_hThreadHS38 = NULL;
  34. static BOOL                                 g_bExitThread = FALSE;
  35. static BOOL                                 pwstatus=TRUE;

  36. void Delay_us(int n);//延時us
  37. BOOL IRS_date(void);//判斷遙控低電平
  38. static void InitInterrupt(void);//中斷初始化
  39. void IRS_port_init(void); //引腳初始化
  40. void IRS_enable_interrupt(void);//使能中斷
  41. void IRS_disable_interrupt(void);//不使能中斷
  42. void IRS_clear_interrupt_pending(void);//清楚中斷屏蔽位
  43. BOOL IRS_set_filter_method(EINT_FILTER_METHOD eMethod, unsigned int uiFilterWidth);//選擇中斷的filter方式
  44. BOOL IRS_set_interrupt_method(EINT_SIGNAL_METHOD eMethod);//設置中斷方式
  45. 2.解碼線程:
  46. INT WINAPI HS38Thread(void)
  47. {
  48.         int i,j;
  49.         byte ircode[4];//四位編碼

  50.         while(!g_bExitThread)
  51.         {
  52.                 WaitForSingleObject(g_hEventHS38, INFINITE);

  53.                 if(g_bExitThread)
  54.                 {
  55.                         break;
  56.                 }
  57.                 IRS_disable_interrupt();                          // 禁止中斷

  58.                 IRS_clear_interrupt_pending();                // 清除中斷標志位

  59.                 InterruptDone(g_dwSysIntrHS38);    //中斷完成,開始解碼

  60.                 Delay_us(8000);//延時掉ms的低電平,

  61.                 while(IRS_date());

  62.                 Delay_us(4000);//4.5ms高電平

  63.                 while(!IRS_date());

  64.                 for(j=0;j<4;j++)
  65.                 {
  66.                         for(i=0;i<8;i++)
  67.                         {
  68.                                 while(IRS_date());
  69.                                 Delay_us(700);
  70.                                 if(IRS_date())// send 0
  71.                                 {
  72.                                         ircode[j]=ircode[j]>>1;
  73.                                 }
  74.                                 else
  75.                                 {
  76.                                         ircode[j]=ircode[j]|0x80;
  77.                                         ircode[j]=ircode[j]>>1;
  78.                                         Delay_us(1200);
  79.                                 }
  80.                         }
  81.                 }
  82.                 Sleep(100);
  83.                 RETAILMSG(1,(TEXT("******* ircode[3] = %x\r\n"),ircode[3]));//打印第三組操作碼,便是按鍵的鍵碼
  84.                 IRS_enable_interrupt();
  85.         }
  86.         return 0;
  87. }
  88. 3.微妙延時函數
  89. void Delay_us(int n)
  90. {
  91.         LARGE_INTEGER litmp;
  92.         LONGLONG QPart1,QPart2;
  93.         double dfMinus, dfFreq, dfTim;
  94.         if(QueryPerformanceFrequency(&litmp)==FALSE)
  95.         {
  96.                 return;
  97.         }
  98.         dfFreq = (double)litmp.QuadPart;
  99.         QueryPerformanceCounter(&litmp);
  100.         QPart1 = litmp.QuadPart;
  101.         do
  102.         {
  103.                 QueryPerformanceCounter(&litmp);
  104.                 QPart2=litmp.QuadPart;
  105.                 dfMinus=(double)(QPart2-QPart1);
  106.                 dfTim=dfMinus/dfFreq;
  107.         }while(dfTim <0.000001*n);

  108. }
  109. 4.其他流驅動接口函數
  110. //設置寄存器地址
  111. BOOL HS38_initialize_register_address(void *pGPIOReg)//,void *pHSReg)
  112. {
  113.         if (pGPIOReg == NULL)
  114.         {
  115.                 return FALSE;
  116.         }
  117.         else
  118.         {
  119.                 g_pGPIOReg = (GPIO_REG *)pGPIOReg;
  120.                
  121.         }

  122.         return TRUE;
  123. }
  124. //初始化
  125. void IRS_port_init(void)
  126. {
  127.         Set_PinFunction(g_pGPIOReg, GPH06_EXT_INT_6);   
  128.         Set_PinPullUD(g_pGPIOReg, GPH06_EXT_INT_6,  sgip_PULL_UP);   

  129. }

  130. //使能引腳中斷
  131. void IRS_enable_interrupt(void)
  132. {

  133.         Unmask_EXTINT(g_pGPIOReg, EXT_INT_6);
  134. }

  135. //禁止引腳中斷
  136. void IRS_disable_interrupt(void)
  137. {

  138.         Mask_EXTINT(g_pGPIOReg, EXT_INT_6);

  139. }

  140. //清除引腳中斷
  141. void IRS_clear_interrupt_pending(void)
  142. {

  143.         Clear_EXTINT(g_pGPIOReg, EXT_INT_6);

  144. }

  145. //設置中斷方式
  146. BOOL IRS_set_interrupt_method(EINT_SIGNAL_METHOD eMethod)
  147. {
  148.         BOOL Ret = TRUE;

  149.         switch(eMethod)
  150.         {
  151.                 case EINT_SIGNAL_LOW_LEVEL:
  152.                         Set_EXTINT_TRLVL(g_pGPIOReg, EXT_INT_6, sgip_LOW_LEVEL);
  153.                         break;
  154.                 case EINT_SIGNAL_HIGH_LEVEL:
  155.                         Set_EXTINT_TRLVL(g_pGPIOReg, EXT_INT_6, sgip_HIGH_LEVEL);
  156.                         break;
  157.                 case EINT_SIGNAL_FALL_EDGE:
  158.                         Set_EXTINT_TRLVL(g_pGPIOReg, EXT_INT_6, sgip_FALLING_EDGE);
  159.                         break;
  160.                 case EINT_SIGNAL_RISE_EDGE:
  161.                         Set_EXTINT_TRLVL(g_pGPIOReg, EXT_INT_6, sgip_RISING_EDGE);
  162.                         break;
  163.                 case EINT_SIGNAL_BOTH_EDGE:
  164.                         Set_EXTINT_TRLVL(g_pGPIOReg, EXT_INT_6, sgip_BOTH_EDGE);
  165.                         break;
  166.                 default:
  167.                 Ret = FALSE;
  168.                 break;
  169.         }


  170.         return Ret;
  171. }

  172. //設置中斷filter方式
  173. BOOL IRS_set_filter_method(EINT_FILTER_METHOD eMethod, unsigned int uiFilterWidth)
  174. {
  175.         BOOL Ret =TRUE;

  176.         switch(eMethod)
  177.         {
  178.                 case EINT_FILTER_DISABLE:
  179.                         Clr_EXTINT_FILTER(g_pGPIOReg, EXT_INT_6);
  180.                         break;
  181.                 case EINT_FILTER_DELAY:
  182.                         Set_EXTINT_FILTER(g_pGPIOReg, EXT_INT_6, sgip_DELAY_FLT, 0);
  183.                         break;
  184.                 case EINT_FILTER_DIGITAL:
  185.                         Set_EXTINT_FILTER(g_pGPIOReg, EXT_INT_6, sgip_DIGITAL_FLT, uiFilterWidth);
  186.                         break;
  187.         default:
  188.                 Ret = FALSE;
  189.         break;
  190.         }
  191.         return Ret;
  192. }

  193. //判斷遙控接收引腳低電平,返回true
  194. BOOL IRS_date(void)
  195. {

  196.         if(Get_PinData(g_pGPIOReg,GPH06_EXT_INT_6))
  197.         {
  198.                 return FALSE;        // Low Active Switch (Pull-up switch)
  199.         }
  200.         else
  201.         {
  202.                 return TRUE;
  203.         }
  204. }

  205. static BOOL AllocResources(void)
  206. {
  207.         DWORD dwIRQ;
  208.         PHYSICAL_ADDRESS        ioPhysicalBase = {0,0};

  209.         //------------------
  210.         // GPIO Controller SFR
  211.         //------------------
  212.         ioPhysicalBase.LowPart = BASE_REG_PA_GPIO;
  213.         g_pGPIOReg = (GPIO_REG *)MmMapIoSpace(ioPhysicalBase, sizeof(GPIO_REG), FALSE);
  214.         if (g_pGPIOReg == NULL)
  215.         {
  216.                 return FALSE;
  217.         }

  218.         dwIRQ = IRQ_EINT6;

  219.         g_dwSysIntrHS38 = SYSINTR_UNDEFINED;
  220.         g_hEventHS38 = NULL;

  221.         if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwIRQ, sizeof(DWORD), &g_dwSysIntrHS38, sizeof(DWORD), NULL))
  222.         {
  223.                 g_dwSysIntrHS38 = SYSINTR_UNDEFINED;
  224.                 return FALSE;
  225.         }

  226.         g_hEventHS38 = CreateEvent(NULL, FALSE, FALSE, NULL);
  227.         if(NULL == g_hEventHS38)
  228.         {
  229.                 return FALSE;
  230.         }

  231.         if (!(InterruptInitialize(g_dwSysIntrHS38, g_hEventHS38, 0, 0)))
  232.         {
  233.                 return FALSE;
  234.         }


  235.         return TRUE;
  236. }
  237. static void ReleaseResources(void)
  238. {

  239.         if (g_pGPIOReg != NULL)
  240.         {
  241.                 MmUnmapIoSpace((PVOID)g_pGPIOReg, sizeof(GPIO_REG));
  242.                 g_pGPIOReg = NULL;
  243.         }

  244.         if (g_dwSysIntrHS38 != SYSINTR_UNDEFINED)
  245.         {
  246.                 InterruptDisable(g_dwSysIntrHS38);
  247.         }

  248.         if (g_hEventHS38 != NULL)
  249.         {
  250.                 CloseHandle(g_hEventHS38);
  251.         }

  252.         if (g_dwSysIntrHS38 != SYSINTR_UNDEFINED)
  253.         {
  254.                 KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR, &g_dwSysIntrHS38, sizeof(DWORD), NULL, 0, NULL);
  255.         }


  256.         g_pGPIOReg = NULL;

  257.         g_dwSysIntrHS38 = SYSINTR_UNDEFINED;

  258.         g_hEventHS38 = NULL;

  259. }

  260. static void InitInterrupt(void)
  261. {
  262.         // 禁止中斷
  263.         IRS_disable_interrupt();

  264.         // I初始化端口
  265.         IRS_port_init();

  266.         // 設置中斷模式
  267.         IRS_set_interrupt_method(EINT_SIGNAL_BOTH_EDGE);
  268.         IRS_set_filter_method(EINT_FILTER_DELAY, 0);

  269.         // 清除中斷標志位
  270.         IRS_clear_interrupt_pending();

  271.         // 使能中斷
  272.         IRS_enable_interrupt();
  273. }

  274. BOOL WINAPI  
  275. DllEntry(HANDLE        hinstDLL,
  276.                         DWORD dwReason,
  277.                         LPVOID /* lpvReserved */)
  278. {
  279.         switch(dwReason)
  280.         {
  281.         case DLL_PROCESS_ATTACH:
  282.                 DEBUGREGISTER((HINSTANCE)hinstDLL);
  283.                 return TRUE;
  284.         case DLL_THREAD_ATTACH:
  285.                 break;
  286.         case DLL_THREAD_DETACH:
  287.                 break;
  288.         case DLL_PROCESS_DETACH:
  289.                 break;
  290. #ifdef UNDER_CE
  291.         case DLL_PROCESS_EXITING:
  292.                 break;
  293.         case DLL_SYSTEM_STARTED:
  294.                 break;
  295. #endif
  296.         }

  297.         return TRUE;
  298. }


  299. BOOL IRS_Deinit(DWORD hDeviceContext)
  300. {
  301.         g_bExitThread = TRUE;

  302.         if (g_hThreadHS38)                // Make Sure if thread is exist
  303.         {
  304.                 IRS_disable_interrupt();
  305.                 IRS_clear_interrupt_pending();

  306.                 // Signal Thread to Finish
  307.                 SetEvent(g_hEventHS38);
  308.                 // Wait for Thread to Finish
  309.                 WaitForSingleObject(g_hThreadHS38, INFINITE);
  310.                 CloseHandle(g_hThreadHS38);
  311.                 g_hThreadHS38 = NULL;
  312.         }


  313.         ReleaseResources();
  314.        
  315.         //RETAILMSG(1,(TEXT("USERLED: IRS_Deinit\r\n")));

  316.         return TRUE;
  317. }


  318. DWORD IRS_Init(DWORD dwContext)
  319. {
  320.         RETAILMSG(1,(TEXT("Key_Gpio_Setting----\r\n")));
  321.         if (AllocResources() == FALSE)
  322.         {
  323.                 goto CleanUp;
  324.         }

  325.         HS38_initialize_register_address((void *)g_pGPIOReg);

  326.         InitInterrupt();
  327.        
  328.         g_hThreadHS38 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) HS38Thread, NULL, 0, NULL);
  329.         if (g_hThreadHS38 == NULL )
  330.         {
  331.                 goto CleanUp;
  332.         }


  333.         return TRUE;

  334. CleanUp:

  335.         IRS_Deinit(0);

  336.         return FALSE;
  337. }

  338. //-----------------------------------------------------------------------------
  339. //-----------------------------------------------------------------------------
  340. BOOL IRS_IOControl(DWORD hOpenContext,
  341.                                    DWORD dwCode,
  342.                                    PBYTE pBufIn,
  343.                                    DWORD dwLenIn,
  344.                                    PBYTE pBufOut,
  345.                                    DWORD dwLenOut,
  346.                                    PDWORD pdwActualOut)
  347. {
  348.         return TRUE;
  349. }

  350. //-----------------------------------------------------------------------------
  351. //-----------------------------------------------------------------------------
  352. DWORD IRS_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
  353. {
  354.         RETAILMSG(0,(TEXT("USERLED: IRS_Open\r\n")));
  355.         return TRUE;
  356. }

  357. //-----------------------------------------------------------------------------
  358. //-----------------------------------------------------------------------------
  359. BOOL IRS_Close(DWORD hOpenContext)
  360. {
  361.         RETAILMSG(0,(TEXT("USERLED: IRS_Close\r\n")));
  362.         return TRUE;
  363. }

  364. //-----------------------------------------------------------------------------
  365. //-----------------------------------------------------------------------------
  366. void IRS_PowerDown(DWORD hDeviceContext)
  367. {
  368.         RETAILMSG(0,(TEXT("USERLED: IRS_PowerDown\r\n")));
  369. }

  370. //-----------------------------------------------------------------------------
  371. //-----------------------------------------------------------------------------
  372. void IRS_PowerUp(DWORD hDeviceContext)
  373. {
  374.         RETAILMSG(0,(TEXT("USERLED: IRS_PowerUp\r\n")));

  375. }

  376. //-----------------------------------------------------------------------------
  377. //-----------------------------------------------------------------------------
  378. DWORD IRS_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
  379. {
  380.         RETAILMSG(0,(TEXT("USERLED: IRS_Read\r\n")));
  381.         return TRUE;
  382. }

  383. //-----------------------------------------------------------------------------
  384. //-----------------------------------------------------------------------------
  385. DWORD IRS_Seek(DWORD hOpenContext, long Amount, DWORD Type)
  386. {
  387.         RETAILMSG(0,(TEXT("USERLED: IRS_Seek\r\n")));
  388.         return 0;
  389. }

  390. //-----------------------------------------------------------------------------
  391. //-----------------------------------------------------------------------------
  392. DWORD IRS_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
  393. {
  394.         RETAILMSG(0,(TEXT("USERLED: IRS_Write\r\n")));
  395.         return 0;
  396. }
復制代碼
6.實驗結果,當你按下遙控器上的按鍵時,dnw或超級終端上會顯示相應的按鍵碼如下: 長時間按某一個按鍵,會顯示同一個鍵值如下:

沙發
發表于 2013-9-24 11:04:11 | 只看該作者
樓主精神可嘉  佩服   學習了
板凳
發表于 2013-9-27 23:52:02 | 只看該作者
感謝分享,當初用1602顯示遙控器的紅外碼,那時候用51的中斷解碼的,現在跑cortex—A9+Android,還可以可以裝ubuntu,可以加入學習交流群187587764,畢竟現在android相對于linux還是火很多的。。。
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人小视频免费在线观看| 一本之道久| 一级女人18片毛片免费视频| 全黄色毛片| 偷拍拍| 性欧美黑人巨大喷潮xxoo| 超大号黑吊magnet| 少女开女包www| 一级毛片在线看| 四虎影视免费观看| 亚洲精品丝袜在线一区波多野结衣| 成人免费在线观看| 特级做A爰片毛片免费看108| 亚洲天堂成人网| 天天躁日日躁狠狠躁一级毛片| 丝瓜视频看污片| qvod12| 视频区 国产 欧美 日韩| 四虎影视在线麻豆国产| 四虎永久网址影院| 亚洲精品高清视频| rio 快播| 性春院| 青视频在线| 亚洲精品综合在线| 怡红院成人g影院| 免费看大黄高清网站视频在线| 亚洲视频中文| 欧美亚洲欧美日韩中文二区| 午夜亚洲国产成人不卡在线| 一个人看的视频在线观看hd| 国产精品九九久久精品视| 亚洲欧美中文日韩v在线| 一级a级毛片| 特片网在线观看| 亚洲欧洲日产韩国2020| 激情男女高潮射精AV免费| 中文字幕在线播放视频| 青娱乐91视频| 天天摸天天舔天天操| 俄罗斯xxxxxbbbbb|