Advertisement
zefie

Pi0 USB Multi-Gadget config (eth+mass+serial) v2.51

Oct 28th, 2018
467
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 7.80 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. ID_VENDOR="0x1d6b"
  4. ID_PRODUCT="0x0104"
  5. ID_MANU="Zefie Networks"
  6. ID_PROD="Raspberry Pi Zero W Gadget"
  7. USB_FILE="/dev/mmcblk0p3"
  8. USB_IS_ISO=0
  9. USB_IS_RO=0
  10.  
  11. functions=("rndis.usb0" "mass_storage.usb0" "acm.usb0")
  12.  
  13. g="/sys/kernel/config/usb_gadget/g"
  14.  
  15.  
  16. # Get serial from Pi /proc/cpuinfo
  17.  
  18. SERIAL="$(grep Serial /proc/cpuinfo | sed 's/Serial\s*: 0000\(\w*\)/\1/')"
  19. if [ -z "${SERIAL}" ]; then
  20.         # Minimum serial length is 8 (for MAC conversion)
  21.         SERIAL=00000001
  22. fi
  23.  
  24. # Generate MAC from last 8 characters of serial
  25. # Dev = serial, Host = serial + 1 hex byte
  26. # eg: Serial: 1234f54b Dev: B8:27:EB:34:F5:4B Host: B8:27:EB:34:F5:4C
  27.  
  28. MAC="$(echo "${SERIAL}" | rev | sed 's/\(\w\w\)/:\1/g' | cut -b 2- | rev)"
  29. MAC_DEV="02:00:$(echo "${MAC}" | rev | cut -b -11 | rev)"
  30. MAC_HOST_PRE=$(perl -le 'print hex("'"$(echo "${MAC_DEV}" | rev | cut -d':' -f1 | rev)"'")')
  31. MAC_HOST="$(echo "${MAC_DEV}" | rev | cut -d':' -f2- | rev):$(printf "%02X" "$((MAC_HOST_PRE + 1))")"
  32.  
  33. check_debug() {
  34.        if [ ! -z "${GADGET_DEBUG}" ]; then
  35.                echo 1;
  36.                return 1;
  37.        fi
  38.        echo 0;
  39.        return 0;
  40. }
  41.  
  42. read_ffs() {
  43.        if [ "$(check_debug)" -eq 1 ]; then
  44.                echo "  ${FUNCNAME[0]} $*"
  45.                return;
  46.        fi
  47.        if [ -e "${g}/${1}" ]; then
  48.                if [ -d "${g}/${1}" ]; then
  49.                        ls -l "${g}/${1}"
  50.                else
  51.                        echo "${1}: $(cat "${g}/${1}")"
  52.                fi
  53.        fi
  54. }
  55.  
  56. write_ffs() {
  57.        if [ "$(check_debug)" -eq 1 ]; then
  58.                echo "  ${FUNCNAME[0]} $*"
  59.                echo "     echo \"${2}\" > \"${g}/${1}\""
  60.                return;
  61.        fi
  62.  
  63.        if [ ! -d "${g}/$(dirname "${1}")" ]; then
  64.                mkdir -p "${g}/$(dirname "${1}")"
  65.        fi
  66.        if [ -f "${g}/${1}" ]; then
  67.                if [ "$(cat "${g}/${1}")" != "${2}" ]; then
  68.                        echo "${2}" > "${g}/${1}"
  69.                        if [ $? -ne 0 ]; then
  70.                                echo "Debug: echo \"${2}\" > \"${g}/${1}\""
  71.                        fi
  72.                fi
  73.        else
  74.                echo "${2}" > "${g}/${1}"
  75.        fi
  76. }
  77.  
  78. config_ffs() {
  79.        if [ "$(check_debug)" -eq 1 ]; then
  80.                echo "${FUNCNAME[0]} $*"
  81.        fi
  82.        write_ffs "configs/c.1/${1}" "${2}"
  83. }
  84.  
  85. activate_function() {
  86.        if [ "$(check_debug)" -eq 1 ]; then
  87.                echo "${FUNCNAME[0]} $*"
  88.                echo "  ln -s \"${g}/functions/${1}\" \"${g}/configs/c.1/\""
  89.                return;
  90.        fi
  91.        ln -s "${g}/functions/${1}" "${g}/configs/c.1/"
  92. }
  93.  
  94. activate_usb() {
  95.        if [ "$(check_debug)" -eq 1 ]; then
  96.                echo "${FUNCNAME[0]}"
  97.                return;
  98.        fi
  99.        udevadm settle -t 5 || :
  100.        write_ffs UDC "$(ls -1 /sys/class/udc)"
  101. }
  102.  
  103. config_function() {
  104.        if [ "$(check_debug)" -eq 1 ]; then
  105.                echo "${FUNCNAME[0]} $*"
  106.        fi
  107.        write_ffs "functions/${1}/${2}" "${3}"
  108. }
  109.  
  110. create_function() {
  111.        if [ "$(check_debug)" -eq 1 ]; then
  112.                echo "${FUNCNAME[0]} $*"
  113.                echo "  mkdir -p \"${g}/functions/${1}\""
  114.                return;
  115.        fi
  116.        mkdir -p "${g}/functions/${1}"
  117. }
  118.  
  119. deactivate_function() {
  120.        if [ "$(check_debug)" -eq 1 ]; then
  121.                echo "${FUNCNAME[0]} $*"
  122.                return;
  123.        fi
  124.        rm "${g}/configs/c.1/${1}"
  125. }
  126.  
  127. deactivate_usb() {
  128.        if [ "$(check_debug)" -eq 1 ]; then
  129.                echo "${FUNCNAME[0]}"
  130.        fi
  131.        write_ffs UDC ""
  132. }
  133.  
  134. destroy_function() {
  135.        if [ "$(check_debug)" -eq 1 ]; then
  136.                echo "${FUNCNAME[0]} $*"
  137.                return;
  138.        fi
  139.        if [ "$(read_ffs "configs/c.1/${1}" | wc -l)" -gt 0 ]; then
  140.                deactivate_function "${f}"
  141.        fi
  142.        rmdir "${g}/functions/${1}"
  143. }
  144.  
  145. link_osdesc() {
  146.        if [ "$(check_debug)" -eq 1 ]; then
  147.                echo "${FUNCNAME[0]}"
  148.                echo "  ln -s \"${g}/configs/c.1\" \"${g}/os_desc/\""
  149.                return;
  150.        fi
  151.        ln -s "${g}/configs/c.1" "${g}/os_desc/"
  152. }
  153.  
  154. ms_update() {
  155.        if [ "$(check_debug)" -eq 1 ]; then
  156.                echo "  ${FUNCNAME[0]} $*"
  157.        fi
  158.        deactivate_usb
  159.        function_init mass_storage.usb0 1
  160.        config_function mass_storage.usb0 "lun.${1}/cdrom" "${2}"
  161.        config_function mass_storage.usb0 "lun.${1}/ro" "${3}"
  162.        config_function mass_storage.usb0 "lun.${1}/file" "${4}"
  163.        activate_function mass_storage.usb0
  164.        sleep 1
  165.        activate_usb
  166. }
  167.  
  168. ms_mount_iso() {
  169.        if [ "$(check_debug)" -eq 1 ]; then
  170.                echo "${FUNCNAME[0]} $*"
  171.        fi
  172.        ms_update 0 1 1 "${1}"
  173. }
  174.  
  175. ms_mount_rw() {
  176.        if [ "$(check_debug)" -eq 1 ]; then
  177.                echo "${FUNCNAME[0]} $*"
  178.        fi
  179.        ms_update 0 0 0 "${1}"
  180. }
  181.  
  182. ms_mount_ro() {
  183.        if [ "$(check_debug)" -eq 1 ]; then
  184.                echo "${FUNCNAME[0]} $*"
  185.        fi
  186.        ms_update 0 0 1 "${1}"
  187. }
  188.  
  189. restart_function() {
  190.        if [ "$(check_debug)" -eq 1 ]; then
  191.                echo "${FUNCNAME[0]} $*"
  192.        fi
  193.        deactivate_usb
  194.        function_init "${1}"
  195.        sleep 1
  196.        activate_usb
  197. }
  198.  
  199. function_init() {
  200.        if [ "$(check_debug)" -eq 1 ]; then
  201.                echo "${FUNCNAME[0]} $*"
  202.        fi
  203.        if [ ! -z "${1}" ]; then
  204.                if [ "$(read_ffs "configs/c.1/${1}" | wc -l)" -gt 0 ]; then
  205.                        deactivate_function "${1}"
  206.                fi
  207.  
  208.                if [ "$(read_ffs "functions/${1}" | wc -l)" -gt 0 ]; then
  209.                        destroy_function "${1}"
  210.                fi
  211.  
  212.                create_function "${1}"
  213.                case "${1}" in
  214.                        mass_storage.usb0)
  215.                                config_function "${1}" stall 0
  216.                                config_function "${1}" lun.0/cdrom "${USB_IS_ISO}"
  217.                                config_function "${1}" lun.0/nofua 0
  218.                                config_function "${1}" lun.0/ro "${USB_IS_RO}"
  219.                                config_function "${1}" lun.0/removable 1
  220.                                config_function "${1}" lun.0/file "${USB_FILE}"
  221.                                ;;
  222.  
  223.                        rndis.usb0)
  224.                                config_function "${1}" host_addr "${MAC_HOST}"
  225.                                config_function "${1}" dev_addr "${MAC_DEV}"
  226.                                config_function "${1}" os_desc/interface.rndis/compatible_id RNDIS
  227.                                config_function "${1}" os_desc/interface.rndis/sub_compatible_id 5162001
  228.                                ;;
  229.                esac
  230.                if [ -z "${2}" ]; then
  231.                        activate_function "${1}"
  232.                fi
  233.        fi
  234. }
  235.  
  236. if [ "${USB_IS_ISO}" -eq 1 ]; then
  237.        USB_IS_RO=1
  238. fi
  239.  
  240. if [ -z "${1}" ]; then
  241.  
  242.        modprobe libcomposite
  243.  
  244.        deactivate_usb
  245.  
  246.        write_ffs idVendor "${ID_VENDOR}"
  247.        write_ffs idProduct "${ID_PRODUCT}"
  248.        write_ffs bcdDevice 0x0100
  249.        write_ffs bcdUSB 0x0200
  250.        write_ffs bDeviceClass 0xEF
  251.        write_ffs bDeviceSubClass 0x02
  252.        write_ffs bDeviceProtocol 0x01
  253.  
  254.        write_ffs strings/0x409/serialnumber "${SERIAL}"
  255.        write_ffs strings/0x409/manufacturer "${ID_MANU}"
  256.        write_ffs strings/0x409/product "${ID_PROD}"
  257.  
  258.        write_ffs os_desc/use 1
  259.        write_ffs os_desc/b_vendor_code 0xcd
  260.        write_ffs os_desc/qw_sign MSFT100
  261.  
  262.        config_ffs MaxPower 250
  263.  
  264.        link_osdesc
  265.  
  266.        for f in "${functions[@]}"; do
  267.                function_init "${f}"
  268.        done
  269.  
  270.        activate_usb
  271. else
  272.        $@
  273. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement