動作確認済み WinUSBのサンプルコードです. c.

http://d.hatena.ne.jp/Waroe/20090311/1236761835

2009/3/11 通信完了完成品はこちら↑

前回いくつかサンプルコードを公開したのですが,
かなり間違ってました(ぉい
やっと通信することができました.
こちらは動作確認済みです.
とはいっても私のデバイスでしか動かないんですがね.

#include<stdio.h>
#include<windows.h>
#include<WINUSB.H>
#include<usb100.h>
#include<setupapi.h>
#include<strsafe.h>

struct devInfo
{
  HANDLE deviceHandle;  
  WINUSB_INTERFACE_HANDLE winUSBHandle;
  unsigned char bulkInPipe;
  unsigned char bulkOutPipe;
  unsigned char interruptPipe;
  int deviceSpeed;   
}devInfo;

struct devInfo devInfo;

BOOL GetDevicePath(LPGUID InterfaceGuid, PCHAR DevicePath, size_t BufLen)
{
  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(InterfaceGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

  interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
  bResult = SetupDiEnumDeviceInterfaces(deviceInfo, NULL, InterfaceGuid, 0, &interfaceData);
  
  SetupDiGetDeviceInterfaceDetail(deviceInfo, &interfaceData, NULL, 0, &requiredLength, NULL);
  detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LMEM_FIXED, requiredLength);

  if(NULL == detailData)
  {
    SetupDiDestroyDeviceInfoList(deviceInfo);
    return FALSE;
  }

  detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
  length = requiredLength;

  bResult = SetupDiGetDeviceInterfaceDetail(deviceInfo, &interfaceData, detailData, length, &requiredLength, NULL);

  if(FALSE == bResult)
  {
    LocalFree(detailData);
    return FALSE;
  }

  hr = StringCchCopy(DevicePath, BufLen, detailData->DevicePath);
  if(FAILED(hr))
  {
    SetupDiDestroyDeviceInfoList(deviceInfo);
    LocalFree(detailData);
  }
  LocalFree(detailData);

  return bResult;
}

//デバイスのファイルハンドルの取得
HANDLE OpenDevice()
{
  HANDLE hDev = NULL;
  char path[512];
  BOOL retVal;
  
  // Object interface: IUnknown, ver. 0.0,
  // GUID={0x00000000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}}
  //  char guid[] = "01B6EB7B-7C81-4c65-84E2-73B6037E9465";
  GUID guid = {
    0x01B6EB7B,
    0x7C81,
    0x4c65,
    { 0x84, 0xE2, 0x73, 0xB6, 0x03, 0x7E, 0x94, 0x65}
  };


  retVal = GetDevicePath(&guid, path, 512);

  hDev = CreateFile(path,
                    GENERIC_WRITE | GENERIC_READ,
                    FILE_SHARE_WRITE | FILE_SHARE_READ,
                    NULL,
                    OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
                    NULL);
  return hDev;
}


//WinUSBの初期化とオリジナルデバイスの構成

BOOL Initialize_Device()
{
  BOOL bResult;
  WINUSB_INTERFACE_HANDLE usbHandle;
  USB_INTERFACE_DESCRIPTOR ifaceDescriptor;
  WINUSB_PIPE_INFORMATION pipeInfo;

  UCHAR speed;
  ULONG length;
  
//WinUSB初期化

  devInfo.winUSBHandle = OpenDevice(TRUE);
  bResult = WinUsb_Initialize(devInfo.winUSBHandle, &usbHandle);

  if(bResult)
  {
    devInfo.winUSBHandle = usbHandle;
    length = sizeof(UCHAR);
    bResult = WinUsb_QueryDeviceInformation(devInfo.winUSBHandle,
                                            DEVICE_SPEED,
                                            &length,
                                            &speed); 
  }

  if(bResult)
  {

    devInfo.deviceSpeed = speed;
    bResult = WinUsb_QueryInterfaceSettings(devInfo.winUSBHandle,
                                            0,
                                            &ifaceDescriptor);

  }
  if(bResult)
  {
    int i;
    for(i=0;i<ifaceDescriptor.bNumEndpoints;i++)
    {

      bResult = WinUsb_QueryPipe(devInfo.winUSBHandle,
                                 0,
                                 (UCHAR) i,
                                 &pipeInfo);

      if(pipeInfo.PipeType == UsbdPipeTypeBulk &&
                  USB_ENDPOINT_DIRECTION_IN(pipeInfo.PipeId))
      {
        devInfo.bulkInPipe = pipeInfo.PipeId;
      }
      else if(pipeInfo.PipeType == UsbdPipeTypeBulk &&
                  USB_ENDPOINT_DIRECTION_OUT(pipeInfo.PipeId))
      {
          
        devInfo.bulkOutPipe = pipeInfo.PipeId;
      }
      else if(pipeInfo.PipeType == UsbdPipeTypeInterrupt)
      {
        devInfo.interruptPipe = pipeInfo.PipeId;
      }
      else
      {
        bResult = FALSE;
        break;
      }
    }
  }
  return bResult;
}

BOOL WriteToDevice(unsigned char data)
{
  BOOL bResult;
  ULONG bytesReturned;
  WINUSB_SETUP_PACKET setupPacket;
  UCHAR lightedBars = 0;
  USHORT bufSize = 12;
  UCHAR szBuffer[12];
  ULONG bytesWritten;
  USB_ENDPOINT_DESCRIPTOR usbEndpointD;
  
  szBuffer[0] = data; 
  setupPacket.RequestType = 0; 
  setupPacket.Request = 0x08;
  setupPacket.Index = 0;
  setupPacket.Length = sizeof(UCHAR);
  setupPacket.Value = 0;

  bResult = WinUsb_ControlTransfer(devInfo.winUSBHandle,
                                   setupPacket,
                                   &lightedBars,
                                   sizeof(UCHAR),
                                   &bytesReturned,
                                   NULL);

  usbEndpointD.bEndpointAddress = 0x01; //これを定義するとエンドポイントとの通信ができるようになった.

//pipeIDの部分をdevInfo.bulkOutPipeからusbEndpointD.bEndpointAddressに変更
  bResult = WinUsb_WritePipe(devInfo.winUSBHandle,
                             usbEndpointD.bEndpointAddress,
                             szBuffer,
                             1,
                             &bytesWritten,
                             NULL);
  return bResult;
}   

void main(void){

  unsigned char data;
  Initialize_Device();
  data = 0x02; //ここの数値を変えると出力が変わる
  WriteToDevice(data);
}
>|c|

動作はするものの勘違いしている箇所があるといけないので,
いろいろ調べてみることにする.