当前位置: 首页 > news >正文

usb驱动程序开发技术总结(三)

三.客户端程序的编写

1设备接口

驱动程序的AddDevice代码调用IoCreateDevice创建设备对象。有两种方法提供对Win32程序可用的名称,老的方法是提供一个明确的符号链接名,新的方法是使用设备接口标识支持定义的API的设备。

IoCreateDevice调用有一个DeviceName参数,可以用于为设备指定一个名字。这个名字向内核标识设备,而不是向Win32标识设备。所以需要创建一个符号链接来使内核设备名对Win32可用。

老的方法调用IoCreateSymbolicLink,使用参数传递合适的符号链接名和设备链接名。新方法的主要思想是为设备对象定义一个可用的应用程序编程接口,全局唯一标识符(GUID)用于标识这个接口。GUID必须使用guidgen工具生成,在GUID.h中正式声明自己定义的设备接口。在AddDevice例程中调用IoRegisterDeviceInterface函数注册它的接口,然后调用IoSetDeviceInterfaceState启用这个设备接口。
2.
用户态程序调用驱动程序

EZ-USB系列的ezusb.sys是一个不用修改就可以直接使用的驱动程序,在自行开发外部设备的时候,如果没有非常特殊的要求,完全可以采用这个驱动程序作为设备的USB接口驱动,当然前提是设备必须采用EZ-USBUSB控制芯片。

ezusb.sys中使用IoCreateSymbolicLink创建符号链接,提供对用户态程序可用的设备名。故用户态程序首先通过调用一个Win32函数CreateFile()来获得设备驱动程序的句柄;然后用DeviceIoControl()函数通过CreateFile()函数返回的句柄,来提交I/O控制代码和相关的输入输出缓冲区到驱动程序,完成在Windows环境下USB数据传输的任务。

3.固件代码、驱动程序和客户端程序的关系

固件代码是非常重要的,他主要实现设备的初始化和配置。驱动程序主要负责对各种IRP的处理,客户端发出IRP实现具体的功能。

以向EZ-USB2131芯片实现简单的读写为例,数据从EP2OUT输出到芯片,从EP2IN读回到主机。而2131芯片的2端点输出缓冲区的地址为7DC0,输入缓冲区的地址为7E00,这就要求固件程序将2端点输入缓冲区的数据全部复制到输出缓冲区。客户端程序在发出读写命令后,通过CreateFile()函数获得设备句柄,然后调用DeviceIoControl()函数提交I/O控制代码和相关的输入输出缓冲区到驱动程序。驱动程序负责处理有关IRP,实现数据的通信。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 目标检测系列算法:YOLOv6代码复现
  • 饕餮元年开发日记(中场休息篇)
  • 完美解决ubuntu:签名无效 KEYEXPIRED、EXPKEYSIG更新出bug
  • 饕餮元年开发日记(四)
  • NLP模型笔记2022-19:知识图谱工具neo4j图数据库的安装与使用
  • NLP模型笔记2022-20:py2neo接口处理知识图谱neo4j实体
  • 饕餮元年开发日记(三)
  • NLP模型笔记2022-21:知识图谱neo4j指定方向实体(头实体、尾实体、头尾实体关系)
  • NLP模型笔记2022-22:知识图谱neo4j批量可视化
  • 饕餮元年开发日记(二)
  • NLP模型笔记2022-23:知识图谱neo4j可视化实体多关系属性【破案线索关系】
  • 饕餮元年开发日记(一)
  • NLP模型笔记2022-24:neo4j+py2neo 构建《中国优质电影及其演员》知识图谱
  • 我的饕餮元年获奖了!
  • 2004年6月29日
  • [笔记] php常见简单功能及函数
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • Android 架构优化~MVP 架构改造
  • angular2开源库收集
  • bootstrap创建登录注册页面
  • Docker入门(二) - Dockerfile
  • EventListener原理
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • React Transition Group -- Transition 组件
  • Redux系列x:源码分析
  • spark本地环境的搭建到运行第一个spark程序
  • vue-cli3搭建项目
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 如何使用 JavaScript 解析 URL
  • 优秀架构师必须掌握的架构思维
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Android开发者必备:推荐一款助力开发的开源APP
  • mysql面试题分组并合并列
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # wps必须要登录激活才能使用吗?
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (1)Nginx简介和安装教程
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (ibm)Java 语言的 XPath API
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (强烈推荐)移动端音视频从零到上手(上)
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Core中的时区转换问题
  • .NET Micro Framework 4.2 beta 源码探析
  • .net 获取某一天 在当月是 第几周 函数
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .NET开发不可不知、不可不用的辅助类(一)