Quantcast
Channel: MEL PICBASIC Forum
Viewing all articles
Browse latest Browse all 4743

Getting Error 87 with WinUSB_WritePipe with LowPin USB Dev Kit

$
0
0
Using PBP3 Gold on Low Pin Count USB Dev Kit (PIC18F14k50). I'm using the vanilla HID code with minor changes to PID/MFR/Device Name.
I followed the code from here: http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
My PBP main code looks like this: (Nothing exciting, you've all seen this.)

Code:

' ************************************************************
' * Auto generated EasyHID file. PBP 2.60 and above          *
' ************************************************************
include "ConfigBits.inc"
' include the HID descriptor
include        "DESCUSBProject.bas"

DEFINE OSC 48
DEFINE LOADER_USED 1

USBBufferSizeMax  con 32  ' maximum buffer size
USBBufferSizeTX    con 32  ' input
USBBufferSizeRX    con 32  ' output

' the USB buffer...
USBBuffer        Var Byte[USBBufferSizeMax]
USBBufferCount  Var Byte

' ************************************************************
' * main program loop - remember, you must keep the USB      *
' * connection alive with a call to USBService every couple  *
' * of milliseconds or so...                                *
' ************************************************************
usbinit ' initialise USB...
ProgramStart:
  gosub DoUSBIn
  gosub DoUSBOut
  goto ProgramStart 

' ************************************************************
' * receive data from the USB bus                            *
' ************************************************************
DoUSBIn:
  USBBufferCount = USBBufferSizeRX              ' RX buffer size
  USBService                                    ' keep connection alive
  USBIn 1, USBBuffer, USBBufferCount, DoUSBIn  ' read data, if available
  return
   
' ************************************************************
' * wait for USB interface to attach                        *
' ************************************************************
DoUSBOut:
  USBBufferCount = USBBufferSizeTX              ' TX buffer size
  USBService                                    ' keep connection alive
  USBOut 1, USBBuffer, USBBufferCount, DoUSBOut ' if bus available, transmit data
  return

My WinUSB code looks like this:
Code:

#include "pch.h"
#include "USBUtils.h"

LONG __cdecl
_tmain(
        LONG    Argc,
        LPTSTR * Argv
        )
/*++

Routine description:

        Sample program that communicates with a USB device using WinUSB

--*/
{
        DEVICE_DATA          deviceData;
        HRESULT              hr;
        USB_DEVICE_DESCRIPTOR deviceDesc;
        BOOL                  bResult;
        BOOL                  noDevice;
        ULONG                lengthReceived;

        UNREFERENCED_PARAMETER(Argc);
        UNREFERENCED_PARAMETER(Argv);
        //Press any key to continue to allow debugger attaching
        system("pause");
        //
        // Find a device connected to the system that has WinUSB installed using our
        // INF
        //
        hr = OpenDevice(&deviceData, &noDevice);

        if (FAILED(hr)) {
                if (noDevice) {
                        printf(_T("Device not connected or driver not installed\n"));
                } else {
                        printf(_T("Failed looking for device, HRESULT 0x%x\n"), hr);
                }
                return 0;
        }

        //
        // Get device descriptor
        //
        bResult = WinUsb_GetDescriptor(deviceData.WinusbHandle,
                                                                  USB_DEVICE_DESCRIPTOR_TYPE,
                                                                  0,
                                                                  0,
                                                                  (PBYTE) &deviceDesc,
                                                                  sizeof(deviceDesc),
                                                                  &lengthReceived);

        if (FALSE == bResult || lengthReceived != sizeof(deviceDesc)) {
                printf(_T("Error among LastError %d or lengthReceived %d\n"),
                          FALSE == bResult ? GetLastError() : 0,
                          lengthReceived);
                CloseDevice(&deviceData);
                return 0;
        }

        //
        // Print a few parts of the device descriptor
        //
        printf(_T("Device found: VID_%04X&PID_%04X; bcdUsb %04X\n"),
                  deviceDesc.idVendor,
                  deviceDesc.idProduct,
                  deviceDesc.bcdUSB);
        //Insert Actual code here.
        UCHAR DeviceSpeed;
        bResult = GetUSBDeviceSpeed(deviceData.WinusbHandle, &DeviceSpeed);
        if (bResult == FALSE){
                printf("Something broke in GetUSBDeviceSpeed.\n");
                return(EXIT_FAILURE);
        }
       
        PIPE_ID pipeUSB;

        bResult = QueryDeviceEndpoints(deviceData.WinusbHandle, &pipeUSB);
        if (bResult == FALSE){
                printf("Something broke in QueryDeviceEndpoints.\n");
                return(EXIT_FAILURE);
        }
        ULONG cbSize;
        UCHAR szBuffer[] = "Hello World";
        cbSize = (ULONG)strlen((char*)szBuffer);
        ULONG cbSent;
        printf("Writing to Bulk Endpoint.\n");
        bResult = WinUsb_WritePipe(deviceData.WinusbHandle, pipeUSB.PipeOutId, szBuffer, cbSize, &cbSent, 0);
        //bResult = WriteToBulkEndpoint(deviceData.WinusbHandle, &pipeUSB.PipeOutId, &cbSize);
        if (bResult == FALSE){
                printf("Something broke in WriteToBulkEndpoint.\n");
                printf(_T("Error among LastError %d\n"),GetLastError());

                return(EXIT_FAILURE);
        }
        else{
                printf("Wrote %d bytes to device.\n", cbSent);
        }
        printf("Reading from Bulk Endpoint.\n");
        bResult = ReadFromBulkEndpoint(deviceData.WinusbHandle, &pipeUSB.PipeInId, cbSize);
        if (bResult == FALSE){
                printf("Something broke in ReadFromBulkEndpoint.\n");
                printf(_T("Error among LastError %d\n"), GetLastError());
                return(EXIT_FAILURE);
        }
        cbSize = 256;
        system("pause");

        //End actual code
        CloseDevice(&deviceData);
        return EXIT_SUCCESS;
}

My output looks like this:
Code:

Device found: VID_1781&PID_07BD; bcdUsb 0110
Device speed: 1 (Low speed).
Endpoint index: 0 Pipe type: Interrupt Pipe ID: 3.
Endpoint index: 1 Pipe type: Interrupt Pipe ID: 3.
Writing to Bulk Endpoint.
Something broke in WriteToBulkEndpoint.
Error among LastError 87

Now, obviously, I'm not writing to a bulk endpoint, I'm writing to an interrupt endpoint. I just not sure how to finagle that.

So how do I fix this?

Viewing all articles
Browse latest Browse all 4743

Trending Articles