linux通过configfs方式开启uvc、uac、adb等功能
IamGroot2023
已于 2023-03-22 13:02:02 修改
阅读量3.1k
收藏 20
点赞数 3
文章标签: adb linux android
Powered by 金山文档
版权
setusbconfig uvc:开启uvc功能。
切换到usb device模式:
cat /sys/devices/platform/soc/usbc0/usb_device
#!/bin/sh
name=`basename $0`
usage() {
echo "$name Usage:"
echo ""
echo "$name [function]"
echo "function: mtp, support MTP function"
echo " adb, support adb function"
echo " uvc, support uvc function"
echo " uvc,uac1 support uvc and uac1 function"
echo "example:"
echo "$name uvc"
echo ""
}
enable_hid() {
#keyboard
mkdir -p /sys/kernel/config/usb_gadget/g1/functions/hid.usb0
echo 2 > /sys/kernel/config/usb_gadget/g1/functions/hid.usb0/protocol
echo 1 > /sys/kernel/config/usb_gadget/g1/functions/hid.usb0/subclass
echo 3 > /sys/kernel/config/usb_gadget/g1/functions/hid.usb0/report_length
# '05 01 09 02 a1 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 03 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 c0 c0'
cat ./report_desc.bin > /sys/kernel/config/usb_gadget/g1/functions/hid.usb0/report_desc
ln -s /sys/kernel/config/usb_gadget/g1/functions/hid.usb0 /sys/kernel/config/usb_gadget/g1/configs/c.1/hid.usb0
}
enable_adb() {
[ -d /sys/kernel/config/usb_gadget/g1/functions/ffs.adb ] || {
mkdir /sys/kernel/config/usb_gadget/g1/functions/ffs.adb
}
echo "Tina ADB" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
ln -s /sys/kernel/config/usb_gadget/g1/functions/ffs.adb/ /sys/kernel/config/usb_gadget/g1/configs/c.1/ffs.adb
[ -d /dev/usb-ffs/adb ] || {
mkdir -p /dev/usb-ffs
mkdir /dev/usb-ffs/adb
mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb/
}
}
enable_mtp() {
mtp_name=mtp.gs0
mtp_ffs=false
kv=`uname -r`
kv=${kv:0:1}
if [ "x$kv" = "x5" ]; then
mtp_ffs=true
mtp_name=ffs.mtp
fi
[ -d /sys/kernel/config/usb_gadget/g1/functions/$mtp_name ] || {
mkdir /sys/kernel/config/usb_gadget/g1/functions/$mtp_name
}
if [ "x$mtp_ffs" = "xtrue" ]; then
[ -d /dev/usb-ffs/mtp ] || {
mkdir -p /dev/usb-ffs
mkdir /dev/usb-ffs/mtp
mount -o rmode=0770,fmode=0660,uid=1024,gid=1024,no_disconnect=1 -t functionfs mtp /dev/usb-ffs/mtp/
}
fi
echo "Tina MTP" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
echo 1 > /sys/kernel/config/usb_gadget/g1/os_desc/use
ln -s /sys/kernel/config/usb_gadget/g1/functions/$mtp_name/ /sys/kernel/config/usb_gadget/g1/configs/c.1/$mtp_name
if [ "x$mtp_ffs" = "xtrue" ]; then
MtpTools -f connect
sleep .500
fi
}
uvc_create_format_frame()
{
format=$1
name=$2
width=$3
height=$4
fps=$5
frame_index=$6
dir=/sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/$format/$name/${height}p
mkdir -p $dir
echo $width > $dir/wWidth
echo $height > $dir/wHeight
echo $(($width * $height * 2 )) > $dir/dwMaxVideoFrameBufferSize
#30fps 333333
interval=$((10000000/$fps))
echo $interval > $dir/dwFrameInterval
echo $interval > $dir/dwDefaultFrameInterval
echo $(($width * $height * 2 * $fps * 8)) > $dir/dwMinBitRate
echo $(($width * $height * 2 * $fps * 8)) > $dir/dwMaxBitRate
echo $frame_index > $dir/bFrameIndex
}
enable_uvc()
{
mkdir -p /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0
if [ -f "/tmp/set_uvc_function.sh" ]; then
echo "/tmp/set_uvc_function.sh exist!!!"
chmod a+x /tmp/set_uvc_function.sh
/tmp/set_uvc_function.sh
return
fi
cd /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0
uvc_create_format_frame mjpeg m 1920 1080 30 1
uvc_create_format_frame mjpeg m 1280 720 30 2
uvc_create_format_frame mjpeg m 640 480 30 3
uvc_create_format_frame mjpeg m 640 360 30 4
uvc_create_format_frame uncompressed u 1280 720 10 1
uvc_create_format_frame uncompressed u 640 480 30 2
uvc_create_format_frame uncompressed u 640 360 30 3
uvc_create_format_frame h264 h 1920 1080 30 1
uvc_create_format_frame h264 h 1280 720 30 2
uvc_create_format_frame h264 h 640 480 30 3
uvc_create_format_frame h264 h 640 360 30 4
uvc_create_format_frame nv12 n 1280 720 10 1
uvc_create_format_frame nv12 n 640 480 30 2
uvc_create_format_frame nv12 n 640 360 30 3
mkdir -p streaming/header/h
ln -s streaming/mjpeg/m/ streaming/header/h/
ln -s streaming/uncompressed/u/ streaming/header/h/
ln -s streaming/h264/h/ streaming/header/h/
ln -s streaming/nv12/n/ streaming/header/h/
ln -s streaming/header/h/ streaming/class/fs
ln -s streaming/header/h/ streaming/class/hs
mkdir -p control/header/h
ln -s control/header/h/ control/class/fs/
ln -s control/header/h/ control/class/ss/
#echo 3072 > streaming_maxpacket
ln -s /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/ /sys/kernel/config/usb_gadget/g1/configs/c.1/
}
enable_uac1()
{
mkdir -p /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0
if [ -f "/tmp/set_uac_function.sh" ]; then
echo "/tmp/set_uac_function.sh exist!!!"
chmod a+x /tmp/set_uac_function.sh
/tmp/set_uac_function.sh
return
fi
uac_func="both"
if [ $# -lt 1 ];then
uac_func="both"
else
uac_func=$1
fi
if [ "$uac_func" == "mic" ];then
echo 0x1 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_chmask
echo 0x0 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_chmask
echo 16000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_srate
echo 0 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_srate
echo 2 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_ssize
echo 0 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_ssize
fi
if [ "$uac_func" == "spk" ];then
echo 0x0 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_chmask
echo 0x1 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_chmask
echo 0 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_srate
echo 16000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_srate
echo 0 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_ssize
echo 2 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_ssize
fi
if [ "$uac_func" == "both" ];then
echo 0x1 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_chmask
echo 0x1 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_chmask
echo 16000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_srate
echo 16000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_srate
echo 2 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_ssize
echo 2 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_ssize
fi
echo "Tina UAC1" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
ln -s /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/ /sys/kernel/config/usb_gadget/g1/configs/c.1/uac1.usb0
}
udc_controller=`ls /sys/class/udc`
set_usb_function() {
# 1:function
# 2:idVendor
# 3:idProduct
#
[ -e /sys/kernel/config/usb_gadget/g1/UDC ] && echo "none" > /sys/kernel/config/usb_gadget/g1/UDC;sleep 1
[ -d /sys/kernel/config/usb_gadget ] || {
mount -t configfs none /sys/kernel/config
mkdir /sys/kernel/config/usb_gadget/g1
mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
echo "Allwinner Technology Inc." > /sys/kernel/config/usb_gadget/g1/strings/0x409/manufacturer
echo "Tina" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
}
[ -d /sys/kernel/config/usb_gadget/g1/configs/c.1 ] || {
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
}
rm -f /sys/kernel/config/usb_gadget/g1/configs/c.1/ffs.adb
rm -f /sys/kernel/config/usb_gadget/g1/configs/c.1/ffs.mtp
rm -f /sys/kernel/config/usb_gadget/g1/configs/c.1/mtp.gs0
rm -f /sys/kernel/config/usb_gadget/g1/configs/c.1/f1
rm -f /sys/kernel/config/usb_gadget/g1/configs/c.1/rndis.usb0
rm -f /sys/kernel/config/usb_gadget/g1/configs/c.1/uac1.usb0
rm -f /sys/kernel/config/usb_gadget/g1/configs/c.1/accessory.usb0
rm -f /sys/kernel/config/usb_gadget/g1/configs/c.1/hid.usb0
rm -f /sys/kernel/config/usb_gadget/g1/configs/c.1/hid.usb1
rm -f /sys/kernel/config/usb_gadget/g1/configs/c.1/loopback.usb0
rm -f /sys/kernel/config/usb_gadget/g1/configs/c.1/gser.usb0
rm -f /sys/kernel/config/usb_gadget/g1/configs/c.1/printer.usb0
rm -f /sys/kernel/config/usb_gadget/g1/configs/c.1/uvc.usb0
rm -f /sys/kernel/config/usb_gadget/g1/configs/c.1/mass_storage.usb0
rm -rf /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/header/h/
rm -rf /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/class/fs
rm -rf /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/class/hs
rm -rf /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/control/class/fs/
rm -rf /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/control/class/ss/
rm -rf /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/
rm -rf /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/
rm -rf /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/uncompressed/
rm -rf /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/nv12/
echo $2 > /sys/kernel/config/usb_gadget/g1/idVendor
echo $3 > /sys/kernel/config/usb_gadget/g1/idProduct
if [ $1 == "none" ]; then
return
elif [ $1 == "mtp" ]; then
enable_mtp
elif [ $1 == "adb" ]; then
enable_adb
elif [ $1 == "mass_storage" ]; then
[ -d /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0 ] || {
mkdir /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0
echo Tina > /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0/lun.0/inquiry_string
}
ln -s /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0/ /sys/kernel/config/usb_gadget/g1/configs/c.1/f1
echo "/dev/by-name/UDISK" > /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0/lun.0/file
elif [ $1 == "uac1" ]; then
echo 0xef > /sys/kernel/config/usb_gadget/g1/bDeviceClass
echo 0x02 > /sys/kernel/config/usb_gadget/g1/bDeviceSubClass
echo 0x01 > /sys/kernel/config/usb_gadget/g1/bDeviceProtocol
echo "Tina UAC" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
#echo 0x013A > /sys/kernel/config/usb_gadget/g1/idProduct
#enable_uac1 mic
#echo 0x014A > /sys/kernel/config/usb_gadget/g1/idProduct
#enable_uac1 spk
#echo 0x012A > /sys/kernel/config/usb_gadget/g1/idProduct
enable_uac1 both
elif [ $1 == "uvc" ]; then
[ "$4" == "bulk" ] && {
echo Y > /sys/module/usb_f_uvc/parameters/bulk_streaming_ep
}
echo 0xef > /sys/kernel/config/usb_gadget/g1/bDeviceClass
echo 0x02 > /sys/kernel/config/usb_gadget/g1/bDeviceSubClass
echo 0x01 > /sys/kernel/config/usb_gadget/g1/bDeviceProtocol
echo "Tina UVC" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
#echo 0x150 > /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/control/header/h/bcdUVC
enable_uvc
elif [ $1 == "uvc,uac1" ]; then
echo N > /sys/module/usb_f_uvc/parameters/bulk_streaming_ep
echo 0xef > /sys/kernel/config/usb_gadget/g1/bDeviceClass
echo 0x02 > /sys/kernel/config/usb_gadget/g1/bDeviceSubClass
echo 0x01 > /sys/kernel/config/usb_gadget/g1/bDeviceProtocol
echo "Tina UVC-UAC" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
enable_uvc
#echo 0x003A > /sys/kernel/config/usb_gadget/g1/idProduct
#enable_uac1 mic
#echo 0x004A > /sys/kernel/config/usb_gadget/g1/idProduct
#enable_uac1 spk
#echo 0x002A > /sys/kernel/config/usb_gadget/g1/idProduct
enable_uac1 both
fi
echo $udc_controller > /sys/kernel/config/usb_gadget/g1/UDC
}
if [ $# -lt 1 ]; then
echo "Lack of arg!"
usage
exit
fi
# idVendor, idProduct only for test
if [ $1 == "none" ]; then
set_usb_function none 0x1f3a 0x1001
return
fi
if [ $1 == "adb" ]; then
set_usb_function adb 0x18d1 0xD002
return
fi
if [ $1 == "mtp" ]; then
set_usb_function mtp 0x045E 0x00C9
return
fi
if [ $1 == "uac1" ]; then
if [ $# == 3 ]; then
set_usb_function uac1 $2 $3
else
set_usb_function uac1 0x1d61 0x0101
fi
return
fi
if [ $1 == "mass_storage" ]; then
set_usb_function mass_storage 0x1f3a 0x1000
return
fi
if [ $1 == "uvc" ]; then
if [ "$2" == "bulk" ]; then
set_usb_function uvc 0x09a1 0x0026 bulk
else
set_usb_function uvc 0x09a1 0x0026
fi
return
fi
if [ $1 == "uac1,uvc" -o $1 == "uvc,uac1" ]; then
#set_usb_function uvc,uac1 0x1943 0x2263
#set_usb_function uvc,uac1 0x09a1 0x0026
if [ $# == 3 ]; then
set_usb_function uvc,uac1 $2 $3
else
set_usb_function uvc,uac1 0x09a1 0x002A
fi
return
fi
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u013905694/article/details/129707112