GNU/Linux >> Linux Esercitazione >  >> Linux

Nessun Udc si presenta per il gadget di archiviazione di massa USB con Configfs?

Attualmente sto cercando di far funzionare il gadget di archiviazione di massa USB su un raspberry pi zero W.

Il mio obiettivo principale è implementare entrambe le funzioni di mass_storage e mtp responder in un unico gadget, ma arriverà più tardi.

Ho seguito questa documentazione Equivalente di g_mass_storage con configfs per scrivere il seguente script che inizializza la configurazione per il gadget di archiviazione di massa USB tramite configfs e functionfs.

#!/bin/sh

set -e

CONFIGFS="/sys/kernel/config"
GADGET="$CONFIGFS/usb_gadget"
VID="0x0525"
PID="0xa4a2"
SERIAL="0123456789"
MANUF="Myself"
PRODUCT="MyProduct"

case "$1" in
    start)
        echo "Creating the USB gadget"
        echo "Loading composite module"
        modprobe libcomposite

        echo "Creating gadget directory g1"
        mkdir -p $GADGET/g1

        cd $GADGET/g1
        if [ $? -ne 0 ]; then
            echo "Error creating usb gadget in configfs"
            exit 1;
        else
            echo "OK"
        fi

        echo "Creating Mass Storage interface"
        echo "\tCreating backing file"
        dd if=/dev/zero of=/home/pi/backingFile.img bs=1024 count=1024 > /dev/null 2>&1
        mkdosfs /home/pi/backingFile.img > /dev/null 2>&1
        echo "\tOK"

        echo "\tCreating gadget functionality"
        mkdir functions/mass_storage.0
        echo 1 > functions/mass_storage.0/stall
        echo "/home/pi/backingFile.img" > functions/mass_storage.0/lun.0/file
        echo 1 > functions/mass_storage.0/lun.0/removable
        echo 0 > functions/mass_storage.0/lun.0/cdrom
        mkdir configs/c.1
        mkdir configs/c.1/strings/0x409
        ln -s functions/mass_storage.0 configs/c.1
        echo "\tOK"
        echo "OK"

        echo "Setting Vendor and Product ID's"
        echo $VID > idVendor
        echo $PID > idProduct
        echo "OK"

        echo "Setting English strings"
        mkdir -p strings/0x409
        echo $SERIAL > strings/0x409/serialnumber
        echo $MANUF > strings/0x409/manufacturer
        echo $PRODUCT > strings/0x409/product
        echo "OK"

        echo "Binding USB Device Controller"
        echo `ls /sys/class/udc` > UDC
        echo "OK"
        ;;
    stop)
        echo "Stopping the USB gadget"

        cd $GADGET/g1

        if [ $? -ne 0 ]; then
            echo "Error: no configfs gadget found" 
            exit 1;
        fi

        echo "Unbinding USB Device Controller"
        echo "" > UDC
        echo "OK"

        echo "Removing Mass Storage interface"
        rm -f configs/c.1/mass_storage.0
        rm -f /home/pi/backingFile.img
        rmdir functions/mass_storage.0
        echo "OK"

        echo "Clearing English strings"
        rmdir strings/0x409
        echo "OK"

        echo "Cleaning up configuration"
        rmdir configs/c.1/strings/0x409
        rmdir configs/c.1
        echo "OK"

        echo "Removing gadget directory"
        cd $GADGET
        rmdir g1
        cd /
        echo "OK"

        echo "Disable composite USB gadgets"
        modprobe -r libcomposite
        echo "OK"
        ;;
    *)
        echo "Usage : $0 {start|stop}"
esac

Tutto sembra funzionare fino al passaggio "Binding USB Device Controller". Dopo aver configurato tutto, non c'è ancora nulla in /sys/class/udc/ .

All'avvio, la cartella /sys/class/udc/ non esiste e appare dopo aver eseguito lo script con sudo ./mass-storage-load start ma rimane vuoto.
Anche la partizione configfs viene montata all'avvio.

Correlati:perché printf è migliore di echo?

Dopo aver eseguito lo script, vengono caricati tre nuovi moduli

[email protected]:~ $ lsmod
Module                  Size  Used by
usb_f_mass_storage     44899  2 
libcomposite           52156  10 usb_f_mass_storage
udc_core               40853  2 usb_f_mass_storage,libcomposite

Tuttavia senza nulla in /sys/class/udc Non so quale controller del dispositivo USB dovrei associare a questo gadget.
Ho cercato molto su Internet per trovare qualcuno che potesse avere un problema simile ma non sono riuscito a trovare qualcosa.

Risposta accettata:

Alla fine il problema era che doveva essere caricato il modulo dwc2.

Quindi ho aggiunto dtoverlay=dwc2 su /boot/config.txt e dwc2 alla fine di /etc/modules per caricarlo automaticamente all'avvio.


Linux
  1. Comando Eco con esempi pratici

  2. Controllo di un alimentatore USB (on/off) con Linux

  3. disabilitare le regole udev MTP per un dispositivo specifico in modo che possa essere montato come dispositivo di archiviazione di massa USB

  4. Tipo di file system da inserire nell'archivio USB, compatibile con la maggior parte dei sistemi operativi

  5. Monta automaticamente le unità USB con systemd

Aggiungi spazio di archiviazione con LVM

Introduzione a btrfs per Linux

Comando Echo in Linux (con esempi)

Echo Command in Linux con esempi

Come gestire l'archiviazione con GParted Linux

come estendere l'archiviazione SAN in CentOS 7