#!/bin/sh # # setup configfs for adbd, usb mass storage and MTP.... # For kernel v4.4 usb configfs # UAC=uac2 USB_ATTRIBUTE=0x409 USB_GROUP=rockchip USB_SKELETON=b.1 CONFIGFS_DIR=/sys/kernel/config USB_CONFIGFS_DIR=${CONFIGFS_DIR}/usb_gadget/${USB_GROUP} USB_STRINGS_DIR=${USB_CONFIGFS_DIR}/strings/${USB_ATTRIBUTE} USB_FUNCTIONS_DIR=${USB_CONFIGFS_DIR}/functions USB_CONFIGS_DIR=${USB_CONFIGFS_DIR}/configs/${USB_SKELETON} function_init() { mkdir ${USB_FUNCTIONS_DIR}/${UAC}.gs0 } configfs_init() { echo "Debug: configfs_init" mkdir /dev/usb-ffs mount -t configfs none ${CONFIGFS_DIR} mkdir ${USB_CONFIGFS_DIR} -m 0770 echo 0x2207 > ${USB_CONFIGFS_DIR}/idVendor echo 0x0310 > ${USB_CONFIGFS_DIR}/bcdDevice echo 0x0200 > ${USB_CONFIGFS_DIR}/bcdUSB mkdir ${USB_STRINGS_DIR} -m 0770 SERIAL=`cat /proc/cpuinfo | grep Serial | awk '{print $3}'` if [ -z $SERIAL ];then SERIAL=0123456789ABCDEF fi echo $SERIAL > ${USB_STRINGS_DIR}/serialnumber echo "rockchip" > ${USB_STRINGS_DIR}/manufacturer echo "rv1109" > ${USB_STRINGS_DIR}/product function_init mkdir ${USB_CONFIGS_DIR} -m 0770 mkdir ${USB_CONFIGS_DIR}/strings/${USB_ATTRIBUTE} -m 0770 } parameter_init() { if [ "$UAC" == "uac2" ]; then CONFIG_STRING=uac2 echo "parameter_init ${CONFIG_STRING}" elif [ "$UAC" == "uac1" ];then CONFIG_STRING=uac1 echo "parameter_init ${CONFIG_STRING}" else echo "parameter_init ${UAC} is invalid" fi } config_init() { UAC_GS0=${USB_FUNCTIONS_DIR}/${UAC}.gs0 echo 3 > ${UAC_GS0}/p_chmask echo 2 > ${UAC_GS0}/p_ssize echo 8000,16000,44100,48000 > ${UAC_GS0}/p_srate echo 1 > ${UAC_GS0}/p_feature_unit echo 3 > ${UAC_GS0}/c_chmask echo 2 > ${UAC_GS0}/c_ssize echo 8000,16000,44100,48000 > ${UAC_GS0}/c_srate echo 1 > ${UAC_GS0}/c_feature_unit } syslink_function() { ln -s ${USB_FUNCTIONS_DIR}/$1 ${USB_CONFIGS_DIR}/f${USB_FUNCTIONS_CNT} let USB_FUNCTIONS_CNT=USB_FUNCTIONS_CNT+1 } bind_functions() { USB_FUNCTIONS_CNT=1 if [ "$UAC" == "uac2" ]; then syslink_function uac2.gs0 elif [ "$UAC" == "uac1" ];then syslink_function uac1.gs0 else echo "parameter_init ${UAC} is invalid" fi echo ${CONFIG_STRING} > ${USB_CONFIGS_DIR}/strings/${USB_ATTRIBUTE}/configuration } program_kill() { P_PID=`ps | grep $1 | grep -v grep | awk '{print $1}'` test -z ${P_PID} || kill -9 ${P_PID} } usb_device_stop() { echo "none" > ${USB_CONFIGFS_DIR}/UDC program_kill adbd program_kill mtp-server ls ${USB_CONFIGS_DIR} | grep f[0-9] | xargs -I {} rm ${USB_CONFIGS_DIR}/{} } case "$1" in start) echo "usb_config in $1" DIR=$(cd `dirname $0`; pwd) parameter_init if [ -z $CONFIG_STRING ]; then echo "$0: no function be selected" exit 0 fi test -d ${USB_CONFIGFS_DIR} || configfs_init echo 0x0019 > ${USB_CONFIGFS_DIR}/idProduct config_init bind_functions sleep 1 UDC=`ls /sys/class/udc/| awk '{print $1}'` echo $UDC > ${USB_CONFIGFS_DIR}/UDC ;; stop) usb_device_stop ;; restart|reload) # Do restart usb by udev echo "USB_FORCE_CHANGED" >> /tmp/.usb_config usb_device_stop sleep 1 $0 start # Don't forget to clear "USB_FORCE_CHANGED" sed -i "/USB_FORCE_CHANGED/d" /tmp/.usb_config ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 esac exit 0