3.4. 其他说明
Ø 编译环境:Win XP Checked Build Environment/Win XP Free Build Environment
Ø 开发环境:Microsoft Visual C++ 6.0
Ø 调试工具:Debugging Tools for Windows (x86)(WinDbg)
Ø 开发周期:2009-11-7到2009-10-24
Ø 设计人员/编码人员/调试人员:罗振辉
第4节 函数接口
4.1. USB_CONFIGURATION_DESCRIPTOR_INFO
描述
USB_CONFIGURATION_DESCRIPTOR_INFO用于描述设备配置信息,同等于USB_CONFIGURATION_DESCRIPTOR结构体的字符串版本。
class USB_CONFIGURATION_DESCRIPTOR_INFO{ public: CString bLength; CString bDescriptorType; CString wTotalLength; CString bNumInterfaces; CString bConfigurationValue; CString iConfiguration; CString bmAttributes; CString MaxPower; }; |
成员
bLength
等同于USB_CONFIGURATION_DESCRIPTOR中bLength域。
bDescriptorType
等同于USB_CONFIGURATION_DESCRIPTOR中bDescriptorType域。
wTotalLength
等同于USB_CONFIGURATION_DESCRIPTOR中wTotalLength域。
bNumInterfaces
等同于USB_CONFIGURATION_DESCRIPTOR中bNumInterfaces域。
bConfigurationValue
等同于USB_CONFIGURATION_DESCRIPTOR中bConfigurationValue域。
iConfiguration
等同于USB_CONFIGURATION_DESCRIPTOR中iConfiguration域。
bmAttributes
等同于USB_CONFIGURATION_DESCRIPTOR中bmAttributes域。
MaxPower
等同于USB_CONFIGURATION_DESCRIPTOR中MaxPower域。
4.2. USB_INTERFACE_DESCRIPTOR_INFO
描述
USB_INTERFACE_DESCRIPTOR_INFO用于描述接口描述信息,同等于USB_INTERFACE_DESCRIPTOR结构体的字符串版本。
class USB_INTERFACE_DESCRIPTOR_INFO{ public: CString bLength; CString bDescriptorType; CString bInterfaceNumber; CString bAlternateSetting; CString bNumEndpoints; CString bInterfaceClass; CString bInterfaceSubClass; CString bInterfaceProtocol; CString bInterface; }; |
成员
bLength
等同于USB_INTERFACE_DESCRIPTOR中bLength域。
bDescriptorType
等同于USB_INTERFACE_DESCRIPTOR中bDescriptorType域。
bInterfaceNumber
等同于USB_INTERFACE_DESCRIPTOR中bInterfaceNumber域。
bAlternateSetting
等同于USB_INTERFACE_DESCRIPTOR中bAlternateSetting域。
bNumEndpoints
等同于USB_INTERFACE_DESCRIPTOR中bNumEndpoints域。
bInterfaceClass
等同于USB_INTERFACE_DESCRIPTOR中bInterfaceClass域。
bInterfaceSubClass
等同于USB_INTERFACE_DESCRIPTOR中bInterfaceSubClass域。
bInterfaceProtocol
等同于USB_INTERFACE_DESCRIPTOR中bInterfaceProtocol域。
bInterface
等同于USB_INTERFACE_DESCRIPTOR中bInterface域。
4.3. USB_ENDPOINT_DESCRIPTOR_INFO
描述
USB_ENDPOINT_DESCRIPTOR_INFO用于描述接口描述信息,同等于USB_ENDPOINT_DESCRIPTOR结构体的字符串版本。
class USB_ENDPOINT_DESCRIPTOR_INFO { public: CString pipe; CString bLength; CString bDescriptorType; CString bEndpointAddress; CString bmAttributes; CString wMaxPacketSize; CString bInterval; }; |
成员
Pipe
端点的名称。
bLength
等同于USB_ENDPOINT_DESCRIPTOR中bLength域。
bDescriptorType
等同于USB_ENDPOINT_DESCRIPTOR中bDescriptorType域。
bEndpointAddress
等同于USB_ENDPOINT_DESCRIPTOR中bEndpointAddress域。
bmAttributes
等同于USB_ENDPOINT_DESCRIPTOR中bmAttributes域。
wMaxPacketSize
等同于USB_ENDPOINT_DESCRIPTOR中wMaxPacketSize域。
bInterval
等同于USB_ENDPOINT_DESCRIPTOR中bInterval域。
4.4. UsbDesc
描述
该结构主要用于处理USB设备描述、接口和端点描述信息,使其与测试软件的List控件显示相对应,该结构体是上述USB_ENDPOINT_DESCRIPTOR_INFO、USB_INTERFACE
_DESCRIPTOR_INFO和USB_CONFIGURATION_DESCRIPTOR_INFO结构体的处理集合,其中包含三个数组信息usbcfg、usbinterfacedesc和usbendpointdesc描述了设备相关的设备描述、接口描述和端点描述信息。
class AFX_EXT_CLASS UsbDesc { public: USB_CONFIGURATION_DESCRIPTOR_INFO usbcfg[USB_CONFIGURATION_DESCRIPTOR_INFO_ARRAY_SIZE]; USB_INTERFACE_DESCRIPTOR_INFO usbinterfacedesc[USB_INTERFACE_DESCRIPTOR_INFO_ARRAY_SIZE]; USB_ENDPOINT_DESCRIPTOR_INFO usbendpointdesc[USB_ENDPOINT_DESCRIPTOR_INFO_ARRAY_SIZE];
int usbcfg_curindex; int usbinter_curindex; int usbendp_curindex; UsbDesc(); virtual ~UsbDesc(); public: void SetUsbFigReport(CListCtrl &m_usbfig); void SetInterfaceDescReport(CListCtrl &m_interface); void SetEndpointDescReport(CListCtrl &m_endpoint); void SetAllDescReport(CListCtrl &m_usbfig,CListCtrl &m_interface,CListCtrl &m_endpoint); void InsertFigItem(CListCtrl &m_usbfig); void InsertInterfaceItem(CListCtrl &m_interface); void InsertEndpointItem(CListCtrl &m_endpoint); void InsertAllCtlItem(CListCtrl &m_usbfig,CListCtrl &m_interface,CListCtrl &m_endpoint); }; |
成员
Usbcfg
数组用于记录设备描述符信息。
Usbinterfacedesc
数组用于记录接口描述信息。
Usbendpointdesc
数组用于记录端点描述信息。
usbcfg_curindex
记录设备描述信息块数。
usbinter_curindex
记录接口描述信息块数。
usbendp_curindex
记录端点描述信息块数。
函数
n SetUsbFigReport
描述
设置设备描述信息控件Header信息,同时改变其显示风格。
void UsbDesc::SetUsbFigReport(CListCtrl &m_usbfig) |
参数
m_usbfig
设备描述信息控件的引用。
返回值
无
n SetInterfaceDescReport
描述
设置接口描述控件Header信息,同时改变其显示风格。
Void SetInterfaceDescReport(CListCtrl &m_interface) |
参数
m_interface
接口描述控件的引用。
返回值
无
n SetEndpointDescReport
描述
设置端点描述控件Header信息,同时改变其显示风格。
Void SetEndpointDescReport(CListCtrl &m_endpoint) |
参数
m_endpoint
端点描述控件的引用。
返回值
无
n SetAllDescReport
描述
设置设备、接口和端点描述控件Header信息,同时改变其显示风格。
Void SetAllDescReport(CListCtrl &m_usbfig,CListCtrl &m_interface,CListCtrl &m_endpoint) |
参数
m_usbfig
设备描述信息控件的引用。
m_interface
接口描述控件的引用。
m_endpoint
端点描述控件的引用。
返回值
无
n InsertFigItem
描述
向设备描述控件中加入一条信息项。
Void InsertFigItem(CListCtrl &m_usbfig) |
参数
m_usbfig
设备描述信息控件的引用。
返回值
无
n InsertInterfaceItem
描述
向接口描述控件中加入一条信息项。
Void InsertInterfaceItem(CListCtrl &m_interface) |
参数
m_interface
接口描述控件的引用。
返回值
无
n InsertEndpointItem
描述
向端点描述控件中加入一条信息项。
Void InsertEndpointItem(CListCtrl &m_endpoint) |
参数
m_endpoint
端点描述控件的引用。
返回值
无
n InsertAllCtlItem
描述
向设备、接口和端点描述控件中加入一条信息项。
Void InsertEndpointItem(CListCtrl &m_endpoint) |
参数
m_usbfig
设备描述信息控件的引用。
m_interface
接口描述控件的引用。
m_endpoint
端点描述控件的引用。
返回值
无
4.5. LPC2400_USB_OpenPipe
描述
打开端点,返回端点操作句柄。
HANDLE _declspec(dllexport) LPC2400_USB_OpenPipe(IN int PipeID); |
参数
PipeID
端点号。
返回值
失败:返回INVALID_HANDLE_VALUE 成功:返回设备句柄
4.6. LPC2400_USB_ReadData
描述
从设备缓存读取一段数据,保存在rData当中
BOOL _declspec(dllexport) LPC2400_USB_ReadData(IN HANDLE hRead, OUT char cdata[], IN DWORD readlen); |
参数
hRead
设备句柄。
Readlen
需要从设备读取数据的长度。
rData
保存读取的数据。
返回值
TRUE:操作成功 FALSE:失败
4.7. LPC2400_USB_WriteData
描述
向设备写入一段数据。
BOOL _declspec(dllexport) LPC2400_USB_WriteData(IN HANDLE hWrite, IN CString wData); |
参数
hWrite
设备句柄。
wData
需要向设备写入的数据。
返回值
TRUE:操作成功 FALSE:失败
4.8. LPC2400_USB_FOR_TEST
描述
测试USB驱动是否运行成功:向逻辑端点1 发送数据 向物理端点3 读取数据。
BOOL _declspec(dllexport) LPC2400_USB_FOR_TEST(CString wData,CString &rData); |
参数
wData
用于向设备写入的数据。
rData
用于向设备读取的数据。
返回值
TRUE:操作成功 FALSE:失败
4.9. dumpUsbConfig
描述
结合USBDesc结构体获取设备的设备描述、接口描述和端点描述信息,并保存在传如的参数当中。
BOOL _declspec(dllexport) dumpUsbConfig(IN OUT UsbDesc &usbdesc); |
参数
usbdesc
用于保存设备描述、接口描述和端点描述信息。
返回值
TRUE:操作成功 FALSE:失败
4.10. LPC2400_USB_ReadByte
描述
从设备中读取一个字节的数据。
BOOL _declspec(dllexport) LPC2400_USB_ReadByte(IN HANDLE hRead OUT UCHAR &rData); |
参数
hRead
设备句柄。
rData
读取的字节数据。
返回值
TRUE:操作成功 FALSE:失败
4.11. LPC2400_USB_WriteByte
描述
向设备中写入一串用于控制的字符串。
BOOL _declspec(dllexport) LPC2400_USB_WriteByte(IN HANDLE hWrite, UCHAR inchar[]); |
参数
hRead
设备句柄。
Inchar
需要写入的数据。
返回值
TRUE:操作成功 FALSE:失败
第5节 归档说明
软件归档,产生如下几个文件夹,默认为当前路径已经指向归档路径。
./ Driver:存放发布后的驱动文件以及INF安装文件,主要包括LPC2400_USB.inf和LPC2400_USB.sys文件。
./ DLL:存放发布后的Dll文件以及可用的lib文件,主要包括UsbDesc.h、LPC2400_USB.dll、LPC2400_USB_API.H和LPC2400_USB.lib文件。
./ Test:存放发布后的测试软件,主要包括LPC2400_USB.dll、USBTest.exe和mfc42.dll文件。
./ papers:主要用于存放驱动相关信息,主要包括WinXP下USB驱动开发.pdf文件。
第4节 VC调用LPC2400_USB动态库的方法
LPC2400_USB动态库在归档文件夹DLL中找到,其中包括LPC2400_USB.lib、LPC2400_USB.dll、LPC2400_USB_API.H和UsbDesc.h如下步骤调用看门狗动态库。
在扩展名为.CPP的文件中包含LPC2400_USB_API.H和UsbDesc.h头文件。如:#include “EPCS_500_WDT_API.H”
在工程的连接器设置中连接到LPC2400_USB.lib文件。
如:在VC6环境下,在项目属性页里的配置属性→连接器→输入→附加依赖项中添加LPC2400_USB.lib。
第6节 总结
通过本次试验,我对USBD规范协议有了比较全面的了解,比如说如何区分管道、端点和接口,同时为日后的Windows驱动开发积累经验。该文《WinXP下USB驱动开发》记录了我从了解USB协议到驱动设计、编写、测试和归档的全部过程,可供USB驱动开发人员参考。