xref: /OK3568_Linux_fs/device/rockchip/common/images/oem/oem_uvcc/usb_config.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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