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.
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.