Here's an updated version of the USB patch that works with WinHID on
Windows. I had to fix:
HID_WriteReport: MS compiler won't allow creation of a variable-sized
array on the stack, so I made the code new/delete it instead.
HID_ReadReport: tmp wasn't being allocated, and assigning to data
function parameter had no effect. I made the code read into the regular
return data location, then shift it down by 1 byte. Note that the dw
return parameter from ReadFile is always 0, so that can't be used.
I think that's it functionally. I did fix some formatting issues in a
couple places too.
Oh, and the diff was made using Cygwin, so you may have to run dos2unix
on it.
I tested:
-v -i
-k
-K
Connectivity file
Config update file
Firmware update file
Index: libconcord/hid.h
===================================================================
RCS file: /cvsroot/concordance/concordance/libconcord/hid.h,v
retrieving revision 1.5
diff -u -p -r1.5 hid.h
--- libconcord/hid.h 3 Apr 2008 07:01:46 -0000 1.5
+++ libconcord/hid.h 4 Apr 2008 07:05:50 -0000
@@ -40,6 +40,6 @@ void ShutdownUSB();
int FindRemote(THIDINFO &hid_info);
int HID_WriteReport(const uint8_t *data);
-int HID_ReadReport(uint8_t *data, unsigned int timeout=500);
+int HID_ReadReport(uint8_t *data, unsigned int timeout = 500);
#endif
Index: libconcord/libconcord.cpp
===================================================================
RCS file: /cvsroot/concordance/concordance/libconcord/libconcord.cpp,v
retrieving revision 1.24
diff -u -p -r1.24 libconcord.cpp
--- libconcord/libconcord.cpp 4 Apr 2008 05:21:03 -0000 1.24
+++ libconcord/libconcord.cpp 4 Apr 2008 07:05:51 -0000
@@ -1055,12 +1055,19 @@ int finish_firmware()
return LC_ERROR;
} else {
data[0] = 0x02;
- if ((err = rmt->WriteRam(0, 1, data)))
+ if ((err = rmt->WriteRam(0, 1, data))) {
+ debug("Failed to write 2 to RAM 0");
return LC_ERROR_WRITE;
- if ((err = rmt->ReadRam(0, 1, data)))
+ }
+ if ((err = rmt->ReadRam(0, 1, data))) {
+ debug("Failed to from RAM 0");
return LC_ERROR_WRITE;
- if (data[0] != 2)
+ }
+ if (data[0] != 2) {
+ printf("byte is %d\n",data[0]);
+ debug("Finalize byte didn't match");
return LC_ERROR_VERIFY;
+ }
}
return 0;
Index: libconcord/remote.cpp
===================================================================
RCS file: /cvsroot/concordance/concordance/libconcord/remote.cpp,v
retrieving revision 1.29
diff -u -p -r1.29 remote.cpp
--- libconcord/remote.cpp 3 Apr 2008 07:01:46 -0000 1.29
+++ libconcord/remote.cpp 4 Apr 2008 07:05:51 -0000
@@ -68,7 +68,7 @@ void make_serial(uint8_t *ser, TRemoteIn
int CRemote::Reset(uint8_t kind)
{
- uint8_t reset_cmd[] = { 0, COMMAND_RESET, kind };
+ uint8_t reset_cmd[] = { COMMAND_RESET, kind };
return HID_WriteReport(reset_cmd);
}
@@ -84,7 +84,7 @@ int CRemote::GetIdentity(TRemoteInfo &ri
int err = 0;
uint32_t cb_count = 0;
- const uint8_t qid[] = { 0x00, COMMAND_GET_VERSION };
+ const uint8_t qid[] = { COMMAND_GET_VERSION };
if ((err = HID_WriteReport(qid))) {
debug("Failed to write to remote");
@@ -100,31 +100,31 @@ int CRemote::GetIdentity(TRemoteInfo &ri
/*
* See specs/protocol.txt for format
*/
- const unsigned int rx_len = rsp[1] & 0x0F;
+ const unsigned int rx_len = rsp[0] & 0x0F;
- if ((rsp[1] & 0xF0) != RESPONSE_VERSION_DATA ||
+ if ((rsp[0] & 0xF0) != RESPONSE_VERSION_DATA ||
(rx_len != 7 && rx_len != 5)) {
debug("Bogus ident response: %02X", rsp[1]);
return LC_ERROR_INVALID_DATA_FROM_REMOTE;
}
- ri.fw_ver_major = rsp[2] >> 4;
- ri.fw_ver_minor = rsp[2] & 0x0F;
- ri.hw_ver_major = rsp[3] >> 4;
- ri.hw_ver_minor = rsp[3] & 0x0F;
- ri.flash_id = rsp[4];
- ri.flash_mfg = rsp[5];
- ri.architecture = rx_len < 6 ? 2 : rsp[6] >> 4;
- ri.fw_type = rx_len < 6 ? 0 : rsp[6] & 0x0F;
- ri.skin = rx_len < 6 ? 2 : rsp[7];
- ri.protocol = rx_len < 7 ? 0 : rsp[8];
+ ri.fw_ver_major = rsp[1] >> 4;
+ ri.fw_ver_minor = rsp[1] & 0x0F;
+ ri.hw_ver_major = rsp[2] >> 4;
+ ri.hw_ver_minor = rsp[2] & 0x0F;
+ ri.flash_id = rsp[3];
+ ri.flash_mfg = rsp[4];
+ ri.architecture = rx_len < 6 ? 2 : rsp[5] >> 4;
+ ri.fw_type = rx_len < 6 ? 0 : rsp[5] & 0x0F;
+ ri.skin = rx_len < 6 ? 2 : rsp[6];
+ ri.protocol = rx_len < 7 ? 0 : rsp[7];
setup_ri_pointers(ri);
- //printf("Reading Flash... ");
uint8_t rd[1024];
if ((err=ReadFlash(ri.arch->config_base, 1024, rd, ri.protocol,
false))) {
+ debug("Error reading first k of config data");
return LC_ERROR_READ;
}
if (cb) {
@@ -162,6 +162,7 @@ int CRemote::GetIdentity(TRemoteInfo &ri
COMMAND_MISC_EEPROM, rsp)
// All newer models store it in Flash
: ReadFlash(FLASH_SERIAL_ADDR, 48, rsp, ri.protocol))) {
+ debug("Couldn't read serial\n");
return LC_ERROR_READ;
}
@@ -204,16 +205,15 @@ int CRemote::ReadFlash(uint32_t addr, co
do {
static uint8_t cmd[8];
- cmd[0] = 0;
- cmd[1] = COMMAND_READ_FLASH | 0x05;
- cmd[2] = (addr >> 16) & 0xFF;
- cmd[3] = (addr >> 8) & 0xFF;
- cmd[4] = addr & 0xFF;
+ cmd[0] = COMMAND_READ_FLASH | 0x05;
+ cmd[1] = (addr >> 16) & 0xFF;
+ cmd[2] = (addr >> 8) & 0xFF;
+ cmd[3] = addr & 0xFF;
unsigned int chunk_len = end-addr;
if (chunk_len > max_chunk_len)
chunk_len = max_chunk_len;
- cmd[5] = (chunk_len >> 8) & 0xFF;
- cmd[6] = chunk_len & 0xFF;
+ cmd[4] = (chunk_len >> 8) & 0xFF;
+ cmd[5] = chunk_len & 0xFF;
if ((err = HID_WriteReport(cmd)))
break;
@@ -225,26 +225,27 @@ int CRemote::ReadFlash(uint32_t addr, co
if ((err = HID_ReadReport(rsp)))
break;
- const uint8_t r = rsp[1]&COMMAND_MASK;
+ const uint8_t r = rsp[0] & COMMAND_MASK;
if (r == RESPONSE_READ_FLASH_DATA) {
- if (seq != rsp[2]) {
+ if (seq != rsp[1]) {
err = LC_ERROR;
debug("Invalid sequence %02X %02x",
- seq, rsp[2]);
+ seq, rsp[1]);
break;
}
- seq+=0x11;
+ seq += 0x11;
const unsigned int rxlen =
- rxlenmap[rsp[1] & LENGTH_MASK];
+ rxlenmap[rsp[0] & LENGTH_MASK];
if (rxlen) {
if (verify) {
- if (memcmp(pr, rsp+3, rxlen)) {
+ if (memcmp(pr, rsp+2, rxlen)) {
+ debug("Verify fail");
err = LC_ERROR_VERIFY;
break;
}
} else {
- memcpy(pr, rsp+3, rxlen);
+ memcpy(pr, rsp+2, rxlen);
}
pr += rxlen;
addr += rxlen;
@@ -253,7 +254,7 @@ int CRemote::ReadFlash(uint32_t addr, co
} else if (r == RESPONSE_DONE) {
break;
} else {
- debug("Invalid response [%02X]", rsp[1]);
+ debug("Invalid response [%02X]", rsp[0]);
err = LC_ERROR;
}
} while (err == 0);
@@ -268,7 +269,7 @@ int CRemote::ReadFlash(uint32_t addr, co
int CRemote::InvalidateFlash(void)
{
- const uint8_t ivf[]={ 0x00, COMMAND_WRITE_MISC | 0x01,
+ const uint8_t ivf[]={ COMMAND_WRITE_MISC | 0x01,
COMMAND_MISC_INVALIDATE_FLASH };
int err;
@@ -279,8 +280,8 @@ int CRemote::InvalidateFlash(void)
if ((err = HID_ReadReport(rsp)))
return err;
- if ((rsp[1] & COMMAND_MASK) != RESPONSE_DONE ||
- (rsp[2] & COMMAND_MASK) != COMMAND_WRITE_MISC) {
+ if ((rsp[0] & COMMAND_MASK) != RESPONSE_DONE ||
+ (rsp[1] & COMMAND_MASK) != COMMAND_WRITE_MISC) {
return 1;
}
@@ -319,11 +320,10 @@ int CRemote::EraseFlash(uint32_t addr, u
for (uint32_t i = 0; i < num_sectors; i++) {
static uint8_t erase_cmd[8];
- erase_cmd[0] = 0;
- erase_cmd[1] = COMMAND_ERASE_FLASH;
- erase_cmd[2] = (sector_begin >> 16) & 0xFF;
- erase_cmd[3] = (sector_begin >> 8) & 0xFF;
- erase_cmd[4] = sector_begin & 0xFF;
+ erase_cmd[0] = COMMAND_ERASE_FLASH;
+ erase_cmd[1] = (sector_begin >> 16) & 0xFF;
+ erase_cmd[2] = (sector_begin >> 8) & 0xFF;
+ erase_cmd[3] = sector_begin & 0xFF;
if ((err = HID_WriteReport(erase_cmd)))
break;
@@ -383,16 +383,15 @@ int CRemote::WriteFlash(uint32_t addr, c
do {
static uint8_t write_setup_cmd[8];
- write_setup_cmd[0] = 0;
- write_setup_cmd[1] = COMMAND_WRITE_FLASH | 0x05;
- write_setup_cmd[2] = (addr >> 16) & 0xFF;
- write_setup_cmd[3] = (addr >> 8) & 0xFF;
- write_setup_cmd[4] = addr & 0xFF;
+ write_setup_cmd[0] = COMMAND_WRITE_FLASH | 0x05;
+ write_setup_cmd[1] = (addr >> 16) & 0xFF;
+ write_setup_cmd[2] = (addr >> 8) & 0xFF;
+ write_setup_cmd[3] = addr & 0xFF;
uint32_t chunk_len = end - addr;
if (chunk_len > max_chunk_len)
chunk_len = max_chunk_len;
- write_setup_cmd[5] = (chunk_len >> 8) & 0xFF;
- write_setup_cmd[6] = chunk_len & 0xFF;
+ write_setup_cmd[4] = (chunk_len >> 8) & 0xFF;
+ write_setup_cmd[5] = chunk_len & 0xFF;
if ((err = HID_WriteReport(write_setup_cmd)))
break;
@@ -406,9 +405,8 @@ int CRemote::WriteFlash(uint32_t addr, c
}
unsigned int block_len = txlenmap[i];
uint8_t wd[68];
- wd[0] = 0;
- wd[1] = COMMAND_WRITE_FLASH_DATA | n;
- memcpy(wd+2, pw, block_len);
+ wd[0] = COMMAND_WRITE_FLASH_DATA | n;
+ memcpy(wd+1, pw, block_len);
HID_WriteReport(wd);
pw += block_len;
addr += block_len;
@@ -416,7 +414,7 @@ int CRemote::WriteFlash(uint32_t addr, c
chunk_len -= block_len;
}
- uint8_t end_cmd[3] = { 0, COMMAND_DONE, COMMAND_WRITE_FLASH };
+ uint8_t end_cmd[] = { COMMAND_DONE, COMMAND_WRITE_FLASH };
HID_WriteReport(end_cmd);
uint8_t rsp[68];
@@ -433,10 +431,10 @@ int CRemote::WriteFlash(uint32_t addr, c
int CRemote::ReadMiscByte(uint8_t addr, uint32_t len, uint8_t kind, uint8_t
*rd)
{
- uint8_t rmb[] = { 0, COMMAND_READ_MISC | 0x02, kind, 0 };
+ uint8_t rmb[] = { COMMAND_READ_MISC | 0x02, kind, 0 };
while (len--) {
- rmb[3] = addr++;
+ rmb[2] = addr++;
int err;
if ((err = HID_WriteReport(rmb)))
@@ -446,22 +444,22 @@ int CRemote::ReadMiscByte(uint8_t addr,
if ((err = HID_ReadReport(rsp)))
return err;
- if (rsp[1] != (RESPONSE_READ_MISC_DATA | 0x02) ||
- rsp[2] != kind)
+ if (rsp[0] != (RESPONSE_READ_MISC_DATA | 0x02) ||
+ rsp[1] != kind)
return 1;
- *rd++ = rsp[3];
+ *rd++ = rsp[2];
}
return 0;
}
int CRemote::ReadMiscWord(uint16_t addr, uint32_t len, uint8_t kind, uint16_t
*rd)
{
- uint8_t rmw[] = { 0, COMMAND_READ_MISC | 0x03, kind, 0, 0 };
+ uint8_t rmw[] = { COMMAND_READ_MISC | 0x03, kind, 0, 0 };
while (len--) {
- rmw[3] = addr >> 8;
- rmw[4] = addr & 0xFF;
+ rmw[2] = addr >> 8;
+ rmw[3] = addr & 0xFF;
++addr;
int err;
@@ -473,12 +471,12 @@ int CRemote::ReadMiscWord(uint16_t addr,
return err;
// WARNING: The 880 responds with C2 rather than C3
- if ((rsp[1] & COMMAND_MASK) != RESPONSE_READ_MISC_DATA ||
- rsp[2] != kind) {
+ if ((rsp[0] & COMMAND_MASK) != RESPONSE_READ_MISC_DATA ||
+ rsp[1] != kind) {
return 1;
}
- *rd++ = (rsp[3] << 8) | rsp[4];
+ *rd++ = (rsp[2] << 8) | rsp[3];
}
return 0;
}
@@ -486,13 +484,12 @@ int CRemote::ReadMiscWord(uint16_t addr,
int CRemote::WriteMiscByte(uint8_t addr, uint32_t len, uint8_t kind, uint8_t
*wr)
{
uint8_t wmb[8];
- wmb[0] = 0;
- wmb[1] = COMMAND_WRITE_MISC | 0x03;
- wmb[2] = kind;
+ wmb[0] = COMMAND_WRITE_MISC | 0x03;
+ wmb[1] = kind;
while (len--) {
- wmb[3] = addr++;
- wmb[4] = *wr++;
+ wmb[2] = addr++;
+ wmb[3] = *wr++;
int err;
if ((err = HID_WriteReport(wmb)))
@@ -501,8 +498,8 @@ int CRemote::WriteMiscByte(uint8_t addr,
uint8_t rsp[68];
if ((err = HID_ReadReport(rsp)))
return err;
- if ((rsp[1] & COMMAND_MASK) != RESPONSE_DONE ||
- rsp[2] != COMMAND_WRITE_MISC) {
+ if ((rsp[0] & COMMAND_MASK) != RESPONSE_DONE ||
+ rsp[1] != COMMAND_WRITE_MISC) {
return 1;
}
}
@@ -512,16 +509,15 @@ int CRemote::WriteMiscByte(uint8_t addr,
int CRemote::WriteMiscWord(uint16_t addr, uint32_t len, uint8_t kind, uint16_t
*wr)
{
uint8_t wmw[8];
- wmw[0] = 0;
- wmw[1] = COMMAND_WRITE_MISC | 0x05;
- wmw[2] = kind;
+ wmw[0] = COMMAND_WRITE_MISC | 0x05;
+ wmw[1] = kind;
while (len--) {
- wmw[3] = addr >> 8;
- wmw[4] = addr & 0xFF;
+ wmw[2] = addr >> 8;
+ wmw[3] = addr & 0xFF;
++addr;
- wmw[5] = *wr >> 8;
- wmw[6] = *wr & 0xFF;
+ wmw[4] = *wr >> 8;
+ wmw[5] = *wr & 0xFF;
++wr;
int err;
@@ -531,8 +527,8 @@ int CRemote::WriteMiscWord(uint16_t addr
uint8_t rsp[68];
if ((err = HID_ReadReport(rsp)))
return err;
- if ((rsp[1] & COMMAND_MASK) != RESPONSE_DONE ||
- rsp[2] != COMMAND_WRITE_MISC) {
+ if ((rsp[0] & COMMAND_MASK) != RESPONSE_DONE ||
+ rsp[1] != COMMAND_WRITE_MISC) {
return 1;
}
}
@@ -605,7 +601,7 @@ int CRemote::SetTime(const TRemoteInfo &
// Send Recalc Clock command for 880 only (not 360/520/550)
if (ri.architecture == 8) {
- static const uint8_t rcc[] = { 0,
+ static const uint8_t rcc[] = {
COMMAND_WRITE_MISC | 0x01,
COMMAND_MISC_CLOCK_RECALCULATE };
err = HID_WriteReport(rcc);
@@ -645,7 +641,7 @@ int handle_ir_response(uint8_t rsp[64],
const unsigned int len = rsp[64];
if ((len & 1) == 0) {
for (unsigned int u = 2; u < len; u += 2) {
- const unsigned int t = rsp[1+u] << 8 | rsp[2+u];
+ const unsigned int t = rsp[0+u] << 8 | rsp[1+u];
if (ir_word > 2) {
/*
* For ODD words, t is the total time, we'll
@@ -728,7 +724,7 @@ int CRemote::LearnIR(string *learn_strin
int err = 0;
uint8_t rsp[68];
- const static uint8_t start_ir_learn[] = { 0, COMMAND_START_IRCAP };
+ const static uint8_t start_ir_learn[] = { COMMAND_START_IRCAP };
if ((err = HID_WriteReport(start_ir_learn)))
return err;
@@ -752,9 +748,9 @@ int CRemote::LearnIR(string *learn_strin
while (err == 0 && t_off < 500000) {
if ((err = HID_ReadReport(rsp, ir_word ? 500 : 4000)))
break;
- const uint8_t r = rsp[1] & COMMAND_MASK;
+ const uint8_t r = rsp[0] & COMMAND_MASK;
if (r == RESPONSE_IRCAP_DATA) {
- if (!check_seq(rsp[2], seq)) {
+ if (!check_seq(rsp[1], seq)) {
err = 1;
break;
}
@@ -784,13 +780,13 @@ int CRemote::LearnIR(string *learn_strin
if (pulse_count < MAX_PULSE_COUNT)
pulses[pulse_count++] = t_off;
- const static uint8_t stop_ir_learn[] = { 0x00, COMMAND_STOP_IRCAP };
+ const static uint8_t stop_ir_learn[] = { COMMAND_STOP_IRCAP };
HID_WriteReport(stop_ir_learn);
/* read returned RESPONSE_DONE, otherwise next command wil fail! */
err = HID_ReadReport(rsp);
if (err == 0) {
- if ((rsp[1] & COMMAND_MASK) != RESPONSE_DONE) {
+ if ((rsp[0] & COMMAND_MASK) != RESPONSE_DONE) {
err = 1;
}
}
Index: libconcord/libusb/libusbhid.cpp
===================================================================
RCS file: /cvsroot/concordance/concordance/libconcord/libusb/libusbhid.cpp,v
retrieving revision 1.15
diff -u -p -r1.15 libusbhid.cpp
--- libconcord/libusb/libusbhid.cpp 3 Apr 2008 07:01:46 -0000 1.15
+++ libconcord/libusb/libusbhid.cpp 4 Apr 2008 07:05:51 -0000
@@ -207,7 +207,7 @@ int HID_WriteReport(const uint8_t *data)
* every command, so we data+1 here to skip that.
*/
const int err=usb_interrupt_write(h_hid, ep_write,
- reinterpret_cast<char *>(const_cast<uint8_t*>(data+1)),
+ reinterpret_cast<char *>(const_cast<uint8_t*>(data)),
orl, 500);
if (err < 0) {
@@ -222,7 +222,7 @@ int HID_WriteReport(const uint8_t *data)
int HID_ReadReport(uint8_t *data, unsigned int timeout)
{
const int err=usb_interrupt_read(h_hid, ep_read,
- reinterpret_cast<char *>(data+1), irl, timeout);
+ reinterpret_cast<char *>(data), irl, timeout);
if (err < 0) {
debug("Failed to read from device: %d (%s)", err,
Index: libconcord/win/winhid.cpp
===================================================================
RCS file: /cvsroot/concordance/concordance/libconcord/win/winhid.cpp,v
retrieving revision 1.8
diff -u -p -r1.8 winhid.cpp
--- libconcord/win/winhid.cpp 3 Apr 2008 07:01:46 -0000 1.8
+++ libconcord/win/winhid.cpp 4 Apr 2008 07:05:52 -0000
@@ -43,71 +43,95 @@ int InitUSB()
{
debug("Using Windows HID stack");
- ol.Offset=ol.OffsetHigh=0;
- ol.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
+ ol.Offset = ol.OffsetHigh = 0;
+ ol.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
return LinkUSB();
}
void ShutdownUSB()
{
- if(h_hid) {
+ if (h_hid) {
CloseHandle(h_hid);
- h_hid=NULL;
+ h_hid = NULL;
}
UnlinkUSB();
CloseHandle(ol.hEvent);
- ol.hEvent=NULL;
+ ol.hEvent = NULL;
}
int FindRemote(THIDINFO &hid_info)
{
- if(h_hid) { CloseHandle(h_hid); h_hid=NULL; }
+ if (h_hid) {
+ CloseHandle(h_hid);
+ h_hid=NULL;
+ }
GUID guid;
HidD_GetHidGuid(&guid);
- const HDEVINFO HardwareDeviceInfo = rtlSetupDiGetClassDevs (
+ const HDEVINFO HardwareDeviceInfo = rtlSetupDiGetClassDevs(
&guid,
- NULL, // Define no
enumerator (global)
- NULL, // Define no
parent window
- (DIGCF_PRESENT | // Only Devices present
- DIGCF_DEVICEINTERFACE)); // Function class devices.
+ // Define no enumerator (global)
+ NULL,
+ // Define no parent window
+ NULL,
+ // Only Devices present
+ (DIGCF_PRESENT |
+ // Function class devices.
+ DIGCF_DEVICEINTERFACE));
/*
- SetupDiEnumDeviceInterfaces() returns information about device
interfaces
- exposed by one or more devices. Each call returns information
about one interface;
- the routine can be called repeatedly to get information about
several interfaces
- exposed by one or more devices.
- */
- if(HardwareDeviceInfo!=INVALID_HANDLE_VALUE) {
+ * SetupDiEnumDeviceInterfaces() returns information about device
+ * interfaces exposed by one or more devices. Each call returns
+ * information about one interface; the routine can be called repeatedly
+ * to get information about several interfaces exposed by one or more
+ * devices.
+ */
+ if (HardwareDeviceInfo != INVALID_HANDLE_VALUE) {
SP_DEVICE_INTERFACE_DATA DeviceInfoData;
- DeviceInfoData.cbSize = sizeof (SP_DEVICE_INTERFACE_DATA);
- int i=0;
- while(rtlSetupDiEnumDeviceInterfaces(HardwareDeviceInfo, 0,
&guid, i, &DeviceInfoData)) {
+ DeviceInfoData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
+ int i = 0;
+ while (rtlSetupDiEnumDeviceInterfaces(HardwareDeviceInfo, 0,
+ &guid, i, &DeviceInfoData)) {
- TRACE1("\n\nInterface # %i\n",i);
+ TRACE1("\n\nInterface # %i\n", i);
ULONG device_data_length = 0;
rtlSetupDiGetDeviceInterfaceDetail(
HardwareDeviceInfo,
&DeviceInfoData,
- NULL, // probing so no output buffer yet
- 0, // probing so output buffer
length of zero
+ // probing so no output buffer yet
+ NULL,
+ // probing so output buffer length of zero
+ 0,
&device_data_length,
- NULL); // not interested in the specific
dev-node
-
- PSP_DEVICE_INTERFACE_DETAIL_DATA
functionClassDeviceData=
-
(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(device_data_length);
- if(functionClassDeviceData==NULL) return FALSE;
-
functionClassDeviceData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
// This is correct - strange but true
-
- ULONG required_length=0;
+ // not interested in the specific dev-node
+ NULL);
-
if(!rtlSetupDiGetDeviceInterfaceDetail(HardwareDeviceInfo, &DeviceInfoData,
functionClassDeviceData,
- device_data_length, &required_length, NULL) ||
(device_data_length < required_length)) {
+ PSP_DEVICE_INTERFACE_DETAIL_DATA
+ functionClassDeviceData =
+ (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(
+ device_data_length);
+
+ if (functionClassDeviceData == NULL)
+ return FALSE;
+
+ // This is correct - strange but true
+ functionClassDeviceData->cbSize =
+ sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
+
+ ULONG required_length = 0;
+
+ if (!rtlSetupDiGetDeviceInterfaceDetail(
+ HardwareDeviceInfo, &DeviceInfoData,
+ functionClassDeviceData,
+ device_data_length, &required_length,
+ NULL) ||
+ (device_data_length < required_length))
+ {
TRACE0("Call to SetupDiGetDeviceInterfaceDetail
failed!\n");
@@ -116,7 +140,8 @@ int FindRemote(THIDINFO &hid_info)
return -1;
}
- TRACE1("Attempting to open %s\n",
functionClassDeviceData->DevicePath);
+ TRACE1("Attempting to open %s\n",
+ functionClassDeviceData->DevicePath);
const HANDLE h = CreateFile(
functionClassDeviceData->DevicePath,
@@ -127,29 +152,38 @@ int FindRemote(THIDINFO &hid_info)
0,
NULL);
- if(h==INVALID_HANDLE_VALUE) {
- TRACE1( "FAILED to open %s\n",
functionClassDeviceData->DevicePath);
+ if (h == INVALID_HANDLE_VALUE) {
+ TRACE1("FAILED to open %s\n",
+ functionClassDeviceData->DevicePath);
} else {
HIDD_ATTRIBUTES attr;
HidD_GetAttributes(h,&attr);
- TRACE1(" Vendor ID:
%04X\n",attr.VendorID);
- TRACE1(" Product ID:
%04X\n",attr.ProductID);
- TRACE1(" Version Number:
%04X\n",attr.VersionNumber);
-
- if((attr.VendorID==0x046D &&
attr.ProductID>=0xC110 && attr.ProductID<=0xC14F) ||
- (attr.VendorID==0x0400 &&
attr.ProductID==0xC359)) {
+ TRACE1(" Vendor ID: %04X\n",
attr.VendorID);
+ TRACE1(" Product ID: %04X\n",
attr.ProductID);
+ TRACE1(" Version Number: %04X\n",
attr.VersionNumber);
+
+ if ((attr.VendorID == 0x046D
+ && attr.ProductID >= 0xC110
+ && attr.ProductID<=0xC14F)
+ || (attr.VendorID==0x0400
+ && attr.ProductID==0xC359)) {
WCHAR s[127];
char ts[128];
- HidD_GetManufacturerString(h, s,
sizeof(s));
-
WideCharToMultiByte(CP_ACP,0,s,-1,ts,sizeof(ts),NULL,NULL);
- TRACE1(" Manufacturer String:
%s\n",ts);
- hid_info.mfg=ts;
+ HidD_GetManufacturerString(h, s,
+ sizeof(s));
+ WideCharToMultiByte(CP_ACP, 0, s, -1,
+ ts, sizeof(ts), NULL, NULL);
+ TRACE1(" Manufacturer String: %s\n",
+ ts);
+ hid_info.mfg = ts;
HidD_GetProductString(h, s, sizeof(s));
-
WideCharToMultiByte(CP_ACP,0,s,-1,ts,sizeof(ts),NULL,NULL);
- TRACE1(" Product String:
%s\n",ts);
- hid_info.prod=ts;
+ WideCharToMultiByte(CP_ACP, 0, s, -1,
+ ts, sizeof(ts), NULL, NULL);
+ TRACE1(" Product String: %s\n",
+ ts);
+ hid_info.prod = ts;
#if 0
HidD_GetSerialNumberString(h, s,
sizeof(s));
@@ -164,33 +198,46 @@ int FindRemote(THIDINFO &hid_info)
#endif
PHIDP_PREPARSED_DATA ppd;
- HidD_GetPreparsedData(h,&ppd);
- UINT u=HidP_GetCaps(ppd,&caps);
+ HidD_GetPreparsedData(h, &ppd);
+ UINT u=HidP_GetCaps(ppd, &caps);
HidD_FreePreparsedData(ppd);
- TRACE1(" Input Report Length:
%i\n",caps.InputReportByteLength);
- TRACE1(" Output Report Length:
%i\n",caps.OutputReportByteLength);
- TRACE1("Feature Report Length:
%i\n",caps.FeatureReportByteLength);
- TRACE1(" LinkCollectionNodes:
%i\n",caps.NumberLinkCollectionNodes);
- TRACE1(" InputButtonCaps:
%i\n",caps.NumberInputButtonCaps);
- TRACE1(" InputValueCaps:
%i\n",caps.NumberInputValueCaps);
- TRACE1(" InputDataIndices:
%i\n",caps.NumberInputDataIndices);
- TRACE1(" OutputButtonCaps:
%i\n",caps.NumberOutputButtonCaps);
- TRACE1(" OutputValueCaps:
%i\n",caps.NumberOutputValueCaps);
- TRACE1(" OutputDataIndices:
%i\n",caps.NumberOutputDataIndices);
- TRACE1(" FeatureButtonCaps:
%i\n",caps.NumberFeatureButtonCaps);
- TRACE1(" FeatureValueCaps:
%i\n",caps.NumberFeatureValueCaps);
- TRACE1(" FeatureDataIndices:
%i\n",caps.NumberFeatureDataIndices);
+ TRACE1(" Input Report Length: %i\n",
+ caps.InputReportByteLength);
+ TRACE1(" Output Report Length: %i\n",
+ caps.OutputReportByteLength);
+ TRACE1("Feature Report Length: %i\n",
+ caps.FeatureReportByteLength);
+ TRACE1(" LinkCollectionNodes: %i\n",
+ caps.NumberLinkCollectionNodes);
+ TRACE1(" InputButtonCaps: %i\n",
+ caps.NumberInputButtonCaps);
+ TRACE1(" InputValueCaps: %i\n",
+ caps.NumberInputValueCaps);
+ TRACE1(" InputDataIndices: %i\n",
+ caps.NumberInputDataIndices);
+ TRACE1(" OutputButtonCaps: %i\n",
+ caps.NumberOutputButtonCaps);
+ TRACE1(" OutputValueCaps: %i\n",
+ caps.NumberOutputValueCaps);
+ TRACE1(" OutputDataIndices: %i\n",
+ caps.NumberOutputDataIndices);
+ TRACE1(" FeatureButtonCaps: %i\n",
+ caps.NumberFeatureButtonCaps);
+ TRACE1(" FeatureValueCaps: %i\n",
+ caps.NumberFeatureValueCaps);
+ TRACE1(" FeatureDataIndices: %i\n",
+ caps.NumberFeatureDataIndices);
CloseHandle(h);
- hid_info.vid=attr.VendorID;
- hid_info.pid=attr.ProductID;
- hid_info.ver=attr.VersionNumber;
-
- hid_info.irl=caps.InputReportByteLength;
-
hid_info.orl=caps.OutputReportByteLength;
-
hid_info.frl=caps.FeatureReportByteLength;
+ hid_info.vid = attr.VendorID;
+ hid_info.pid = attr.ProductID;
+ hid_info.ver = attr.VersionNumber;
+
+ hid_info.irl =
caps.InputReportByteLength;
+ hid_info.orl =
caps.OutputReportByteLength;
+ hid_info.frl =
caps.FeatureReportByteLength;
h_hid = CreateFile(
functionClassDeviceData->DevicePath,
@@ -203,7 +250,8 @@ int FindRemote(THIDINFO &hid_info)
free(functionClassDeviceData);
- return
(h_hid==INVALID_HANDLE_VALUE)?-2:0;
+ return (h_hid == INVALID_HANDLE_VALUE)
+ ? -2 : 0;
}
CloseHandle(h);
@@ -215,7 +263,7 @@ int FindRemote(THIDINFO &hid_info)
++i;
}
- TRACE1("Interface enum ended with error %u\n",GetLastError());
+ TRACE1("Interface enum ended with error %u\n", GetLastError());
// SetupDiDestroyDeviceInfoList() destroys a device information
set and frees all associated memory.
rtlSetupDiDestroyDeviceInfoList(HardwareDeviceInfo);
@@ -228,54 +276,68 @@ int FindRemote(THIDINFO &hid_info)
int HID_WriteReport(const uint8_t *data)
{
- DWORD err,dw;
- if (!WriteFile(h_hid,data,caps.OutputReportByteLength,&dw,&ol)) {
+ DWORD err, dw;
+ BOOL ret;
+ uint8_t *windata = new uint8_t[caps.OutputReportByteLength];
+
+ // Add an initial 0-byte for the Windows USB stack
+ windata[0] = 0;
+ memcpy(windata + 1, data, caps.OutputReportByteLength - 1);
+ ret = WriteFile(h_hid, windata, caps.OutputReportByteLength, &dw, &ol);
+ if (!ret) {
err = GetLastError();
if (err != ERROR_IO_PENDING) {
+ delete[] windata;
debug("WriteFile() failed with error %i", err);
return err;
}
}
- const DWORD ws=WaitForSingleObject(ol.hEvent,500);
+ const DWORD ws = WaitForSingleObject(ol.hEvent, 500);
- if (ws==WAIT_TIMEOUT) {
+ if (ws == WAIT_TIMEOUT) {
debug("Write failed to complete within alloted time");
CancelIo(h_hid);
- err=1;
- } else if(ws!=WAIT_OBJECT_0) {
+ err = 1;
+ } else if(ws != WAIT_OBJECT_0) {
debug("Wait failed with code %i", ws);
- err=2;
+ err = 2;
} else {
- err=0;
+ err = 0;
}
+ delete[] windata;
return err;
}
int HID_ReadReport(uint8_t *data, unsigned int timeout)
{
- DWORD err,dw;
- if(!ReadFile(h_hid,data,caps.InputReportByteLength,&dw,&ol)) {
- err=GetLastError();
- if(err!=ERROR_IO_PENDING) {
+ DWORD err, dw;
+
+ if(!ReadFile(h_hid, data, caps.InputReportByteLength, &dw, &ol)) {
+ err = GetLastError();
+ if(err != ERROR_IO_PENDING) {
debug("ReadFile() failed with error %i", err);
return err;
}
}
- const DWORD ws=WaitForSingleObject(ol.hEvent,timeout);
+ const DWORD ws = WaitForSingleObject(ol.hEvent, timeout);
- if(ws==WAIT_TIMEOUT) {
+ if (ws == WAIT_TIMEOUT) {
debug("No response from remote");
CancelIo(h_hid);
- err=1;
- } else if(ws!=WAIT_OBJECT_0) {
+ err = 1;
+ } else if (ws != WAIT_OBJECT_0) {
debug("Wait failed with code %i", ws);
- err=2;
+ err = 2;
} else {
- err=0;
+ err = 0;
}
+
+ // Remove the initial 0-byte the Windows USB stack adds
+ memmove(data, data + 1, caps.InputReportByteLength - 1);
+
return err;
}
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
concordance-devel mailing list
concordance-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/concordance-devel