如何访问硬件.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
WDM驱动程序设计 常用的I/O资源类型 访问端口和内存寄存器的HAL函数 读写I/O端口 配置中断 配置中断 中断服务例程的实现 中断服务例程的实现 * 驱动程序中如何访问硬件 调用IoConnectInterrupt函数创建中断对象,中断对象指向ISR(中断服务例程) Interrupt 调用IoGetDmaAdapter函数创建适配器对象 Dma 映射内存范围;应在设备扩展中保存内存范围基址 Memory 可能映射I/O端口范围;应在设备扩展中保存端口范围基址 Port 处理概述 资源类型 UCHAR READ_PORT_UCHAR(IN PUCHAR Port); ULONG READ_PORT_ULONG(IN PULONG Port); USHORT READ_PORT_USHORT(IN PUSHORT Port); VOID WRITE_PORT_UCHAR( IN PUCHAR Port, IN UCHAR Value ); VOID WRITE_PORT_USHORT ( IN PUCHAR Port, IN USHORT Value ); VOID WRITE_PORT_ULONG ( IN PUCHAR Port, IN ULONG Value ); 如果设备要求将其寄存器映射到I/O地址空间,则对于具有独立的I/O地址空间的CPU(如Intel)会满足其要求;而对于没有独立的I/O地址空间的CPU则将其映射到内存地址空间。 开发人员不用关心这些细节,只须用READ_PORT_XXX函数或WRITE_PORT_XXX访问该寄存器就可以了。 typedef struct _DEVICE_EXTENSION { ... PKINTERRUPT InterruptObject; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; ULONG vector; // 中断向量 KIRQL irql; // 中断请求级 KINTERRUPT_MODE mode; // 中断触发模式(电平/边缘) KAFFINITY affinity; // CPU亲和性 BOOLEAN irqshare; // 是否与其它设备共享 ... ... ... ... (接下页) status = IoConnectInterrupt( pdx-InterruptObject, //存放内核中断对象的内存地址 (PKSERVICE_ROUTINE) OnInterrupt, //中断服务例程 (PVOID) pdx, //传递给ISR的上下文参数 NULL, // 当设备有多个中断时必须提供一个自旋锁 vector, // 中断向量 irql, // 中断请求级 irql, // 驱动中其它例程与ISR同步时将被提高到该级别 mode, //中断触发模式(电平/边缘) irqshare, // 是否与其它设备共享中断 affinity, // 该中断的CPU亲和掩码 FALSE); //是否需要操作系统保存浮点上下文 当设备生成中断时,HAL将基于你指定的CPU亲合掩码选择一个CPU来服务这个中断。然后该CPU的IRQL提升到合适的同步级并请求一个与中断对象关联的自旋锁。最后调用ISR 因为有可能多个设备共享一个中断向量,所以在ISR中首先应该判断是否是自己的设备产生了中断。如果不是则返回FALSE,以便HAL能把中断送往其它设备驱动程序。如果是,应该先清除该中断然后返回TRUE。 ISR执行在高于DISPATCH_LEVEL的IRQL上。因此ISR中使用的所有代码和数据必须存在于非分页内存中,此外,ISR只能调用有限的内核服务函数。 在ISR中应该做尽量少的工作,如果有大量的工作应该请求一个DPC来完成。 BOOLEAN OnInterrupt(PKINTERRUPT InterruptObject,

文档评论(0)

***** + 关注
实名认证
文档贡献者

本账号下所有文档分享可拿50%收益 欢迎分享

1亿VIP精品文档

相关文档