Pi Zero als smart USB-stick 2

Door synoniem op zaterdag 23 november 2019 20:00 - Reageren is niet meer mogelijk
Categorie: Raspberry Pi, Views: 3.603

Om nog even terugkomen op de reactie bij aflevering 1 van Pi Zero als smart USB-stick wat kan je hier nu mee? Zoals gezegd heel veel. Hieronder een opsomming van de kernel modules die als linux gadget beschikbaar zijn.
  • Serial (g_serial), virtuele terminal ttyACM0 onder linux COM3 e.v. onder Windows
  • Ethernet (g_ether), virtuele ethernet adapter
  • Mass storage (g_mass_storage),virtuele USB-stick
  • MIDI (g_midi), virtuele MIDI apparaat
  • Audio (g_audio), virtuele audioapparaat
  • Keyboard/Mouse (g_hid), virtuele toetsenbord en muis
  • Mass storage and Serial (g_acm_ms), zowel USB-stick als virtuele terminal
  • Ethernet and Serial (g_cdc), zowel virtuele terminal als virtuele ethernet adapter
  • Multi (g_multi), tegelijkertijd terminal, seriële en ethernetadapter
  • Webcam (g_webcam), een webcam
  • Printer (g_printer), een printer
  • Gadget tester (g_zero), en een testmodule
Het eerste doel wat ik nu met de Pi wil bereiken is een ge-encrypte USB-stick waarbij je via zowel het netwerk als de virtuele terminal kan inloggen om de partitie beschikbaar te stellen en weer af te sluiten na gebruik. Om dat te realiseren heb ik uiteindelijk de g_multi module nodig maar ik begin simpel met alleen de g_serial module dan misschien g_ether en als laatste g_mass_storage. Werkt elke module afzonderlijk dan ga ik g_multi configureren (en nadenken over mijn volgende project).

Zoals altijd als je bezig gaat met dit soort projectjes ga er vanuit dat je rare dingen tegen gaat komen.
Maar laten we beginnen met USB OTG aan te zetten op de Pi. Dit doe je door in het bestand config.txt op de boot partitie de volgende regel toe te voegen:
code:
1
dtoverlay=dwc2

Vervolgens moet de module dwc2 (en g_serial) geladen worden. Normaliter doe ik dat in het bestand /etc/modules maar dit levert, in mijn geval, wat vage foutmeldingen en soms wel, soms niet goed opstarten op. Hierover niet getreurd je kan de te laden modules ook meegeven bij het opstarten door modules-load=dwc2 toe te voegen aan het bestand cmdline.txt op de boot partitie. Mijn cmdline.txt ziet er nu zo uit:
code:
1
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=e934c5ce-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2

Nu denk je misschien waarom laat je niet ook automatisch g_serial? Dat is een van de rare dingen waar ik tegenaan gelopen ben. Op het moment dat ik hier g_serial toevoeg zal het onder Windows gewoon werken maar onder Linux gaat het kennelijk iets te snel. In mijn logfile (dmesg) verscheen de volgende tekst:
code:
1
2
3
4
5
6
[24732.293784] usb 1-4: New USB device found, idVendor=0525, idProduct=a4a7, bcdDevice= 4.19
[24732.293787] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[24732.293789] usb 1-4: Product: Gadget Serial v2.4
[24732.293791] usb 1-4: Manufacturer: Linux 4.19.85+ with 20980000.usb
[24732.317976] cdc_acm 1-4:2.0: ttyACM0: USB ACM device
[24732.318969] cdc_acm 1-4:2.0: failed to set dtr/rts

Met als gevolg dat het hele circus niet wil werken en minicom of screen een foutmelding geeft over device /dev/ttyACM0.

Het probleem heb ik ontweken door een vertragingstactiek toe te passen. Namelijk pas als laatste de module g_serial te laden in /etc/rc.local. Mijn rc.local ziet er nu zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
sleep 2
modprobe g_serial
exit 0

Is dit alles goed gegaan en de driver laadt zonder foutmeldingen, blijft er nog één ding over. Namelijk de Pi vertellen dat hij op de virtuele seriële poort ook een login kan verwachten. Dat kan op de twee manieren. De simpelste manier is vanaf de Pi zelf:
code:
1
sudo systemctl enable getty@ttyGS0.service

De andere manier is op de SD-kaart van de Pi deze kopieeractie uit te voeren, er vanuit gaande dat de SD-kaart gemount is onder /media/synoniem/rootfs.
code:
1
sudo ln -s /media/synoniem/rootfs/lib/systemd/system/getty@.service /media/synoniem/rootfs/etc/systemd/system/getty.target.wants/getty@ttyGS0.service


Onder linux kun je aan de logfile zien of het allemaal gelukt is en welk devicenaam de USB-stick gekregen heeft. Dit kun je controleren met;
code:
1
2
3
4
sudo dmesg | grep cdc
[21998.393504] cdc_acm 1-4:2.0: ttyACM0: USB ACM device
[21998.397107] usbcore: registered new interface driver cdc_acm
[21998.397108] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters

In dit geval is de seriële devicenaam /dev/ttyACM0. Met device kun je vanaf een linux systeem nu verbinding maken door middel van screen of minicom. Onder debian-achtigen distro's installeer je die met sudo apt-get install screen (of minicom).
code:
1
screen /dev/ttyACM0 115200

En het resultaat https://tweakers.net/ext/f/z22wH0FOtiJy1B4kizmt915O/full.png

Onder Windows gebruik je Putty met de virtuele COM poort toegewezen aan de USB-stick. Dit kun je eventueel terugvinden bij Apparaatbeheer. In mijn geval is dat COM3 en putty staat ingesteld op: serial, 115200 8N1.

Pi Zero als smart USB-stick 1

Door synoniem op dinsdag 12 november 2019 22:24 - Reacties (10)
Categorie: Raspberry Pi, Views: 3.635

De hardware
De Pi Zero is letterlijk en figuurlijk de kleinste Pi uit de serie. Fysiek maar een halve creditcard en maar een processor met één core en maar 512 Mb geheugen. Daarmee is hij echt voor inbouw in projecten bedoeld en niet voor een mediaspeler of andere zwaardere toepassingen. Daarnaast zijn ook niet alle connectoren aanwezig. En de wel aanwezige connectoren zijn ook nog eens micro en mini versie. Allemaal bedoeld om het printje zo klein mogelijk te houden.

Maar het interessantste onderdeel van een Zero is dat hij een USB OTG microconnector heeft. Daarmee kan de Zero tegelijk zowel een randapparaat/gadget als een master device zijn. Dat maakte mij nieuwsgierig naar de mogelijkheden om van de Zero een smart USB-stick te maken. Bij het rond zoeken op het web zijn er diverse handleidingen te vinden maar niet altijd compleet of voor een oude versie van Raspbian. Vandaar dat ik het resultaat van mijn projectje voor de liefhebbers in twee of drie afleveringen hier op schrijf.

Om het maximale aan functionaliteit uit de Zero te halen heb ik gekozen voor de Pi Zero W. Dus de versie met Wifi en Bluetooth aan boord. Ik wil ook dat het op een USB-stick lijkt met een gewone connector. Hier zijn verschillende oplossingen voor te koop met de keuze om zelf te solderen of door een tweede printplaatje met kunststof moertjes en boutjes vast te klemmen aan de Zero.


Zo ziet het printplaatje er uit, verkrijgbaar bij diverse leveranciers. De mijne heb ik op Aliexpress gekocht. (Geen affiliate je kan ook zelf zoeken op Pi Zero USB addon board).

En hier kun je zien dat de contacten op de Zero geklemd worden.

Overigens heb ik hiervoor ook een 3D geprinte behuizing gevonden op Thinkiverse waarmee het geheel echt op een USB-stick uit de begintijd lijkt. Lomp en zonder verloopje geen twee naast of onder elkaar te gebruiken. Wil je dat wel kun natuurlijk ook gelijk een micro - USB A verloopkabeltje gebruiken zonder het extra addon boardje.

De installatie
Als eerste wilde ik ssh en een wifi verbinding configuren zodat ik achter mijn gewone PC alles kan installeren en configuren. Dit doe je voor ssh door op een nieuw gekopieerd SD-kaartje in de root van de bootpartitie een leeg bestand ssh aan te maken:
code:
1
$ touch /ssh


Voor het inschakelen van wifi maak je op dezelfde locatie het bestand wpa_supplicant.conf met de volgende inhoud:
code:
1
2
3
4
5
6
7
8
9
10
11
country=NL
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="APnaam"
    psk="Wachtwoord"
    key_mgmt=WPA-PSK
    proto=RSN
    group=CCMP
    pairwise=CCMP
}


Helaas ben ik na veel gedoe er achter gekomen dat dit voor Raspbian 10/Buster niet werkt. Misschien dat er inmiddels een workaround is maar ik heb, na een halve dag hier aan verspild te hebben, er voor gekozen om Raspbian 9/Stretch te gaan gebruiken. Dat werkte direct bij de eerste keer opstarten met deze instellingen.

Wordt vervolgd.