This document demonstrates how to implement an USB 2.0 / USB 3.0 mass storage gadget on SP7350 platforms.
Table of Contents
Enter the kernel configuration by running the following command in the top directory of project.
# make kconfig |
Select submenus for USB 2.0 controller : Device Drivers > USB support > USB Gadget Support > USB Peripheral Controller. Select <*> for “Sunplus USB 2.0 Device Controller“.
Select submenus for USB OTG Transceive driver : Device Drivers > USB support > USB Physical Layer drivers. Select <*> for “Sunplus USB OTG Transceive driver“.
Select submenus for USB 3.0 controller : Device Drivers > USB support. Select <*> for “DesignWare USB3 DRD Core Support“ and select “Dual Role mode“ for “Deware USB3 DRD Core Support“.
Select submenus for USB Gadget configfs : Device Drivers > USB support > USB Gadget Support. Select <M> for “USB Gadget functions configurable through configfs“ and [*] for “Mass storage“.
Execute the make command to build the Linux image.
The backing storage file must be prepared before the gadget uses it.
Use the following command to create 32MB files (backing_file_u2 and backing_file_u3) filled with zeros.
# dd bs=1M count=32 if=/dev/zero of=/backing_file_u2 32+0 records in 32+0 records out 33554432 bytes (34 MB, 32 MiB) copied, 0.0850515 s, 395 MB/s # dd bs=1M count=32 if=/dev/zero of=/backing_file_u3 32+0 records in 32+0 records out 33554432 bytes (34 MB, 32 MiB) copied, 0.0836486 s, 401 MB/s |
Use the following command to create the FAT file system in backing_file_u2 and backing_file_u3.
# mkfs.fat /backing_file_u2 mkfs.fat 4.1 (2017-01-24) # mkfs.fat /backing_file_u3 mkfs.fat 4.1 (2017-01-24) |
Configure mass storage gadget through configfs saved as a file named usb_mass_storage.
#!/bin/bash USB2_UMS_EN=on USB3_UMS_EN=on # install the drivers modprobe libcomposite modprobe usb_f_mass_storage # disable debug message echo 0 > /sys/module/sunplus_udc/parameters/dmsg # create /sys/kernel/config if [ ! -d /sys/kernel/config ] then mkdir -p /sys/kernel/config fi # mount configfs if ! mountpoint -q /sys/kernel/config then mount -t configfs none /sys/kernel/config fi if [ $USB2_UMS_EN = on ] then UDC_NAME="f8102800.usb" BACKING_FILE=/backing_file_u2 # create gadget cd /sys/kernel/config/usb_gadget mkdir g1 cd g1 echo "64" > bMaxPacketSize0 echo "0x200" > bcdUSB # create configuration mkdir -p configs/c.1 mkdir -p configs/c.1/strings/0x409 echo 120 > configs/c.1/MaxPower mkdir strings/0x0409 echo "1234" > strings/0x0409/serialnumber echo "Sunplus" > strings/0x0409/manufacturer echo "SP7350 USB2.0 Mass Storage Gadget" > strings/0x0409/product # create functions mkdir functions/mass_storage.usb0 echo "$BACKING_FILE" > functions/mass_storage.usb0/lun.0/file # link functions and configuration ln -s functions/mass_storage.usb0 configs/c.1 # activate echo $UDC_NAME > UDC fi if [ $USB3_UMS_EN = on ] then UDC_NAME="f80a1000.dwc3" BACKING_FILE=/backing_file_u3 # create gadget cd /sys/kernel/config/usb_gadget if [ $USB2_UMS_EN = on ] then mkdir g2 cd g2 else mkdir g1 cd g1 fi echo "64" > bMaxPacketSize0 echo "0x300" > bcdUSB # create configuration mkdir configs/c.1 mkdir configs/c.1/strings/0x409 echo 120 > configs/c.1/MaxPower mkdir strings/0x0409 echo "5678" > strings/0x0409/serialnumber echo "Sunplus" > strings/0x0409/manufacturer echo "SP7350 USB3.0 Mass Storage Gadget" > strings/0x0409/product # create functions mkdir functions/mass_storage.usb0 echo "$BACKING_FILE" > functions/mass_storage.usb0/lun.0/file # link functions and configuration ln -s functions/mass_storage.usb0 configs/c.1 # activate echo $UDC_NAME > UDC fi |
After updating the image to the SP7350 platform, booting the system and copying backing_file_u2 and backing_file_u3 to it, use sh usb_mass_storage command to configure USB 2.0 and USB 3.0 as mass storage devices.
After connecting the mass storage gadget to a Windows PC through an USB cable, “E:\” and “F:\”will show up in “Portable Devices” of “Device Manager” and 2 “USB Mass Storage Device“ in “Universal Serial Bus controllers“.
The following script can be used to clear the configuration of the gadget.
#!/bin/bash addr1="g1" addr2="g2" arr=("addr1" "addr2") GADGET=/sys/kernel/config/usb_gadget cd / for i in "${arr[@]}"; do if [ -d $GADGET/${!i} ] then if [ -d $GADGET/${!i}/configs/c.1 ] then rm $GADGET/${!i}/configs/c.1/mass_storage.usb0 if [ -d $GADGET/${!i}/configs/c.1/strings/0x409 ] then rmdir $GADGET/${!i}/configs/c.1/strings/0x409 fi rmdir $GADGET/${!i}/configs/c.1 fi if [ -d $GADGET/${!i}/functions/mass_storage.usb0 ] then rmdir $GADGET/${!i}/functions/mass_storage.usb0 fi if [ -d $GADGET/${!i}/strings/0x0409 ] then rmdir $GADGET/${!i}/strings/0x0409 fi rmdir $GADGET/${!i} fi done rmmod usb_f_mass_storage rmmod libcomposite |