完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在RK3308平台研究UAC功能,网上资料少的可怜,稍微有点用的资料还是专栏,还得开会员或者付费查看,真的是坑死了。
看了下相关资料,基本原理就是通过u*** gadget虚拟成一个u***音频设备,然后在linux层虚拟出一个声卡。 1.如何开启UAC功能 检查kernel 编译宏配置 buildroot/configs/rockchip_rk3308_release_defconfig 检查是否开启如下宏配置: CONFIG_USB_DWC2=y CONFIG_USB_GADGET=y CONFIG_USB_GADGET_DEBUG_FILES=y CONFIG_USB_GADGET_VBUS_DRAW=500 CONFIG_USB_CONFIGFS=y CONFIG_USB_CONFIGFS_F_FS=y CONFIG_USB_CONFIGFS_UEVENT=y CONFIG_USB_CONFIGFS_F_UAC1=y CONFIG_USB_CONFIGFS_F_HID=y #打开HID,是考虑后期需要配置软件调节音量等功能。 由于是通过configfs来配置的,RK3308使用/etc/init.d/S50u***device脚本对我们需要的功能进行配置,包括UAC、ADB、UVC等USB相关功能,而这些功能又由/etc/init.d/.u***_config和/tmp/.u***_config文件内容决定是否开启。刚开始摸的时候,打开kernel配置的uac宏后,将板子的u***连接到电脑上后,死活检测不到u***音频设备,纠结了好一阵,最后发现就是个.u***_config文件配置导致的。 查看/etc/init.d/S50u***device启动脚本可以看到,就是通过这个文件内容来判断要初始化哪种u***设备: 而.u***_config文件中内容可以配置为什么呢?可以根据parameter_init()函数的case值可以看出支持哪些u***设备: 而RK的配置默认不支持adb和uac同时开启,我在此做了一些修改,可以同时开启adb和uac功能,方便调试,供大家参考。 diff --git a/S50u***device b/S50u***device index 878ca3b..d1d2228 100755 --- a/S50u***device +++ b/S50u***device @@ -12,6 +12,7 @@ MTP_EN=off NTB_EN=off ACM_EN=off UAC1_EN=off +UAC1_ADB_EN=off UAC2_EN=off UVC_EN=off RNDIS_EN=off @@ -52,9 +53,11 @@ function_init() mkdir ${USB_FUNCTIONS_DIR}/uac1.gs0 test_write 1 ${USB_FUNCTIONS_DIR}/uac1.gs0/c_feature_unit test_write 1 ${USB_FUNCTIONS_DIR}/uac1.gs0/p_feature_unit echo -e "8000,16000,32000,48000" > ${USB_FUNCTIONS_DIR}/uac1.gs0/c_srate echo -e "8000,16000,32000,48000" > ${USB_FUNCTIONS_DIR}/uac1.gs0/p_srate #echo -e "16000" > ${USB_FUNCTIONS_DIR}/uac1.gs0/c_srate #echo -e "16000" > ${USB_FUNCTIONS_DIR}/uac1.gs0/c_srate mkdir ${USB_FUNCTIONS_DIR}/uac2.gs0 @@ -174,6 +177,10 @@ parameter_init() UAC1_EN=on make_config_string uac1 ;; + u***_uac1_adb_en) + UAC1_ADB_EN=on + make_config_string uac1_adb + ;; u***_uac2_en) UAC2_EN=on make_config_string uac2 @@ -215,6 +222,9 @@ parameter_init() acm) PID=0x1005 ;; + uac1_adb) + PID=0x0029 + ;; *) PID=0x3301 esac @@ -230,7 +240,7 @@ use_os_desc() pre_run_binary() { - if [ $ADB_EN = on ];then + if [ $ADB_EN = on ] || [ $UAC1_ADB_EN = on ];then mkdir /dev/u***-ffs/adb -m 0770 mount -o uid=2000,gid=2000 -t functionfs adb /dev/u***-ffs/adb start-stop-daemon --start --quiet --background --exec /usr/bin/adbd @@ -302,6 +312,7 @@ bind_functions() test $RNDIS_EN = on && syslink_function rndis.gs0 test $UAC1_EN = on && syslink_function uac1.gs0 + test $UAC1_ADB_EN = on && syslink_function uac1.gs0 && syslink_function ffs.adb test $UAC2_EN = on && syslink_function uac2.gs0 echo 0x1 > ${USB_FUNCTIONS_DIR}/uac2.gs0/p_chmask # test $UAC1_EN = on && syslink_function uac1.gs0 在如下目录即可查看kernel当前对哪些类型的u***设备进行了配置: ls /sys/kernel/config/u***_gadget/rockchip/functions/ 如下图表示,kernel已经生成了uac1.gs0配置,此时我们只需要修改.u***_config文件内容为u***_uac1_en或者u***_uac1_adb_en,即可开启UAC功能。 cat /etc/init.d/.u***_config #查看当前配置 只有其值为u***_uac1_en 或者 u***_uac1_adb_en时,才会生效 echo u***_uac1_en > /etc/init.d/.u***_config #启用 UAC echo u***_adb_en > /etc/init.d/.u***_config #启用 ADB echo u***_uac1_adb_en > /etc/init.d/.u***_config #同时启用 UAC和ADB 修改完后重启系统即可生效。若想让配置固件烧录后即可生效,需要手动修改buildroot/output/rockchip_rk3308_release/target/etc/init.d/.u***_config的文件内容,然后重新编译即可。 UAC功能正常开启后,即可在设备管理器中看到一个麦克风设备和扬声器设备。 2.修改UAC通道数、采样率、数据类型等参数 x_chmask:表示录/放音通道数(p相当于PC的录音通道个数, c相当于PC的播放通道个数):
x_srate: 录/放音的采样率,Rockchip UAC支持多采样率。 x_ssize: 录/放音数据的类型,单位bytes,对应PCM_16的数据,其值为2. 由于windows对驱动有记忆功能,修改UAC的参数后,我们需要卸载windows的驱动,才能使修改的参数生效。注意:必须要卸载声音、视频和游戏控制器中的 Source/Sink 设备,而不是音频输入和输出中的设备。 3. 修改UAC配置period_size大小 这个period_size会受驱动设置的buff大小和UAC通道数影响,如果开的通道比较多,需要相应增大buff的大小。 修改后如下图所示: |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
基于米尔瑞芯微RK3576核心板/开发板的人脸疲劳检测应用方案
626 浏览 0 评论
887 浏览 1 评论
784 浏览 1 评论
1997 浏览 1 评论
3242 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 01:40 , Processed in 0.972728 second(s), Total 74, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号