diff --git a/FunKey/board/funkey/linux.config b/FunKey/board/funkey/linux.config index 5cb4c06..a1caa37 100644 --- a/FunKey/board/funkey/linux.config +++ b/FunKey/board/funkey/linux.config @@ -120,6 +120,9 @@ CONFIG_USB_ZERO=m CONFIG_USB_ETH=m CONFIG_USB_ETH_EEM=y CONFIG_USB_G_NCM=m +CONFIG_USB_FUNCTIONFS=m +CONFIG_USB_FUNCTIONFS_ETH=y +CONFIG_USB_FUNCTIONFS_RNDIS=y CONFIG_USB_MASS_STORAGE=m CONFIG_USB_G_SERIAL=m CONFIG_USB_G_ACM_MS=m diff --git a/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/adb b/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/adb new file mode 100755 index 0000000..52c9898 --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/adb @@ -0,0 +1,154 @@ +#!/bin/sh + +#set -xv + +SELF=${SELF:-$(basename $0)} + +source /usr/local/lib/utils +source usb_gadget + +# The composite gadget directory +GADGET=/sys/kernel/config/usb_gadget/FunKey + +# USB VID for Intel +ID_VENDOR="0x8087" + +# USB PID for Multifunction Composite Gadget +ID_PRODUCT="0x011e" + +# Get the CPU serial number +SERIAL="$(grep Serial /proc/cpuinfo | sed 's/Serial\s*: \(\w*\)/\1/')" + +# Initialize the ADB +init_adb() { + + # Don't proceed if existing gadget is present + if [ -e ${GADGET} ]; then + return 0 + fi + + # Get the legacy drivers out of the way + modprobe -r g_ether + modprobe -r g_mass_storage + + # Load the libcomposite USB driver, configfs and various other drivers + modprobe libcomposite + modprobe usb_f_serial + modprobe usb_f_fs + modprobe usb_f_acm + + # USB Device Controller Driver + local udc_driver=$(ls /sys/class/udc | cut -f1 | head -n 1) + + # Create our gadget directory + mkdir ${GADGET} + mkdir ${GADGET}/strings/0x409 + mkdir ${GADGET}/configs/FunKey.1 + mkdir ${GADGET}/configs/FunKey.1/strings/0x409 + mkdir ${GADGET}/functions/acm.GS0 + mkdir ${GADGET}/functions/ffs.adb + + # USB VID and PID + echo ${ID_VENDOR} > ${GADGET}/idVendor + echo ${ID_PRODUCT} > ${GADGET}/idProduct + + # Device String Descriptiors + echo "Intel" > ${GADGET}/strings/0x409/manufacturer + echo "FunKey S" > ${GADGET}/strings/0x409/product + echo ${SERIAL} > ${GADGET}/strings/0x409/serialnumber + + # Configuration + + # Maximum power is 120 mA + echo 120 > ${GADGET}/configs/FunKey.1/MaxPower + + # Configuration String Descriptors + echo "ADB+CDC" > ${GADGET}/configs/FunKey.1/strings/0x409/configuration + + # Add the ACM function to the FunKey.1 configuration + ln -s ${GADGET}/functions/acm.GS0 ${GADGET}/configs/FunKey.1 + + # Add the FunctionFS function to the FunKey.1 configuration + ln -s ${GADGET}/functions/ffs.adb ${GADGET}/configs/FunKey.1 + + # Create the function filesystem + mkdir /dev/usb-ffs + mkdir /dev/usb-ffs/adb + + # Mount the ADB function filesystem + mount -t functionfs adb /dev/usb-ffs/adb + + # Bring up the loopback network + ifup lo + + # Launch the ADB daemon + adbd >/dev/null & + + # Sleeping is required to wait for the UDC to come up + sleep 5 + + # Bind the USB Gadget + echo ${udc_driver} > ${GADGET}/UDC + return 0 +} + +# Deinitialize the ADB +deinit_adb() { + + # Unbind the device + echo > ${GADGET}/UDC + + # Kill the ADB daemon + killall adbd + + # Bring down the local network + ifdown lo + + # Unmount the ADB function filesystem + umount /dev/usb-ffs/adb + + # Delete the function filesystem + rmdir /dev/usb-ffs/adb + rmdir /dev/usb-ffs + + # Remove functions from configurations + rm ${GADGET}/configs/FunKey.1/acm.GS0 + rm ${GADGET}/configs/FunKey.1/ffs.adb + + # Remove string directories in configurations + rmdir ${GADGET}/configs/FunKey.1/strings/0x409 + + # Remove configurations + rmdir ${GADGET}/configs/FunKey.1 + + # Remove functions + rmdir ${GADGET}/functions/acm.GS0 + rmdir ${GADGET}/functions/ffs.adb + + # Remove strings + rmdir ${GADGET}/strings/0x409 + + # Finallyy remove the gadget + rmdir ${GADGET} + + # Unload the kernel modules + modprobe -r usb_f_serial usb_f_fs usb_f_acm +} + +case "$1" in + + start) + deinit_usb_gadget + init_adb + ;; + + stop) + deinit_adb + init_usb_gadget + ;; + + *) + die 15 "Usage $0 {start|stop}" + ;; +esac +exit $? diff --git a/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/usb_gadget b/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/usb_gadget index 2e77f91..e16be2a 100755 --- a/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/usb_gadget +++ b/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/usb_gadget @@ -6,7 +6,7 @@ SELF=${SELF:-$(basename $0)} source /usr/local/lib/utils -# The composite gadget directory +# The composite gadget directory GADGET=/sys/kernel/config/usb_gadget/FunKey # Check if Ethernet over USB network is requested @@ -167,3 +167,48 @@ init_usb_gadget() { echo ${udc_driver} > ${GADGET}/UDC return 0 } + +# Deinitialize the USB gadget +deinit_usb_gadget() { + + # Unbind the device + echo > ${GADGET}/UDC + + # Remove functions from configurations + rm ${GADGET}/configs/FunKey.1/mass_storage.mmcblk0p4 + if [ ${USBNET} -eq 1 ]; then + rm ${GADGET}/configs/FunKey.1/rndis.usb0 + fi + + # Remove string directories in configurations + rmdir ${GADGET}/configs/FunKey.1/strings/0x409 + + # Remove configurations from OS descriptors + if [ ${USBNET} -eq 1 ]; then + rm ${GADGET}/os_desc/FunKey.1 + fi + + # Remove configurations + rmdir ${GADGET}/configs/FunKey.1 + + # Remove extended properties from OS descriptors + if [ ${USBNET} -eq 1 ]; then + rmdir ${GADGET}/functions/rndis.usb0/os_desc/interface.rndis/Icons + rmdir ${GADGET}/functions/rndis.usb0/os_desc/interface.rndis/Label + fi + + # Remove functions + rmdir ${GADGET}/functions/mass_storage.mmcblk0p4 + if [ ${USBNET} -eq 1 ]; then + rmdir ${GADGET}/functions/rndis.usb0 + fi + + # Remove strings + rmdir ${GADGET}/strings/0x409 + + # Finallyy remove the gadget + rmdir ${GADGET} + + # Unload the kernel modules + modprobe -r usb_f_mass_storage usb_f_rndis +} diff --git a/FunKey/configs/funkey_defconfig b/FunKey/configs/funkey_defconfig index 51bec87..50c4879 100644 --- a/FunKey/configs/funkey_defconfig +++ b/FunKey/configs/funkey_defconfig @@ -97,6 +97,7 @@ BR2_PACKAGE_FMT=y BR2_PACKAGE_ICU=y BR2_PACKAGE_DHCPCD=y BR2_PACKAGE_DROPBEAR=y +BR2_PACKAGE_ANDROID_TOOLS=y BR2_PACKAGE_PROCPS_NG=y BR2_PACKAGE_SWUPDATE=y BR2_PACKAGE_SWUPDATE_CONFIG="$(BR2_EXTERNAL_FUNKEY_PATH)/board/funkey/swupdate.config"