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
相关文章:
rk3588配置uac功能,android13使能uac及adb的复合设备
最近,因新增需求需要在现有产品上增加UAC的功能,查阅并学习相关知识后,在rk3588 SOC硬件平台搭载android13系统平台上成功配置了uac及uac&adb的复合设备。基于开源共享精神希望给大家提供些参考。 1.技术可行性预研 (1&#…...
对未来新能源车测试工具的看法
汽车行业正在经历变革的说法算是比较轻描淡写的了,还记得我1983年加入这个行业时,行业聚焦点是引入发动机管理系统。当时还是以家庭掀背车为主的时代,发动机分析仪的体积像衣柜一样大,还没出现“CAN”通信协议。现在经常听到我的导…...
案例说法:智能网联车背后的安全隐患
随着汽车智能化、网联化的发展,汽车数据处理能力日益增强,未经授权对个人信息和重要数据采集、利用等数据安全问题逐步凸显。对车辆网络攻击、网络侵入等网络安全问题恐将危及个人生命安全、合法权益,甚至危害公共利益、国家安全,…...
基于C#实现双端队列
话说有很多数据结构都在玩组合拳,比如说:块状链表,块状数组,当然还有本篇的双端队列,是的,它就是栈和队列的组合体。 一、概念 我们知道普通队列是限制级的一端进,另一端出的 FIFO 形式&#…...
蓝桥杯物联网竞赛_STM32L071_4_按键控制
原理图: 当按键S1按下PC14接GND,为低电平 CubMX配置: Keil配置: main函数: while (1){/* USER CODE END WHILE */OLED_ShowString(24, 0, "<KeyCheck>", 16);if(Function_KEY_S1Check() 1){ OLED_ShowString(…...
【后端卷前端】
为啥现在对后端要求这么高?为啥不要求前端会后端呢? 可能是后端人太多了,要求后端需要会前端的框架(vue react angular ), 这不我为了适应市场的需求来系统的学习vue了: 生成一个基础的vue项目 创建vue项目 vue create projectname 创建vitevue npm init vitelatest p…...
二叉树题目:结点与其祖先之间的最大差值
文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:结点与其祖先之间的最大差值 出处:1026. 结点与其祖先之间的最大差值 难度 5 级 题目描述 要求 给…...
平衡树 - splay
相比于之前的普通平衡树进行左旋右旋来比,splay的适用性更高,使用更广泛。 核心函数rotate、splay函数,其它的根据需要进行修改。 int n, m; struct Node {int s[2], p, v, cnt; // 左右儿子、父节点、值、出现数量int size, flag; // 子树大…...
Spring Validation实践及其实现原理
Bean Validation 2.0 注解 校验空值 Null:验证对象是否为 null NotNull:验证对象是否不为 null NotEmpty:验证对象不为 null,且长度(数组、集合、字符串等)大于 0 NotBlank:验证字符串不为 nul…...
Java核心知识点整理大全18-笔记
Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…...
vue 富文本编辑器多图上传
首先我使用的富文本编辑器是vue-quill-editor 使用npm进行下载 npm install vue-quill-editor --save当然也可以按照官方的方法下载,到官方 因为我是在原有老项目上开发的使用的组件库是ant-design-vue 1x版,当然使用其他组件库也可以 然后还有重要的一…...
简易地铁自动机售票系统实现(C++)
该程序具有以下功能 (1) 一个地铁路线类 Router,包含路线编号,途中的各个站点。可以新增、删除、查询路线,可以根据线路名称,显示线路图片。 (2) 一个地图类 Map,可以显示所有可以乘坐的地铁站名,以及线路…...
【Spark入门】基础入门
【大家好,我是爱干饭的猿,本文重点介绍Spark的定义、发展、扩展阅读:Spark VS Hadoop、四大特点、框架模块、运行模式、架构角色。 后续会继续分享其他重要知识点总结,如果喜欢这篇文章,点个赞👍ÿ…...
【自制开源】实时调参,手写字生成神器!大学生福音,告别繁琐的手写报告。
HandwritingGenerator HandwritingGenerator 是一个使用 PyQt6 制作的手写文本图片生成器。 该工具允许用户自定义多种效果,通过在左边配置效果参数,右边实时预览,并在调整好后输出图片。 效果预览 软件界面预览:一封情书&#x…...
Python 进阶(十一):高精度计算(decimal 模块)
《Python入门核心技术》专栏总目录・点这里 文章目录 1. 导入decimal模块2. 设置精度3. 创建Decimal对象4. 基本运算5. 比较运算6. 其他常用函数7. 注意事项8. 总结 大家好,我是水滴~~ 在进行数值计算时,浮点数的精度问题可能会导致结果的不准确性。为了…...
MCU常用文件格式
1. asm文件 asm是汇编语言源程序的扩展名,.asm文件是以asm作为扩展名的文件,是汇编语言的源程序文件。汇编语言(Assembly Language)是面向机器的程序设计语言,是利用计算机所有硬件特性并能直接控制硬件的语言。在汇编语言中,用助…...
【机器学习】On the Identifiability of Nonlinear ICA: Sparsity and Beyond
前言 本文是对On the Identifiability of Nonlinear ICA: Sparsity and Beyond (NIPS 2022)中两个结构稀疏假设的总结。原文链接在Reference中。 什么是ICA(Independent component analysis)? 独立成分分析简单来说,就是给定很多的样本X,通…...
RBAC(Role-Based Access Control,基于角色的访问控制)
1. RBAC核心概念 RBAC(Role-Based Access Control,基于角色的访问控制)是一种广泛应用于软件和系统中的权限管理模型。它通过将用户与角色关联,再将角色与访问权限关联,来管理用户对系统资源的访问。RBAC模型的主要特…...
C++const指针的两种用法
const int *p &a; 指向const变量的指针 指向const变量的指针const修饰的变量,只能由指向const变量的指针去指向 p &a1;const的位置,必须在*的左边指向const变量的指针,可以被改变,可以指向别的变量可以指向普通变量&am…...
【Proteus仿真】【51单片机】智能垃圾桶设计
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用报警模块、LCD1602液晶模块、按键模块、人体红外传感器、HCSR04超声波、有害气体传感器、SG90舵机等。 主要功能: 系统运行后…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
