Робота з саморобними usb пристроями без драйверів

Робота з саморобними USB пристроями без драйверів

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

Отже, найпоширеніші типи стандартних пристроїв:

  • MSC - Mass Storage Class
  • CDC - Serial Device Class
  • HID - Human Interface Device
  • CCID - Circuit Card Interface Device

Клас MSC малопридатний для організації зручного і простого обміну з додатком. Даний клас можна використовувати, якщо пристрій має великий обсяг FLASH-пам'яті з файловою системою і потрібно дати до нього доступ.

Клас USB-CCID досить цікавий в разі, якщо потрібно створити забезпечити швидкий обмін (він дозволяє передавати дані швидше HID і забезпечує менші затримки ніж CDC-клас), проте досить специфічний, тому що з ним потрібно працювати в рамках APDU-посилок.

Тепер розглянемо роботу з кожним класом устройсва більш докладно:

Робота з пристроєм MSC класу

Даний клас не дуже зручний для роботи, тому що вимагає велику кількість обробного коду і зав'язується на роботу з файловою системою. Однак, з пристроєм даного класу. Цікавий він стає, якщо пристрій має свою файлову систему або просто великий обсяг внутрішньої пам'яті.

В принципі, робота з пристроями MSC можна виробляти і без файлової системи, шляхом прямого читання / запису диска. Для цього потрібно просто відкрити за допомогою функції CreateFile безпосередньо пристрій:

Робота з пристроєм CDC класу

При використанні класу CDC після підключення пристрою в системі створюється віртуальний COM-порт, спілкування з яким з боку операційної системи абсолютно не відрізняється від роботи з фізичним COM-портом. На урове WinAPI робота з таким устройсва зводиться до викликів функцій CreateFile, WriteFile, ReadFile і CloseHandle.

Ідеальний варіант, якщо до цього пристрій використовувало COM-порт для спілкування з PC. В даному випадку не потрібно ніяких переробок в програмному забезпеченні на стороні PC, та й взагалі рішення є шаблонною. Будь-який пристрій з COM-портом через перехідник можна повісити на USB. В деякій серійної продукції (мені траплялися такі бесперебойники) перехід на шину USB здійснювався саме шляхом впровадження конвертора USB-COM.

Так само варіант з використанням CDC-класу хороший тим, що протокол асинхронний і в ньому можна відсилати блоки даних будь-якої довжини.

Однак, варто пам'ятати, що клас пристрою стандартний, в Windows для забезпечення його роботи є драйвер usbserial.sys, проте той же конвертор FTDI FT232хх використовує власну реалізацію протоколу CDC і все-таки вимагає установку драйвера.

Робота з пристроєм HID-класу

Хоч HID-устройсва і призначаються для взаємодії з джойстиками і клавіатурами, вони без проблем конфигурируются для передачі довільних даних користувача. Досить серйозний недолік HID - блоки даних можуть бути тільки фіксованого розміру, який встановлюється в HID-дескрипторі.

Основна складність при роботі з HID-пристроєм - отримати його ім'я в системі. Після того, як ім'я отримано працювати з пристроєм можна за допомогою функцій CreateFile, WriteFile, ReadFile і CloseHandle. Один момент, який варто згадати, першим байтом в переданому функцій Read / WriteFile йде ідентифікатор посилки, зазвичай це 0. Таким чином, якщо розмір блоку даних HID дорівнює 64 байта, в функцію потрібно передавати 65 байт. Цей байт використовується в драйвері і не йде в пристрій.

Яким же чином отримати ім'я HID-пристрої, найкраще подивитися в бібліотеці за посиланням в кінці статті.

Робота з пристроєм CCID-класу

Перша особливість роботи по CCID, потрібно вибрати ATR-рядок і протокол T = 0 або T = 1. Найкраще вибирати T = 1, тому що в ньому є APDU Case 4. Напевно, вже всі перелякалися купою незрозумілих слів. Сам протокол описується в стандарті ISO 7816-12 (є відповідний ГОСТ / ІСО), так само формат APDU посилок можна подивитися в ISO 7816-3 і ISO 7816-4. На жаль, стандарти ці платні, але добре пошукавши, всю необхідну інформацію з них все ж можна знайти у відкритому доступі.

Спілкування з пристроєм здійснюється за допомогою функцій SCardConnect, SCardTransmit. Функція SCardTransmit займається безпосередньо прийомом-передачею даних.

APDU посилка складається з заголовка і блоку даних. На неї обов'язково потрібно відповісти хоча б 2 байтами: код повернення, 90 00 в разі якщо все в порядку й інше значення (за стандартом 6х хх). Якщо є дані вони йдуть на початку, а код повернення дописується 2 байтами в кінець посилки. Основні коди, які можуть стати в нагоді при роботі описані в таблиці (в реальності, кодів помилок досить багато):

Повернення SW1 SW2

Тепер безпосередньо формати посилок (T = 1):

  • APDU Case 1:
  • APDU Case 2:
  • APDU Case 3:
  • APDU Case 4:

    Тобто є 4 класу APDU команд: без даних, з даними в пристрій, з поверненням даних з пристрою і з передачею даних відразу в обидві сторони. CLA - клас команди, INS - код команди, P1 і P2 - параметри команди. Так само при Разрабтка варто враховувати, що операційна система може сама в окремих випадках спробувати послати пристрою набір стандартних APDU-команд.

    Вибір VID і PID

    Наостанок питання про вибір VID і PID. За цим значенням відбувається прив'язка до пристрою драйверів в разі якщо пристрій не відноситься до стандартного класу. Якщо з однаковими PID і VID намагатися підключати устройсва різних класів можуть виникнути проблеми з драйверами, тому що передбачається що кожен пристрій має унікальні VID і PID.

    Підбірка статей та звітів про різні математичних і електронних експериментах.

    Схожі статті