完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
`利用DriverStudio开发驱动程序比直接调用DDK开发起来要方便快捷的多。就像利用MFC开发一般的桌面程序一样,而非选择SDK进行程序的编写。换句话说,DriverStudio和DDK的关系就像MFC和SDK的关系一样,DriverStudio只是对DDK中的各种结构、函数进行了封装,方便开发人员进行底层函数的调用,如DriverStudio的Kirp类就是对DDK中IRP所有操作的封装而已。 下面简单介绍一下利用DriverStudio3.2开发一个USB驱动程序的步骤。这个USB设备有3个双向端点,每个端点配置如下: EP 类型 地址 buffer(Bytes) 0 IN/OUTControl 0x80/0x00 16/16 1 IN/OUTBulk 0x81/0x01 64/64 2 IN/OUTBulk 0x82/0x02 64/64 驱动程序需要实现功能就是控制设备上LED灯亮和灭,以及通过Endpoint2对设备进行读写。由于DriveStudio由几个部分组成,我们写这个驱动程序只要用到DriverWork。在这里,我们假定读者已经正确安装了DriverWorks,并且已经编译了各个库文件(见本博客前面介绍内容)。 1、启动VC,从VC IDE菜单"DriverStudio"中选择"DriverWizard",如图1所示对话框中,写上项目名称。在这里,我们将这个项目称为:TEST,所在目录为D:TEST。然后点按钮"Next>"; 图1 2、在接下来这个对话框中(如图2),我们需要选择驱动程序类型。由于USB设备驱动程序是WDM类型,所以我们在的一个单选按钮中选择“WDM Driver”;第二个单选按钮是指所编写的驱动程序是否需要C++框架的支持,如选择该项,所生成的驱动程序类被封装成驱动类和设备类两大类,否则驱动程序类以DDK形式出现,通常选择支持C++框架。点按钮"Next >"。图2 3、在接下来这个对话框中(如图3),我们需要选择驱动程序类型。由于USB设备驱动程序是WDM类型,所以我们选择第二项并且点按钮"Next >"。图3 4、在第4个对话框中(如图4),选择我们驱动程序所操作总线类型。这里,我们选择USB。在USB Vendor ID和USB Product ID中填入USB设备VID和PID。假定我们USB设备VID和PID分别是16进制0471和1801。然后点按钮"Next >"。 图4 Ku***Pipe EndPoint1IN; // Pipe for USB endpoint address 81, type BULK Ku***Pipe EndPoint1OUT;// Pipe for USB endpoint address 1, type BULK Ku***Pipe EndPoint2IN; // Pipe for USB endpoint address 82, type BULK Ku***Pipe EndPoint2OUT;// Pipe for USB endpoint address 2, type BULK在设备类源文件种添加如下代码: // Initialize each Pipe object EndPoint1IN.Initialize(m_Lower, 81, 64); EndPoint1OUT.Initialize(m_Lower, 1, 64); EndPoint2IN.Initialize(m_Lower, 82, 64); EndPoint2OUT.Initialize(m_Lower, 2, 64);从上述源代码中可以看出,每个输入端点的实际地址从0x81开始,每个输出端点的实际地址从0x01开始逐个增加。例如,地址值为0x82的端点是一个端点号为2的IN端点。具有接下来,继续按"Next >"按钮。 图5 图5-1 6、选择TRP处理类型。WDM驱动程序必须支持IRP_MJ_SYSTEM_CONTROL、IRP_MJ_POWER和IRP_MJ_PNP。IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_WRITE、IRP_MJ_CLOSE、IRP_MJ_CLEANUP或IRP_MJ_DEVICE_CONTROL处理应用程序和驱动程序之间的通信工作。 图6 7、选择IO端口的读写方式。IRP_MJ_READ和IRP_MJ_WRITE后面的选项指应用程序用ReadFile或WriteFile与驱动程序进行数据传输时,驱动程序根据设备对象创建时的特征标志位(DO_BUFFER_IO或DO_DIRECT_IO)来决定该如何获取应用程序的缓冲区地址。当选择Buffer Access为Buffered时,设备对象创建时的特征标志位被设为DO_BUFFER_IO,驱动程序可分别在Kirp::BufferedReadDest和Kirp::BufferedWriteSource中获取到读写缓冲区的地址;当选择Buffer Access为Direct时,设备对象创建时的特征标志位被设为DO_ DIRECT _IO,IO管理者将锁定应用程序的数据缓冲区,并创建一个MDL,驱动程序可在Kirp::Mdl来获取到读写缓冲区的地址。 当应用程序用DeviceIoControl函数和驱动程序进行数据通信时,“Add”等按钮用来定义DeviceIoControl的控制命令,即给驱动程序增加一些IOCTL接口。如图7-1所示。当选择Buffer Access为Buffered时,驱动程序通过Kirp::IoctlBuffer来获取应用程序的输入、输出缓冲区;当选择Buffer Access为Direct时驱动程序通过Kirp::IoctlBuffer来获取应用程序的输入缓冲区,通过Kirp::Mdl来获获取应用程序的输出缓冲区。 第三个选择指应用程序打开设备的方式:以符号连接名或GUID接口方式(Interface)。 图7 图7-1 |
|
相关推荐
|
|
学习了
|
|
|
|
|
|
好资料
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
3855 浏览 0 评论
8032 浏览 0 评论
5854 浏览 0 评论
3927 浏览 1 评论
5068 浏览 0 评论
请问一下qspi mtsr引脚传输一次32bit后引脚不拉低怎么解决?
301浏览 2评论
413浏览 2评论
4485浏览 2评论
最近UJA1023开发遇到问题了,各位大神有谁知道可以替代这颗芯片的
489浏览 1评论
597浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-20 11:07 , Processed in 0.856694 second(s), Total 76, Slave 58 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号