161 lines
6.6 KiB
Bash
Executable File
161 lines
6.6 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# default NO, set YES to enable cdc
|
|
# set kernel's defconfig CONFIG_USB_CONFIGFS_ACM=y to enable cdc
|
|
CDC_ENABLE=NO
|
|
|
|
USB_FUNCTIONS_DIR=/sys/kernel/config/usb_gadget/rockchip/functions
|
|
USB_CONFIGS_DIR=/sys/kernel/config/usb_gadget/rockchip/configs/b.1
|
|
|
|
configure_uvc_resolution_mjpeg()
|
|
{
|
|
UVC_DISPLAY_W=$1
|
|
UVC_DISPLAY_H=$2
|
|
UVC_DISPLAY_DIR=${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/mjpeg/m/${UVC_DISPLAY_W}_${UVC_DISPLAY_H}p
|
|
mkdir ${UVC_DISPLAY_DIR}
|
|
echo $UVC_DISPLAY_W > ${UVC_DISPLAY_DIR}/wWidth
|
|
echo $UVC_DISPLAY_H > ${UVC_DISPLAY_DIR}/wHeight
|
|
echo 333333 > ${UVC_DISPLAY_DIR}/dwDefaultFrameInterval
|
|
echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*20)) > ${UVC_DISPLAY_DIR}/dwMinBitRate
|
|
echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*20)) > ${UVC_DISPLAY_DIR}/dwMaxBitRate
|
|
echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*2)) > ${UVC_DISPLAY_DIR}/dwMaxVideoFrameBufferSize
|
|
echo -e "333333\n666666\n1000000\n2000000" > ${UVC_DISPLAY_DIR}/dwFrameInterval
|
|
}
|
|
|
|
configure_uvc_resolution_h264()
|
|
{
|
|
UVC_DISPLAY_W=$1
|
|
UVC_DISPLAY_H=$2
|
|
UVC_DISPLAY_DIR=${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/framebased/f1/${UVC_DISPLAY_W}_${UVC_DISPLAY_H}p
|
|
mkdir ${UVC_DISPLAY_DIR}
|
|
echo $UVC_DISPLAY_W > ${UVC_DISPLAY_DIR}/wWidth
|
|
echo $UVC_DISPLAY_H > ${UVC_DISPLAY_DIR}/wHeight
|
|
echo 333333 > ${UVC_DISPLAY_DIR}/dwDefaultFrameInterval
|
|
echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*10)) > ${UVC_DISPLAY_DIR}/dwMinBitRate
|
|
echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*10)) > ${UVC_DISPLAY_DIR}/dwMaxBitRate
|
|
echo -e "333333\n400000\n500000\n666666\n1000000\n2000000" > ${UVC_DISPLAY_DIR}/dwFrameInterval
|
|
echo -ne \\x48\\x32\\x36\\x34\\x00\\x00\\x10\\x00\\x80\\x00\\x00\\xaa\\x00\\x38\\x9b\\x71 > ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/framebased/f1/guidFormat
|
|
}
|
|
|
|
configure_uvc_resolution_h265()
|
|
{
|
|
UVC_DISPLAY_W=$1
|
|
UVC_DISPLAY_H=$2
|
|
UVC_DISPLAY_DIR=${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/framebased/f2/${UVC_DISPLAY_W}_${UVC_DISPLAY_H}p
|
|
mkdir ${UVC_DISPLAY_DIR}
|
|
echo $UVC_DISPLAY_W > ${UVC_DISPLAY_DIR}/wWidth
|
|
echo $UVC_DISPLAY_H > ${UVC_DISPLAY_DIR}/wHeight
|
|
echo 333333 > ${UVC_DISPLAY_DIR}/dwDefaultFrameInterval
|
|
echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*10)) > ${UVC_DISPLAY_DIR}/dwMinBitRate
|
|
echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*10)) > ${UVC_DISPLAY_DIR}/dwMaxBitRate
|
|
echo -e "333333\n400000\n500000" > ${UVC_DISPLAY_DIR}/dwFrameInterval
|
|
echo -ne \\x48\\x32\\x36\\x35\\x00\\x00\\x10\\x00\\x80\\x00\\x00\\xaa\\x00\\x38\\x9b\\x71 > ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/framebased/f2/guidFormat
|
|
}
|
|
|
|
uvc_device_config()
|
|
{
|
|
UVC_GS=$1
|
|
UVC_NAME=$2
|
|
uvc_w=$3
|
|
uvc_h=$4
|
|
mkdir ${USB_FUNCTIONS_DIR}/$UVC_GS
|
|
echo $UVC_NAME > ${USB_FUNCTIONS_DIR}/$UVC_GS/device_name
|
|
echo 3072 > ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming_maxpacket
|
|
echo 2 > ${USB_FUNCTIONS_DIR}/$UVC_GS/uvc_num_request
|
|
#echo 1 > /sys/kernel/config/usb_gadget/rockchip/functions/$UVC_GS/streaming_bulk
|
|
|
|
mkdir ${USB_FUNCTIONS_DIR}/$UVC_GS/control/header/h
|
|
ln -s ${USB_FUNCTIONS_DIR}/$UVC_GS/control/header/h ${USB_FUNCTIONS_DIR}/$UVC_GS/control/class/fs/h
|
|
ln -s ${USB_FUNCTIONS_DIR}/$UVC_GS/control/header/h ${USB_FUNCTIONS_DIR}/$UVC_GS/control/class/ss/h
|
|
|
|
## mjpeg support config
|
|
mkdir ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/mjpeg/m
|
|
configure_uvc_resolution_mjpeg $uvc_w $uvc_h
|
|
|
|
## h.264 support config
|
|
mkdir ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/framebased/f1
|
|
configure_uvc_resolution_h264 $uvc_w $uvc_h
|
|
|
|
## h.265 support config
|
|
mkdir ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/framebased/f2
|
|
configure_uvc_resolution_h265 $uvc_w $uvc_h
|
|
|
|
mkdir /sys/kernel/config/usb_gadget/rockchip/functions/$UVC_GS/streaming/header/h
|
|
ln -s ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/mjpeg/m ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/header/h/m
|
|
ln -s ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/framebased/f1 ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/header/h/f1
|
|
ln -s ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/framebased/f2 ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/header/h/f2
|
|
ln -s ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/header/h ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/class/fs/h
|
|
ln -s ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/header/h ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/class/hs/h
|
|
ln -s ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/header/h ${USB_FUNCTIONS_DIR}/$UVC_GS/streaming/class/ss/h
|
|
}
|
|
|
|
cdc_device_config()
|
|
{
|
|
mkdir ${USB_FUNCTIONS_DIR}/acm.g0
|
|
CONFIG_STR=`cat /sys/kernel/config/usb_gadget/rockchip/configs/b.1/strings/0x409/configuration`
|
|
STR=${CONFIG_STR}_acm
|
|
echo $STR > ${USB_CONFIGS_DIR}/strings/0x409/configuration
|
|
USB_CNT=`echo $STR | awk -F"_" '{print NF-1}'`
|
|
let USB_CNT=USB_CNT+2
|
|
echo "acm on++++++ ${USB_CNT}"
|
|
ln -s ${USB_FUNCTIONS_DIR}/acm.g0 ${USB_CONFIGS_DIR}/f${USB_CNT}
|
|
}
|
|
|
|
##main
|
|
UVC_W=1920
|
|
if expr "$1" + 0 2>/dev/null; then
|
|
UVC_W=$1
|
|
fi
|
|
UVC_H=1080
|
|
if expr "$2" + 0 2>/dev/null; then
|
|
UVC_H=$2
|
|
fi
|
|
#init usb config
|
|
|
|
insmod /oem/usr/ko/usb-common.ko
|
|
insmod /oem/usr/ko/usbcore.ko
|
|
insmod /oem/usr/ko/udc-core.ko
|
|
insmod /oem/usr/ko/libcomposite.ko
|
|
insmod /oem/usr/ko/usb_f_fs.ko
|
|
insmod /oem/usr/ko/usb_f_uvc.ko
|
|
if [ "$CDC_ENABLE" = "YES" ];then
|
|
insmod /oem/usr/ko/u_serial.ko
|
|
insmod /oem/usr/ko/usb_f_acm.ko
|
|
fi
|
|
insmod /oem/usr/ko/phy-rockchip-inno-usb2.ko
|
|
insmod /oem/usr/ko/dwc3-of-simple.ko
|
|
insmod /oem/usr/ko/dwc3.ko
|
|
|
|
mount -t configfs none /sys/kernel/config
|
|
mkdir -p /sys/kernel/config/usb_gadget/rockchip
|
|
mkdir -p /sys/kernel/config/usb_gadget/rockchip/strings/0x409
|
|
mkdir -p ${USB_CONFIGS_DIR}/strings/0x409
|
|
echo 0x2207 > /sys/kernel/config/usb_gadget/rockchip/idVendor
|
|
echo 0x0310 > /sys/kernel/config/usb_gadget/rockchip/bcdDevice
|
|
echo 0x0200 > /sys/kernel/config/usb_gadget/rockchip/bcdUSB
|
|
echo 239 > /sys/kernel/config/usb_gadget/rockchip/bDeviceClass
|
|
echo 2 > /sys/kernel/config/usb_gadget/rockchip/bDeviceSubClass
|
|
echo 1 > /sys/kernel/config/usb_gadget/rockchip/bDeviceProtocol
|
|
SERIAL_NUM=`cat /proc/cpuinfo |grep Serial | awk -F ":" '{print $2}'`
|
|
echo "serialnumber is $SERIAL_NUM"
|
|
echo $SERIAL_NUM > /sys/kernel/config/usb_gadget/rockchip/strings/0x409/serialnumber
|
|
echo "rockchip" > /sys/kernel/config/usb_gadget/rockchip/strings/0x409/manufacturer
|
|
echo "UVC" > /sys/kernel/config/usb_gadget/rockchip/strings/0x409/product
|
|
echo 0x1 > /sys/kernel/config/usb_gadget/rockchip/os_desc/b_vendor_code
|
|
echo "MSFT100" > /sys/kernel/config/usb_gadget/rockchip/os_desc/qw_sign
|
|
echo 500 > /sys/kernel/config/usb_gadget/rockchip/configs/b.1/MaxPower
|
|
#ln -s /sys/kernel/config/usb_gadget/rockchip/configs/b.1 /sys/kernel/config/usb_gadget/rockchip/os_desc/b.1
|
|
echo 0x0016 > /sys/kernel/config/usb_gadget/rockchip/idProduct
|
|
|
|
uvc_device_config uvc.gs1 "UVC main" $UVC_W $UVC_H
|
|
|
|
echo "uvc" > ${USB_CONFIGS_DIR}/strings/0x409/configuration
|
|
ln -s ${USB_FUNCTIONS_DIR}/uvc.gs1 ${USB_CONFIGS_DIR}/f2
|
|
|
|
if [ "$CDC_ENABLE" = "YES" ];then
|
|
cdc_device_config
|
|
fi
|
|
|
|
UDC=`ls /sys/class/udc/| awk '{print $1}'`
|
|
echo $UDC > /sys/kernel/config/usb_gadget/rockchip/UDC
|