rk3588配置uac功能,android13使能uac及adb的复合设备

          最近,因新增需求需要在现有产品上增加UAC的功能,查阅并学习相关知识后,在rk3588 SOC硬件平台搭载android13系统平台上成功配置了uac及uac&adb的复合设备。基于开源共享精神希望给大家提供些参考。

1.技术可行性预研

        (1)我首先预览rockchip发布的文档包,遍历了系统及usb相关的文档,其中Rockchip_Developer_Guide_USB_Gadget_UAC_CN.pdf文档中已经明确了RK3588内核中已经对RK3588 && Linux-5.10做了相关技术支持。

但是阅读android初始化配置文件,并没有相关uac的系统配置内容;内核中也无uac相关配置项。看到了usb配置文件及内核中对audio_source的支持,试验生效audio_source后,可以在/dev/snd/下生成对应的pcm设备;但使用inypcminfo指令来查询设备属性时系统崩溃,直接往对应的pcm设备推数据亦然。

        (2)询问rockchip FAE关于rk3588关于uac技术支持现状,被告知需要自行支持,可行。

2.UAC及UAC,ADB符合设备系统配置

        (1)内核增加uac配置

--- a/kernel-5.10/arch/arm64/configs/rockchip_defconfig
+++ b/kernel-5.10/arch/arm64/configs/rockchip_defconfig
@@ -837,6 +837,9 @@ CONFIG_USB_CONFIGFS_MASS_STORAGE=y
 CONFIG_USB_CONFIGFS_F_FS=y
 CONFIG_USB_CONFIGFS_F_ACC=y
 CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y
+CONFIG_USB_CONFIGFS_F_UAC1=y
+CONFIG_USB_CONFIGFS_F_UAC1_LEGACY=y
+CONFIG_USB_CONFIGFS_F_UAC2=y
 CONFIG_USB_CONFIGFS_F_MIDI=y
 CONFIG_USB_CONFIGFS_F_UVC=y
 CONFIG_TYPEC_TCPM=y

        (2)配置文件增加uac,及uac,adb符合设备配置

                a).init.usb.configfs.rc文件增加内容

--- a/system/core/rootdir/init.usb.configfs.rc
+++ b/system/core/rootdir/init.usb.configfs.rc
@@ -106,6 +106,22 @@ on property:sys.usb.ffs.ready=1 && property:sys.usb.config=accessory,audio_sourc
     write /config/usb_gadget/g1/UDC ${sys.usb.controller}
     setprop sys.usb.state ${sys.usb.config}
 
+on property:sys.usb.config=uac && property:sys.usb.configfs=1
+    write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "uac2"
+    symlink /config/usb_gadget/g1/functions/uac2.gs0 /config/usb_gadget/g1/configs/b.1/f1
+    write /config/usb_gadget/g1/UDC ${sys.usb.controller}
+    setprop sys.usb.state ${sys.usb.config}
+
+on property:sys.usb.config=uac,adb && property:sys.usb.configfs=1
+    start adbd
+
+on property:sys.usb.ffs.ready=1 && property:sys.usb.config=uac,adb && property:sys.usb.configfs=1
+    write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "uac_adb"
+    symlink /config/usb_gadget/g1/functions/uac2.gs0 /config/usb_gadget/g1/configs/b.1/f1
+    symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2
+    write /config/usb_gadget/g1/UDC ${sys.usb.controller}
+    setprop sys.usb.state ${sys.usb.config}
+
 on property:sys.usb.config=midi && property:sys.usb.configfs=1
     write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "midi"
     symlink /config/usb_gadget/g1/functions/midi.gs5 /config/usb_gadget/g1/configs/b.1/f1

                b).init.usb.rc文件增加内容

--- a/system/core/rootdir/init.usb.rc
+++ b/system/core/rootdir/init.usb.rc
@@ -103,6 +103,24 @@ on property:sys.usb.config=accessory,audio_source,adb && property:sys.usb.config
     start adbd
     setprop sys.usb.state ${sys.usb.config}
 
+# UAC2 USB audio Class accessory configuration
+on property:sys.usb.config=uac && property:sys.usb.configfs=0
+    write /sys/class/android_usb/android0/enable 0
+    write /sys/class/android_usb/android0/idVendor 2207
+    write /sys/class/android_usb/android0/idProduct 0019
+    write /sys/class/android_usb/android0/functions ${sys.usb.config}
+    write /sys/class/android_usb/android0/enable 1
+    setprop sys.usb.state ${sys.usb.config}
+
+# UAC2 && adb Class accessory configuration
+on property:sys.usb.config=uac,adb && property:sys.usb.configfs=0
+    write /sys/class/android_usb/android0/enable 0
+    write /sys/class/android_usb/android0/idVendor 2207
+    write /sys/class/android_usb/android0/idProduct 001a
+    write /sys/class/android_usb/android0/functions ${sys.usb.config}
+    write /sys/class/android_usb/android0/enable 1
+    setprop sys.usb.state ${sys.usb.config}
+
 # Used to set USB configuration at boot and to switch the configuration
 # when changing the default configuration
 on boot && property:persist.sys.usb.config=*

                 c).init.rk30board.usb.rc文件增加内容

--- a/device/rockchip/common/rootdir/init.rk30board.usb.rc
+++ b/device/rockchip/common/rootdir/init.rk30board.usb.rc
@@ -82,6 +82,17 @@ on early-boot
     /config/usb_gadget/g1/functions/uvc.gs6/streaming/class/hs/h
     symlink /config/usb_gadget/g1/functions/uvc.gs6/streaming/header/h \
     /config/usb_gadget/g1/functions/uvc.gs6/streaming/class/ss/h
+    
+    #uac function description
+    mkdir /config/usb_gadget/g1/functions/uac2.gs0
+    write /config/usb_gadget/g1/functions/uac2.gs0/p_chmask 3
+    write /config/usb_gadget/g1/functions/uac2.gs0/p_ssize 2
+    write /config/usb_gadget/g1/functions/uac2.gs0/p_srate "48000"
+    write /config/usb_gadget/g1/functions/uac2.gs0/c_chmask 3
+    write /config/usb_gadget/g1/functions/uac2.gs0/c_ssize 2
+    write /config/usb_gadget/g1/functions/uac2.gs0/c_srate "48000"
+    write /config/usb_gadget/g1/functions/uac2.gs0/c_feature_unit 1
+    
     mkdir /config/usb_gadget/g1/configs/b.1 0770 shell shell
     mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shell
     write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1
@@ -118,6 +129,7 @@ on early-boot
     chown system system /config/usb_gadget/g1/functions/rndis.gs4
     chown system system /config/usb_gadget/g1/functions/midi.gs5
     chown system system /config/usb_gadget/g1/functions/uvc.gs6
+    chown system system /config/usb_gadget/g1/functions/uac2.gs0
     chown system system /config/usb_gadget/g1/functions/ncm.gs7
 
     setprop sys.usb.mtp.device_type 3
@@ -175,6 +187,12 @@ on property:sys.usb.config=uvc && property:sys.usb.configfs=1
 
 on property:sys.usb.config=uvc,adb && property:sys.usb.configfs=1
     write /config/usb_gadget/g1/idProduct 0x0015
+    
+on property:sys.usb.config=uac && property:sys.usb.configfs=1
+    write /config/usb_gadget/g1/idProduct 0x0019
+
+on property:sys.usb.config=uac,adb && property:sys.usb.configfs=1
+    write /config/usb_gadget/g1/idProduct 0x001a
 
 on property:sys.usb.config=accessory && property:sys.usb.configfs=1
     write /config/usb_gadget/g1/idVendor 0x18d1
sdk文件对应rk3588调试板文件路径
system/core/rootdir/init.usb.rc/system/etc/init/hw/init.usb.rc
system/core/rootdir/init.usb.configfs.rc/system/etc/init/hw/init.usb.configfs.rc
device/rockchip/common/rootdir/init.rk30board.usb.rc/vendor/etc/init/hw/init.rk30board.usb.rc

3.编译后测试

        (1)rk3588生效UAC设备

        通过setprop指令生效uac或 uac,adb设备,需要先置none清空原配置再生效uac

                只生效uac:

setprop sys.usb.config none;setprop sys.usb.config uac

                生效uac,adb的复合设备:

setprop sys.usb.config none;setprop sys.usb.config uac,adb

        (2)查看声卡信息及配置内容

        (3)PC上查看uac识别情况

                (4)音频测试,在PC上录音

               在rk3588上推wav数据给PCM设备(playback),既可在PC上使用录音机app进行收音测试。

rk3588_t:/data/yueyc # tinyplay /data/yueyc/ihatetoloveyou48k.wav  -D 7 -d 0
Playing sample: 2 ch, 48000 hz, 16 bit 47607428 bytes

附加说明

MP3格式转wav指令

#将不同采样率MP3转为所需采样率MP3
ffmpeg -i xxx.mp3 -ac 2 -ar 48000 -y xxx48k.mp3
#将mp3转为相同采样率的wav音频格式指令
ffmpeg -i xxx48k.mp3 xxx48k.wav

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/184348.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是 TLS/SSL 握手

TLS/SSL 握手是一个加密过程,每当客户端(如浏览器)与服务器建立连接时,都会在后台进行,此握手协议有助于客户端和服务器之间的安全连接,从而促进隐私、数据完整性和机密性。 TLS/SSL 握手何时发生 每当客…

Android笔记(十四):JetPack Compose中附带效应(一)

在Android应用中可以通过定义可组合函数来搭建应用界面。应用界面的更新往往是与可组合函数内部定义的状态值相关联的。当界面的状态值发生变更,会导致应用界面进行更新。在Android笔记(九):Compose组件的状态,对Compo…

数据库实验五 数据库设计

数据库实验五 数据库设计 一、实验目的二、实验内容三、实验内容四、验证性实验五、设计性实验 一、实验目的 1.了解E-R图构成要素以及各要素图元。 2.掌握概念模型E-R图的绘制方法。 3.掌握概念模型向逻辑模型的转换原则和步骤。 4.运用sql编程实现 二、实验内容 1.选取一个…

TCP 重传、滑动窗口、流量控制、拥塞控制的剖析

TCP 是一个可靠传输的协议,那它是如何保证可靠的呢? 为了实现可靠性传输,需要考虑很多事情,例如数据的破坏、丢包、重复以及分片顺序混乱等问题。如不能解决这些问题,也就无从谈起可靠传输。 那么,TCP 是…

使用骨传导耳机会伤耳朵吗?一文读懂骨传导耳机有哪些优点

首先说明,如果是正确的使用骨传导耳机是不会伤耳朵。 一、骨传导耳机的传声原理是什么? 声音的传播需要介质,传统的耳机是通过空气来进行传播,也被称为“空气传导耳机”,而骨传导耳机最大的特别之处就在于&#xff0…

linux安装zsh、oh-my-zsh及常用插件

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com,github地址为https://github.com/xjintong。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家访问。 一、安装zsh 这个不用多说了&#xff0…

[HOW TO]-VirtualBox的虚拟机通过宿主机上网

快速链接: . 👉👉👉 [专栏目录]-环境搭建安装问题笔记目录 👈👈👈 付费专栏-付费课程 【购买须知】:👉👉👉 个人博客笔记导读目录(全部) 👈👈&a…

uni-app,nvue中text标签文本超出宽度不换行问题解决

复现:思路: 将text标签换为rich-text,并给rich-text增加换行的样式class类名解决:

nf_conntrack内核模块常见问题

nf_conntrack内核模块常见问题 问题描述排查步骤前置条件:启用nf_conntrack内核模块检查nf_conntrack配置 解决办法1:半数减少nf_conntrack buckets的值解决办法2:加倍调大m.min_free_kbytes值解决办法3:Linux社区权威答复-忽略告警 问题描述 内核报错 falling bac…

【C++初阶】四、类和对象(构造函数、析构函数、拷贝构造函数、赋值运算符重载函数)

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 【C初阶】三、类和对象 (面向过程、class类、类的访问限定符和封装、类的实例化、类对象模型、this指针) -CSDN博客 引入:类的六个默认成员函数…

Web(6)Metasploit缓冲区溢出漏洞

利用ms17_010漏洞建立会话: 原理: 因为window低级版本中存在漏洞,端口445.SMB是一个协议名,全称是Server Message Block(服务器消息快协议),用于计算机之间共享文件,打印机&#x…

智驾芯片全矩阵「曝光」,这家企业的车载品牌正式官宣

随着汽车智能化加速,智能驾驶芯片格局逐渐清晰。 针对L0-L2,业内基本采用智能前视一体机方案;要实现高速NOA、城市NOA等更为高阶的智驾功能等,则基本采用域控制器方案。从前视一体机至域控,再逐步演进到舱驾一体、中央…

eclipse项目移到idea上部署运行

1.配置web模块 另外,模块这里,也要加上Spring 2.配置Artifact (用于tomcat) 就是从上面配置的web模块,产生的工件 3.添加lib 一般是在web-inf/lib , 遇到的坑: jdk版本问题,这里…

加速软件开发:自动化测试在持续集成中的重要作用!

持续集成的自动化测试 如今互联网软件的开发、测试和发布,已经形成了一套非常标准的流程,最重要的组成部分就是持续集成(Continuous integration,简称CI,目前主要的持续集成系统是Jenkins)。 那么什么是持…

6.显示评论 + 添加评论

1.显示评论 数据层:根据实体查询一页评论数据、根据实体查询评论的数量业务层:处理查询评论的业务、处理查询评论数量的业务表现层:显示帖子详情数据时,同时显示该帖子所有的评论数据 1.1 数据访问层 entity_type:实体…

linux 内存回收mglru算法代码注释2

mglru与原lru算法的兼容 旧的lru算法有active与inactive两代lru,可参考linux 内存回收代码注释(未实现多代lru版本)-CSDN博客 新的算法在引入4代lru的同时,还引入了tier的概念。 新旧算法的切换的实现在lru_gen_change_state&a…

机器学习探索计划——数据集划分

文章目录 导包手写数据划分函数使用sklearn内置的划分数据函数stratifyy理解举例 导包 import numpy as np from matplotlib import pyplot as plt from sklearn.datasets import make_blobs手写数据划分函数 x, y make_blobs(n_samples 300,n_features 2,centers 3,clus…

【UE5】资源(Asset)

了解UE游戏的基本构成 资源(Asset): 在UE中,资源(Asset)是指游戏中使用到的各种素材,例如模型、纹理、材质、声音、动画、蓝图、数据表格、关卡等(通常以uasset结尾),他…

freeswitch设置多个execute_on_media

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 fs中有非常多的接口和通道变量,使用方式多变。 官方文档有时候也仅仅是介绍了最基本的使用方法和格式。 环境 centos:CentOS release 7.0 (Final)或以上版本 freeswitch:v1.6 G…

办公技巧:Word中插入图片、形状、文本框排版技巧

目录 一、插入图片排版技巧 二、添加形状排版技巧 三、插入“文本框”排版技巧 我们平常在制作word时候经常会遇到插入选项卡下的图片、形状和文本框这三种情况下,那么如何使得Word文档当中添加这三个元素的同时,又能保证样式美观呢,今天小…