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

                (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

  • 26
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android UAC设备开发,UAC是指USB音频类协议,它是一种用于音频设备Android智能设备之间通信的协议。在Android系统中,我们可以通过UAC协议与外接的USB音频设备进行交互,实现音频的录制、播放和控制等功能Android UAC设备开发的主要步骤如下: 1. 准备开发环境:首先需要安装Android开发工具包(ADT)以及相应的USB驱动程序,此外还需要一台支持USB OTG的Android设备。 2. 配置权限:在AndroidManifest.xml文件中,需要声明相应的权限,例如USB权限和音频权限等。 3. 建立USB连接:通过USBManager类获取USB设备,根据设备标识符进行过滤,并建立USB连接。 4. 发现和选择设备:使用UsbDeviceConnection类与USB设备进行通信,通过设备描述符和接口描述符等信息来发现和选择要操作的UAC设备。 5. 配置设备:根据UAC设备的要求,配置其采样率、通道数、位深度等参数,并打开音频流。 6. 音频数据传输:使用AudioRecord类进行音频的录制,通过USB传输给外接设备;使用AudioTrack类进行音频的播放,通过USB接收外接设备传输过来的音频数据。 7. 控制设备:通过UAC协议中定义的控制命令,实现音量调节、播放控制等功能。 8. 释放资源:在程序结束时,需要释放相应的资源,关闭连接、停止录制、停止播放等。 总结来说,Android UAC设备开发主要涉及USB连接、设备发现、配置和控制,音频数据传输等方面。通过上述步骤,我们可以在Android平台上与外接的USB音频设备进行交互,实现音频的录制、播放和控制等功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值