1#!/bin/sh 2 3ADB_EN=on 4DFU_EN=off 5MTP_EN=off 6if ( echo $2 |grep -q "off" ); then 7ADB_EN=off 8fi 9USB_FUNCTIONS_DIR=/sys/kernel/config/usb_gadget/rockchip/functions 10USB_CONFIGS_DIR=/sys/kernel/config/usb_gadget/rockchip/configs/b.1 11 12configure_uvc_resolution_yuyv() 13{ 14 UVC_DISPLAY_W=$1 15 UVC_DISPLAY_H=$2 16 UVC_DISPLAY_DIR=${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/uncompressed/u/${UVC_DISPLAY_W}_${UVC_DISPLAY_H}p 17 mkdir ${UVC_DISPLAY_DIR} 18 echo $UVC_DISPLAY_W > ${UVC_DISPLAY_DIR}/wWidth 19 echo $UVC_DISPLAY_H > ${UVC_DISPLAY_DIR}/wHeight 20 echo 333333 > ${UVC_DISPLAY_DIR}/dwDefaultFrameInterval 21 echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*20)) > ${UVC_DISPLAY_DIR}/dwMinBitRate 22 echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*20)) > ${UVC_DISPLAY_DIR}/dwMaxBitRate 23 echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*2)) > ${UVC_DISPLAY_DIR}/dwMaxVideoFrameBufferSize 24 echo -e "333333\n666666\n1000000\n2000000" > ${UVC_DISPLAY_DIR}/dwFrameInterval 25} 26 27configure_uvc_resolution_yuyv_720p() 28{ 29 UVC_DISPLAY_W=$1 30 UVC_DISPLAY_H=$2 31 UVC_DISPLAY_DIR=${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/uncompressed/u/${UVC_DISPLAY_W}_${UVC_DISPLAY_H}p 32 mkdir ${UVC_DISPLAY_DIR} 33 echo $UVC_DISPLAY_W > ${UVC_DISPLAY_DIR}/wWidth 34 echo $UVC_DISPLAY_H > ${UVC_DISPLAY_DIR}/wHeight 35 echo 1000000 > ${UVC_DISPLAY_DIR}/dwDefaultFrameInterval 36 echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*20)) > ${UVC_DISPLAY_DIR}/dwMinBitRate 37 echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*20)) > ${UVC_DISPLAY_DIR}/dwMaxBitRate 38 echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*2)) > ${UVC_DISPLAY_DIR}/dwMaxVideoFrameBufferSize 39 echo -e "1000000\n2000000" > ${UVC_DISPLAY_DIR}/dwFrameInterval 40} 41 42configure_uvc_resolution_mjpeg() 43{ 44 UVC_DISPLAY_W=$1 45 UVC_DISPLAY_H=$2 46 UVC_DISPLAY_DIR=${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/${UVC_DISPLAY_W}_${UVC_DISPLAY_H}p 47 mkdir ${UVC_DISPLAY_DIR} 48 echo $UVC_DISPLAY_W > ${UVC_DISPLAY_DIR}/wWidth 49 echo $UVC_DISPLAY_H > ${UVC_DISPLAY_DIR}/wHeight 50 echo 333333 > ${UVC_DISPLAY_DIR}/dwDefaultFrameInterval 51 echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*20)) > ${UVC_DISPLAY_DIR}/dwMinBitRate 52 echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*20)) > ${UVC_DISPLAY_DIR}/dwMaxBitRate 53 echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*2)) > ${UVC_DISPLAY_DIR}/dwMaxVideoFrameBufferSize 54 echo -e "333333\n666666\n1000000\n2000000" > ${UVC_DISPLAY_DIR}/dwFrameInterval 55} 56configure_uvc_resolution_h264() 57{ 58 UVC_DISPLAY_W=$1 59 UVC_DISPLAY_H=$2 60 UVC_DISPLAY_DIR=${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/framebased/f1/${UVC_DISPLAY_W}_${UVC_DISPLAY_H}p 61 mkdir ${UVC_DISPLAY_DIR} 62 echo $UVC_DISPLAY_W > ${UVC_DISPLAY_DIR}/wWidth 63 echo $UVC_DISPLAY_H > ${UVC_DISPLAY_DIR}/wHeight 64 echo 333333 > ${UVC_DISPLAY_DIR}/dwDefaultFrameInterval 65 echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*10)) > ${UVC_DISPLAY_DIR}/dwMinBitRate 66 echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*10)) > ${UVC_DISPLAY_DIR}/dwMaxBitRate 67 echo -e "333333\n400000\n500000\n666666\n1000000\n2000000" > ${UVC_DISPLAY_DIR}/dwFrameInterval 68 echo -ne \\x48\\x32\\x36\\x34\\x00\\x00\\x10\\x00\\x80\\x00\\x00\\xaa\\x00\\x38\\x9b\\x71 > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/framebased/f1/guidFormat 69} 70configure_uvc_resolution_h265() 71{ 72 UVC_DISPLAY_W=$1 73 UVC_DISPLAY_H=$2 74 UVC_DISPLAY_DIR=${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/framebased/f2/${UVC_DISPLAY_W}_${UVC_DISPLAY_H}p 75 mkdir ${UVC_DISPLAY_DIR} 76 echo $UVC_DISPLAY_W > ${UVC_DISPLAY_DIR}/wWidth 77 echo $UVC_DISPLAY_H > ${UVC_DISPLAY_DIR}/wHeight 78 echo 333333 > ${UVC_DISPLAY_DIR}/dwDefaultFrameInterval 79 echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*10)) > ${UVC_DISPLAY_DIR}/dwMinBitRate 80 echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*10)) > ${UVC_DISPLAY_DIR}/dwMaxBitRate 81 echo -e "333333\n400000\n500000" > ${UVC_DISPLAY_DIR}/dwFrameInterval 82 echo -ne \\x48\\x32\\x36\\x35\\x00\\x00\\x10\\x00\\x80\\x00\\x00\\xaa\\x00\\x38\\x9b\\x71 > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/framebased/f2/guidFormat 83} 84hid_device_config() 85{ 86 mkdir ${USB_FUNCTIONS_DIR}/hid.usb0 87 #echo 1 > ${USB_FUNCTIONS_DIR}/hid.usb0/protocol # keyboard 88 #echo 1 > ${USB_FUNCTIONS_DIR}/hid.usb0/subclass 89 echo 1 > ${USB_FUNCTIONS_DIR}/hid.usb0/report_length 90 91 #Volume Up/Down Mute Consumer Devices 92 echo -ne \\x05\\x0c\\x09\\x01\\xa1\\x01\\x15\\x00\\x25\\x01\\x09\\xe9\\x09\\xea\\x75\\x01\\x95\\x02\\x81\\x06\\x09\\xe2\\x95\\x01\\x81\\x06\\x95\\x05\\x81\\x07\\xc0 > ${USB_FUNCTIONS_DIR}/hid.usb0/report_desc 93 ln -s ${USB_FUNCTIONS_DIR}/hid.usb0 ${USB_CONFIGS_DIR}/f$1 94} 95mtp_device_config() 96{ 97 mkdir ${USB_FUNCTIONS_DIR}/mtp.gs0 98 echo "MTP" > ${USB_FUNCTIONS_DIR}/mtp.gs0/os_desc/interface.MTP/compatible_id 99 echo 1 > ${USB_FUNCTIONS_DIR}/../os_desc/use 100 echo "mtp on++++++ f$1" 101 ln -s ${USB_FUNCTIONS_DIR}/mtp.gs0 ${USB_CONFIGS_DIR}/f$1 102 MTP_EN=on 103} 104uvc_device_config() 105{ 106 mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6 107 echo 3072 > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming_maxpacket 108 UDC=`ls /sys/class/udc/| awk '{print $1}'` 109 if [ "$UDC"x = "fcc00000.dwc3"x ]; then 110 echo "rk3568 uvc config dwc3" 111 echo 2 > ${USB_FUNCTIONS_DIR}/uvc.gs6/uvc_num_request 112 echo 5 > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming_maxburst 113 else 114 echo 2 > ${USB_FUNCTIONS_DIR}/uvc.gs6/uvc_num_request 115 fi 116 #echo 1 > /sys/kernel/config/usb_gadget/rockchip/functions/uvc.gs6/streaming_bulk 117 118 mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6/control/header/h 119 ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/control/header/h ${USB_FUNCTIONS_DIR}/uvc.gs6/control/class/fs/h 120 ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/control/header/h ${USB_FUNCTIONS_DIR}/uvc.gs6/control/class/ss/h 121 ##YUYV support config 122 mkdir /sys/kernel/config/usb_gadget/rockchip/functions/uvc.gs6/streaming/uncompressed/u 123 configure_uvc_resolution_yuyv 320 240 124 configure_uvc_resolution_yuyv 640 360 125 configure_uvc_resolution_yuyv 640 480 126 if [ "$UDC"x = "fcc00000.dwc3"x ]; then 127 configure_uvc_resolution_yuyv 1280 720 128 configure_uvc_resolution_yuyv 1920 1080 129 else 130 configure_uvc_resolution_yuyv_720p 1280 720 131 fi 132 133 ##mjpeg support config 134 mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m 135 configure_uvc_resolution_mjpeg 320 240 136 configure_uvc_resolution_mjpeg 640 360 137 configure_uvc_resolution_mjpeg 640 480 138 configure_uvc_resolution_mjpeg 768 448 139 configure_uvc_resolution_mjpeg 1280 720 140 configure_uvc_resolution_mjpeg 1024 768 141 configure_uvc_resolution_mjpeg 1920 1080 142 configure_uvc_resolution_mjpeg 2560 1440 143 #configure_uvc_resolution_mjpeg 2592 1944 144 145 ## h.264 support config 146 mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/framebased/f1 147 configure_uvc_resolution_h264 640 480 148 configure_uvc_resolution_h264 1280 720 149 configure_uvc_resolution_h264 1920 1080 150 configure_uvc_resolution_h264 2560 1440 151 configure_uvc_resolution_h264 3840 2160 152 153 ## h.265 support config 154 mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/framebased/f2 155 configure_uvc_resolution_h265 640 480 156 configure_uvc_resolution_h265 1280 720 157 configure_uvc_resolution_h265 1920 1080 158 configure_uvc_resolution_h265 2560 1440 159 configure_uvc_resolution_h265 3840 2160 160 161 mkdir /sys/kernel/config/usb_gadget/rockchip/functions/uvc.gs6/streaming/header/h 162 ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/uncompressed/u ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h/u 163 ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h/m 164 ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/framebased/f1 ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h/f1 165 ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/framebased/f2 ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h/f2 166 ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/class/fs/h 167 ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/class/hs/h 168 ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/class/ss/h 169} 170uac1_device_config() 171{ 172 UAC=$1 173 mkdir ${USB_FUNCTIONS_DIR}/${UAC}.gs0 174 UAC_GS0=${USB_FUNCTIONS_DIR}/${UAC}.gs0 175 echo 3 > ${UAC_GS0}/p_chmask 176 echo 2 > ${UAC_GS0}/p_ssize 177 echo 1 > ${UAC_GS0}/p_feature_unit 178 echo 8000,16000,44100,48000 > ${UAC_GS0}/p_srate 179 180 echo 3 > ${UAC_GS0}/c_chmask 181 echo 2 > ${UAC_GS0}/c_ssize 182 echo 1 > ${UAC_GS0}/c_feature_unit 183 echo 4 > ${UAC_GS0}/req_number 184 echo 8000,16000,44100,48000 > ${UAC_GS0}/c_srate 185 186 ln -s ${UAC_GS0} ${USB_CONFIGS_DIR}/f2 187} 188uac2_device_config() 189{ 190 UAC=$1 191 mkdir ${USB_FUNCTIONS_DIR}/${UAC}.gs0 192 UAC_GS0=${USB_FUNCTIONS_DIR}/${UAC}.gs0 193 echo 3 > ${UAC_GS0}/p_chmask 194 echo 2 > ${UAC_GS0}/p_ssize 195 echo 0 > ${UAC_GS0}/p_feature_unit 196 echo 8000,16000,44100,48000 > ${UAC_GS0}/p_srate 197 198 echo 3 > ${UAC_GS0}/c_chmask 199 echo 2 > ${UAC_GS0}/c_ssize 200 echo 0 > ${UAC_GS0}/c_feature_unit 201 echo 4 > ${UAC_GS0}/req_number 202 echo 8000,16000,44100,48000 > ${UAC_GS0}/c_srate 203 204 ln -s ${UAC_GS0} ${USB_CONFIGS_DIR}/f2 205} 206pre_run_rndis() 207{ 208 RNDIS_STR="rndis" 209 if ( echo $1 |grep -q "rndis" ); then 210 #sleep 1 211 IP_FILE=/data/uvc_xu_ip_save 212 echo "config usb0 IP..." 213 if [ -f $IP_FILE ]; then 214 for line in `cat $IP_FILE` 215 do 216 echo "save ip is: $line" 217 ifconfig usb0 $line 218 done 219 else 220 ifconfig usb0 172.16.110.6 221 fi 222 ifconfig usb0 up 223 fi 224} 225pre_run_adb() 226{ 227 if [ $ADB_EN = on ];then 228 umount /dev/usb-ffs/adb 229 mkdir -p /dev/usb-ffs/adb -m 0770 230 mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb 231 start-stop-daemon --start --quiet --background --exec /usr/bin/adbd 232 fi 233} 234 235##main 236#init usb config 237/etc/init.d/S10udev stop 238umount /sys/kernel/config 239mkdir /dev/usb-ffs 240mount -t configfs none /sys/kernel/config 241mkdir -p /sys/kernel/config/usb_gadget/rockchip 242mkdir -p /sys/kernel/config/usb_gadget/rockchip/strings/0x409 243mkdir -p ${USB_CONFIGS_DIR}/strings/0x409 244echo 0x2207 > /sys/kernel/config/usb_gadget/rockchip/idVendor 245echo 0x0310 > /sys/kernel/config/usb_gadget/rockchip/bcdDevice 246echo 0x0200 > /sys/kernel/config/usb_gadget/rockchip/bcdUSB 247echo 239 > /sys/kernel/config/usb_gadget/rockchip/bDeviceClass 248echo 2 > /sys/kernel/config/usb_gadget/rockchip/bDeviceSubClass 249echo 1 > /sys/kernel/config/usb_gadget/rockchip/bDeviceProtocol 250SERIAL_NUM=`cat /proc/cpuinfo |grep Serial | awk -F ":" '{print $2}'` 251echo "serialnumber is $SERIAL_NUM" 252echo $SERIAL_NUM > /sys/kernel/config/usb_gadget/rockchip/strings/0x409/serialnumber 253echo "rockchip" > /sys/kernel/config/usb_gadget/rockchip/strings/0x409/manufacturer 254echo "UVC" > /sys/kernel/config/usb_gadget/rockchip/strings/0x409/product 255echo 0x1 > /sys/kernel/config/usb_gadget/rockchip/os_desc/b_vendor_code 256echo "MSFT100" > /sys/kernel/config/usb_gadget/rockchip/os_desc/qw_sign 257echo 500 > /sys/kernel/config/usb_gadget/rockchip/configs/b.1/MaxPower 258#ln -s /sys/kernel/config/usb_gadget/rockchip/configs/b.1 /sys/kernel/config/usb_gadget/rockchip/os_desc/b.1 259echo 0x0016 > /sys/kernel/config/usb_gadget/rockchip/idProduct 260 261#uvc config init 262uvc_device_config 263##reset config,del default adb config 264if [ -e ${USB_CONFIGS_DIR}/ffs.adb ]; then 265 #for rk1808 kernel 4.4 266 rm -f ${USB_CONFIGS_DIR}/ffs.adb 267else 268 ls ${USB_CONFIGS_DIR} | grep f[0-9] | xargs -I {} rm ${USB_CONFIGS_DIR}/{} 269fi 270 271case "$1" in 272rndis) 273 # config rndis 274 mkdir /sys/kernel/config/usb_gadget/rockchip/functions/rndis.gs0 275 echo "uvc_rndis" > ${USB_CONFIGS_DIR}/strings/0x409/configuration 276 ln -s ${USB_FUNCTIONS_DIR}/rndis.gs0 ${USB_CONFIGS_DIR}/f2 277 echo "config uvc and rndis..." 278 ;; 279uac1) 280 uac1_device_config uac1 281 echo "uvc_uac1" > ${USB_CONFIGS_DIR}/strings/0x409/configuration 282 echo "config uvc and uac1..." 283 ;; 284uac2) 285 uac2_device_config uac2 286 echo "uvc_uac2" > ${USB_CONFIGS_DIR}/strings/0x409/configuration 287 echo "config uvc and uac2..." 288 ;; 289hid) 290 hid_device_config 2 291 echo "uvc_hid" > ${USB_CONFIGS_DIR}/strings/0x409/configuration 292 echo "config uvc and hid..." 293 ;; 294mtp) 295 mtp_device_config 2 296 echo "uvc_mtp" > ${USB_CONFIGS_DIR}/strings/0x409/configuration 297 echo "config uvc and mtp..." 298 ;; 299uac1_rndis) 300 #uac_device_config uac1 301 mkdir /sys/kernel/config/usb_gadget/rockchip/functions/rndis.gs0 302 ln -s ${USB_FUNCTIONS_DIR}/rndis.gs0 ${USB_CONFIGS_DIR}/f3 303 uac1_device_config uac1 304 echo "uvc_uac1_rndis" > ${USB_CONFIGS_DIR}/strings/0x409/configuration 305 echo "config uvc and uac1 rndis..." 306 ;; 307uac2_rndis) 308 #uac_device_config uac2 309 mkdir /sys/kernel/config/usb_gadget/rockchip/functions/rndis.gs0 310 ln -s ${USB_FUNCTIONS_DIR}/rndis.gs0 ${USB_CONFIGS_DIR}/f3 311 uac2_device_config uac2 312 echo "uvc_uac2_rndis" > ${USB_CONFIGS_DIR}/strings/0x409/configuration 313 echo "config uvc and uac2 rndis..." 314 ;; 315uac1_hid) 316 uac1_device_config uac1 317 hid_device_config 3 318 echo "uvc_uac1_hid" > ${USB_CONFIGS_DIR}/strings/0x409/configuration 319 echo "config uvc + uac1 + hid ..." 320 ;; 321uac2_hid) 322 uac2_device_config uac2 323 hid_device_config 3 324 echo "uvc_uac2_hid" > ${USB_CONFIGS_DIR}/strings/0x409/configuration 325 echo "config uvc + uac2 + hid ..." 326 ;; 327*) 328 echo "uvc" > ${USB_CONFIGS_DIR}/strings/0x409/configuration 329 echo "config uvc ..." 330esac 331 332ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6 ${USB_CONFIGS_DIR}/f1 333 334if [ $DFU_EN = on ];then 335 mkdir /sys/kernel/config/usb_gadget/rockchip/functions/dfu.gs0 336 CONFIG_STR=`cat /sys/kernel/config/usb_gadget/rockchip/configs/b.1/strings/0x409/configuration` 337 STR=${CONFIG_STR}_dfu 338 echo $STR > ${USB_CONFIGS_DIR}/strings/0x409/configuration 339 USB_CNT=`echo $STR | awk -F"_" '{print NF-1}'` 340 let USB_CNT=USB_CNT+1 341 echo "dfu on++++++ ${USB_CNT}" 342 ln -s ${USB_FUNCTIONS_DIR}/dfu.gs0 ${USB_CONFIGS_DIR}/f${USB_CNT} 343 ADB_EN=off 344 sleep .5 345fi 346 347if [ $ADB_EN = on ];then 348 mkdir ${USB_FUNCTIONS_DIR}/ffs.adb 349 CONFIG_STR=`cat /sys/kernel/config/usb_gadget/rockchip/configs/b.1/strings/0x409/configuration` 350 STR=${CONFIG_STR}_adb 351 echo $STR > ${USB_CONFIGS_DIR}/strings/0x409/configuration 352 USB_CNT=`echo $STR | awk -F"_" '{print NF-1}'` 353 let USB_CNT=USB_CNT+1 354 echo "adb on++++++ ${USB_CNT}" 355 ln -s ${USB_FUNCTIONS_DIR}/ffs.adb ${USB_CONFIGS_DIR}/f${USB_CNT} 356 pre_run_adb 357 sleep .5 358fi 359 360UDC=`ls /sys/class/udc/| awk '{print $1}'` 361echo $UDC > /sys/kernel/config/usb_gadget/rockchip/UDC 362 363if [ $MTP_EN = on ];then 364 start-stop-daemon --start --quiet --background --exec /usr/bin/mtp-server 365fi 366 367if [ "$1" ]; then 368 pre_run_rndis $1 369fi 370