?
Lösung ,
sind keine Endpoint -Id's vorhanden, wird mit WinUsb_ControlTransfer
gewirkt, hiermit können individuelle Daten gelesen/geschrieben werden,
allerdings bei weitem nicht mit der Transferrate die ein Bulktransfer
leistet, diese sind ja astronomisch. Dennoch lassen sich so noch
einige KB/s erreichen was mehr als genug sein kann
Grüße
Karsten Schulz
Dieser Thread handelt um die USB Avr's von Digispark, man sollte sich damit befassen
#include <Windows.h>
#include <strsafe.h>
#include <winusb.h>
#include <SetupAPI.h>
//http://www.usbmadesimple.co.uk/ums_4.htm
DEFINE_GUID(avrguid, 0x8EEE9732, 0xE67A, 0x4C64, 0x89, 0xC3, 0x23, 0x7C, 0xAA, 0xDA, 0xEC, 0x13);
WINUSB_INTERFACE_HANDLE WinusbHandle;
HANDLE DeviceHandle;
TCHAR DevicePath[MAX_PATH];
HRESULT RetrieveDevicePath(_Out_bytecap_(BufLen) LPTSTR DevicePath, _In_ ULONG BufLen, _Out_opt_ PBOOL FailureDeviceNotFound)
{
BOOL bResult = FALSE;
HDEVINFO deviceInfo;
SP_DEVICE_INTERFACE_DATA interfaceData;
PSP_DEVICE_INTERFACE_DETAIL_DATA detailData = NULL;
ULONG length;
ULONG requiredLength = 0;
HRESULT hr;
deviceInfo = SetupDiGetClassDevs(&avrguid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (deviceInfo == INVALID_HANDLE_VALUE)
{
hr = HRESULT_FROM_WIN32(GetLastError());
return hr;
}
interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
bResult = SetupDiEnumDeviceInterfaces(deviceInfo, NULL, &avrguid, 0, &interfaceData);
if (FALSE == bResult)
{
if (ERROR_NO_MORE_ITEMS == GetLastError() && NULL != FailureDeviceNotFound)
*FailureDeviceNotFound = TRUE;
hr = HRESULT_FROM_WIN32(GetLastError());
SetupDiDestroyDeviceInfoList(deviceInfo);
return hr;
}
bResult = SetupDiGetDeviceInterfaceDetail(deviceInfo, &interfaceData, NULL, 0, &requiredLength, NULL);
if (FALSE == bResult && ERROR_INSUFFICIENT_BUFFER != GetLastError())
{
hr = HRESULT_FROM_WIN32(GetLastError());
SetupDiDestroyDeviceInfoList(deviceInfo);
return hr;
}
detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)
LocalAlloc(LMEM_FIXED, requiredLength);
if (NULL == detailData)
{
hr = E_OUTOFMEMORY;
SetupDiDestroyDeviceInfoList(deviceInfo);
return hr;
}
detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
length = requiredLength;
bResult = SetupDiGetDeviceInterfaceDetail(deviceInfo, &interfaceData, detailData, length, &requiredLength, NULL);
if (FALSE == bResult)
{
hr = HRESULT_FROM_WIN32(GetLastError());
LocalFree(detailData);
SetupDiDestroyDeviceInfoList(deviceInfo);
return hr;
}
hr = StringCbCopy(DevicePath, BufLen, detailData->DevicePath);
LocalFree(detailData);
SetupDiDestroyDeviceInfoList(deviceInfo);
return hr;
}
LONG __cdecl main(void)
{
USB_DEVICE_DESCRIPTOR deviceDesc;
BOOL bResult;
if (FAILED(RetrieveDevicePath(DevicePath, sizeof(DevicePath), &bResult)))
return 0;
if ((DeviceHandle = CreateFile(DevicePath, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL)) == INVALID_HANDLE_VALUE)
return 0;
if (WinUsb_Initialize(DeviceHandle, &WinusbHandle) == FALSE)
return 0;
while (1)
{
WINUSB_SETUP_PACKET SetupPacket = { 0 };
UCHAR bars = 0;
ULONG cbSent = 0;
//------------- Send -----------------
bars = 0; cbSent = 0;
SetupPacket.RequestType = (1 << 5) | 0x00;
SetupPacket.Request = 0x09;
SetupPacket.Value = 0;
SetupPacket.Index = 'E'; //transmit byte
SetupPacket.Length = sizeof(UCHAR);
bResult = WinUsb_ControlTransfer(WinusbHandle, SetupPacket, &bars, sizeof(UCHAR), &cbSent, 0);
Sleep(100);
//------------- Recieve -----------------
bars = 0; cbSent = 1;
SetupPacket.RequestType = (1 << 5) | 0x80;
SetupPacket.Request = 0x01;
SetupPacket.Value = 0;
SetupPacket.Index = 0;
SetupPacket.Length = sizeof(UCHAR);
while(WinUsb_ControlTransfer(WinusbHandle, SetupPacket, &bars, sizeof(UCHAR), &cbSent, 0) && cbSent > 0)
printf("Result Status(%d) Data(%x) Cnt(%d)\r\n", bResult, bars, cbSent);
}
WinUsb_Free(WinusbHandle);
CloseHandle(DeviceHandle);
return 0;
}