在我所负责的音频驱动部分代码中,采用了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中断处理到检测就完成了.

WinCE下的GPIO中断的处理相关推荐

  1. wince下Gpio 驱动程序

    [转]wince下Gpio 驱动程序 在WINCE下能够直接访问的都是虚拟地址,不能直接访问GPIO端口,因此我们首先需要将GPIO口的物理地址映射到虚拟地址上来.      分别使用VirtualA ...

  2. 记WinCE下调试SIM900 GSM module

    记WinCE下调试SIM900 GSM module 近几天在调试sim900,把遇到的一些问题总结下吧. 一.一些引脚的说说明. Sim900有几个引脚需要了解下. 1.  CTS.RTS 由于使用 ...

  3. LPC1768外部中断与GPIO中断

    LPC1768的外部中断严格来说只有四个,分别是EINT0,EINT1,EINT2,EINT3,技术手册上有如下说明 控制这四个外部中断靠以下寄存器 这三个寄存器的0 1 2 3位分别代表中断的0 1 ...

  4. 【WinCE】SD card技术了解并WINCE下SDHC驱动开发(updated)

    SD Card Driver on ADS Summary 了解SD card. 1 WinCE 5.0下SD Stack. 6 Bus Driver 7 Host Controller Driver ...

  5. OpenWrt 之 MT7628 使用GPIO中断

    在支持设备树的系统中使用中断一般有2种方式. 一.DTS配置interrupt节点 这里有个挺好的博客,链接地址:https://biscuitos.github.io/blog/DTS-interr ...

  6. 树莓派移植SX1278 LoRa通信--使用wiringPi 移植GPIO中断

    一.SX1278 数字接口状态映射 从官方文档可知sx1278的数字接口状态映射明细,移植的代码中主要用查询的方式来判断在连续模式下是否接收和发送完成,因此只需要用到DIO0.如果要用到CAD,则需要 ...

  7. IMX6ULL学习笔记(18)——GPIO中断

    一.中断简介 相比 STM32 的 NVIC,IMX6ULL 的中断控制系统更复杂,它的中断管理器使用的是 GIC V2,GIC V2 的实现方式与我们熟知的 NVIC 差别较大. 1.1 GIC G ...

  8. xilinx zynq 7010/7020 中断/中断向量/GIC向量/GPIO中断

    上图所示GIC左边的称为中断请求源,它们产生中断请求.所有的中断请求都可以发送到GIC通用中断控制器,所以它是一个集中式的中断请求中心.GIC根据请求源的属性(enables, disables, m ...

  9. 乐鑫Esp32学习之旅⑦ esp32上利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

最新文章

  1. ARM 的几个重要特点
  2. ​2021年机器学习什么风向?把注意力放在MLP上
  3. 「我是个杀猪的,毫无基础看这本能学会 Python 吗?」
  4. 为何信标无线充电总是烧板子?
  5. 数据中心冷却水系统的一种节能优化控制策略
  6. 批量显示JOB Log
  7. SAP UI5 应用开发教程之三十六 - 使用 Chrome 开发者工具 Elements 标签动态修改 CSS 类
  8. 跨站点脚本(XSS)
  9. 利用Mybatis写第一个数据库操作的程序
  10. [C#-Util]ObjectPool Prototype
  11. “”和“”的你真的理解吗?
  12. php composer 框架,用 Composer 组建了个 PHP 框架
  13. SEO如何辨别真假Baiduspider
  14. 完全支持双层PDF 开源的PDF分离与合并软件 C 版本 转自codeproject
  15. CS61a-2020fall学习笔记
  16. 计算机二级c语言考试题型及分值,全国计算机二级C语言考试题型及考试重点
  17. 使用百度EasyDL训练自己的图像识别模型
  18. 蓝桥杯备考-python刷题之路-动态规划算法(DP算法)Part3【最终代码实现
  19. 【重磅首发新品】AM335x全面升级处理器——AM62x,四核Cortex-A53+M4F,主频1.4GHz
  20. Ubuntu 20.04 搭建 Fisco-BCOS 2.8.0 区块链系统

热门文章

  1. 线性表操作的基本应用
  2. 2362:Square 能否拼接为正方形 . DFS+回溯
  3. 09 | 队列:队列在线程池等有限资源池中的应用
  4. springboot指定首页(静态资源导入)
  5. 【剑指offer - C++/Java】2、替换空格
  6. mysql聚合函数rollup和cube
  7. IDEA设置取消自动显示参数提示
  8. 自动生成业务单据流水号方案
  9. 锋利的jQuery--jQuery与DOM对象的互相转换,DOM的三种操作(读书笔记一)
  10. UIView常见方法总结