Pokazywałem już wcześniej jak można zrealizować na PIC16LF1659 prostą klawiaturę, oraz pokazywałem najprostszą emulację pendrive z jednym plikiem i zapisem do pamięci nieulotnej EERAM. Teraz pójdę o krok dalej i wykonam praktyczny projekt oparty o doświadczenia z obu poprzednich eksperymentów. Będzie to urządzenie udające klawiaturę i wpisujące automatycznie hasło w momencie gdy wciśniemy przycisk. Co więcej, w trybie bierności, urządzenie będzie z kolei udawać pendriva i pozwalać na edycję zapisanego hasła w postaci zwykłego pliku tekstowego. O bieżącym stanie urządzenia będzie informować szybkość migania LED.
Przypomnę dwa poprzednie tematy:
-Tutorial PIC16LF1459 - obsługa USB HID w darmowym kompilatorze SDCC - LED, myszka i klawiatura
- Własny pendrive od zera - mikrokontroler PIC i pamięć EERAM - bez zewnętrznych bibliotek
Teraz można zacząć od ogólnego planu działania. Mamy uruchomione już dwa składowe moduły, teraz wystarczy:
- wydzielić odpowiednio klawiaturę i pendrive do osobnych plików
- utworzyć wspólną funkcję pętli w main i w niej decydować, który stos USB działa
- dobrać jakiś pin cyfrowy - przykładowo RA5 - i skonfigurować go jako cyfrowe wejście
- w pętli na bazie odczytu z tego pinu przełączać stan na klawiaturę, a gdy klawiatura skończy wysyłać znaki to wracać do trybu pamięci masowej
Dla uproszczenia uznałem, że dam namiastkę sprzętową ograniczającą efekt drgania styków i po prostu zastosuję kondensator...
W praktyce się nieco skomplikowało. Obsługa Mass Storage Device opiera się o przerwania, jest reaktywna, MSD odpowiada dopiero gdy się ją zapyta. Z tego powodu zrealizowana jest w usb_handle_transaction.
Klawiatura HID natomiast jest proaktywna - klawiatura sama się odzywa i wysyła wciśnięte klawisze, nie trzeba jej pytać o zdanie.
Z tego powodu mamy ogólny handler usb_service oraz dodatkowo funkcję keyboard_service.
Kod: C / C++
Analogicznie rozdzieliłem inne wspólne funkcje, np. pobieranie deskryptora:
Kod: C / C++
albo inicjalizacje:
Kod: C / C++
To teraz już wiemy jak działa rozdzielenie oraz jak działa wejście w tryb klawiatury. Zostaje jeszcze wyjście z trybu klawiatury i wysyłanie klawiszy. Główna pętla klawiatury respektuje w nieblokujący sposób opóźnienia i wysyła kolejne klawisze, wcześniej odczytując je z EERAM:
Kod: C / C++
No i teraz wracamy do pokazanej głównej pętli - tam sprawdzana jest flaga o zakończeniu pisania:
Kod: C / C++
Zasadniczo to tyle. Kilka ifów, obsługa przycisku, iteracja bajtów z pamięci i jazda.
Pora na końcową prezentację.
Tak wygląda nośnik danych w "Ten Komputer":
Tak w menedżerze urządzeń:
Tak po otwarciu w eksploratorze Windows (ciekawostka: ten plik od Dropbox i folder systemowy nie istnieją fizycznie w mojej tablicy plików):
Tak urządzenie działa w praktyce - na filmie widać wciśnięcie przycisku, miganie LED oraz wprowadzanie tekstu:
... a te natrętne okno z Dropbox po wpisywaniu tekstu dobrze obrazuje, że urządzenie wraca do trybu nośnika pamięci.
Podsumowując, cała trudna praca sprowadzała się do uruchomienia klawiatury HID (to było względnie proste) i udawanego pendrive z FAT12 (to nieco trudniejsze), a oba te kroki opisałem w poprzednich tematach. Tu zasadniczo całość sprowadziła się do sprytnego rozdzielenia obsługi USB na dwie gałęzie oraz do zaprogramowania klawiatury tak, by wysyłała bajty z pamięci a potem wracała do trybu nośnika danych.
Zostaje tylko pytanie - czy tak opracowane urządzenie ma sens?
W bieżącej wersji raczej nie, przydałoby się dodać kilka więcej przycisków oraz niezbędna może okazać się kontrola nad trybem edycji zawartości (pendrive). Edycja tekstu powinna by tylko na żądanie, być może też zabezpieczona hasłem, tylko w jaki sposób to zrobić bez zewnętrznych sterowników? Lepiej chyba zabezpieczyć przyciskiem. Wyobrażam sobie sytuację, gdzie tego rodzaju urządzenie jest takim przenośnym menedżerem haseł, pozwalającym wygodnie zalogować się na konto w szkole, pracy lub w bibliotece. Oczywiście są gotowce, ale tu chodzi o DIY. Podobnie przydałby się wyświetlacz... może coś z interfejsem I2C, pinów na to starczy.
Oczywiście nie ochroni to przed programami typu keylogger na komputerze, bo one przechwytują na poziomie systemu operacyjnego, ale to inna sprawa już.
Być może to jeszcze nie koniec, a wkrótce przedstawię kolejną wersję.
Pełen projekt SDCC w załączniku.
Fajne? Ranking DIY Pomogłem? Kup mi kawę.