GNU/Linux >> Tutoriales Linux >  >> Linux

¿No aparece Udc para el dispositivo de almacenamiento masivo USB con configfs?

Actualmente estoy tratando de hacer que el dispositivo de almacenamiento masivo USB funcione en una raspberry pi zero W.

Mi objetivo principal es implementar las funciones de respuesta de almacenamiento masivo y mtp en un dispositivo, pero vendrá más tarde.

Seguí esta documentación Equivalente de g_mass_storage con configfs para escribir el siguiente script que inicializa la configuración del dispositivo de almacenamiento masivo USB a través de configfs y 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

Todo parece funcionar hasta el paso "Binding USB Device Controller". Después de haber configurado todo, sigue sin haber nada en /sys/class/udc/ .

Al arrancar, la carpeta /sys/class/udc/ no existe y aparece después de ejecutar el script con sudo ./mass-storage-load start pero permanece vacío.
La partición configfs también se monta en el arranque.

Relacionado:¿Por qué printf es mejor que echo?

Después de ejecutar el script, se cargaron tres módulos nuevos

[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

Sin embargo, sin nada en /sys/class/udc No sé qué controlador de dispositivo USB debo vincular a este dispositivo.
Busqué mucho en Internet para encontrar a alguien que pudiera tener un problema similar, pero no puedo encontrar nada.

Respuesta aceptada:

Finalmente el problema era que había que cargar el módulo dwc2.

Así que agregué dtoverlay=dwc2 a /boot/config.txt y dwc2 al final de /etc/modules para cargarlo automáticamente al arrancar.


Linux
  1. 3 consejos para imprimir con Linux

  2. Configuración de almacenamiento local en Linux con Stratis

  3. Primeros pasos con Samba para la interoperabilidad

  4. Comprobar la validez de la IP

  5. Unidades USB de montaje automático con systemd

Agregar almacenamiento con LVM

Primeros pasos con btrfs para Linux

Comando Echo en Linux (con ejemplos)

Comando Echo en Linux con ejemplos

Ve a por ello:una lista de tareas pendientes moderna con un temporizador

Cómo administrar el almacenamiento con GParted Linux