4684|7

9

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

OK210开发板使用感想续之自己设计的红外驱动 [复制链接]

经过几天的研究,终于把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. //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:41

赞赏

2

查看全部赞赏

点赞 关注

回复
举报

110

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
楼主真是好人啊,顶一个。不知道楼主做过linux的驱动吗

点评

做过点,,,我主要是做wince的  详情 回复 发表于 2013-9-24 10:20
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 沙发huangwarrenus 的帖子

做过点,,,我主要是做wince的
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
感谢楼主的分享,请问楼主是从事什么工作的啊?
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

6
 
感谢楼主分享,请问楼主我是一名学电子的大三学生,,适不适合买一套这样的板子用来学习????、???????
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

7
 
楼主继续努力,加油,争取做出属于自己的产品来

点评

好的 一块努力吧  详情 回复 发表于 2013-9-25 10:52
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

8
 

回复 7楼arm-lover 的帖子

好的   一块努力吧
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表