基于STM32的USB程序开发笔记(7)
http://www.hkaco.com
#define ReadFrom_EP2 \\
CTL_CODE(FILE_DEVICE_EZUSB, 0x800, METHOD_IN_DIRECT, FILE_ANY_ACCESS) #define WriteTo_EP1 \\
CTL_CODE(FILE_DEVICE_EZUSB, 0x801, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
这部分定义的是DeviceIoControl()函数所需要的I/O控制代码,此定义在DriverWizard生成的interface.h文件中,在这可包含interface.h也可以复制过来进行定义。
typedef struct _NODE_ENUDEVICEINTERFACE {
CHAR pDeviceInterfaceSymbolicName[MAX_PATH]; // Index for this node
struct _NODE_ENUDEVICEINTERFACE *pNext; }
NODE_ENUMDI, *PNODE_ENUMDI;
这个链表用以存储USB设备的接口名称,需要另外说明的一点,在USBAPI.c文件中定义了:
DEFINE_GUID(GUID_DEVICEINTERFACE, 0xE075C5B2, 0xE7FB, 0x4186, 0xA1, 0x39, 0x0B, 0x3F, 0xD2, 0x05, 0xE7, 0x6E);
需要通过这个GUID_DEVICEINTERFACE取得该接口名称,有了该接口名称后就可以通过CreateFile()获取该接口的句柄,进而可以通过ReadFile()/WriteFile()或者DeviceIoControl()读写USB设备。获取一个设备可能有多个接口,在该类中建立了一个循环链表用以存储该信息。
typedef struct _STRUCT_IO {
HWND hTargetWnd;
HANDLE hDevice;
DWORD dwIoControlCode;
PCHAR pInBuffer; DWORD dwInSize;
PCHAR pOutBuffer; DWORD dwOutSize;
LPDWORD lpBytesReturned; }
STRUCT_IO,
http://www.hkaco.com
*PSTRUCT_IO;
这个结构中的hTargetWnd定义了消息对象的窗口句柄,用以向该窗口发送读写数据完成的消息;hDevice即USB设备接口的句柄;其他的含义很明了,就不说明了。
#define CORESTATUS_SUCCESS 0x0000L #define CORESTATUS_DESTROY 0x0001L
#define CORESTATUS_READWRITE_EVENT_ERROR 0x0002L #define CORESTATUS_READWRITE_THREAD_ERROR 0x0003L #define CORESTATUS_IOCONTROL_EVENT_ERROR 0x0004L #define CORESTATUS_IOCONTROL_THREAD_ERROR 0x0005L 这些是定义的类状态,应用程序可以获取这些状态。
#define MSG_READWRITE_COMPLETION WM_USER+0x0010 #define MSG_IOCONTROL_COMPLETION WM_USER+0x0011 这些定义的是自定义消息码,应用程序识别此消息码可得知读写操作已完成。
#define ERROR_HANDLE_WINDOW 0x1000L #define ERROR_HANDLE_DEVICE 0x1001L #define ERROR_BUFFER_LENGTH 0x1002L #define ERROR_BUFFER_ISNULL 0x1003L #define ERROR_READWRITE_BUSY 0x1004L #define ERROR_IOCONTROL_BUSY 0x1005L
这些定义的进行读写操作时,进行的一些参数检查并返回的状态。
下面这些是类成员函数以及变量,USBAPI类内建立了两个独立线程,这样在对USB设备进行读写时,就不会堵塞应用程序的窗口线程,读写操作完成后由消息MSG_READWRITE_COMPLETION和MSG_IOCONTROL_COMPLETION通知应用程序。详细代码请参考源程序。
// ********************************************************************************************************** // Class members definition
// ********************************************************************************************************** class CUSBAPI {
public:
CUSBAPI();
virtual ~CUSBAPI();
public:
DWORD EnumDeviceInterface(LPGUID pGUID);
HANDLE OpenDeviceInterface(PCHAR pDeviceInterfaceSymbolicName);
http://www.hkaco.com
DWORD Execute_ReadFile( HWND hWnd, HANDLE hDevice, PCHAR pInBuffer, DWORD dwInSize,
LPDWORD lpBytesReturned );
DWORD Execute_WriteFile( HWND hWnd, HANDLE hDevice, PCHAR pOutBuffer, DWORD dwOutSize,
LPDWORD lpBytesReturned );
DWORD Execute_IoControl( HWND hWnd, HANDLE hDevice,
DWORD dwIoControlCode, PCHAR pInBuffer, DWORD dwInSize, PCHAR pOutBuffer, DWORD dwOutSize,
LPDWORD lpBytesReturned );
BOOL Node_HeadCreate(VOID); VOID Node_HeadDelete(VOID); VOID Node_RemoveAll(VOID);
BOOL Node_Append(PCHAR pDeviceInterfaceSymbolicName); VOID Node_Remove(PCHAR pDeviceInterfaceSymbolicName);
PNODE_ENUMDI Node_Find(PCHAR pDeviceInterfaceSymbolicName);
public:
GUID GUID_Device;
PNODE_ENUMDI pEnumDeviceNode; PNODE_ENUMDI pEnumDeviceHead;
HANDLE hEvent_ReadWrite; HANDLE hEvent_IoControl;
http://www.hkaco.com
HANDLE hThread_ReadWrite; HANDLE hThread_IoControl;
DWORD dwThreadID_ReadWrite; DWORD dwThreadID_IoControl;
STRUCT_IO ReadWrite; STRUCT_IO IoControl;
BOOL bExecuting_IoControl; BOOL bExecuting_ReadWrite;
DWORD dwCoreStatus; };
#endif
在应用程序中定义变量:CUSBAPI ezUSB; 读写操作函数也就三种:
Execute_IoControl()、Execute_ReadFile()、Execute_WriteFile()
执行这些函数后,将与USB的驱动程序挂钩,分别响应:
Execute_IoControl() -> NTSTATUS ezUSBDevice::DeviceControl(KIrp I) Execute_ReadFile() -> NTSTATUS ezUSBDevice::Read(KIrp I) Execute_WriteFile() -> NTSTATUS ezUSBDevice::Write(KIrp I)
其中NTSTATUS ezUSBDevice::DeviceControl(KIrp I)根据I.IoctlCode()区别类型,按照此示例说明:
ReadFrom_EP2->Execute_IoControl()->NTSTATUS ezUSBDevice::ReadFrom_EP2_Handler(KIrp I)
WriteTo_EP1->Execute_IoControl()->NTSTATUS ezUSBDevice::WriteTo_EP1_Handler(KIrp I)
这样应用程序与USB驱动之间就建立了通讯渠道,在驱动函数中: NTSTATUS ezUSBDevice::DeviceControl(KIrp I) NTSTATU …… 此处隐藏:3650字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [实用模板]第八章:法国“新浪潮”与“左岸派”
- [实用模板]2021年北京上半年临床医学检验技师生物
- [实用模板]SAP GUI 7.10客户端安装配置文档
- [实用模板]2001年临床执业医师资格考试综合笔试试
- [实用模板]36机场工作实用英语词汇总结
- [实用模板](一)社会保险稽核通知书
- [实用模板]安全教育主题班会材料
- [实用模板]濉溪县春季呼吸道传染病防控应急演练方
- [实用模板]长沙房地产市场周报(1.30-2.3)
- [实用模板]六年级数学上册典中点 - 图文
- [实用模板]C程序设计(红皮书)习题官方参考答案
- [实用模板]中国证监会第一届创业板发行审核委员会
- [实用模板]桥梁工程复习题
- [实用模板]2011学而思数学及答案
- [实用模板]初中病句修改专项练习
- [实用模板]监理学习知识1 - 图文
- [实用模板]小机灵杯四年级试题
- [实用模板]国贸专业毕业论文模板
- [实用模板]教育学概论考试练习题-判断题4
- [实用模板]2015届高考英语一轮复习精品资料(译林
- 00Nkmhe_市场营销学工商管理_电子商务_
- 事业单位考试法律常识
- 诚信教育实施方案
- 吉大小天鹅食品安全检测箱方案(高中低
- 房地产销售培训资料
- 高一地理必修1复习提纲
- 新概念英语第二册lesson_1_练习题
- 证券公司内部培训资料
- 小学英语时间介词专项练习
- 新世纪英语专业综合教程(第二版)第1册U
- 【新课标】浙教版最新2018年八年级数学
- 工程建设管理纲要
- 外研版 必修一Module 4 A Social Surve
- Adobe认证考试 AE复习资料
- 基于H.264AVC与AVS标准的帧内预测技术
- 《食品检验机构资质认定管理办法》(质
- ABB变频器培训课件
- (完整版)小学说明文阅读练习题及答案
- 深思洛克(SenseLock) 深思IV,深思4,深
- 弟子规全文带拼音




