#!/bin/sh setup_image() { set -x local storage="$1" local sz_mb="$2" # create the backing store dd if=/dev/zero of=$storage bs=1M seek=$sz_mb count=0 2>/dev/null # this shows up as 23FC-F676 in /dev/disk/by-uuid local diskid=0x23FCF676 mkdosfs -n 'OPENBMC-FW' -i $diskid -I $storage >/dev/null 2>&1 } mount_image() { set -x local storage="$1" local stormnt="$2" mkdir -p $stormnt || exit 1 mount -o loop -t vfat $storage $stormnt } cleanup_image() { set -x local storage="$1" local stormnt="$2" umount -f "$stormnt" rm -f "$storage" rmdir "$stormnt" } GADGET_BASE=/sys/kernel/config/usb_gadget which_dev() { local in_use=$(cat $GADGET_BASE/*/UDC) cd /sys/class/udc for D in *; do case "$in_use" in *"$D"*) ;; *) echo "$D"; return 0;; esac done return 1 } usb_ms_insert() { local name="$1" local storage="$2" if [ -d $GADGET_BASE/$name ]; then echo "device $name already exists" >&2 return 1 fi mkdir $GADGET_BASE/$name cd $GADGET_BASE/$name echo 0x1d6b > idVendor # Linux Foundation echo 0x0105 > idProduct # FunctionFS Gadget mkdir strings/0x409 local machineid=$(cat /etc/machine-id) local data="OpenBMC USB mass storage gadget device serial number" local serial=$( echo -n "${machineid}${data}${machineid}" | \ sha256sum | cut -b 0-12 ) echo $serial > strings/0x409/serialnumber echo OpenBMC > strings/0x409/manufacturer echo "OpenBMC Mass Storage" > strings/0x409/product mkdir configs/c.1 mkdir functions/mass_storage.$name echo $storage > functions/mass_storage.$name/lun.0/file echo 0 > functions/mass_storage.$name/lun.0/removable mkdir configs/c.1/strings/0x409 echo "Conf 1" > configs/c.1/strings/0x409/configuration echo 120 > configs/c.1/MaxPower ln -s functions/mass_storage.$name configs/c.1 local dev=$(which_dev) echo $dev > UDC } usb_ms_eject() { local name="$1" echo '' > $GADGET_BASE/$name/UDC rm -f $GADGET_BASE/$name/configs/c.1/mass_storage.$name rmdir $GADGET_BASE/$name/configs/c.1/strings/0x409 rmdir $GADGET_BASE/$name/configs/c.1 rmdir $GADGET_BASE/$name/functions/mass_storage.$name rmdir $GADGET_BASE/$name/strings/0x409 rmdir $GADGET_BASE/$name } usage() { echo "Usage: $0 ..." echo " $0 setup " echo " $0 insert " echo " $0 eject " echo " $0 mount " echo " $0 cleanup " exit 1 } echo "$#: $0 $@" case "$1" in insert) shift usb_ms_insert "$@" ;; eject) shift usb_ms_eject "$@" ;; setup) shift setup_image "$@" ;; mount) shift mount_image "$@" ;; cleanup) shift cleanup_image "$@" ;; *) usage ;; esac exit $?