linux通过configfs方式开启uvc、uac、adb等功能

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

相关推荐
wno7045 小时前
postgresSQL压缩版安装与基本命令
数据库·postgresql
聚美智数7 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
瀚高PG实验室7 小时前
瀚高数据库常用系统表查询入门指南(附常用SQL)
数据库·sql·postgresql·瀚高数据库
ben9518chen7 小时前
mysql数据库基本操作
数据库·mysql
2603_965148118 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
土豆.exe8 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
缓慢更新8 小时前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
Web3&Basketball10 小时前
实测Gemini4Argon:ERQA 87%登顶长程任务榜
数据库·python·大模型·多模态·gemini·长上下文·推理优化
xiaogai_gai10 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
注塑机数据采集联网10 小时前
注塑机数据采集网关对接MES系统数字化技术方案
大数据·网络·数据库·物联网·数据挖掘·数据分析