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=yCONFIG_USB_CONFIGFS_F_FS=yCONFIG_USB_CONFIGFS_F_ACC=yCONFIG_USB_CONFIGFS_F_AUDIO_SRC=y
+CONFIG_USB_CONFIGFS_F_UAC1=y
+CONFIG_USB_CONFIGFS_F_UAC1_LEGACY=y
+CONFIG_USB_CONFIGFS_F_UAC2=yCONFIG_USB_CONFIGFS_F_MIDI=yCONFIG_USB_CONFIGFS_F_UVC=yCONFIG_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_sourcwrite /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=1write /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.configstart adbdsetprop 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 configurationon 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/hsymlink /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 shellmkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shellwrite /config/usb_gadget/g1/os_desc/b_vendor_code 0x1
@@ -118,6 +129,7 @@ on early-bootchown system system /config/usb_gadget/g1/functions/rndis.gs4chown system system /config/usb_gadget/g1/functions/midi.gs5chown system system /config/usb_gadget/g1/functions/uvc.gs6
+    chown system system /config/usb_gadget/g1/functions/uac2.gs0chown system system /config/usb_gadget/g1/functions/ncm.gs7setprop sys.usb.mtp.device_type 3
@@ -175,6 +187,12 @@ on property:sys.usb.config=uvc && property:sys.usb.configfs=1on property:sys.usb.config=uvc,adb && property:sys.usb.configfs=1write /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 0x001aon property:sys.usb.config=accessory && property:sys.usb.configfs=1write /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

                (5)音频测试,在PC上放音

                在pc上选择好,音频输出设备为rk3588 声卡

                

在rk3588抓取数据如下:

rk3588_t:/data/yueyc # tinycap ./capture.pcm -D 7 -d 0 -c 2 -r 48000 -b 16
Capturing sample: 2 ch, 48000 hz, 16 bit
^CCaptured 1724416 frames
rk3588_t:/data/yueyc #

附加说明

MP3格式转wav指令

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【一起来学kubernetes】7、k8s中的ingress详解

引言配置示例负载均衡的实现负载均衡策略实现模式实现方案Nginx类型Ingress实现Treafik类型Ingress实现HAProxy类型ingress实现Istio类型ingress实现APISIX类型ingress实现 更多 引言 Ingress是Kubernetes集群中的一种资源类型,用于实现用域名的方式访问Kubernetes…

人工智能-注意力机制之残差连接和层规范化

残差连接和层规范化 层规范化和批量规范化的目标相同,但层规范化是基于特征维度进行规范化。尽管批量规范化在计算机视觉中被广泛应用,但在自然语言处理任务中(输入通常是变长序列)批量规范化通常不如层规范化的效果好。 以下代…

自建私有化证书颁发机构(Certificate Authority,CA)实战之 《0x02 Nginx 配置 https双向认证》

自建CA实战之 《0x02 Nginx 配置 https双向认证》 上一章节我们已经实现了Nginx上配置https单向认证,主要场景为客户端验证服务端的身份,但是服务端不验证客户端的身份。 本章节我们将实现Nginx上配置https双向认证,主要场景为客户端验证服…

C++ 实现位图

引出 面试题:给出 40 亿个不重复的无符号整数,没有排过序。给定一个无符号整数,如何快速判断这个数是否在这 40 亿个无符号整数中。[ 腾讯面试题 ] 想法一:将 40 亿个数据存放到 set 里面,然后再查找指定的无符号整数。…

Python基础入门例程75-NP75 使用字典计数(字典)

最近的博文: Python基础入门例程74-NP74 字典新增(字典)-CSDN博客 Python基础入门例程73-NP73 查字典(字典)-CSDN博客 Python基础入门例程72-NP72 生成字典(字典)-CSDN博客 目录 最近的博文:

论文阅读——MCAN(cvpr2019)

补充一下MCAN-VQA: 对图片的处理:首先输入图片到Faster R-CNN,会先设定一个判断是否检测到物体的阈值,这样动态的生成m∈[10,100]个目标,然后从检测到的对应的区域通过平均池化提取特征。第i个物体特征表示为&#xff…

MUYUCMS v2.1:一款开源、轻量级的内容管理系统

MuYuCMS:一款基于Thinkphp开发的轻量级开源内容管理系统,为企业、个人站长提供快速建站解决方案。它具有以下的环境要求: 支持系统:Windows/Linux/Mac WEB服务器:Apache/Nginx/ISS PHP版本:php > 5.6 (…

3.3.4打开cpu初始化大门之cpumask

文章目录 作用初始化定义接口参考作用 初始化 // in kernel/cpu.c void __init boot_cpu_init(void) {int cpu = smp_processor_id();set_cpu_online(cpu, true);set_cpu_active(cpu, true);set_cpu_present(cpu, true);set_cpu_possible(cpu, true); ​ #ifdef CONFIG_SMP__…

发布鸿蒙的第一个java应用

1.下载和安装华为自己的app开发软件DevEco Studio HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 2.打开IDE新建工程(当前用的IDEA 3.1.1 Release) 选择第一个,其他的默认只能用(API9)版本,搞了半天才发现8&#xff…

11 月 25 日 ROS 学习笔记——3D 建模与仿真

文章目录 前言一、在 ROS 中自定义机器人的3D模型1. 在 rviz 里查看3D模型2. xacro 二、Gazebo1. urdf 集成 gazebo2. 综合应用1). 运动控制及里程计2). 雷达仿真3). 摄像头信息仿真4). kinect 深度相机仿真5). 点云 前言 本文为11 月 25 日 ROS 学习笔记——3D 建模与仿真&am…

BART non-Cartesian 重建:并行成像 压缩感知

本文主要使用并行成像和压缩感知方法实现non-Cartesian MRI 数据的重建。 目录 1 自定义MRI kspace trajectory 2 自定义该 trajectory下的多通道MRI数据 3 使用NUFFT 直接做欠采样数据的重建

使用UIActivityViewController分享图片,没有preview

以前都是用第三方sdk来分享的,最近使用官方的UIActivityViewController来做分享,结果分享图片的时候preview不了分享的图片。 自定义一个继承UIActivityItemProvider的类。关于分享的内容自定义可以自己实现UIActivityItemSource这个协议。首先看看协议的…

STK Components 基础篇

1.开发包 STK Components 访问AGI官网,注册并登录后,从官网下载开发包:https://support.agi.com/downloads/,下载成功后可以申请许可证,AGI会向你注册的邮箱地址发送有效期半年的使用授权许可文件(lic文件…

【LeeCode】26.删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k ,你需…

最详细手把手教你安装 Git + TortoiseGit 及使用

软件下载 从 Git 官网 下载 Git 安装程序,点击 Download for Windows: 点击下载 64-bit Git for Windows Setup: Git for Windows Setup 为安装版本,建议选择此版本Git for Windows Portable 为绿色免安装版本 从 TortoiseGit 官网 下载 T…

Spring Boot + hutool 创建海报图片

Spring Boot hutool 创建海报图片 /*** 分享,生成图片* param id* return*/GetMapping("/getShareImg")public void getShareImg(String id,HttpServletResponse response) throws IOException {CouponConsignSaleClassify byId couponConsignSaleClassifyService…

OpenCV简介及安装

前言 因为最近想做图像处理、人脸检测/识别之类的相关开发,所以就开始补OpenCV的相关知识,便开个专栏用于记录学习历程和在学习过程中遇到的一些值得注意的重点和坑。 学习过程基本上也是面向官方文档和Google。 简介 OpenCV(开源的计算机视觉库)是基于…

C编译过程

寻觅GCC 如果你已经安装了Clion&#xff0c;那么gcc就在根目录下。 如果没有&#xff0c;那么需要去minGW的官网下载安装。添加到环境变量中。 编写C代码 #include <stdio.h>#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0]) static int a 123;int main() {int i 0;c…

【云备份】文件操作实用工具类设计

文章目录 为什么要单独设计文件工具类&#xff1f;整体实现Filesize ——文件大小stat接口 LastMTime ——最后一次修改时间LastATime —— 最后一次访问时间FileName —— 文件名称GetPostLen ——获取文件指定位置 指定长度的数据GetContnet —— 读取文件数据SetContent ——…

owl文件导入neo4j教程(win11)

一、前置条件 下载安装好neo4j 我是在官网下载的社区版4.4.28 下载neosemantics-4.4.0.3.jar 直接贴下载网址 https://objects.githubusercontent.com 下载rdf2rdf https://sourceforge.net/projects/rdf2rdf/ 下载并安装配置好jdk8 下载jdk11 二、步骤 1.使用如下命令将owl转…