저는 현재 Raspberry Pi Zero W에서 작동할 USB 대용량 저장 장치를 얻으려고 노력하고 있습니다.
나의 주요 목표는 Mass_storage 및 mtp 응답기 기능을 작은 도구에 구현하는 것이지만 이는 나중에 구현될 것입니다.
나는 이 문서를 따랐다.g_mass_storage 및 configfs와 동일configfs 및 functionfs를 통해 USB 대용량 저장 장치의 구성을 초기화하려면 다음 스크립트를 작성하십시오.
#!/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
"USB 장치 컨트롤러 바인딩" 단계까지는 모든 것이 괜찮은 것 같습니다. 모든 것을 구성한 후에도 여전히 아무것도 없습니다 /sys/class/udc/
.
시작할 때 폴더가 /sys/class/udc/
존재하지 않으며 스크립트를 실행한 후에 폴더가 나타나지만 sudo ./mass-storage-load start
비어 있습니다. configfs 파티션은 부팅 시에도 마운트됩니다.
스크립트를 실행하면 세 개의 새 모듈이 로드됩니다.
pi@raspberrypi:~ $ 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
그러나 /sys/class/udc
이 가젯에 어떤 USB 장치 컨트롤러를 바인딩해야 하는지 모르겠습니다. 비슷한 문제를 겪고 있는 사람들을 찾기 위해 인터넷에서 많은 검색을 해봤지만 아무 것도 찾을 수 없습니다.
답변1
마지막 문제는 dwc2 모듈을 로드해야 한다는 것입니다.
그래서 시작 시 및 dtoverlay=dwc2
끝에 자동 로드를 추가했습니다 ./boot/config.txt
dwc2
/etc/modules