WinXP下USB驱动开发(十)

来源:互联网 发布:线路板处理画图软件 编辑:程序博客网 时间:2024/05/04 11:27

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-72009-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_DESCRIPTORbLength域。

bDescriptorType

等同于USB_CONFIGURATION_DESCRIPTORbDescriptorType域。

wTotalLength

等同于USB_CONFIGURATION_DESCRIPTORwTotalLength域。

bNumInterfaces

等同于USB_CONFIGURATION_DESCRIPTORbNumInterfaces域。

bConfigurationValue

等同于USB_CONFIGURATION_DESCRIPTORbConfigurationValue域。

iConfiguration

等同于USB_CONFIGURATION_DESCRIPTORiConfiguration域。

bmAttributes

等同于USB_CONFIGURATION_DESCRIPTORbmAttributes域。

MaxPower

等同于USB_CONFIGURATION_DESCRIPTORMaxPower域。

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_DESCRIPTORbLength域。

bDescriptorType

等同于USB_INTERFACE_DESCRIPTORbDescriptorType域。

bInterfaceNumber

等同于USB_INTERFACE_DESCRIPTORbInterfaceNumber域。

bAlternateSetting

等同于USB_INTERFACE_DESCRIPTORbAlternateSetting域。

bNumEndpoints

等同于USB_INTERFACE_DESCRIPTORbNumEndpoints域。

bInterfaceClass

等同于USB_INTERFACE_DESCRIPTORbInterfaceClass域。

bInterfaceSubClass

等同于USB_INTERFACE_DESCRIPTORbInterfaceSubClass域。

bInterfaceProtocol

等同于USB_INTERFACE_DESCRIPTORbInterfaceProtocol域。

bInterface

等同于USB_INTERFACE_DESCRIPTORbInterface域。

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_DESCRIPTORbLength域。

bDescriptorType

等同于USB_ENDPOINT_DESCRIPTORbDescriptorType域。

bEndpointAddress

等同于USB_ENDPOINT_DESCRIPTORbEndpointAddress域。

bmAttributes

等同于USB_ENDPOINT_DESCRIPTORbmAttributes域。

wMaxPacketSize

等同于USB_ENDPOINT_DESCRIPTORwMaxPacketSize域。

bInterval

等同于USB_ENDPOINT_DESCRIPTORbInterval域。

4.4.        UsbDesc

描述

该结构主要用于处理USB设备描述、接口和端点描述信息,使其与测试软件的List控件显示相对应,该结构体是上述USB_ENDPOINT_DESCRIPTOR_INFOUSB_INTERFACE

_DESCRIPTOR_INFOUSB_CONFIGURATION_DESCRIPTOR_INFO结构体的处理集合,其中包含三个数组信息usbcfgusbinterfacedescusbendpointdesc描述了设备相关的设备描述、接口描述和端点描述信息。

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.infLPC2400_USB.sys文件。

./ DLL:存放发布后的Dll文件以及可用的lib文件,主要包括UsbDesc.hLPC2400_USB.dllLPC2400_USB_API.HLPC2400_USB.lib文件。

./ Test:存放发布后的测试软件,主要包括LPC2400_USB.dllUSBTest.exemfc42.dll文件。

./ papers:主要用于存放驱动相关信息,主要包括WinXPUSB驱动开发.pdf文件。

第4节       VC调用LPC2400_USB动态库的方法

LPC2400_USB动态库在归档文件夹DLL中找到,其中包括LPC2400_USB.libLPC2400_USB.dllLPC2400_USB_API.HUsbDesc.h如下步骤调用看门狗动态库。

在扩展名为.CPP的文件中包含LPC2400_USB_API.HUsbDesc.h头文件。如:#include “EPCS_500_WDT_API.H”

在工程的连接器设置中连接到LPC2400_USB.lib文件。

如:在VC6环境下,在项目属性页里的配置属性连接器输入附加依赖项中添加LPC2400_USB.lib

第6节       总结

通过本次试验,我对USBD规范协议有了比较全面的了解,比如说如何区分管道、端点和接口,同时为日后的Windows驱动开发积累经验。该文《WinXPUSB驱动开发》记录了我从了解USB协议到驱动设计、编写、测试和归档的全部过程,可供USB驱动开发人员参考。