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

这篇具有很好参考价值的文章主要介绍了linux通过configfs方式开启uvc、uac、adb等功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

setusbconfig uvc:开启uvc功能。文章来源地址https://www.toymoban.com/news/detail-647781.html

切换到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

到了这里,关于linux通过configfs方式开启uvc、uac、adb等功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UVC&UAC之USB接口传输速率

    USB接口传输速率 USB2.0的理论传输速度为480 Mbps,即60 MB/s, 实际为30 MB/s左右 USB3.0的理论传输速度为5Gbps,即500 MB/s, 实际为100 MB/s左右 (1080P)P的含义: progressive scan,逐行扫描的意思 YUV420采样之后的一帧数据大小 每个Y/U/V的采样点用8bit来表示,即1Bytes. 所以如果用USB2.0的UVC采集高分辨

    2024年02月10日
    浏览(41)
  • adb详细教程(二)-开启手机开发者模式、通过adb连接安卓设备

    adb对于安卓移动端来说,是个非常重要的调试工具。 本篇介绍如何开启手机的开发者模式,及如何连接电脑的adb (adb的安装包我已上传到了网盘。可以直接搜索公众号【软件测试必备技能】或 滑到文章底部,点击公众号卡片扫描二维码,前往关注领取。) adb 提供对 Unix s

    2024年02月15日
    浏览(83)
  • rockchip rk3588添加uvc及uvc,adb的复合设备

    软硬件环境:         软件基础:我目前拿到的rk3588 sdk : git@www.rockchip.com.cn:2222/Android_S/rk3588- manifests.git         硬件基础:RK3588 LP4X EVB          uvc_app: 从rv1126 sdk中rv1126_sdk/rv1126/external/uvc_app 目录移植而来。移植后,可以采集开发板板载摄像头图像(/dev/video11)获

    2024年02月09日
    浏览(54)
  • Android13 网络 Adb 默认开启

    通过代码分析发现Android13 上对 网络adb 进行了限制! Android13原生代码要求:必现连接上某个wifi,才能进行adb ,并且切换wifi或者关闭wifi都是会停止adb。 如果要做成Android11 或者之前一样,设备连接WiFi/有线网络后电脑可以直接进行adb连接,就要对系统代码进行适配修改。 之前

    2024年02月12日
    浏览(46)
  • Android 11编译第三弹 ADB开启ROOT权限

    问题:Relese版本,默认adb访问会降级到shell权限,一些敏感操作不能进行,远程调试比较麻烦。且Release版本没有su模块,不能切换Root用户。 开启adb调试以后,默认进入adb是system权限,不能切换到root(因为Release没有集成su). 有两种方式切换Root: 1) Release也集成su模块 2)默认

    2024年02月09日
    浏览(54)
  • 高通Android系列随身WIFI强行开启adb,关闭商家远程控制

    目前市面上便宜的随身wifi大概分为高通、中芯微、MTK几家的SOC。大部分Android产品都关闭了adb或者开启的是user adb,没有root权限。下面说说高通系列如何强行开root adb,以及关闭部分机器远程控制功能。 如果机器默认未开启adb,就需要直接使用硬件方式进入9008进行备份和刷机,

    2024年02月07日
    浏览(40)
  • 电脑ADB连接手机的方式&通过网络无法adb连接手机的问题(已解决)

    首先电脑要下载adb工具,将压缩包解压到C盘:https://download.csdn.net/download/qq_43445867/87975072 打开手机USB调试;PC端安装手机USB驱动。 1.打开DOS命令窗口,进入adb文件夹,输入adb.exe devices回车列出设备列表 2.输入adb -s 611AZ***** shell连接自己的设备 找到当前手机的IP地址,一般都在“

    2024年02月14日
    浏览(77)
  • Android 通过adb命令查看应用流量

            通过adb shell ps -A  |  grep 包名  来获取app的 pid号         使用 adb shell cat /proc/#pid#/net/dev 命令 来获取流量数据 备注: Recevice: 表示收包 Transmit:  表示发包 bytes: 表示收发的字节数 packets: 表示收发正确的包量 errs: 表示收发错误的包量 drop: 表示收发丢弃的包量 wla

    2024年01月25日
    浏览(50)
  • android 通过adb shell命令旋转Android屏幕朝向

    注意: 默认0有的为横向,有的为纵向 纵向返回结果: cur 的值 宽 短 x 高 长 init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1794x1731 横向返回结果: cur 的值 宽 长 x 高 短 init=1080x1920 420dpi cur=1920x1080 app=1794x1080 rng=1080x1017-1794x1731

    2024年02月11日
    浏览(113)
  • android 通过adb shell命令旋转Android屏幕朝向方向

    注意: 默认0有的为横向,有的为纵向 纵向返回结果: cur 的值 宽 短 x 高 长 init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1794x1731 横向返回结果: cur 的值 宽 长 x 高 短 init=1080x1920 420dpi cur=1920x1080 app=1794x1080 rng=1080x1017-1794x1731

    2024年02月06日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包