WinUSB Pipe an AVR
-
Hallo zusammen,
Ich möchte einen am USB befindlichen Atiny85, den ich mit der libusb
bereits erfolgreich anspreche, jetzt auch via WinUsb beschreiben/lesen
ich kann den Baustein nach den Iterationen erfolgreich mit CreateFile
öffnen, allerdings erhalte ich als PipeType: UsbdPipeTypeInterruptHier wirken die Funktionen :
WinUsb_WritePipe
WinUsb_Read_Pipescheinbar nicht.
Gibt es einen Hinweise wie die Vorgehensweise zu sein hat ?
Vielen Dank
Karsten Schulz aus Berlin
-
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 kannGrüße
Karsten SchulzDieser 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; }