WINUSB_ControlTransfer может использоваться только на одном из двух интерфейсов, доступных на устройстве, но не на другом - PullRequest
0 голосов
/ 24 августа 2018

Я работаю с устройством, и оно имеет два интерфейса. Информацию о lsusb на USB-устройстве можно найти по ссылке ниже. https://github.com/zougloub/libseek

Камера имеет два интерфейса: первый - интерфейс iAP, а второй - интерфейс com.thermal.pit206. Я написал свое приложение на основе интерфейса iAP, потому что. Причина, по которой я выбрал интерфейс iAP, заключается в том, что все остальные делали это на GitHub, поэтому я просто последовал их примеру.

Я могу использовать функцию Winusb_ControlTrasnfer с интерфейсом iAP. Я могу инициализировать дескриптор WinUSB и использовать его для отправки и получения команд, а также для чтения канала.

Однако, когда я использую интерфейс com.thermal.pit206, я все равно могу инициализировать дескриптор WinUSB, но не могу отправлять или получать команды.

void CommandTransfer(WINUSB_INTERFACE_HANDLE winIHandle, UCHAR requestTypeI, UCHAR requestI, USHORT valueI, USHORT indexI, USHORT lengthI, PUCHAR dataIn)
{
    WINUSB_SETUP_PACKET packet;
    ZeroMemory(&packet, sizeof(WINUSB_SETUP_PACKET));
    packet.RequestType = requestTypeI;
    packet.Request = requestI;
    packet.Value = valueI;
    packet.Index = indexI;
    packet.Length = lengthI;

    ULONG dataLength = 0;

    if (!WinUsb_ControlTransfer(winIHandle, packet, dataIn, lengthI, &dataLength, NULL))
    {
        printf("ERROR: WinUsb_ControlTransfer, Windows Error Code - %d \n", GetLastError());
    }
} 

Вы можете увидеть копию моего кода, который я использую для отправки команд на устройство.

Я не понимаю, почему я могу отправлять команды на устройство, когда я использую интерфейс iAP, но когда я использую интерфейс com.thermal.pir206, я не могу этого сделать.

Спасибо! Любая полезная ссылка / информация приветствуется.

1 Ответ

0 голосов
/ 24 августа 2018

Функция WinUsb_ControlTransfer() работает только для нулевой конечной точки по умолчанию, которая всегда имеет тип control.

Конечные точки во всех других интерфейсах на вышеупомянутом выходе lsusb имеют тип bulk.Это потребует использования функций WinUsb_ReadPipe() или WinUsb_WritePipe().

...