bluefishhttp://blog.yesky.com/Blog/vincentzhou/复制地址
公告栏
专注wince底层开发,学习linux 为生活而奋斗!
控制面板
日历
<2008年9月>
SuMoTuWeThFrSa
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
留言簿(13)
文章分类
文章档案
日记档案
向强人学习

在给客户的定制的一个系统上跑应用程序的时候,那几个摁键总是不怎么灵,干扰很严重。由于用户的应用程序已经完成了,所以只有在驱动中更改。

其实按照我的理解,驱动只是提供一个功能接口,尽可能的实现最基本的功能给上层尽可能多的发挥空间。如果一些控制代码放到驱动中,这样就把上层的一些操作给固化了,上层的发挥的空间就小了很多。

现在是没有办法,只能在驱动中更改。本文的平台是wince4.2+s3c2440,4个摁键的接口分别是SPICLK0(L9),SPIMOSI0(P9),SPIMISO1(K10),SPIMISO0(K9)。在这地方差点被忽悠了,看着这些东西好象是要做spi的驱动,其实在2440的spec中搜一下发现这些口分别对应了GPE13,GPE12,GPG5,GPE11。

这样就好办了,随便写个流驱动对这几个口进行设置。在应用程序readfile的时候,驱动程序就分别查看这几个口的状态寄存器值,如果是1则对应的摁键被摁下,如果为0则相反。在这个地方就出现问题了,由于应用程序开了一个线程一直在readfile(个人猜测),摁键被摁下则做相应处理。由于在按键时有一定的抖动产生干扰,导致按一次键应用程序可能会读到好几个按下的状态。

在这里,消除干扰无非就是用时间来换取。可以多次检测取值比对,这个办法也不是很稳定,因为无法确定该取多少次值。我的办法很土,不过比较有效。在驱动中如果一个寄存器的值为1(即键被按下),则等待300ms并将这个状态返回给应用程序。之所以这么做是因为在不按键时是不会产生干扰的,假如按键了不管有没有干扰总会产生一个1状态,而驱动程序总能捕获到这样一个状态,不管你后面有没有干扰先等着再说。这样应用程序就不知道有干扰的存在(驱动还没有返回值给它,这里所谓的干扰就是0和1之间的不确定跳动),这也必然会影响应用程序的响应速度。根据我们测试的能接受的时间,在驱动中设置100-300ms比较合适。

在这种地方真不应该用轮循的方法,要是中断的话就没有这么多麻烦了。至少在处理一个中断的时候可以将这个中断给屏蔽掉。


作者:bluefish 阅读() 评论()  编辑 发表于:2007-08-28 12:35
相关内容
文章评论

  • # re: 摁键干扰消除
  • 比较奇怪你在这里为什么不用中断来处理按键的GPIO.
    如果是轮询的话,你可以在1的时候开启个FLAG,然后立刻返回给上层,同时开启一个TIMER计时,然后在TIMER的回调处理中,判断达到一定数字后关闭FLAG,KILLTIMEER. 
    当后面有1过来的时候,判断下如果FLAG为有效,就不做任何处理直接跳过. 这样就可以解决你先SLEEP后返回带来的延迟问题.
    Walzer | 2007-09-05 09:34
  • # re: 摁键干扰消除
  • 这个办法是不错,呵呵
    不过现在是上层的东西是用户做的,他们不愿意做修改
    bluefish | 2007-09-05 12:57
  • # re: 摁键干扰消除
  • 可以在驱动中写一个判断矩阵按键的驱动,确定了哪个键按下时就对应用keybd_event()发送自己想要的虚拟键值,这样是不是也可以实现按键驱动呢,还不用在Driver\keybd驱动里面改
    天极博友 | 2008-01-15 14:36
  • # re: 摁键干扰消除
  • 接上,而且可以用中断方式

    遇到高人,就这么问一下,呵呵
    天极博友 | 2008-01-15 14:37

    发表评论
    标题 *  
    姓名 *  
    内容 *  
       验证码: *       
           
    版权声明:天极是本Blog托管服务提供商。如本文牵涉版权问题,天极不承担相关责任,请版权拥有者直接与文章作者联系解决。
    Powered by:

    Copyright © bluefish