分类: WINDOWS
2011-12-06 11:51:04
对生成的驱动程序进行分析,使用Windriver生成的USB驱动框架中包含了:diag_lib.c、usb_diag_lib.c、usbdrvier_diag.c三个源文件,其中usbdrvier为自己建的驱动工程名。
就先对usbdrvier_diag.c文件进行理解:
1. 使用windriver的库文件,包括
"windrvr.h"、"diag_lib.h"、"wd_ver.h"、"windrvr_usb.h"。在这里也需要实现自己的驱动函数功能,所以还要调用usbdriver_diag.h对自定义的函数进行定义。
//设备上下文
typedef struct DEVICE_CONTEXT
{
struct DEVICE_CONTEXT *pNext;
WDU_DEVICE_HANDLE hDevice;
DWORD dwVendorId;
DWORD dwProductId;
DWORD dwInterfaceNum;
DWORD dwAlternateSetting;
} DEVICE_CONTEXT;
//驱动上下文
typedef struct DRIVER_CONTEXT
{
HANDLE hEvent;
HANDLE hMutex;
DWORD dwDeviceCount;
DEVICE_CONTEXT *deviceContextList;
DEVICE_CONTEXT *pActiveDev;
HANDLE hDeviceUnusedEvent;
} DRIVER_CONTEXT;
首先是usb设备连接功能函数
static BOOL DLLCALLCONV DeviceAttach(WDU_DEVICE_HANDLE hDevice, WDU_DEVICE *pDeviceInfo, PVOID pUserData)
枚举设备的接入、拔出以及上电状态表结构体
typedef struct
{
WDU_ATTACH_CALLBACK pfDeviceAttach;
WDU_DETACH_CALLBACK pfDeviceDetach;
WDU_POWER_CHANGE_CALLBACK pfPowerChange;
PVOID pUserData; /* pointer to pass in each callback */
} WDU_EVENT_TABLE;
对WDU_ATTACH_CALLBACK 定义在
typedef BOOL (DLLCALLCONV *WDU_ATTACH_CALLBACK)(WDU_DEVICE_HANDLE hDevice, WDU_DEVICE *pDeviceInfo,
PVOID pUserData);
定义DLLCALLCONV #define DLLCALLCONV __stdcall 查询_stdcall作用:Win32的API函数都遵循_stdcall调用约定,是Pascal方式清理C方式压栈,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。__stdcall、__cdecl和__fastcall可以直接加在要输出的函数前。
根据Windriver的帮助文件获取USB驱动设计信息,在生成的驱动文件框架中如何添加自己的代码:
1. Call WDU_Init() at the beginning of your program to initialize WinDriver for your USB device and wait for the device-attach callback. The relevant device information will be provided in the attach callback.
2. Once the attach callback is received, you can start using one of the WDU_Transfer() functions family to send and receive data.
3. To finish, call WDU_Uninit() to un-register from the device.
WDU_Init() 、WDU_Transfer() 、 WDU_Uninit() 为Windriver USB的API函数,在WDU_xxx中定义了USB用户应用和USB设备之间的事件驱动传输。
WDU_ATTACH_CALLBACK()、 WDU_DETACH_CALLBACK()、WDU_POWER_CHANGE_CALLBACK()用于通知用户程序设备相关状态,例如USB设备的插入、拔出操作。
操作流程如下程序所示:
main()
{
WDU_Init(...);
...
while (...)
{
/* wait for new devices */
...
/* issue transfers */
...
}
...
WDU_Uninit();
}
下表对应WDU_XXX文件中的Windrvier USB的API函数表,可以方便后面用户调用API函数功能。
Problem | Solution |
---|---|
High Level API | |
This function... | has been replaced by... |
WD_Open() WD_Version() WD_UsbScanDevice() |
WDU_Init() |
WD_UsbDeviceRegister() | WDU_SetInterface() |
WD_UsbGetConfiguration() | WDU_GetDeviceInfo() |
WD_UsbDeviceUnregister() | WDU_Uninit() |
Low Level API | |
This function... | has been replaced by... |
WD_UsbTransfer() |
WDU_Transfer() |
USB_TRANSFER_HALT option | WDU_HaltTransfer() |
WD_UsbResetPipe() | WDU_ResetPipe() |
WD_UsbResetDevice() WD_UsbResetDeviceEx() |
WDU_ResetDevice() |
wdu_lib.h头文件中定义如下函数:
WDU_Init() :监听对应输入协议的设备,并为设备产生回调通知,定义如下