Pi Zero als smart USB-stick 2

Door synoniem op zaterdag 23 november 2019 20:00
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.

Volgende: Pi Zero als smart USB-stick 3 12-'19 Pi Zero als smart USB-stick 3
Volgende: Pi Zero als smart USB-stick 1 11-'19 Pi Zero als smart USB-stick 1

Reacties

Reageren is niet meer mogelijk