при старте винды в первый раз в контролллер пишется какая-то чушь, потом этот буфер "FIFO" заполняется до двух элементов и поехало...
что посылается в драйвер проверял прогой USB Monitor, что принимает контроллер - проверял поиском нужной посылки во всей его озу.
программа переделана из примера usbhidio.cs
Код
private void SetFeature(byte []data, byte index)
{
FileIOApiDeclarations.SECURITY_ATTRIBUTES Security = new HID_System.FileIOApiDeclarations.SECURITY_ATTRIBUTES();
bool Success = false;
bool AlreadyOpened = false;
if (DevHandle != FileIOApiDeclarations.INVALID_HANDLE_VALUE) AlreadyOpened = true;
if (!AlreadyOpened)
{
// Get another handle to use in overlapped ReadFiles (for requesting Input reports).
DevHandle = FileIOApiDeclarations.CreateFile(DevInfo.Path,
FileIOApiDeclarations.GENERIC_READ | FileIOApiDeclarations.GENERIC_WRITE,
FileIOApiDeclarations.FILE_SHARE_READ | FileIOApiDeclarations.FILE_SHARE_WRITE,
ref Security,
FileIOApiDeclarations.OPEN_EXISTING,
FileIOApiDeclarations.FILE_FLAG_OVERLAPPED, 0);
//int n = 1;
//Success = HID_System.HidApiDeclarations.HidD_SetNumInputBuffers(DevHandle, n);
Debug.WriteLine(_MyDebugging.ResultOfAPICall("CreateFile, ReadHandle"));
Debug.WriteLine(" Returned handle: " + DevHandle.ToString("x") + "h");
}
{//передача репорта
byte[] reportBuffer = new byte[DevInfo.FeatureReportLength];
for (byte i = 0; i < (DevInfo.FeatureReportLength-1) && i < data.Length; i++) reportBuffer[i+1] = data[i];
reportBuffer[0] = index;
//int NumberOfBytesWritten = 0;
//int Result = FileIOApiDeclarations.WriteFile(DevHandle, ref reportBuffer[0], DevInfo.FeatureReportLength, ref NumberOfBytesWritten, 0);
Success = HidApiDeclarations.HidD_SetFeature(DevHandle, ref reportBuffer[0], DevInfo.FeatureReportLength);
}
if (!AlreadyOpened)
{
int Result = FileIOApiDeclarations.CloseHandle(DevHandle);
Debug.WriteLine(_MyDebugging.ResultOfAPICall("CloseHandle"));
DevHandle = FileIOApiDeclarations.INVALID_HANDLE_VALUE;
}
}
{
FileIOApiDeclarations.SECURITY_ATTRIBUTES Security = new HID_System.FileIOApiDeclarations.SECURITY_ATTRIBUTES();
bool Success = false;
bool AlreadyOpened = false;
if (DevHandle != FileIOApiDeclarations.INVALID_HANDLE_VALUE) AlreadyOpened = true;
if (!AlreadyOpened)
{
// Get another handle to use in overlapped ReadFiles (for requesting Input reports).
DevHandle = FileIOApiDeclarations.CreateFile(DevInfo.Path,
FileIOApiDeclarations.GENERIC_READ | FileIOApiDeclarations.GENERIC_WRITE,
FileIOApiDeclarations.FILE_SHARE_READ | FileIOApiDeclarations.FILE_SHARE_WRITE,
ref Security,
FileIOApiDeclarations.OPEN_EXISTING,
FileIOApiDeclarations.FILE_FLAG_OVERLAPPED, 0);
//int n = 1;
//Success = HID_System.HidApiDeclarations.HidD_SetNumInputBuffers(DevHandle, n);
Debug.WriteLine(_MyDebugging.ResultOfAPICall("CreateFile, ReadHandle"));
Debug.WriteLine(" Returned handle: " + DevHandle.ToString("x") + "h");
}
{//передача репорта
byte[] reportBuffer = new byte[DevInfo.FeatureReportLength];
for (byte i = 0; i < (DevInfo.FeatureReportLength-1) && i < data.Length; i++) reportBuffer[i+1] = data[i];
reportBuffer[0] = index;
//int NumberOfBytesWritten = 0;
//int Result = FileIOApiDeclarations.WriteFile(DevHandle, ref reportBuffer[0], DevInfo.FeatureReportLength, ref NumberOfBytesWritten, 0);
Success = HidApiDeclarations.HidD_SetFeature(DevHandle, ref reportBuffer[0], DevInfo.FeatureReportLength);
}
if (!AlreadyOpened)
{
int Result = FileIOApiDeclarations.CloseHandle(DevHandle);
Debug.WriteLine(_MyDebugging.ResultOfAPICall("CloseHandle"));
DevHandle = FileIOApiDeclarations.INVALID_HANDLE_VALUE;
}
}