Udostępnij przez


Funkcje WinUSB na potrzeby modyfikacji zasad kanału

Aby umożliwić aplikacjom pobieranie i ustawianie domyślnych parametrów zasad potoku punktu końcowego, Winusb.dll uwidacznia funkcję WinUsb_GetPipePolicy w celu pobrania domyślnych zasad potoku. Funkcja WinUsb_SetPipePolicy umożliwia aplikacji ustawienie parametru zasad na nową wartość.

WinUSB umożliwia zmianę domyślnego działania poprzez zastosowanie zasad do kanału punktu końcowego. Za pomocą tych zasad można skonfigurować usługę WinUSB, aby najlepiej dopasować urządzenie do jego możliwości. Poniższa tabela zawiera listę zasad potoku obsługiwanych przez usługę WinUSB.

Uwaga / Notatka

Zasady opisane w tabeli są prawidłowe tylko dla określonych punktów końcowych. Ustawienie zasad w innych punktach końcowych nie ma wpływu na zachowanie WinUSB dla żądań odczytu lub zapisu.

Numer polisy Nazwa zasady Opis Punkt końcowy (kierunek) Wartość domyślna
0x01 Krótkie zakończenie pakietu Wysyła pakiet o zerowej długości dla żądania zapisu, w którym bufor jest wielokrotnym maksymalnym rozmiarem pakietów obsługiwanym przez punkt końcowy. Zbiorcze (WYJŚCIOWE)

Przerwanie (OUT)
FAŁSZYWY
0x02 AUTO_USUWANIE_ZAWIESZENIA Automatycznie czyści zatrzymany potok bez zatrzymywania przepływu danych. Zbiorczo (IN)

Przerwanie (IN)
FAŁSZYWY
0x03 PIPE_TRANSFER_TIMEOUT Czeka na interwał limitu czasu (w milisekundach) przed anulowaniem żądania. Zbiorczo (IN)

Zbiorcze (OUT)

Przerwanie (IN)

Przerwanie (OUT)
5 sekund (5000 milisekund) dla kontroli; 0 dla innych
0x04 IGNORUJ_KRÓTKIE_PAKIETY Kończy żądanie odczytu po odebraniu krótkiego pakietu lub odczytaniu określonej liczby bajtów. Jeśli rozmiar pliku jest nieznany, żądanie zostanie zakończone przy krótkim pakiecie. Zbiorczo (IN)

Przerwanie (IN)
FAŁSZYWY
0x05 ALLOW_PARTIAL_READS Umożliwia odczytywanie żądań z urządzenia, które zwraca więcej danych niż żądane przez obiekt wywołujący. Zbiorczo (IN)

Przerwanie (IN)
PRAWIDŁOWE
0x06 AUTO_FLUSH Zapisuje nadmiarowe dane z żądania odczytu i dodaje je do następnego żądania odczytu lub odrzuca nadmiar danych. Zbiorczo (IN)

Przerwanie (IN)
FAŁSZYWY
0x07 RAW_IO Pomija kolejkowanie i obsługę błędów w celu zwiększenia wydajności wielu żądań odczytu. Zbiorczo (IN)

Przerwanie (IN)
FAŁSZYWY
0x08 MAXIMUM_TRANSFER_SIZE Pobiera maksymalny rozmiar transferu USB obsługiwanego przez WinUSB. Jest to polityka tylko do odczytu, którą można pobrać, wywołując WinUsb_GetPipePolicy. Zbiorczo (IN)

Zbiorcze (OUT)

Przerwanie (IN)

Przerwanie (OUT)
0x09 RESET_PIPE_ON_RESUME Resetuje kanał punktu końcowego po wznowieniu z zawieszenia, zanim zaakceptuje nowe żądania. Zbiorczo (IN)

Zbiorcze (OUT)

Przerwanie (IN)

Przerwanie (OUT)
FAŁSZYWY

W poniższej tabeli przedstawiono najlepsze rozwiązania dotyczące używania poszczególnych zasad potoku i opisano wynikowe zachowanie po włączeniu zasad.

Policy Włącz, jeśli... Zachowanie
SHORT_PACKET_TERMINATE(0x01) Urządzenie wymaga, aby transfery OUT były zakończone pakietem o zerowej długości. Większość urządzeń nie ma tego wymagania. W przypadku włączenia (wartość parametru zasad to TRUE lub nonzero), każde żądanie zapisu, które jest wielokrotnym maksymalnym rozmiarem pakietów obsługiwanym przez punkt końcowy, następuje po nim pakiet o zerowej długości.

Po wysłaniu danych do kontrolera hosta usługa WinUSB wysyła żądanie zapisu z pakietem o zerowej długości, a następnie kończy żądanie utworzone przez WinUsb_WritePipe.
AUTO_USUWANIE_ZAWIESZENIA Nie chcesz, aby nieudane transfery pozostawiły punkt końcowy w stanie wstrzymania. Te zasady są przydatne tylko wtedy, gdy masz wiele oczekujących żądań odczytu do punktu końcowego, gdy RAW_IO jest wyłączona.
  • W przypadku włączenia (gdy wartość parametru polityki to TRUE lub niezerowa), warunek zatrzymania zostanie wyczyszczony automatycznie. Ten parametr polityki nie ma wpływu na potoki sterowania.

    Gdy żądanie odczytu zakończy się niepowodzeniem, a kontroler hosta zwróci stan inny niż STATUS_CANCELLED lub STATUS_DEVICE_NOT_CONNECTED, WinUSB resetuje potok przed zakończeniem przetwarzania tego żądania. Resetowanie kanału danych likwiduje stan zatrzymania bez przerywania przepływu danych. Dane będą nadal przepływać w punktach końcowych, o ile nowe transfery będą nadal napływać z urządzenia. Nowy transfer może zawierać taki, który znajdował się w kolejce, gdy doszło do zatrzymania.

    Włączenie tych zasad nie ma znaczącego wpływu na wydajność.

  • Jeśli jest wyłączone (wartość parametru zasad to FALSE lub zero), wszystkie transfery, które docierają do punktu końcowego po zatrzymaniu transferu, nie powiodą się, dopóki wywołujący nie zresetuje ręcznie potoku punktu końcowego, wywołując WinUsb_ResetPipe.
PIPE_TRANSFER_TIMEOUT Oczekujesz, że transfery do punktu końcowego zakończą się w określonym czasie.
  • Jeśli ustawiono wartość zero (wartość domyślna), transfery nie wygasną, ponieważ kontroler hosta nie anuluje transferu. W takim przypadku transfer czeka na czas nieokreślony, dopóki nie zostanie ręcznie anulowany lub transfer zostanie ukończony normalnie.
  • Jeśli ustawiono wartość niezerową (interwał limitu czasu), kontroler hosta uruchamia czasomierz po odebraniu żądania przeniesienia. Gdy czasomierz przekracza ustawiony interwał limitu czasu, żądanie zostanie anulowane.

    Niewielkie pogorszenie wydajności jest spowodowane zarządzaniem czasem.

    Żądania nie przekraczają limitu czasu podczas oczekiwania w kolejce WinUSB.

    W systemie Windows Vista dla wszystkich transferów (z wyjątkiem transferów z włączonym RAW_IO), WinUSB kolejkuje żądanie do momentu ukończenia wszystkich poprzednich transferów w docelowym punkcie końcowym. Kontroler hosta nie uwzględnia czasu kolejkowania w obliczaniu interwału czasowego.

    Po włączeniu RAW_IO usługa WinUSB nie kolejkuje żądania. Zamiast tego przekazuje żądanie bezpośrednio do stosu USB, niezależnie od tego, czy stos USB jest zajęty przetwarzaniem poprzednich transferów. Jeśli stos USB jest zajęty, może opóźnić przetwarzanie nowego żądania. Może to spowodować przekroczenie limitu czasu.
IGNORUJ_KRÓTKIE_PAKIETY RAW_IO jest wyłączona i nie chcesz, aby krótkie pakiety wypełniały żądania odczytu.
  • Jeśli ta opcja jest włączona (wartość parametru polityki ma wartość TRUE lub niezerową), kontroler hosta nie ukończy operacji odczytu natychmiast po otrzymaniu krótkiego pakietu. Zamiast tego wykonuje operację tylko wtedy, gdy:
    • Wystąpi błąd.
    • Żądanie zostało anulowane.
    • Odebrano wszystkie żądane bajty.
  • Jeśli jest wyłączona (wartość parametru zasad to FAŁSZ lub zero), kontroler hosta ukończy operację odczytu po odczytaniu żądanej liczby bajtów lub otrzymaniu krótkiego pakietu.
ALLOW_PARTIAL_READS Urządzenie może wysyłać więcej danych niż żądano, jeśli rozmiar buforu żądania jest wielokrotnym maksymalnym rozmiarem pakietu punktu końcowego.

Użyj, jeśli Twoja aplikacja chce odczytać kilka bajtów, aby określić, ile łącznie bajtów należy odczytać.
  • Jeśli wyłączone (wartość parametru zasad ma wartość FALSE lub zero), a urządzenie zwraca więcej danych niż zażądano, WinUSB kończy żądanie z błędem.
  • W przypadku włączenia (wartość parametru zasad ma wartość TRUE lub niezerowa) i gdy urządzenie zwraca więcej danych, niż zażądano, WinUSB może (w zależności od ustawień AUTO_FLUSH) dodać nadmiarowe dane z żądania odczytu na początku jego następnego żądania odczytu lub odrzucić nadmiarowe dane.

    Jeśli opcja jest włączona, usługa WinUSB natychmiast kończy żądania odczytu o rozmiarze zero bajtów i nie wysyła tych żądań w dół stosu.
AUTO_FLUSH Polityka ALLOW_PARTIAL_READS jest włączona.

Urządzenie może wysyłać więcej danych niż zażądano, a aplikacja nie wymaga żadnych innych danych. Jest to możliwe, jeśli rozmiar buforu żądania jest wielokrotnym maksymalnym rozmiarem pakietu punktu końcowego.
AUTO_FLUSH definiuje zachowanie WinUSB, gdy włączone jest ALLOW_PARTIAL_READS. Jeśli ALLOW_PARTIAL_READS jest wyłączony, wartość AUTO_FLUSH jest ignorowana przez WinUSB.

WinUSB może odrzucić pozostałe dane lub wysłać je przy użyciu następnego żądania odczytu obiektu wywołującego.

  • W przypadku włączenia (gdy wartość parametru zasad to TRUE lub niezerowa), WinUSB odrzuca dodatkowe bajty bez żadnego kodu błędu.
  • Jeśli wyłączono (wartość parametru zasad to FAŁSZ lub zero), usługa WinUSB zapisuje dodatkowe bajty, dodaje je na początku następnego żądania odczytu obiektu wywołującego, a następnie wysyła dane do obiektu wywołującego w następnej operacji odczytu.
RAW_IO Wydajność jest priorytetem, a aplikacja przesyła równoczesne żądania odczytu do tego samego punktu końcowego.

RAW_IO nakłada pewne ograniczenia dotyczące buforu przekazywanego przez obiekt wywołujący w WinUsb_ReadPipe:

  • Długość buforu musi być wielokrotnym maksymalnym rozmiarem pakietu punktu końcowego.
  • Długość musi być mniejsza lub równa wartości MAXIMUM_TRANSFER_SIZE pobranej przez WinUsb_GetPipePolicy.
Jeśli ta opcja jest włączona, transfery pomijają kolejkowanie i obsługę błędów w celu zwiększenia wydajności wielu żądań odczytu. Usługa WinUSB obsługuje żądania odczytu w następujący sposób:

  • Żądanie, które nie jest wielokrotnym maksymalnym rozmiarem pakietu punktu końcowego, kończy się niepowodzeniem.
  • Żądanie większe niż maksymalny rozmiar transferu obsługiwany przez usługę WinUSB kończy się niepowodzeniem.
  • Wszystkie prawidłowo sformułowane żądania są natychmiast przekazywane do stosu rdzeni USB, aby zostały zaplanowane przez kontroler hosta.


Włączenie tego ustawienia znacznie poprawia wydajność wielu żądań odczytu, zmniejszając opóźnienie między ostatnim pakietem jednego transferu a pierwszym pakietem następnego transferu.
RESET_PIPE_ON_RESUME Urządzenie nie zachowuje stanu przełączania danych podczas zawieszenia. Po wznowieniu od wstrzymania WinUSB resetuje punkt końcowy, zanim umożliwi osobie wywołującej wysyłanie nowych żądań do punktu końcowego.