Apply clang-format code style to all source files
This commit is contained in:
+147
-45
@@ -17,23 +17,22 @@ Additional Notes:
|
||||
#ifndef __IOCTL_H__
|
||||
#define __IOCTL_H__
|
||||
|
||||
|
||||
#ifndef DRIVER
|
||||
|
||||
#ifndef CTL_CODE
|
||||
#include <devioctl.h>
|
||||
#include <devioctl.h>
|
||||
#endif
|
||||
|
||||
#ifndef BM_REQUEST_TYPE
|
||||
#include "usb200.h"
|
||||
#include "usb200.h"
|
||||
#endif
|
||||
|
||||
#define DIR_HOST_TO_DEVICE 0
|
||||
#define DIR_DEVICE_TO_HOST 1
|
||||
|
||||
#define DEVICE_SPEED_UNKNOWN 0x00000000
|
||||
#define DEVICE_SPEED_LOW_FULL 0x00000001
|
||||
#define DEVICE_SPEED_HIGH 0x00000002
|
||||
#define DEVICE_SPEED_UNKNOWN 0x00000000
|
||||
#define DEVICE_SPEED_LOW_FULL 0x00000001
|
||||
#define DEVICE_SPEED_HIGH 0x00000002
|
||||
|
||||
typedef struct _WORD_SPLIT {
|
||||
UCHAR lowByte;
|
||||
@@ -41,14 +40,13 @@ typedef struct _WORD_SPLIT {
|
||||
} WORD_SPLIT, *PWORD_SPLIT;
|
||||
|
||||
typedef struct _BM_REQ_TYPE {
|
||||
UCHAR Recipient:2;
|
||||
UCHAR Reserved:3;
|
||||
UCHAR Type:2;
|
||||
UCHAR Direction:1;
|
||||
UCHAR Recipient : 2;
|
||||
UCHAR Reserved : 3;
|
||||
UCHAR Type : 2;
|
||||
UCHAR Direction : 1;
|
||||
} BM_REQ_TYPE, *PBM_REQ_TYPE;
|
||||
|
||||
typedef struct _SETUP_PACKET {
|
||||
|
||||
union {
|
||||
BM_REQ_TYPE bmReqType;
|
||||
UCHAR bmRequest;
|
||||
@@ -75,13 +73,12 @@ typedef struct _SETUP_PACKET {
|
||||
|
||||
} SETUP_PACKET, *PSETUP_PACKET;
|
||||
|
||||
#define USB_ISO_ID 0x4945
|
||||
#define USB_ISO_CMD_ASAP 0x8000
|
||||
#define USB_ISO_CMD_CURRENT_FRAME 0x8001
|
||||
#define USB_ISO_CMD_SET_FRAME 0x8002
|
||||
#define USB_ISO_ID 0x4945
|
||||
#define USB_ISO_CMD_ASAP 0x8000
|
||||
#define USB_ISO_CMD_CURRENT_FRAME 0x8001
|
||||
#define USB_ISO_CMD_SET_FRAME 0x8002
|
||||
|
||||
typedef struct _ISO_ADV_PARAMS {
|
||||
|
||||
USHORT isoId;
|
||||
USHORT isoCmd;
|
||||
|
||||
@@ -123,84 +120,189 @@ typedef struct _SET_TRANSFER_SIZE_INFO {
|
||||
ULONG TransferSize;
|
||||
} SET_TRANSFER_SIZE_INFO, *PSET_TRANSFER_SIZE_INFO;
|
||||
|
||||
|
||||
//
|
||||
// Macro to extract function out of the device io control code
|
||||
//
|
||||
#ifdef WIN_98_DDK
|
||||
#define DEVICE_TYPE_FROM_CTL_CODE(ctrlCode) (((ULONG)(ctrlCode & 0xffff0000)) >> 16)
|
||||
#define DEVICE_TYPE_FROM_CTL_CODE(ctrlCode) \
|
||||
(((ULONG)(ctrlCode & 0xffff0000)) >> 16)
|
||||
#endif
|
||||
#define FUNCTION_FROM_CTL_CODE(ctrlCode) (((ULONG)(ctrlCode & 0x00003FFC)) >> 2)
|
||||
#define ACCESS_FROM_CTL_CODE(ctrlCode) (((ULONG)(ctrlCode & 0x000C0000)) >> 14)
|
||||
//#define METHOD_FROM_CTL_CODE(ctrlCode) (((ULONG)(ctrlCode & 0x00000003)))
|
||||
|
||||
#define FUNCTION_FROM_CTL_CODE(ctrlCode) (((ULONG)(ctrlCode & 0x00003FFC)) >> 2)
|
||||
#define ACCESS_FROM_CTL_CODE(ctrlCode) (((ULONG)(ctrlCode & 0x000C0000)) >> 14)
|
||||
//#define METHOD_FROM_CTL_CODE(ctrlCode) (((ULONG)(ctrlCode &
|
||||
// 0x00000003)))
|
||||
|
||||
#define IOCTL_ADAPT_INDEX 0x0000
|
||||
|
||||
// Get the driver version
|
||||
#define IOCTL_ADAPT_GET_DRIVER_VERSION CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_GET_DRIVER_VERSION \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Get the current USBDI version
|
||||
#define IOCTL_ADAPT_GET_USBDI_VERSION CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+1, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_GET_USBDI_VERSION \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 1, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Get the current device alt interface settings from driver
|
||||
#define IOCTL_ADAPT_GET_ALT_INTERFACE_SETTING CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+2, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_GET_ALT_INTERFACE_SETTING \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 2, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Set the device interface and alt interface setting
|
||||
#define IOCTL_ADAPT_SELECT_INTERFACE CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+3, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_SELECT_INTERFACE \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 3, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Get device address from driver
|
||||
#define IOCTL_ADAPT_GET_ADDRESS CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+4, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_GET_ADDRESS \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 4, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Get number of endpoints for current interface and alt interface setting from driver
|
||||
#define IOCTL_ADAPT_GET_NUMBER_ENDPOINTS CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+5, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
// Get number of endpoints for current interface and alt interface setting from
|
||||
// driver
|
||||
#define IOCTL_ADAPT_GET_NUMBER_ENDPOINTS \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 5, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Get the current device power state
|
||||
#define IOCTL_ADAPT_GET_DEVICE_POWER_STATE CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+6, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_GET_DEVICE_POWER_STATE \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 6, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Set the device power state
|
||||
#define IOCTL_ADAPT_SET_DEVICE_POWER_STATE CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+7, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_SET_DEVICE_POWER_STATE \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 7, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Send a raw packet to endpoint 0
|
||||
#define IOCTL_ADAPT_SEND_EP0_CONTROL_TRANSFER CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+8, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_SEND_EP0_CONTROL_TRANSFER \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 8, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Send/receive data to/from nonep0
|
||||
#define IOCTL_ADAPT_SEND_NON_EP0_TRANSFER CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+9, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_SEND_NON_EP0_TRANSFER \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 9, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Simulate a disconnect/reconnect
|
||||
#define IOCTL_ADAPT_CYCLE_PORT CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+10, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_CYCLE_PORT \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 10, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Reset the pipe
|
||||
#define IOCTL_ADAPT_RESET_PIPE CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+11, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_RESET_PIPE \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 11, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Reset the device
|
||||
#define IOCTL_ADAPT_RESET_PARENT_PORT CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+12, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_RESET_PARENT_PORT \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 12, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Get the current transfer size of an endpoint (in number of bytes)
|
||||
#define IOCTL_ADAPT_GET_TRANSFER_SIZE CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+13, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_GET_TRANSFER_SIZE \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 13, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Set the transfer size of an endpoint (in number of bytes)
|
||||
#define IOCTL_ADAPT_SET_TRANSFER_SIZE CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+14, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_SET_TRANSFER_SIZE \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 14, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Return the name of the device
|
||||
#define IOCTL_ADAPT_GET_DEVICE_NAME CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+15, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_GET_DEVICE_NAME \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 15, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Return the "Friendly Name" of the device
|
||||
#define IOCTL_ADAPT_GET_FRIENDLY_NAME CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+16, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_GET_FRIENDLY_NAME \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 16, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Abort all outstanding transfers on the pipe
|
||||
#define IOCTL_ADAPT_ABORT_PIPE CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+17, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_ABORT_PIPE \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 17, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Send/receive data to/from nonep0 w/ direct buffer acccess (no buffering)
|
||||
#define IOCTL_ADAPT_SEND_NON_EP0_DIRECT CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+18, METHOD_NEITHER, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_SEND_NON_EP0_DIRECT \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 18, \
|
||||
METHOD_NEITHER, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Return device speed
|
||||
#define IOCTL_ADAPT_GET_DEVICE_SPEED CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+19, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_GET_DEVICE_SPEED \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 19, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
// Get the current USB frame number
|
||||
#define IOCTL_ADAPT_GET_CURRENT_FRAME CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+20, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define IOCTL_ADAPT_GET_CURRENT_FRAME \
|
||||
CTL_CODE( \
|
||||
FILE_DEVICE_UNKNOWN, \
|
||||
IOCTL_ADAPT_INDEX + 20, \
|
||||
METHOD_BUFFERED, \
|
||||
FILE_ANY_ACCESS)
|
||||
|
||||
#define NUMBER_OF_ADAPT_IOCTLS 21 // Last IOCTL_ADAPT_INDEX + 1
|
||||
|
||||
|
||||
#endif // __IOCTL_H__
|
||||
+127
-56
@@ -1,5 +1,5 @@
|
||||
#include <windows.h>
|
||||
#include <setupapi.h>
|
||||
#include <windows.h>
|
||||
|
||||
#include "ezusb/ezusb.h"
|
||||
|
||||
@@ -27,9 +27,16 @@
|
||||
|
||||
#define EP0_EZUSB_RAM_CPU_RESET_ADDR 0xE600
|
||||
|
||||
static int ezusb2_ctrl_transfer(HANDLE handle, uint32_t ioctl_code,
|
||||
uint8_t endpoint, uint8_t req_type, uint8_t req, uint16_t value,
|
||||
uint16_t index, void* buf, uint32_t buf_len)
|
||||
static int ezusb2_ctrl_transfer(
|
||||
HANDLE handle,
|
||||
uint32_t ioctl_code,
|
||||
uint8_t endpoint,
|
||||
uint8_t req_type,
|
||||
uint8_t req,
|
||||
uint16_t value,
|
||||
uint16_t index,
|
||||
void *buf,
|
||||
uint32_t buf_len)
|
||||
{
|
||||
int xmit_buf_size = sizeof(SINGLE_TRANSFER) + buf_len;
|
||||
char xmit_buf[xmit_buf_size];
|
||||
@@ -57,8 +64,15 @@ static int ezusb2_ctrl_transfer(HANDLE handle, uint32_t ioctl_code,
|
||||
memcpy(xmit_buf + sizeof(SINGLE_TRANSFER), buf, buf_len);
|
||||
}
|
||||
|
||||
if (!DeviceIoControl(handle, ioctl_code, xmit_buf, xmit_buf_size, xmit_buf,
|
||||
xmit_buf_size, &ret_len, NULL)) {
|
||||
if (!DeviceIoControl(
|
||||
handle,
|
||||
ioctl_code,
|
||||
xmit_buf,
|
||||
xmit_buf_size,
|
||||
xmit_buf,
|
||||
xmit_buf_size,
|
||||
&ret_len,
|
||||
NULL)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -69,23 +83,51 @@ static int ezusb2_ctrl_transfer(HANDLE handle, uint32_t ioctl_code,
|
||||
return ret_len - sizeof(SINGLE_TRANSFER);
|
||||
}
|
||||
|
||||
static int ezusb2_ep0_transfer(HANDLE handle, uint8_t req_type, uint8_t req,
|
||||
uint16_t value, uint16_t index, void* buf, uint32_t buf_len)
|
||||
static int ezusb2_ep0_transfer(
|
||||
HANDLE handle,
|
||||
uint8_t req_type,
|
||||
uint8_t req,
|
||||
uint16_t value,
|
||||
uint16_t index,
|
||||
void *buf,
|
||||
uint32_t buf_len)
|
||||
{
|
||||
return ezusb2_ctrl_transfer(handle, IOCTL_ADAPT_SEND_EP0_CONTROL_TRANSFER,
|
||||
REQ_CODE_EP0, req_type, req, value, index, buf, buf_len);
|
||||
return ezusb2_ctrl_transfer(
|
||||
handle,
|
||||
IOCTL_ADAPT_SEND_EP0_CONTROL_TRANSFER,
|
||||
REQ_CODE_EP0,
|
||||
req_type,
|
||||
req,
|
||||
value,
|
||||
index,
|
||||
buf,
|
||||
buf_len);
|
||||
}
|
||||
|
||||
/* Any other endpoint than 0 */
|
||||
static int ezusb2_epx_transfer(HANDLE handle, uint8_t endpoint,
|
||||
uint8_t req_type, uint8_t req, uint16_t value, uint16_t index,
|
||||
void* buf, uint32_t buf_len)
|
||||
static int ezusb2_epx_transfer(
|
||||
HANDLE handle,
|
||||
uint8_t endpoint,
|
||||
uint8_t req_type,
|
||||
uint8_t req,
|
||||
uint16_t value,
|
||||
uint16_t index,
|
||||
void *buf,
|
||||
uint32_t buf_len)
|
||||
{
|
||||
return ezusb2_ctrl_transfer(handle, IOCTL_ADAPT_SEND_NON_EP0_TRANSFER,
|
||||
endpoint, req_type, req, value, index, buf, buf_len);
|
||||
return ezusb2_ctrl_transfer(
|
||||
handle,
|
||||
IOCTL_ADAPT_SEND_NON_EP0_TRANSFER,
|
||||
endpoint,
|
||||
req_type,
|
||||
req,
|
||||
value,
|
||||
index,
|
||||
buf,
|
||||
buf_len);
|
||||
}
|
||||
|
||||
static char* ezusb2_get_device_name(HANDLE handle)
|
||||
static char *ezusb2_get_device_name(HANDLE handle)
|
||||
{
|
||||
const int len = 256;
|
||||
char buf[len];
|
||||
@@ -93,24 +135,37 @@ static char* ezusb2_get_device_name(HANDLE handle)
|
||||
|
||||
memset(&buf, 0, len);
|
||||
|
||||
if (!DeviceIoControl(handle, IOCTL_ADAPT_GET_FRIENDLY_NAME, &buf, len, &buf,
|
||||
len, &received, NULL)) {
|
||||
if (!DeviceIoControl(
|
||||
handle,
|
||||
IOCTL_ADAPT_GET_FRIENDLY_NAME,
|
||||
&buf,
|
||||
len,
|
||||
&buf,
|
||||
len,
|
||||
&received,
|
||||
NULL)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return str_dup((const char*) &buf);
|
||||
return str_dup((const char *) &buf);
|
||||
}
|
||||
|
||||
static bool ezusb2_get_device_descriptor(HANDLE handle,
|
||||
USB_DEVICE_DESCRIPTOR* desc)
|
||||
static bool
|
||||
ezusb2_get_device_descriptor(HANDLE handle, USB_DEVICE_DESCRIPTOR *desc)
|
||||
{
|
||||
int res;
|
||||
|
||||
memset(desc, 0, sizeof(USB_DEVICE_DESCRIPTOR));
|
||||
|
||||
/* 0: not used */
|
||||
res = ezusb2_ep0_transfer(handle, REQ_TYPE_DEV_TO_HOST, EP0_GET_DESCRIPTOR,
|
||||
EP0_DESCRIPTOR_TYPE_DEVICE, 0, desc, sizeof(USB_DEVICE_DESCRIPTOR));
|
||||
res = ezusb2_ep0_transfer(
|
||||
handle,
|
||||
REQ_TYPE_DEV_TO_HOST,
|
||||
EP0_GET_DESCRIPTOR,
|
||||
EP0_DESCRIPTOR_TYPE_DEVICE,
|
||||
0,
|
||||
desc,
|
||||
sizeof(USB_DEVICE_DESCRIPTOR));
|
||||
|
||||
if (res != sizeof(USB_DEVICE_DESCRIPTOR)) {
|
||||
return false;
|
||||
@@ -119,11 +174,17 @@ static bool ezusb2_get_device_descriptor(HANDLE handle,
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool ezusb2_write_ram(HANDLE handle, const void* buffer,
|
||||
uint16_t ram_offset, uint32_t size)
|
||||
static bool ezusb2_write_ram(
|
||||
HANDLE handle, const void *buffer, uint16_t ram_offset, uint32_t size)
|
||||
{
|
||||
return ezusb2_ep0_transfer(handle, REQ_TYPE_HOST_TO_DEV, EP0_EZUSB_WRITE_RAM,
|
||||
ram_offset, 0, (void*) buffer, size) == size;
|
||||
return ezusb2_ep0_transfer(
|
||||
handle,
|
||||
REQ_TYPE_HOST_TO_DEV,
|
||||
EP0_EZUSB_WRITE_RAM,
|
||||
ram_offset,
|
||||
0,
|
||||
(void *) buffer,
|
||||
size) == size;
|
||||
}
|
||||
|
||||
static bool ezusb2_reset(HANDLE handle, bool hold)
|
||||
@@ -133,32 +194,32 @@ static bool ezusb2_reset(HANDLE handle, bool hold)
|
||||
/* Write CPU state */
|
||||
flag = hold ? 1 : 0;
|
||||
|
||||
return ezusb2_write_ram(handle, &flag, EP0_EZUSB_RAM_CPU_RESET_ADDR,
|
||||
sizeof(uint8_t));
|
||||
return ezusb2_write_ram(
|
||||
handle, &flag, EP0_EZUSB_RAM_CPU_RESET_ADDR, sizeof(uint8_t));
|
||||
}
|
||||
|
||||
char* ezusb2_find(const GUID* guid)
|
||||
char *ezusb2_find(const GUID *guid)
|
||||
{
|
||||
HDEVINFO info;
|
||||
SP_DEVICE_INTERFACE_DATA iface;
|
||||
BOOL result;
|
||||
ULONG required_len;
|
||||
PSP_DEVICE_INTERFACE_DETAIL_DATA detail;
|
||||
ULONG length;
|
||||
char* res;
|
||||
PSP_DEVICE_INTERFACE_DETAIL_DATA detail;
|
||||
ULONG length;
|
||||
char *res;
|
||||
|
||||
log_assert(guid);
|
||||
|
||||
result = FALSE;
|
||||
required_len = 0;
|
||||
detail = NULL;
|
||||
detail = NULL;
|
||||
|
||||
info = SetupDiGetClassDevs(guid, NULL, NULL,
|
||||
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
|
||||
info = SetupDiGetClassDevs(
|
||||
guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
|
||||
|
||||
if (info == INVALID_HANDLE_VALUE) {
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Enum devices that support the GUID, get first only */
|
||||
memset(&iface, 0, sizeof(iface));
|
||||
@@ -175,17 +236,17 @@ char* ezusb2_find(const GUID* guid)
|
||||
know how much memory to allocate to get this information, so
|
||||
we will ask by passing in a null buffer and location to
|
||||
receive the size of the buffer needed. */
|
||||
result = SetupDiGetDeviceInterfaceDetail(info, &iface, NULL, 0,
|
||||
&required_len, NULL);
|
||||
result = SetupDiGetDeviceInterfaceDetail(
|
||||
info, &iface, NULL, 0, &required_len, NULL);
|
||||
|
||||
if (!required_len) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Okay, we got a size back, so let's allocate memory
|
||||
/* Okay, we got a size back, so let's allocate memory
|
||||
for the interface detail information we want. */
|
||||
detail = (PSP_DEVICE_INTERFACE_DETAIL_DATA) LocalAlloc(LMEM_FIXED,
|
||||
required_len);
|
||||
detail =
|
||||
(PSP_DEVICE_INTERFACE_DETAIL_DATA) LocalAlloc(LMEM_FIXED, required_len);
|
||||
|
||||
if (detail == NULL) {
|
||||
SetupDiDestroyDeviceInfoList(info);
|
||||
@@ -195,8 +256,8 @@ char* ezusb2_find(const GUID* guid)
|
||||
detail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
|
||||
length = required_len;
|
||||
|
||||
result = SetupDiGetDeviceInterfaceDetail(info, &iface, detail,
|
||||
length, &required_len, NULL);
|
||||
result = SetupDiGetDeviceInterfaceDetail(
|
||||
info, &iface, detail, length, &required_len, NULL);
|
||||
|
||||
if (!result) {
|
||||
SetupDiDestroyDeviceInfoList(info);
|
||||
@@ -204,7 +265,7 @@ char* ezusb2_find(const GUID* guid)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
res = str_dup((const char*) &detail->DevicePath);
|
||||
res = str_dup((const char *) &detail->DevicePath);
|
||||
LocalFree(detail);
|
||||
|
||||
SetupDiDestroyDeviceInfoList(info);
|
||||
@@ -212,17 +273,24 @@ char* ezusb2_find(const GUID* guid)
|
||||
return res;
|
||||
}
|
||||
|
||||
HANDLE ezusb2_open(const char* device_path)
|
||||
HANDLE
|
||||
ezusb2_open(const char *device_path)
|
||||
{
|
||||
log_assert(device_path);
|
||||
|
||||
return CreateFileA(device_path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
|
||||
OPEN_EXISTING, 0, NULL);
|
||||
return CreateFileA(
|
||||
device_path,
|
||||
GENERIC_WRITE,
|
||||
FILE_SHARE_WRITE,
|
||||
NULL,
|
||||
OPEN_EXISTING,
|
||||
0,
|
||||
NULL);
|
||||
}
|
||||
|
||||
bool ezusb2_get_ident(HANDLE handle, struct ezusb_ident* ident)
|
||||
bool ezusb2_get_ident(HANDLE handle, struct ezusb_ident *ident)
|
||||
{
|
||||
char* name;
|
||||
char *name;
|
||||
USB_DEVICE_DESCRIPTOR desc;
|
||||
|
||||
log_assert(handle != INVALID_HANDLE_VALUE);
|
||||
@@ -250,7 +318,7 @@ bool ezusb2_get_ident(HANDLE handle, struct ezusb_ident* ident)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ezusb2_download_firmware(HANDLE handle, struct ezusb_firmware* fw)
|
||||
bool ezusb2_download_firmware(HANDLE handle, struct ezusb_firmware *fw)
|
||||
{
|
||||
log_assert(handle != INVALID_HANDLE_VALUE);
|
||||
log_assert(handle);
|
||||
@@ -263,8 +331,11 @@ bool ezusb2_download_firmware(HANDLE handle, struct ezusb_firmware* fw)
|
||||
for (uint16_t i = 0; i < fw->segment_count; i++) {
|
||||
/* Important: Writing the full binary does NOT work on the FX2 device
|
||||
compared to the legacy ezusb device */
|
||||
if (!ezusb2_write_ram(handle, fw->segments[i]->data,
|
||||
fw->segments[i]->offset, fw->segments[i]->size)) {
|
||||
if (!ezusb2_write_ram(
|
||||
handle,
|
||||
fw->segments[i]->data,
|
||||
fw->segments[i]->offset,
|
||||
fw->segments[i]->size)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -276,8 +347,8 @@ bool ezusb2_download_firmware(HANDLE handle, struct ezusb_firmware* fw)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ezusb2_endpoint_transfer(HANDLE handle, uint8_t endpoint, void* data,
|
||||
uint32_t size)
|
||||
bool ezusb2_endpoint_transfer(
|
||||
HANDLE handle, uint8_t endpoint, void *data, uint32_t size)
|
||||
{
|
||||
if (endpoint == 0) {
|
||||
return false;
|
||||
|
||||
+22
-19
@@ -2,17 +2,17 @@
|
||||
* Module for fundamental communication with an Ezusb FX2 board, e.g.
|
||||
* IIDX/Pop'n IO2. Credit also goes to willxinc for his initial implemention
|
||||
* which, for some unknown reason, did not work on my machines.
|
||||
*
|
||||
*
|
||||
* This module does not implement any sort of higher level protocol which is
|
||||
* required by the games to exchange data with the device, e.g. getting input
|
||||
* states of keys and setting light outputs. Further modules are utilizing this
|
||||
* base layer to implement higher level communication.
|
||||
*
|
||||
*
|
||||
* Note: This module requires the newer "cyusb3" driver which is compatible
|
||||
* with WinXP, Win7, Win8 and Win10 (both 32 and 64-bit). The old "cyusb" driver
|
||||
* does NOT work with this.
|
||||
*
|
||||
* @author icex2, willxinc
|
||||
*
|
||||
* @author icex2, willxinc
|
||||
*/
|
||||
#ifndef EZUSB2_H
|
||||
#define EZUSB2_H
|
||||
@@ -27,62 +27,65 @@
|
||||
/**
|
||||
* GUID of Ezusb FX2 board
|
||||
*/
|
||||
static const GUID EZUSB2_GUID = {0xAE18AA60L, 0x7F6A, 0x11D4,
|
||||
static const GUID EZUSB2_GUID = {
|
||||
0xAE18AA60L,
|
||||
0x7F6A,
|
||||
0x11D4,
|
||||
{0x97, 0xDD, 0x00, 0x01, 0x02, 0x29, 0xB9, 0x59}};
|
||||
|
||||
/**
|
||||
* Scan for connected devices which match the provided GUID.
|
||||
*
|
||||
*
|
||||
* @param guid GUID of device to find.
|
||||
* @return Allocated device path string of first device found matching the GUID
|
||||
* provided. Caller has to free buffer.
|
||||
*/
|
||||
char* ezusb2_find(const GUID* guid);
|
||||
char *ezusb2_find(const GUID *guid);
|
||||
|
||||
/**
|
||||
* Open a connected Ezusb FX2 device.
|
||||
*
|
||||
* @param device_path Path to the Ezusb FX2 device obtained by using
|
||||
*
|
||||
* @param device_path Path to the Ezusb FX2 device obtained by using
|
||||
* the ezusb2_find function.
|
||||
* @return A valid handle to the device on success, INVALID_HANDLE_VALUE on
|
||||
* @return A valid handle to the device on success, INVALID_HANDLE_VALUE on
|
||||
* error.
|
||||
*/
|
||||
HANDLE ezusb2_open(const char* device_path);
|
||||
HANDLE ezusb2_open(const char *device_path);
|
||||
|
||||
/**
|
||||
* Get identifier information of the device.
|
||||
*
|
||||
*
|
||||
* @param handle Valid device handle.
|
||||
* @param ident Pointer to memory to write the identifier information to.
|
||||
* @return True if successful and identifier information was written to the
|
||||
* the struct, false on error.
|
||||
*/
|
||||
bool ezusb2_get_ident(HANDLE handle, struct ezusb_ident* ident);
|
||||
bool ezusb2_get_ident(HANDLE handle, struct ezusb_ident *ident);
|
||||
|
||||
/**
|
||||
* Download a firmware to the ezusb device.
|
||||
*
|
||||
*
|
||||
* @param handle Valid device handle.
|
||||
* @param fw Firmware to write to the target ezusb device.
|
||||
* @return True on success, false on failure.
|
||||
*/
|
||||
bool ezusb2_download_firmware(HANDLE handle, struct ezusb_firmware* fw);
|
||||
bool ezusb2_download_firmware(HANDLE handle, struct ezusb_firmware *fw);
|
||||
|
||||
/**
|
||||
* Execute a data transfer to a specific endpoint other than endpoint 0.
|
||||
*
|
||||
*
|
||||
* @param handle Valid device handle.
|
||||
* @param endpoint Target endpoint, in and out valid but not 0.
|
||||
* @param data Buffer with data to transfer or for data to receive.
|
||||
* @param size Size of buffer.
|
||||
* @return True on success, false on failure.
|
||||
*/
|
||||
bool ezusb2_endpoint_transfer(HANDLE handle, uint8_t endpoint, void* data,
|
||||
uint32_t size);
|
||||
bool ezusb2_endpoint_transfer(
|
||||
HANDLE handle, uint8_t endpoint, void *data, uint32_t size);
|
||||
|
||||
/**
|
||||
* Close an opened ezusb device handle.
|
||||
*
|
||||
*
|
||||
* @param handle Valid handle to close.
|
||||
*/
|
||||
void ezusb2_close(HANDLE handle);
|
||||
|
||||
Reference in New Issue
Block a user