#include "ddk/usb100.h"
#include "ddk/usbioctl.h"
-#define DLL_SYMBOL_DECLARE(api, ret, name, args) \
- typedef ret (api * __dll_##name##_t)args; \
- static __dll_##name##_t name
-
-#define LOAD_FUNCPTR(name) \
- do { \
- HMODULE h = GetModuleHandle("winusb.dll"); \
- if(h == NULL) \
- h = LoadLibrary("winusb.dll"); \
- if(h == NULL) \
- break; \
- if((name = (__dll_##name##_t)GetProcAddress(h, #name))) \
- break; \
- if((name = (__dll_##name##_t)GetProcAddress(h, #name "A"))) \
- break; \
- if((name = (__dll_##name##_t)GetProcAddress(h, #name "W"))) \
- break; \
- } while(0)
-
// The USBD_PIPE_TYPE enumerator indicates the type of pipe.
typedef enum _USBD_PIPE_TYPE {
UsbdPipeTypeControl = 0, //Indicates that the pipe is a control pipe.
SDB_MUTEX_DEFINE( usb_lock );
-// winusb.dll entrypoints
-DLL_SYMBOL_DECLARE(WINAPI, BOOL, WinUsb_Initialize, (HANDLE, PWINUSB_INTERFACE_HANDLE));
-DLL_SYMBOL_DECLARE(WINAPI, BOOL, WinUsb_Free, (WINUSB_INTERFACE_HANDLE));
-DLL_SYMBOL_DECLARE(WINAPI, BOOL, WinUsb_GetDescriptor, (WINUSB_INTERFACE_HANDLE, UCHAR, UCHAR, USHORT, PUCHAR, ULONG, PULONG));
-DLL_SYMBOL_DECLARE(WINAPI, BOOL, WinUsb_QueryInterfaceSettings, (WINUSB_INTERFACE_HANDLE, UCHAR, PUSB_INTERFACE_DESCRIPTOR));
-DLL_SYMBOL_DECLARE(WINAPI, BOOL, WinUsb_SetCurrentAlternateSetting, (WINUSB_INTERFACE_HANDLE, UCHAR));
-DLL_SYMBOL_DECLARE(WINAPI, BOOL, WinUsb_GetCurrentAlternateSetting, (WINUSB_INTERFACE_HANDLE, PUCHAR));
-DLL_SYMBOL_DECLARE(WINAPI, BOOL, WinUsb_QueryPipe, (WINUSB_INTERFACE_HANDLE, UCHAR, UCHAR, PWINUSB_PIPE_INFORMATION));
-DLL_SYMBOL_DECLARE(WINAPI, BOOL, WinUsb_SetPipePolicy, (WINUSB_INTERFACE_HANDLE, UCHAR, ULONG, ULONG, PVOID));
-DLL_SYMBOL_DECLARE(WINAPI, BOOL, WinUsb_GetPipePolicy, (WINUSB_INTERFACE_HANDLE, UCHAR, ULONG, PULONG, PVOID));
-DLL_SYMBOL_DECLARE(WINAPI, BOOL, WinUsb_ReadPipe, (WINUSB_INTERFACE_HANDLE, UCHAR, PUCHAR, ULONG, PULONG, LPOVERLAPPED));
-DLL_SYMBOL_DECLARE(WINAPI, BOOL, WinUsb_WritePipe, (WINUSB_INTERFACE_HANDLE, UCHAR, PUCHAR, ULONG, PULONG, LPOVERLAPPED));
-DLL_SYMBOL_DECLARE(WINAPI, BOOL, WinUsb_ControlTransfer, (WINUSB_INTERFACE_HANDLE, WINUSB_SETUP_PACKET, PUCHAR, ULONG, PULONG, LPOVERLAPPED));
-DLL_SYMBOL_DECLARE(WINAPI, BOOL, WinUsb_ResetPipe, (WINUSB_INTERFACE_HANDLE, UCHAR));
-DLL_SYMBOL_DECLARE(WINAPI, BOOL, WinUsb_GetOverlappedResult, (WINUSB_INTERFACE_HANDLE, LPOVERLAPPED, LPDWORD, BOOL));
+HMODULE g_h = NULL;
+
+#define TYPEDEF_SYMBOL(name, args) \
+ typedef BOOL (WINAPI * _##name##_)args; \
+ static _##name##_ name
+
+#define LOAD_FUNCPTR(name) \
+ do { \
+ if((name = (_##name##_)GetProcAddress(g_h, #name))) \
+ break; \
+ } while(0)
+
+// declare all symbols exported by winusb dll
+TYPEDEF_SYMBOL(WinUsb_Initialize, (HANDLE, PWINUSB_INTERFACE_HANDLE));
+TYPEDEF_SYMBOL(WinUsb_Free, (WINUSB_INTERFACE_HANDLE));
+TYPEDEF_SYMBOL(WinUsb_GetDescriptor, (WINUSB_INTERFACE_HANDLE, UCHAR, UCHAR, USHORT, PUCHAR, ULONG, PULONG));
+TYPEDEF_SYMBOL(WinUsb_QueryInterfaceSettings, (WINUSB_INTERFACE_HANDLE, UCHAR, PUSB_INTERFACE_DESCRIPTOR));
+TYPEDEF_SYMBOL(WinUsb_SetCurrentAlternateSetting, (WINUSB_INTERFACE_HANDLE, UCHAR));
+TYPEDEF_SYMBOL(WinUsb_GetCurrentAlternateSetting, (WINUSB_INTERFACE_HANDLE, PUCHAR));
+TYPEDEF_SYMBOL(WinUsb_QueryPipe, (WINUSB_INTERFACE_HANDLE, UCHAR, UCHAR, PWINUSB_PIPE_INFORMATION));
+TYPEDEF_SYMBOL(WinUsb_SetPipePolicy, (WINUSB_INTERFACE_HANDLE, UCHAR, ULONG, ULONG, PVOID));
+TYPEDEF_SYMBOL(WinUsb_GetPipePolicy, (WINUSB_INTERFACE_HANDLE, UCHAR, ULONG, PULONG, PVOID));
+TYPEDEF_SYMBOL(WinUsb_ReadPipe, (WINUSB_INTERFACE_HANDLE, UCHAR, PUCHAR, ULONG, PULONG, LPOVERLAPPED));
+TYPEDEF_SYMBOL(WinUsb_WritePipe, (WINUSB_INTERFACE_HANDLE, UCHAR, PUCHAR, ULONG, PULONG, LPOVERLAPPED));
+TYPEDEF_SYMBOL(WinUsb_ControlTransfer, (WINUSB_INTERFACE_HANDLE, WINUSB_SETUP_PACKET, PUCHAR, ULONG, PULONG, LPOVERLAPPED));
+TYPEDEF_SYMBOL(WinUsb_ResetPipe, (WINUSB_INTERFACE_HANDLE, UCHAR));
+TYPEDEF_SYMBOL(WinUsb_GetOverlappedResult, (WINUSB_INTERFACE_HANDLE, LPOVERLAPPED, LPDWORD, BOOL));
void win_usb_init(void) {
// Initialize DLL functions
- if (!WinUsb_Initialize) {
+ if (g_h == NULL) {
+ g_h = GetModuleHandle("winusb.dll");
+ if(g_h == NULL) {
+ g_h = LoadLibrary("winusb.dll");
+ }
+ if(g_h == NULL) {
+ LOG_FATAL("cannot load winusb dll\n");
+ }
+
LOAD_FUNCPTR(WinUsb_Initialize);
LOAD_FUNCPTR(WinUsb_Free);
LOAD_FUNCPTR(WinUsb_GetDescriptor);
LIST_NODE* cur_ptr = handle_list;
while(cur_ptr != NULL) {
- usb_handle* usb = cur_ptr->data;
- cur_ptr = cur_ptr->next_ptr;
+ usb_handle* usb = cur_ptr->data;
+ cur_ptr = cur_ptr->next_ptr;
- if(!strcmp(usb->unique_node_path, node_path)) {
- r = 1;
- break;
- }
+ if(!strcmp(usb->unique_node_path, node_path)) {
+ r = 1;
+ break;
+ }
}
sdb_mutex_unlock(&usb_lock, "usb is_device_registered");
return r;
FILE_FLAG_OVERLAPPED, NULL);
if (INVALID_HANDLE_VALUE == hnd) {
- D("fail to create device file: %s due to: %d\n", device_path, GetLastError());
+ LOG_DEBUG("fail to create device file: %s due to: %d\n", device_path, GetLastError());
return NULL;
}
}
if (2 != usb_interface_descriptor.bNumEndpoints) {
- D("the number of endpoint should be two\n");
+ LOG_DEBUG("the number of endpoint should be two\n");
return NULL;
}
// only interested in bulk type
if (UsbdPipeTypeBulk == pipe_info.PipeType) {
if (USB_ENDPOINT_DIRECTION_IN(pipe_info.PipeId)) {
- D("builk in endpoint index: %d, id: %04x\n", endpoint_index, pipe_info.PipeId);
+ LOG_DEBUG("builk in endpoint index: %d, id: %04x\n", endpoint_index, pipe_info.PipeId);
usb->end_point[0] = pipe_info.PipeId;
}
if (USB_ENDPOINT_DIRECTION_OUT(pipe_info.PipeId)) {
- D("builk out endpoint index: %d, id: %04x\n", endpoint_index, pipe_info.PipeId);
+ LOG_DEBUG("builk out endpoint index: %d, id: %04x\n", endpoint_index, pipe_info.PipeId);
usb->end_point[1] = pipe_info.PipeId;
}
// Get information about all the installed devices for the specified device interface class.
HDEVINFO hDeviceInfo = SetupDiGetClassDevs(&deviceClassID, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDeviceInfo == INVALID_HANDLE_VALUE) {
- D("fail to find any device: %d\n", GetLastError());
+ LOG_DEBUG("fail to find any device: %d\n", GetLastError());
return 0;
}
//Check for some other error
if (!bResult)
{
- D("Error SetupDiEnumDeviceInterfaces: %d.\n", GetLastError());
+ LOG_DEBUG("Error SetupDiEnumDeviceInterfaces: %d.\n", GetLastError());
break;
}
detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA) malloc(requiredLength);
if (detailData == NULL) {
- D("fail to allocate memory\n");
+ LOG_DEBUG("fail to allocate memory\n");
break;
}
} else {
- D("Error SetupDiEnumDeviceInterfaces: %d.\n", GetLastError());
+ LOG_DEBUG("Error SetupDiEnumDeviceInterfaces: %d.\n", GetLastError());
break;
}
}
//Check for some other error
if (!bResult) {
- D("fail to setdup get device interface detail: %d\n", GetLastError());
+ LOG_DEBUG("fail to setdup get device interface detail: %d\n", GetLastError());
if (detailData != NULL) {
free(detailData);
}
if (hnd != NULL) {
char serial[256];
if (get_serial_number(hnd, serial, sizeof(serial)) > 0) {
- D("register usb for: %s\n", serial);
+ LOG_DEBUG("register usb for: %s\n", serial);
if (register_device(hnd)) {
register_usb_transport(hnd, serial);
} else {
- D("fail to register usb\n");
+ LOG_DEBUG("fail to register usb\n");
win_usb_close(hnd);
free(hnd);
}
} else {
- D("fail to get usb serial name: kick? close?\n");
+ LOG_DEBUG("fail to get usb serial name: kick? close?\n");
win_usb_close(hnd);
free(hnd);
}
}
void* device_poll_thread(void* sleep_msec) {
- D("Created device thread\n");
+ LOG_DEBUG("Created device thread\n");
int mseconds = (int) sleep_msec;
while (1) {
}
void sdb_usb_cleanup() {
- D("TODO: not imple yet\n");
+ LOG_DEBUG("+all clean resources+\n");
+
+ if (g_h != NULL) {
+ FreeLibrary(g_h);
+ }
}
int usb_bulk_transfer(usb_handle* handle, BOOL is_read, const void *data, unsigned long length, unsigned long *actual_length, unsigned long timeout) {
endpoint = handle->end_point[1];
}
if (handle->fd == NULL) {
- D("invalid handle\n");
+ LOG_DEBUG("invalid handle\n");
return 0;
}
// do not complete within the specified time-out interval
if (!WinUsb_SetPipePolicy(handle->fd, endpoint, PIPE_TRANSFER_TIMEOUT, sizeof(tmp), &tmp)) {
- D("fail to set timeout\n");
+ LOG_DEBUG("fail to set timeout\n");
SetLastError(ERROR_SEM_TIMEOUT);
return 0;
}
if (NULL != overlapped.hEvent){
CloseHandle(overlapped.hEvent);
}
- D("pipe error: (%ld/ld) error:%d\n", length, transferred, GetLastError());
+ LOG_DEBUG("pipe error: (%ld/ld) error:%d\n", length, transferred, GetLastError());
return 0;
}
unsigned long written = 0;
int ret;
- D("+sdb_usb_write %d\n", len);
+ LOG_DEBUG("+sdb_usb_write %d\n", len);
if (NULL != handle) {
ret = usb_bulk_transfer(handle, FALSE, (void*)data, (unsigned long)len, &written, time_out);
int saved_errno = GetLastError();
- D("sdb_usb_write got(ret:%d): %ld, expected: %d, errno: %d\n",ret, written, len, saved_errno);
+ LOG_DEBUG("sdb_usb_write got(ret:%d): %ld, expected: %d, errno: %d\n",ret, written, len, saved_errno);
if (ret) {
if (written == (unsigned long) len) {
}
errno = saved_errno;
} else {
- D("usb_write NULL handle\n");
+ LOG_DEBUG("usb_write NULL handle\n");
SetLastError(ERROR_INVALID_HANDLE);
}
- D("-sdb_usb_write failed: %d\n", errno);
+ LOG_DEBUG("-sdb_usb_write failed: %d\n", errno);
return -1;
}
unsigned long n = 0;
int ret;
- D("+sdb_usb_read %d\n", len);
+ LOG_DEBUG("+sdb_usb_read %d\n", len);
if (NULL != handle) {
while (len > 0) {
int xfer = (len > 4096) ? 4096 : len;
ret = usb_bulk_transfer(handle, TRUE, (void*)data, (unsigned long)xfer, &n, (unsigned long)0);
int saved_errno = GetLastError();
- D("sdb_usb_read got(ret:%d): %ld, expected: %d, errno: %d\n", ret, n, xfer, saved_errno);
+ LOG_DEBUG("sdb_usb_read got(ret:%d): %ld, expected: %d, errno: %d\n", ret, n, xfer, saved_errno);
if (ret) {
data += n;
errno = saved_errno;
}
} else {
- D("sdb_usb_read NULL handle\n");
+ LOG_DEBUG("sdb_usb_read NULL handle\n");
SetLastError(ERROR_INVALID_HANDLE);
}
- D("-sdb_usb_read failed: %d\n", errno);
+ LOG_DEBUG("-sdb_usb_read failed: %d\n", errno);
return -1;
}
int win_usb_close(usb_handle *handle) {
- D("+usb win_usb_close\n");
+ LOG_DEBUG("+usb win_usb_close\n");
if (NULL != handle) {
if (NULL != handle->fd) {
WinUsb_Free(handle->fd);
}
handle = NULL;
}
- D("-usb win_usb_close\n");
+ LOG_DEBUG("-usb win_usb_close\n");
return 0;
}
void sdb_usb_kick(usb_handle* handle) {
- D("+sdb_usb_kick: %p\n", handle);
+ LOG_DEBUG("+sdb_usb_kick: %p\n", handle);
// called from transport remote kick if already registered
// so only clean for win usb handle resources
sdb_mutex_lock(&usb_lock, "usb sdb_usb_kick");
win_usb_close(handle);
sdb_mutex_unlock(&usb_lock , "usb sdb_usb_kick");
- D("-sdb_usb_kick: %p\n", handle);
+ LOG_DEBUG("-sdb_usb_kick: %p\n", handle);
}
int sdb_usb_close(usb_handle* handle) {
- D("+sdb_usb_close: %p\n", handle);
+ LOG_DEBUG("+sdb_usb_close: %p\n", handle);
if (NULL != handle) {
sdb_mutex_lock(&usb_lock, "usb sdb_usb_close");
remove_node(&handle_list, handle->node, NULL);
sdb_mutex_unlock(&usb_lock, "usb sdb_usb_close");
}
- D("-sdb_usb_close: %p\n", handle);
+ LOG_DEBUG("-sdb_usb_close: %p\n", handle);
return 0;
}