Як переконатися, що флешка працює в USB 3.0?

Як переконатися, що флешка працює в USB 3.0?

У сучасній 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.

Ріс 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.

Ріс 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.

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

Рис.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. Швидкість не визначена.

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

Рис.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-протоколи замість прямої взаємодії з регістрами контролера.

Джерела інформації

  • Специфікація eXtensible Host Controller Interface
  • Документація на чіпсет Intel 8 Series

UPD

Як «піддослідний кролик» використовувався девайс Kingston DataTraveler 100 G3, обсягом 16 GB:

UPD-II

1. Дескриптори пристроїв, доступні для перегляду за допомогою різних інформаційних утиліт індикують потенційні можливості пристрою. Швидкісний режим, встановлений для USB порту при підключенні пристрою, не завжди відповідає можливостям, декларованим у дескрипторах.

Пристрій, що декларує підтримку USB 3.0, може працювати в режимі USB 2.0 через заводські недоробки, несправний кабель і багато інших причин. При цьому вміст дескрипторів може вказувати на підтримку режиму USB 3.0.

Специфікацією USB рекомендовано, щоб пристрій видавав різний набір дескрипторів залежно від реальної встановленої швидкості. Але у нас немає гарантії, що ця рекомендація дотримана розробниками флешки.

Звичайно, вміст дескрипторів пристрою - це більш достовірне джерело інформації, ніж напис на флешці і клятви продавця. Але з причин, вказаних вище, достовірність відмінна від 100 відсотків.

Саме прагнення довести достовірність до 100% спонукало нас на екстремально низькорівневі дослідження.

2. Інший метод - простежити в диспетчері пристроїв, який контролер є батьківським для флешки (USB 2.0 EHCI або USB 3.0 XHCI), також неефективний, оскільки, згідно зі специфікацією, контролер USB 3.0 XHCI може підтримувати всі види пристроїв: від Low-Speed до Super Speed. Тому, з того, що для флешки батьківським контролером є xHCI не випливає, що пристрій працює в режимі Super Speed.

COM_SPPAGEBUILDER_NO_ITEMS_FOUND