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: UsbdPipeTypeInterrupt

    Hier wirken die Funktionen :
    WinUsb_WritePipe
    WinUsb_Read_Pipe

    scheinbar 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 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;
    }
    

Log in to reply