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

server/2024/10/19 21:32:48/

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


http://www.ppmy.cn/server/133152.html

相关文章

架构师知识梳理(十):系统架构设计与评估

架构基本概念 软件架构:从需求分析到软件设计之间的过渡过程称为软件架构,软件架构为软件系统提供了一个结构、行为和属性的高级抽象,由构件的描述、构件的相互作用(连接件)、指导构件集成的模式以及这些模式的约束组成…

Uncaught (in promise) TypeError: Cannot convert object to primitive value

使用vue3的时候报了这个错误,而且还同时报了一个警告 说一下我这里这个错误和警告的原因,是因为我把传给 第三方组件的值 也当做了 第三方组件的 ref,可能没太说清楚,所以接下来看代码,我这里使用的第三方组件是 vxe-t…

K8s简介和安装部署

一、 Kubernetes 简介及部署方法 1、应用部署方式演变 Kubernetes简称为K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,起源于Google 集群管理工具Borg。 传统部署 :互联网早期,会直接将应用程序部署在物理机上 优…

C++初阶——入门

目录 1、C发展历史 2、C版本更新 3、C参考文档 4、C书籍推荐 5、C的程序 6、命名空间 6.1 namespace的作用 6.2 namespace的定义 6.3 namespace的使用 7、C输入&输出 8、缺省参数 9、函数重载 10、引用 10.1 引用的概念和定义 10.2 引用的特性 10.3 引用的使…

测试自动化成功关键因素!

在软件测试领域,自动化测试被广泛认为是提高效率和准确性的关键工具。然而,尽管自动化测试具有巨大潜力,但实现其最大效益并非易事。本文将探讨测试自动化中的一些常见挑战,并提供策略以确保项目的成功。 自动化测试的局限性 尽管…

港大和字节提出长视频生成模型Loong,可生成具有一致外观、大运动动态和自然场景过渡的分钟级长视频。

HKU, ByteDance|⭐️ 港大和字节联合提出长视频生成模型Loong,该模型可以生成外观一致、运动动态大、场景过渡自然的分钟级长视频。选择以统一的顺序对文本标记和视频标记进行建模,并使用渐进式短到长训练方案和损失重新加权来克服长视频训练…

Mysql数据库 | 第一章 | 基本介绍 | 数据库的安装 | 工具下载 | 创建 | 查询 | 备份 | 三层结构

MySQL数据库 P1 数据库的作用 2022/6/19 1.简介 MySQL是一个[关系型数据库管理系统],由瑞典[MySQL AB](https://baike.baidu.com/item/MySQL AB/2620844) 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WE…

MySQL 9从入门到性能优化-二进制日志

【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…