
Pracujący przy komputerze w firmie o korporacyjnej "kulturze pracy" zapewne rozpoznają ten obraz. Wiele programów z dostępem chronionym hasłem (oczywiście każdy swoim). Do tego jakieś udziały sieciowe (znów hasło), korporacyjny serwer www, pocztowy, harmonogramów (kolejne hasła, hasła, hasła). Część programów wymusza okresowe zmiany hasła. Część programów ma krótkie timeouty. Ciągle trzeba coś tam wpisywać. Człowiek z głową zaabsorbowaną ważkim problemem, przełącza się do programu X by coś szybko sprawdzić a tam oczywiście timeout (Jakie tu, k...., jest hasło?...Ok...co ja tu właściwie chciałem...). Motywem wykonania urządzenia była potrzeba poradzenia sobie tą sytuacją.
Podstawowym założeniem było uczynienie czynności wpisywania danych autoryzacyjnych maksymalnie szybkim i nieabsorbującym. Dlatego odpadły rozwiązania programowe. I dlatego sposób obsługi urządzenia jest uproszczony do maksimum.
Urządzenie ma formę pudełka z 10 klawiszami i trzema różnokolorowymi diodami na wierzchu. Pod każdy przycisk "podpięty" jest ciąg znaków. Wciśnięcie przycisku wysyła do komputera tenże ciąg, tak jakby był on wpisany z klawiatury. Ciąg może składać się z dowolnych znaków ASCII. Maksymalna długość to 150 znaków. Długie wciśnięcie dowolnego batona aktywuje symulację ruchów myszki, co bywa przydatne przy dłuższej obserwacji ekranu bez aktywności na urządzeniach wejściowych (nie, nie chodzi o oglądanie filmików na jutubie). LEDy dają podstawową informacje zwrotną: tryb myszki, brak definicji ciągu, wyprowadzenie ciągu na wyjście, błąd krytyczny urządzenia.
Softwareowo jest to urządzenie kompozytowe USB składające się z trzech klas: HID klawiatura, HID mysz oraz CDC. Przejściowo zamiast dwóch oddzielnych HIDów zaimplementowałem HID z dwoma raportami, ale to rozwiązanie się nie sprawdziło. Nie wspomniałem o tym wcześniej więc teraz powiem, że podstawowym wymaganiem była praca urządzenia na standardowych sterownikach Windows (brak uprawnień administratora). HID dwuraportowy, niestety, domaga się sterowników więc skleciłem dwa oddzielne HIDy i to działa na sterownikach defaultowych. (Z CDC jest podobna kołomyjka, niestety, ale o tym może trochę dalej). CDC jest w charakterze interfejsu do wpisywania haseł. Po stronie urządzenia nasłuchuje prosty CLI realizujący kilka niezbędnych komend. Są to głównie komenda SET ustawiająca lub kasująca hasło, LIST listująca wszystkie hasła oraz HELP wyświetlający listę dostępnych komend z krótkim opisem.
Schemat ideowy jest bardzo prosty.

Sercem urządzenia jest płytka Black Pill z klonem STM32F103, zawierająca większość potrzebnych elementów (w tym gniazdo USB) co bardzo upraszcza wykonanie. Płytka wpięta w płytkę bazową z rozmieszczonymi pozostałymi elementami układu (LED, switche). Płytka bazowa jest przyśrubowana do obudowy Kradex Z-73.






Urządzenie kompozytowe zostało złożone do kupy z trzech oddzielnych urządzeń wyklikanych w CubeMX. W tym zadaniu bardzo pomogły mi informacje z tej strony:
https://sudonull.com/post/68144-CDC-MSC-USB-Composite-Device-on-STM32-HAL
W większym lub mniejszym stopniu przydały się także:
https://ep.com.pl/kursy/tutoriale/12577-stm32cubemx-tworzenie-urzadzen-usb-hid
https://ep.com.pl/kursy/tutoriale/10890-stm32-urzadzenie-usb-cdc.-wykonanie-za-pomoca-cubemx
https://community.arm.com/developer/tools-sof...-forum/31001/2-hids-in-one-composite-usb-code
http://kevincuzner.com/2018/01/29/bare-metal-stm32-writing-a-usb-driver/
https://damogranlabs.com/2018/02/stm32-usb-hid-mouse-keyboard/
Moduł CLI to moje własne wypociny sklecone kiedyś tam na AVR, które okazały się trochę nieprzystające do wymogów pracy asynchronicznej. Adaptacja nie do końca się udała i zabrała za dużo czasu. Ta część firmware jest pierwsza do ewentualnych modyfikacji, jeśli kiedyś nastąpią.
Aplikacja została napisana przy użyciu frameworka Quantum Leaps QP/C (Link).
Koszty materiałowe to ok 25 zł, z tego obudowa 6.94, Black Pill 6.77, laminat 3.43
W załączniku projekt Eclipse z kodem źródłowym. Dla zbudowania binarki potrzebne są także źródła frameworka (w załączniku ich nie ma). Najnowsza wersja prawdopodobnie nie będzie działać (framework jest mocno rozwijany, API jest dosyć dynamiczne), trzeba użyć wersji 6.3.8 (Link). W Eclipse trzeba ustawić dwie zmienne środowiskowe ze ścieżką dostępu do frameworka, są to:
QPC_SRC w Window > Preferences > General > Workspace > Linked Resources
QPC_PATH w Window > Preferences > C/C++ > Build > Build Variables
Filmik z działania: https://youtu.be/VQ_yNAAg3ck
Urządzenie jest wykorzystywane od kilku miesięcy i, wg relacji użytkownika, spełnia swoje zadanie. Ma jednak dwa mankamenty.
Pierwszy, iż sposób definiowania haseł jest dosyć trudny do ogarnięcia przez przeciętnego użytkownika Windowsów. Samo znalezienie w Windowsach portu COM pod którym urządzenie siedzi jest zadaniem niemal niemożliwym. Wpisywanie zaś komend w terminalu to rzecz totalnie nerdowska.
Drugim mankamentem jest fakt iż Windows 7 domaga się sterownika dla VCP w urządzeniu kompozytowym.
Dlatego powstała druga wersja w którym są dwa tryby pracy z przełączaniem się pomiędzy USB kompozytowym 2xHID oraz CDC. Powstała także aplikacja okienkowa Qt, w której można połączyć się z urządzeniem oraz podefiniować hasła w bardziej przyjazny sposób. Ale o tym może innym razem.
=== Edit 21.01.2021 ===
Mała aplikacja Qt na PC: https://github.com/m-xor/cserv.git Ułatwia znalezienie urządzenia i edycję haseł.
Kompilacja w Qt Creator https://www.qt.io/product/development-tools

Deployment na Windows: https://doc.qt.io/qt-5/windows-deployment.html Aplikacja nie stosuje niestandardowych wtyczek więc 'windeployqt katalog_z_binarką' bez dodatkowych parametrów. Kompilacja statyczna też nie jest specjalnie potrzebna. Na komputery z zainstalowanym Qt wystarczy sama binarka.
Cool! Ranking DIY