summaryrefslogtreecommitdiffstats
path: root/commandline/usb-windows.c
diff options
context:
space:
mode:
authorJenna Fox <a@creativepony.com>2012-09-23 16:10:31 +1000
committerJenna Fox <a@creativepony.com>2012-09-23 16:10:31 +1000
commit0b63b7b37c027ae58fa29698c5181ecf212f961b (patch)
treecbd2711939c9c29be8ca9b0840aeb9f38978265d /commandline/usb-windows.c
parent824c303782a62b57b6525875b3c2dee81056baa4 (diff)
downloadmicronucleus-0b63b7b37c027ae58fa29698c5181ecf212f961b.tar.gz
micronucleus-0b63b7b37c027ae58fa29698c5181ecf212f961b.tar.bz2
micronucleus-0b63b7b37c027ae58fa29698c5181ecf212f961b.zip
bring in slightly modified version of bootloadHID host programming app by objective development - including delays tiny85 requires (though they could be tuned to be a bit shorter for quicker programming later)
Diffstat (limited to 'commandline/usb-windows.c')
-rwxr-xr-xcommandline/usb-windows.c180
1 files changed, 180 insertions, 0 deletions
diff --git a/commandline/usb-windows.c b/commandline/usb-windows.c
new file mode 100755
index 0000000..fac3b02
--- /dev/null
+++ b/commandline/usb-windows.c
@@ -0,0 +1,180 @@
+/* Name: usb-windows.c
+ * Project: usbcalls library
+ * Author: Christian Starkjohann
+ * Creation Date: 2006-02-02
+ * Tabsize: 4
+ * Copyright: (c) 2006 by OBJECTIVE DEVELOPMENT Software GmbH
+ * License: Proprietary, free under certain conditions. See Documentation.
+ * This Revision: $Id: usb-windows.c 281 2007-03-20 13:22:10Z cs $
+ */
+
+/*
+General Description:
+This module implements USB HID report receiving and sending with native
+Windows API functions. If you compile with MinGW, no software from Microsoft
+(no DDK) is needed. We supply the missing types and function prototypes in
+hidsdi.h.
+*/
+
+#include <stdio.h>
+#include <windows.h>
+#include <setupapi.h>
+#include "hidsdi.h"
+#include <ddk/hidpi.h>
+
+#include "usbcalls.h"
+
+#ifdef DEBUG
+#define DEBUG_PRINT(arg) printf arg
+#else
+#define DEBUG_PRINT(arg)
+#endif
+
+/* ------------------------------------------------------------------------ */
+
+static void convertUniToAscii(char *buffer)
+{
+unsigned short *uni = (void *)buffer;
+char *ascii = buffer;
+
+ while(*uni != 0){
+ if(*uni >= 256){
+ *ascii++ = '?';
+ }else{
+ *ascii++ = *uni++;
+ }
+ }
+ *ascii++ = 0;
+}
+
+int usbOpenDevice(usbDevice_t **device, int vendor, char *vendorName, int product, char *productName, int usesReportIDs)
+{
+GUID hidGuid; /* GUID for HID driver */
+HDEVINFO deviceInfoList;
+SP_DEVICE_INTERFACE_DATA deviceInfo;
+SP_DEVICE_INTERFACE_DETAIL_DATA *deviceDetails = NULL;
+DWORD size;
+int i, openFlag = 0; /* may be FILE_FLAG_OVERLAPPED */
+int errorCode = USB_ERROR_NOTFOUND;
+HANDLE handle = INVALID_HANDLE_VALUE;
+HIDD_ATTRIBUTES deviceAttributes;
+
+ HidD_GetHidGuid(&hidGuid);
+ deviceInfoList = SetupDiGetClassDevs(&hidGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
+ deviceInfo.cbSize = sizeof(deviceInfo);
+ for(i=0;;i++){
+ if(handle != INVALID_HANDLE_VALUE){
+ CloseHandle(handle);
+ handle = INVALID_HANDLE_VALUE;
+ }
+ if(!SetupDiEnumDeviceInterfaces(deviceInfoList, 0, &hidGuid, i, &deviceInfo))
+ break; /* no more entries */
+ /* first do a dummy call just to determine the actual size required */
+ SetupDiGetDeviceInterfaceDetail(deviceInfoList, &deviceInfo, NULL, 0, &size, NULL);
+ if(deviceDetails != NULL)
+ free(deviceDetails);
+ deviceDetails = malloc(size);
+ deviceDetails->cbSize = sizeof(*deviceDetails);
+ /* this call is for real: */
+ SetupDiGetDeviceInterfaceDetail(deviceInfoList, &deviceInfo, deviceDetails, size, &size, NULL);
+ DEBUG_PRINT(("checking HID path \"%s\"\n", deviceDetails->DevicePath));
+ /* attempt opening for R/W -- we don't care about devices which can't be accessed */
+ handle = CreateFile(deviceDetails->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, openFlag, NULL);
+ if(handle == INVALID_HANDLE_VALUE){
+ DEBUG_PRINT(("opening failed: %d\n", (int)GetLastError()));
+ /* errorCode = USB_ERROR_ACCESS; opening will always fail for mouse -- ignore */
+ continue;
+ }
+ deviceAttributes.Size = sizeof(deviceAttributes);
+ HidD_GetAttributes(handle, &deviceAttributes);
+ DEBUG_PRINT(("device attributes: vid=%d pid=%d\n", deviceAttributes.VendorID, deviceAttributes.ProductID));
+ if(deviceAttributes.VendorID != vendor || deviceAttributes.ProductID != product)
+ continue; /* ignore this device */
+ errorCode = USB_ERROR_NOTFOUND;
+ if(vendorName != NULL && productName != NULL){
+ char buffer[512];
+ if(!HidD_GetManufacturerString(handle, buffer, sizeof(buffer))){
+ DEBUG_PRINT(("error obtaining vendor name\n"));
+ errorCode = USB_ERROR_IO;
+ continue;
+ }
+ convertUniToAscii(buffer);
+ DEBUG_PRINT(("vendorName = \"%s\"\n", buffer));
+ if(strcmp(vendorName, buffer) != 0)
+ continue;
+ if(!HidD_GetProductString(handle, buffer, sizeof(buffer))){
+ DEBUG_PRINT(("error obtaining product name\n"));
+ errorCode = USB_ERROR_IO;
+ continue;
+ }
+ convertUniToAscii(buffer);
+ DEBUG_PRINT(("productName = \"%s\"\n", buffer));
+ if(strcmp(productName, buffer) != 0)
+ continue;
+ }
+ break; /* we have found the device we are looking for! */
+ }
+ SetupDiDestroyDeviceInfoList(deviceInfoList);
+ if(deviceDetails != NULL)
+ free(deviceDetails);
+ if(handle != INVALID_HANDLE_VALUE){
+ *device = (usbDevice_t *)handle;
+ errorCode = 0;
+ }
+ return errorCode;
+}
+
+/* ------------------------------------------------------------------------ */
+
+void usbCloseDevice(usbDevice_t *device)
+{
+ CloseHandle((HANDLE)device);
+}
+
+/* ------------------------------------------------------------------------ */
+
+int usbSetReport(usbDevice_t *device, int reportType, char *buffer, int len)
+{
+HANDLE handle = (HANDLE)device;
+BOOLEAN rval = 0;
+DWORD bytesWritten;
+
+ switch(reportType){
+ case USB_HID_REPORT_TYPE_INPUT:
+ break;
+ case USB_HID_REPORT_TYPE_OUTPUT:
+ rval = WriteFile(handle, buffer, len, &bytesWritten, NULL);
+ break;
+ case USB_HID_REPORT_TYPE_FEATURE:
+ rval = HidD_SetFeature(handle, buffer, len);
+ break;
+ }
+ return rval == 0 ? USB_ERROR_IO : 0;
+}
+
+/* ------------------------------------------------------------------------ */
+
+int usbGetReport(usbDevice_t *device, int reportType, int reportNumber, char *buffer, int *len)
+{
+HANDLE handle = (HANDLE)device;
+BOOLEAN rval = 0;
+DWORD bytesRead;
+
+ switch(reportType){
+ case USB_HID_REPORT_TYPE_INPUT:
+ buffer[0] = reportNumber;
+ rval = ReadFile(handle, buffer, *len, &bytesRead, NULL);
+ if(rval)
+ *len = bytesRead;
+ break;
+ case USB_HID_REPORT_TYPE_OUTPUT:
+ break;
+ case USB_HID_REPORT_TYPE_FEATURE:
+ buffer[0] = reportNumber;
+ rval = HidD_GetFeature(handle, buffer, *len);
+ break;
+ }
+ return rval == 0 ? USB_ERROR_IO : 0;
+}
+
+/* ------------------------------------------------------------------------ */