WinCE下的GPIO中断的处理

在我所负责的音频驱动部分代码中,采用了PXA270的GPIO34来检测Headphone的插入与拔出.原驱动部分有个BUG,即当耳机插入以后,耳机和喇叭同时在响,很明显没有对耳机插入事件做出响应.所以我开始采用了检测GPIO信号拉高或者拉低和检测耳机的插入事件,但是这样做有个问题,就是会有延时,插入耳机以后,会有一两秒的时候喇叭才会变关掉.为了改变这种办法,经过咨询,决定采用中断的办法来做这件事情,可以保证没有这样的检测延时.

    在音频驱动(WM9705)的Hwctxt.cpp的initcodec函数中加入如下代码:

  if (m_pGPIORegs == NULL)
    {
        PHYSICAL_ADDRESS ioPhysicalBase = {BULVERDE_BASE_REG_PA_GPIO,0};
        m_pGPIORegs = (PBULVERDE_GPIO_REG)MmMapIoSpace(ioPhysicalBase, sizeof(BULVERDE_GPIO_REG),FALSE);
      
     }
    
     SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);

    //create the headphone Event
     gHeadPhoneIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

    //Interrupt initialize and connect SYSINTR with EVENT.    

     if (!(InterruptInitialize(SYSINTR_HEADPHONE_DETECT, gHeadPhoneIntrEvent, NULL, 0))) {
     WAV_DBGMSG(TEXT("[Audio]Intialize the interrupt gHeadphoneIntrEvent error\r\n"));
             
    }
       

//Create the Interrupt thread 
    gHeadPhoneIntrThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)HeadPhoneIntrThread,this, 0, NULL);
    if (!gHeadPhoneIntrThread)
  {
   WAV_DBGMSG(TEXT("Create the Detect thread failure--\r\n"));
  }

其中SYSINTR_HEADPHONE_DETECT定义在Bsp_cfg.h中,具体定义如下:

#define SYSINTR_HEADPHONE_DETECT (SYSINTR_FIRMWARE+19) //chose a unused intr

具体的中断处理函数如下:

int WINAPI HeadPhoneIntrThread(void)
{
   
    while(1)
    {           
        WaitForSingleObject(gHeadPhoneIntrEvent,INFINITE);

 
     //if GPIO34 is high,means headphone is inserted 
     if (m_pGPIORegs->GPLR1 & XLLP_BIT_2)
     {
        
         HeadPhone_Detect=1;
         //WAV_DBGMSG(TEXT("[Audio]in HeadphoneIntrThread Headphone in--\r\n"));
         WMAudioMuteSignal( DeviceToRW, WM_AUDIO_HEADPHONE, FALSE );//open headphone output
         WMAudioMuteSignal( DeviceToRW, WM_AUDIO_LINEOUT, TRUE );//mute the lineout output
     }
     else
     {
       
         HeadPhone_Detect=0; 
         //WAV_DBGMSG(TEXT("[Audio]in HeadphoneIntrThread Headphone out--\r\n"));
         WMAudioMuteSignal( DeviceToRW, WM_AUDIO_HEADPHONE,TRUE );
         WMAudioMuteSignal( DeviceToRW, WM_AUDIO_LINEOUT, FALSE );
           
     }
     
      InterruptDone(SYSINTR_HEADPHONE_DETECT);
    }
}

但是SYSINTR_HEADPHONE_DETECT是如何和真正的中断联系起来的呢,具体的操作在intr.c里面.这个文件位于\project\platform\mainstoneii\src\kernel\oal.

OALIntrStaticTranslate(SYSINTR_HEADPHONE_DETECT, IRQ_HEADPHONE_DETECT);
这句将SYSINTR_HEADPHOONE_DETECT和真正的中断号联系起来.而IRQ_HEADPHONE_DETECT的定义也在这儿:#define IRQ_HEADPHONE_DETECT          (IRQ_BULVERDE_MAX + 15) 

注意,这里的IRQ_HEADPHONE_DETECT与#define IRQ_GPIO0_PCMCIA_S1_CSC       (IRQ_BULVERDE_MAX + 15) 是一样的,因为PCMCIA在系统里面没有用,所以采用这个中断来给我们的HEADPHONE使用.所以别忘了把下面这句注释掉,否则你的系统会不知道这个中断给谁用了.

//OALIntrStaticTranslate(SYSINTR_PCCARD_CSC_S1, IRQ_GPIO0_PCMCIA_S1_CSC);

然后在BSPIntrEnableIrq函数中加入对headphone IRQ的处理:

 if (irq == IRQ_HEADPHONE_DETECT)
    {
    // WAV_DBGMSG(TEXT("[Audio]Setting GPIO for Headphone in BSPIntrEnableIrq\r\n")); 

     g_pGPIORegs->GAFR1_L &= ~XLLP_GPIO_AF_BIT_FFRXD_MASK;   //GPIO34 as GPIO
     g_pGPIORegs->GPDR1 &= ~XLLP_BIT_2;                      //GPIO34 as HPS Input

//set the falling edge and rising edg to work
       g_pGPIORegs->GFER1 |=XLLP_BIT_2;
     g_pGPIORegs->GRER1 |=XLLP_BIT_2;
    }

同样的在BSPIntrDisableIrq函数中也要加入处理headphone IRQ的代码:

 else if (irq == IRQ_HEADPHONE_DETECT)
    {

//clear the falling edge and rising to start the interrupt
     g_pGPIORegs->GFER1 &=~XLLP_BIT_2;
     g_pGPIORegs->GRER1 &=~XLLP_BIT_2;
    }

在BSPIntrActiveIrq函数中,可以知道这个函数的用途是:This function is called from interrupt handler to give BSP chance to  translate IRQ in case of secondary interrupt controller.可以看到实际处理我们HEADPHONE IRQ的函数是GPIOXX2InterruptHandler().在这个函数中处理Headphone IRQ的代码为:

else if (g_pGPIORegs->GEDR1 & XLLP_BIT_2)
     {//set the GPIO Edge Status Register
        g_pGPIORegs->GEDR1 |= XLLP_BIT_2; 
       //return IRQ to enbale the EVENT
        return IRQ_HEADPHONE_DETECT;
     }

此处返回中断号可以触发EVENT.这样的话在中断处理函数中 WaitForSingleObject(gHeadPhoneIntrEvent,INFINITE);就可以知道中断发生了,否则的话它会等在这儿.

这样在WINCE下的GPIO中断处理到检测就完成了.

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xvhfeng的工作回忆总结(第二年)阅读手记

xvhfeng 工作回忆总结(第二年) 上接工作第一年回忆总结,时间来到了工作第二年,我在PM的帮助下拿到了令自己满意的工资,又开始加入公司正常的工作。 上文说到有一个外省市(以下称为A市)的项目在做&#xff…

【转】详解JS的四种异步解决方案:回调函数、Promise、Generator、async/await

转自:详解JS的四种异步解决方案:回调函数、Promise、Generator、async/await 同步&异步的概念 在讲这四种异步方案之前,我们先来明确一下同步和异步的概念: 所谓同步(synchronization),简单来说,就是…

S3C2440中断解析和基于WINCE操作系统的中断分析(整理于网络,用于按键中断使用)

在调试CAN总线的时候,遇到了操作系统的中断,为了彻底的弄清楚中断是怎么回事?我先从底层的中断开始研究,在这里我们只讨论外部中断,下面就结合S3C2440TEST测试程序来分析一下中断是怎么执行的:我们研究的是…

修改 MrBayes 3.2 源码解决不能恢复断点的问题

当数据量较大时,用MrBayes进行计算通常是旷日持久的事情,几天甚至几个月。中间如果断电死机什么的发生就很令人发狂了。于是 MrBayes 3.2 svn 版增加了一个断点保存的功能,死机后可以从保存的断点处继续计算。只要在mcmc命令中加入checkfreqn…

【转】ubuntu下为APT设置代理

转自:https://blog.csdn.net/lwbeyond/article/details/8431927 Ubuntu下为APT设置代理一.最简单的方法 图形界面方法:新立得软件包管理器-->设置-->首选项-->网络。 进行设置代理就可以了。二.编辑命令 方法1:验证通过 如果您 希望…

wince6.0 s5pv210 中断

1. 在smdkv210\src\oal\oallib\ksarm.h头文件里可以看到wince的中断定义。 设备中断的起始编号即wince预定义的设备中断ID的基值 SYSINTR_DEVICES EQU 8 一共支持64个设备中断 SYSINTR_MAX_DEVICES EQU 64 可用的设备…

Regular Expression

Reference: 正则表达式三十分钟入门: http://deerchao.net/tutorials/regex/regex.htm 在线测试工具: regexlib(http://regexlib.com/default.aspx) 吐血推荐,比较狠的一个工具: Expresso &…

【转】vsftp配置实例-虚拟用户锁定目录

转自: vsftp配置实例-虚拟用户锁定目录_jasonyang69的博客-CSDN博客_vsftpd锁定用户目录 快速解决 vsftpd nologin 虚拟用户 拒绝访问 无法登录_小飞飞飞鱼的博客-CSDN博客_vsftpd 拒绝访问 一、实验步骤 0、启用 nologin shell #vim /etc/shells /bin/sh /bi…

顺丰快递,果然不一般!

2010-06-03 18:27:03快件到达北京集散点 2010-06-03 19:15:41快件离开北京集散点 发往北京集散中心 2010-06-03 21:05:34快件到达北京集散中心 2010-06-03 21:06:12快件离开北京集散中心 发往深圳集散中心 2010-06-04 02:56:29快件到达深圳集散中心 2010-06-04 02:57:04快件离开…

windowsCE异常和中断服务程序初探(-)

1。中断/异常相量的装入和执行方式。 中断和异常都是异步发生的事件,当该事件发生,系统将停止目前正在执行的代码转而执行事件响应的服务程序。而事件服务程序的入口点就是中断/异常向量所在的位置。arm的中断向量可以是0x0开始的低地址向…

windowsCE异常和中断服务程序初探(=)

继续上次的内容,在上次的分析中我们已经对SWI,FIQ,IRQ的流程有了一个大概的认识,下面继续对DataAbort和PrefetchAbort以及公共分发程序CommonHandler进行一下认识,完整异常处理的流程。 2-4 DataAbort服务程序 由数据异常触发&…

【转】Linux中tty、pty和pts概念及区别

转自:Linux中tty、pty和pts概念及区别 - 知乎 基本概念 ①tty(终端设备的统称): tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是一种通过串行线连接键盘和打印机进行发送、阅读信息的设备,后来…

Microsoft Jet SQL 参考在线手册

http://www.weste.net/book/sql/转载于:https://www.cnblogs.com/cwfsoft/archive/2010/06/19/1760961.html

Windows CE下驱动程序开发基础

我想即使读者看过微软的关于驱动开发的培训教材和CE帮助文档中的驱动部分,头脑中仍然一片茫然。要想真正了解驱动程序必须结合一些驱动程序源码,在此我以串口驱动程序(COM16550)中初始化过程为线索简单讲一讲驱动开发的基础知识。…

【转】高端球管使用了哪些高科技?

转自:高端球管使用了哪些高科技? 本文来源:第三方维修平台 本文作者:RepairCT 随着人类发现X射线,这项技术不断应用到医学领域,比如X光机、DR、CT、乳腺钼靶等医疗设备,它们的主要核心均是利用…

关于代码组织的一些看法(上)

今天看了一个篇关于架构的文章,略有所感,记录一下。 软件的架构基本是从一个原始需求出发,逐步构建可维护、更灵活的开发框架的过程,在这个构建过程中可能会逐渐的增加代码的复杂度来满足灵活性的要求,从这个层面来讲&…

CE下基于Zylonite硬件平台的SD卡驱动开发

摘要:本文结合实际项目(一款以WINCE为操作系统内核的GSM/PHS双模智能手机)对嵌入式系统Windows CE5.0的底层驱动(SD卡)的架构进行了分析和研究,以MARVELL公司提供的基于INTEL Zylonite硬件平台的BSP为基础&…

【转】svn详解

转自:svn status详解 - 世界,太精彩 - 博客园 svn 是在提交前查看本地文本和版本库里面的文件的区别。返回值有许多种具体含义如下: L abc.c # svn已经在.svn目录锁定了abc.c M bar.c # bar.c的内…

outofmemory异常如何解决?

一年多来打交道最多的就是WinForm,界面设计确实比MFC容易多了,但是问题出的也更隐晦,要想完全解决还是离不开框架底层的知识。 现在又遇到了一个麻烦的问题:切换界面时,有时GroupBox(里面嵌有ListView&…

pthread-win32在VC2005下的使用

pthread-win32是一个在Win32环境下的Unix POSIX线程库的移植. 有了它, 可以比较方便的移植Unix/Linux多线程程序到Windows下. 在VC2005下使用也很简单: 下载, 地址是 http://sourceware.org/pthreads-win32 里面include目录中是头文件, lib目录中是.lib和.dll文件. 在VC项目的属…