WinUSBのサンプルコード更新.
http://d.hatena.ne.jp/Waroe/20090220/1235124086
2/20版はこちら↑
http://d.hatena.ne.jp/Waroe/20090311/1236761835
3/11 通信完了完成品はこちら↑
#include<stdio.h> #include<windows.h> #include<WINUSB.H> #include<usb100.h> #include<setupapi.h> #include<strsafe.h> 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(BOOL bSync) { HANDLE hDev = NULL; char path[512]; BOOL retVal; //[Dev_AddReg]で指定したGUID GUID guid = { 0x1F1F1F1F, 0x1F1F, 0x1F1F, { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F} }; 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の初期化とFx2用デバイスの構成 //devInfo構造体を作ってみる.new! struct devInfo { HANDLE deviceHandle; WINUSB_INTERFACE_HANDLE winUSBHandle; unsigned char bulkInPipe; unsigned char bulkOutPipe; unsigned char interruptPipe; int deviceSpeed; }; BOOL Initialize_Device() { BOOL bResult; WINUSB_INTERFACE_HANDLE usbHandle; USB_INTERFACE_DESCRIPTOR ifaceDescriptor; WINUSB_PIPE_INFORMATION pipeInfo; UCHAR speed; ULONG length; HANDLE deviceHandle; struct devInfo devInfo; //WinUSB初期化 deviceHandle = OpenDevice(TRUE); bResult = WinUsb_Initialize(deviceHandle, &usbHandle); //[1] if(bResult) { devInfo.winUSBHandle = usbHandle; length = sizeof(UCHAR); bResult = WinUsb_QueryDeviceInformation(devInfo.winUSBHandle, DEVICE_SPEED, &length, &speed); } //[2] if(bResult) { devInfo.deviceSpeed = speed; bResult = WinUsb_QueryInterfaceSettings(devInfo.winUSBHandle, 0, &ifaceDescriptor); } if(bResult) { int i; for(i=0;i<ifaceDescriptor.bNumEndpoints;i++) { //[3] bResult = WinUsb_QueryPipe(devInfo.winUSBHandle, 0, (UCHAR) i, &pipeInfo); //[4] 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; } void main(void){ GUID guid = { 0x1F1F1F1F, 0x1F1F, 0x1F1F, { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F} }; //[Dev_AddReg]で指定したGUID char path[512]; GetDevicePath( &guid, path, 512); printf("Hello, world!\n"); }
devInfo構造体を追加した.
こちらもビルド通るのでWinUSBの初期化はできているであろう.
ここから先は独自のものになりそう.
Fx2デバイスの構成あたりをオリジナルのデバイス用に書き直す.