zefie icon

pi0 gadget_setup (otg part 2)

zefie | PRO | 09/05/17 11:53:37 AM UTC | 0 ⭐ | 899 👁️ | Never ⏰ | []
Bash |

3.77 KB

|

None

|

0 👍

/

0 👎

#!/bin/bash -e
 
SERIAL=$(grep Serial /proc/cpuinfo | sed 's/Serial\s*: 0000\(\w*\)/\1/')
BASEMAC="$(echo $(echo ${SERIAL} | cut -b 3-) | sed 's/\(\w\w\)/:\1/g' | cut -b 2-)"
DEV_MAC="02:${BASEMAC}"
HOST_MAC="12:${BASEMAC}"
DIAG_IP="192.168.99.1/30" # Default
MSFILE=''
 
if [ $(grep "^zefie_diag_ip=" /boot/config.txt | wc -l) -eq 1 ]; then
        DIAG_IP="$(grep "^zefie_diag_ip=" /boot/config.txt | cut -d'=' -f2)"
fi
 
if [ $(grep "^zefie_msd_file=" /boot/config.txt | wc -l) -eq 1 ]; then
        MSFILE="$(grep "^zefie_msd_file=" /boot/config.txt | cut -d'=' -f2)"
        if [ ! -f "${MSFILE}" ]; then
                # Unset since file doesn't exist
                MSFILE='';
        fi
fi
 
if [ $(grep "^zefie_enable_configfs=1" /boot/config.txt | wc -l) -eq 1 ]; then
        # Use configfs
        modprobe libcomposite
 
        CONFIGFS="/sys/kernel/config/usb_gadget"
        G="${CONFIGFS}/gadget"
 
        mkdir ${G}
        mkdir -p ${G}/strings/0x409
        echo 0x1d6b > ${G}/idVendor  # Linux Foundation
        echo 0x0104 > ${G}/idProduct # Multifunction Composite Gadget
        echo 0x0201 > ${G}/bcdDevice # v2.0.1
        echo 0x0200 > ${G}/bcdUSB    # USB 2.0
        echo "${SERIAL}" > ${G}/strings/0x409/serialnumber
        echo "Zefie Networks" > ${G}/strings/0x409/manufacturer
        echo "Pi Zero Gadget" > ${G}/strings/0x409/product
 
        # Main Config
        mkdir -p ${G}/configs/c.1
        echo 1 > ${G}/configs/c.1/MaxPower
        mkdir -p ${G}/configs/c.1/strings/0x409
        echo "Config 1" > ${G}/configs/c.1/strings/0x409/configuration
 
        # Serial 1 (tty)
        mkdir -p ${G}/functions/acm.0
        ln -s ${G}/functions/acm.0 ${G}/configs/c.1
 
        if [ $(grep "^zefie_second_serial=1" /boot/config.txt | wc -l) -eq 1 ]; then
                # Serial 2
                mkdir -p ${G}/functions/acm.1
                ln -s ${G}/functions/acm.1 ${G}/configs/c.1
        fi
 
        # RNDIS Ether
        mkdir -p ${G}/functions/rndis.0
        echo "${DEV_MAC}" > ${G}/functions/rndis.0/dev_addr
        echo "${HOST_MAC}" > ${G}/functions/rndis.0/host_addr
        ln -s ${G}/functions/rndis.0 ${G}/configs/c.1
 
        # Mass Storage
        if [ ! -z "${MSFILE}" ]; then
                mkdir -p ${G}/functions/mass_storage.0
                echo 0 > ${G}/functions/mass_storage.0/stall
                mkdir -p ${G}/functions/mass_storage.0/lun.0
                echo 1 > ${G}/functions/mass_storage.0/lun.0/removable
                if [ $(grep "^zefie_msd_cdrom=1" /boot/config.txt | wc -l) -eq 1 ]; then
                        echo 1 > ${G}/functions/mass_storage.0/lun.0/cdrom
                        echo 1 > ${G}/functions/mass_storage.0/lun.0/ro
                else
                        echo 0 > ${G}/functions/mass_storage.0/lun.0/cdrom
                        echo 0 > ${G}/functions/mass_storage.0/lun.0/ro
                fi
                echo 0 > ${G}/functions/mass_storage.0/lun.0/nofua
                echo ${MSFILE} > ${G}/functions/mass_storage.0/lun.0/file
                ln -s ${G}/functions/mass_storage.0 ${G}/configs/c.1
        fi
 
        # Windows Compatibility
        echo 1 > ${G}/os_desc/use
        echo "0xcd" > ${G}/os_desc/b_vendor_code
        echo "MSFT100" > ${G}/os_desc/qw_sign
 
        echo "RNDIS" > ${G}/functions/rndis.0/os_desc/interface.rndis/compatible_id
        echo 5162001 > ${G}/functions/rndis.0/os_desc/interface.rndis/sub_compatible_id
 
        ln -s ${G}/configs/c.1 ${G}/os_desc
 
        # Enable it all
        echo 20980000.usb > ${G}/UDC
else
        # Use g_ether
        modprobe g_ether host_addr=${HOST_MAC} dev_addr=${DEV_MAC}
fi
 
# We have ethernet regardless, so we set this.
ip addr add ${DIAG_IP} dev usb0
ip link set usb0 up

Comments