Как убедиться, что флешка работает в USB 3.0?

в 11:54, , рубрики: usb flash drive, диагностика производительности, интерфейсы, метки: ,

В современной IT-индустрии часто случается так, что заверения производителя устройства относительно его функциональности не соответствуют действительности. От скепсиса по этому поводу перейдем к решению конкретной технической задачи…

Постановка задачи

В нашей тестовой лаборатории оказался USB Flash накопитель Kingston DataTraveler 3.0. Согласно информации производителя, устройство поддерживает USB 3.0. Проверим, так ли это на самом деле, не разбирая флешку и не нарушая гарантию.

Аппаратный тест

Присмотревшись к разъему, за четырьмя «ближними» контактами, обеспечивающими поддержку USB 2.0, мы, как и ожидалось, обнаружили пять «дальних» контактов, используемых только в режиме USB 3.0 Super Speed. Измеряем сопротивление сигнальных линий USB 3.0 относительно земли, получаем значения, отличные от бесконечности. Вывод: контакты USB 3.0 физически присутствуют и не заканчиваются тупиком. Измерение выполнялось омметром на пределе, используемом для проверки полупроводниковых диодов. Для доступа к «дальним» контактам разъема USB 3.0 можно сконструировать переходник или воспользоваться тонким и длинным щупом, например иглой. Полученный результат является необходимым, но не достаточным условием функционирования устройства в режиме USB 3.0 Super Speed. Может случиться так, что сигнальные цепи заканчиваются терминирующими резисторами, но не подключены к контроллеру. Поэтому переходим к следующему тесту – программному.

Программный тест

Эксперимент выполняем на достаточно новой, еще не исследованной плате Tyan S5533, построенной на чипсете Denlow.

Системная плата Tyan S5533

Рис 1. Системная плата Tyan S5533 в ITX-формате

Чтобы исключить влияние драйверов, запускаемых в сеансе операционной системы, наш тест будет «экстремально низкоуровневым», запускаться будем под DOS, а результаты контролировать путем просмотра дампа Memory Mapped I/O регистров контроллера USB.

Последовательность действий такова.

1) Воспользовавшись бета-версией утилиты USB.EXE разработки IC Book Labs, определим адрес блока конфигурационных регистров контроллера XHCI, в нашем примере это bus=0, device=14h, function=0. Также определим базовый адрес блока операционных регистров в пространстве Memory Mapped I/O, в нашем примере он равен F7500000h.

image

Рис 2. Результаты работы утилиты USB.EXE. Адрес блока конфигурационных регистров XHCI: bus=0, device=14h, function=0. Базовый адрес операционных регистров XHCI равен F7500000h.

2) Как известно, в целях совместимости с программным обеспечением, не поддерживающим контроллер USB 3.0 XHCI, на данной платформе, по умолчанию, порты USB 3.0 обслуживаются контроллером USB 2.0 EHCI. Наша задача – перевести их в режим обслуживания контроллером USB 3.0 XHCI. Воспользуемся документацией Intel 8 Series / С220 Series Chipset Family Platform Controller Hub Datasheet и любой утилитой, позволяющей редактировать содержимое регистров системной логики.

Программируем регистр USB 3.0 Port Routing Mask Register. Записываем по адресу bus=0, device=14h, function=0, register=0DCh байт со значением 0FFh.

Программируем регистр USB 3.0 Port Super Speed Enable Register. Записываем по адресу bus=0, device=14h, function=0, register=0D8h байт со значением 0FFh.

image

Рис.3. Регистр USB 3.0 Port Routing Mask Register

image

Рис.4. Регистр USB 3.0 Port Super Speed Enable Register

3) Считываем и расшифровываем согласно рис.5 и рис.6 исходное состояние нескольких битовых полей из младших 16-битов 32-битного регистра PORTSCNUSB3 до подключения устройства к исследуемому порту. Регистр находится по смещению 0570h от базового адреса блока операционных регистров контроллера, его адрес F7500000h+0570h=F7500570h

Прочитанное значение = 02A0h = 0000.0010.1010.0000b
D0=Current Connect Status=0. Устройство не подключено.
D1=Port Enabled/Disabled=0. Порт не используется.
D[13-10]=Port Speed=0000b. Скорость не определена.

image

Рис.5. Регистр USB 3.0 Port Status and Control Register, биты [4-0]

image

Рис.6. Регистр USB 3.0 Port Status and Control Register, биты [13-10]

4) Подключаем USB 3.0 флэшку, затем повторно считываем регистр и расшифровываем те же битовые поля.

Прочитанное значение = 1203h = 0001.0010.0000.0011b
D0=Current Connect Status=1. Устройство подключено.
D1=Port Enabled/Disabled=1. Порт используется.
D[13-10]=Port Speed=0100b. Скорость равна 5.0 Gbit/S, режим USB 3.0 Super Speed работает.

5) Для самоконтроля, подключаем USB 2.0 флэшку к тому же порту, затем повторно считываем регистр и расшифровываем те же битовые поля. Прочитанное значение = 02A0h, что соответствует отсутствию подключения. Так и должно быть, регистр PORTSCNUSB3 «не видит» USB 2.0 устройство, так как оно обслуживается другой подсистемой и статус подключения доступен посредством другого регистра – PORTSCNUSB2, рассмотрение которого выходит за рамки наших исследований.

Резюме

Испытуемая флэшка действительно поддерживает режим USB 3.0.

Если формализовать и запрограммировать описанные действия в виде DOS-программы или UEFI-приложения, получится небольшая утилита, позволяющая быстро определить, в каком скоростном режиме работает USB устройство. Для упрощения нашего примера, мы реализовали его для частного случая – подсистемы USB платы Tyan S5533 и использования первого порта, поэтому адрес регистра PORTSCNUSB3 в нашем примере – константа. В общем случае, для того, чтобы программа была работоспособна на всех платформах, адрес регистра PORTSCNUSB3 должен вычисляться на основании содержимого полей XHCI Capabilities, в соответствии со спецификацией USB 3.0 XHCI. С другой стороны, достигнуть универсальности можно значительно проще и изящнее, используя UEFI-протоколы вместо прямого взаимодействия с регистрами контроллера.

Источники информации

UPD

В качестве «подопытного кролика» использовался девайс Kingston DataTraveler 100 G3, объемом 16 GB:
image

Автор: icbook

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js