Skip to end of metadata
Go to start of metadata

You are viewing an old version of this content. View the current version.

Compare with Current View Version History

« Previous Version 15 Next »

This document demonstrates how to implement an USB 2.0 / USB 3.0 mass storage gadget on SP7350 platforms.

Table of Contents

Kernel Setup

Enter the kernel configuration by running the following command in the top directory of project.

# make kconfig

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

image-20240708-071332.png

  1. Select submenus for USB OTG Transceive driver : Device Drivers > USB support > USB Physical Layer drivers. Select <*> for “Sunplus USB OTG Transceive driver“.

image-20240708-071051.png
  1. 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“.

image-20240703-083817.png

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

image-20240703-084023.png

  1. Execute the make command to build the Linux image.

Create a backing storage file

The backing storage file must be prepared before the gadget uses it.

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

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

ConfigFS

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

Implementation

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.

image-20240708-065620.png

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

image-20240801-034342.png

Clear the configuration

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

  • No labels