1. 在smdkv210\src\oal\oallib\ksarm.h头文件里可以看到wince的中断定义。

设备中断的起始编号即wince预定义的设备中断ID的基值

SYSINTR_DEVICES EQU 8

一共支持64个设备中断                                
    SYSINTR_MAX_DEVICES EQU 64

可用的设备中断ID的基值

SYSINTR_FIRMWARE    EQU SYSINTR_DEVICES+16

中断总数                                      
    SYSINTR_MAXIMUM EQU SYSINTR_DEVICES+SYSINTR_MAX_DEVICES

那我们自己增加的外设的中断需要以SYSINTR_FIRMWARE为基值来定义,所有自定义的系统中断号都应该基于该值进行累加加1,这些自定义的系统中断号用于和IRQ一一对应。如下:

#define  SYSINTR_SHUTPOWER_DETECT  (SYSINTR_FIRMWARE+N)

SYSINTR_SHUTPOWER_DETECT为我定义的关机中的中断。

N为当前已定义的最大值(以保证此中断未使用过)。

2. 在datasheet上查要使用的中断号。

我用的是XEINT1/GPH01----->EINT1

3. 在s5pv210_sec_v1\oal\inc\intr_reg.h 中找到我们要用的虚拟中断号IRQ_EINT1。

4. 在smdkv210\src\oal\oallib\intr.c中的BSPIntrInit()函数中加入对GPH01的初始化。

//gph01 as eint1

v_pGPIOregs->GPH0.GP_CON &=  ~(0xf<<4);

//gph01 as eint1

v_pGPIOregs->GPH0.GP_CON |=  (0xf<<4);

//gph01 pull disable
    v_pGPIOregs->GPH0.GP_PUD &=~(0x3<<2);

//gph01 low level triggered

v_pGPIOregs->EINTCON.EXT_INT0_CON &=~(0xF<<4);

//enable eint1

v_pGPIOregs->EINTMSK.EXT_INT0_MASK &=~(0x1<<1);

//Filter Enable for EXT_INT[1] ---DISBLE

v_pGPIOregs->EINTFLT.EXT_FLT0_CON._FLT_CON0   &=~(0x3<<14);

//EINT1 interrupt clear

v_pGPIOregs->EINTPND.EXT_INT0_PEND |=(0x1<<1);

然后调用OALIntrStaticTranslate(SYSINTR_SHUTPOWER_DETECT, IRQ_EINT1)来注册中断。

然后使能中断。

value = IRQ_EINT1;
    OALIntrEnableIrqs(1, &value);

BSPIntrInit这个函数由s5pv210_sec_v1\oal\intr\intr.c的OALIntrInit()来调用,

OALIntrInit()最终由OEMInit()来调用。

看这个函数的注释。

//  This is Windows CE OAL initialization function. It is called from kernel
    //  after basic initialization is made.

他由内核来调用的。

5. 修改OALIntrEnableIrqs函数,加入我们对此中断的使能。

if (PhysicalIRQ == PHYIRQ_EINT1)
        {
            g_pGPIOReg->EINTMSK.EXT_INT0_MASK &=~(0x1<<1); //enable eint1
            OALMSG(1, (L"+OALIntrEnableIrqs(%d,)\r\n", PhysicalIRQ));
        }

6. 修改OALIntrDisableIrqs函数,加入我们对此中断的关闭。

if (PhysicalIRQ == PHYIRQ_EINT1)
        {
                   g_pGPIOReg->EINTMSK.EXT_INT0_MASK |=(0x1<<1); //enable eint1
                   g_pGPIOReg->EINTPND.EXT_INT0_PEND |=(0x1<<1);  // Clear pending EINT1
                   OALMSG(1, (L"+OALIntrDisableIrqs(%d,)\r\n", PhysicalIRQ));  
        }

至此,对bsp修改完成,接下来写驱动。

1. 在驱动的初始化函数中创建一个事件对象

gShutpowerIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

此事件对象用于和中断绑定,来阻塞我们自己写的IST。

2. 然后将刚才创建的事件对象与中断绑定。

InterruptInitialize(SYSINTR_SHUTPOWER_DETECT,gShutpowerIntrEvent, NULL, 0)

3. 创建我们自己的IST

gShutpowerIntrThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ShutpowerIntrThread,this, 0, NULL);

4. 编写IST完成我们在中断到来时需要完成的关机动作。

IST的框架如下:

int WINAPI ShutpowerIntrThread(void) {

while(1) {

WaitForSingleObject(gShutpowerIntrEvent ,INFINITE);

关机代码

}

InterruptDone(SYSINTR_SHUTPOWER_DETECT);

}

至此一个简单的CE中断关机驱动完成。

wince6.0 s5pv210 中断相关推荐

  1. 在我的S5pv210 wince6.0 上做个支持硬解的wince播放器,播放1080P视频堪比android

    作者:gooogleman@foxmail.com 以及P网友合作开发 Sate210 wince6.0 硬解播放器测试视频 http://v.youku.com/v_show/id_XNTIwNTk ...

  2. WINCE6.0系统调用

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  3. WINCE6.0操作系统---内核(kernel)学习

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  4. WINCE6.0+S3C6410串口驱动

    ********************************LoongEmbedded************************作者:LoongEmbedded(kandi)时间:2011. ...

  5. WINCE6.0+S3C2443下的usb function(功能)驱动

    ********************************LoongEmbedded************************ 作者:LoongEmbedded(kandi) 时间:201 ...

  6. WINCE6.0+S3C2443的启动过程---内核启动

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  7. WINCE6.0 + S3C2443的启动过程---nboot篇

    WINCE6.0 + S3C2443的启动过程---nboot篇 我们启动WINCE6.0的方式是:nboot+eboot+NK.那么是如何启动WINCE6.0系统映像的呢?首先是nboot把eboo ...

  8. WINCE6.0+S3C2443睡眠和唤醒(sleep and wake up)的实现

    1. 系统进入睡眠状态的过程 1.1 硬件相关电路 我们的产品使用GPF0/EINT0作为系统进入睡眠和从睡眠中唤醒的唤醒源,如下图所示: EINT0作为唤醒源,而EINT0在S3C2443的data ...

  9. WinCE6.0的EBOOT概要

    为一个新的硬件设备定制WinCE6.0操作系统,一般需要完成以下几个主要步骤: 1.       针对特定的硬件设备创建板级支持包(Board Support Package缩写为BSP),BSP必须 ...

最新文章

  1. 道理我都懂,但是神经网络反向传播时的梯度到底怎么求?
  2. Java 基础入门随笔(1) JavaSE版——java语言三种技术架构
  3. jquery生成一个li_JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
  4. 杭电OJ1069java实现
  5. Android 拦截WebView请求,并加入或修改参数(GET)
  6. 计算机网络 | 网络基础 :网络协议,协议分层,数据封装与分用,地址管理,字节序
  7. python mysqldb 查询不到最新记录_Python MySQLdb更新查询失败
  8. pixel 解锁_如何在Google Pixel 4和Pixel 4 XL上禁用面部解锁
  9. redis 版的 hello world
  10. python人工智能_人工智能人才缺口千万!学Python抓住风口机会
  11. bzoj3442学习小组
  12. Android仿人人客户端(v5.7.1)——通过HTTPS协议的POST方式获取用户的基本信息
  13. 数据分析,怎么做才算到位?
  14. Git教程_1 简介
  15. java 8 官网下载地址
  16. idea的设置,导致list长度只有1000
  17. 单片机基础-第一个单片机系统
  18. 阿里云发送邮件(mail)失败
  19. Scala数据类型中的Symbol(符号文本)
  20. 96-Java的打印流、打印流重定向、补充知识:Properties、commons-io框架

热门文章

  1. mybatis高级查询,批量新增
  2. 1099. Build A Binary Search Tree (30)
  3. 题解 P5301 【[GXOI/GZOI2019]宝牌一大堆】
  4. 【SP26073】DIVCNT1 - Counting Divisors 题解
  5. VM异常关闭后导致虚拟机无法打开问题解决办法【已解决】
  6. 基于DBUtils实现数据库连接池
  7. 【知了堂学习笔记】MySQL数据库常用的SQL语句整理
  8. 几个删除重复记录的SQL语句
  9. 第七章 假设检验(3)
  10. [剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]