-
概述
使能virtio-snd的方法参考QNX官网步骤:
需要代码包括: qnx prebuilt, 高通qnx基线,高通vendor la-va(android)代码。
代码移植开发包括三个部分:
1, 添加io-audio设备;
2, 添加 vdev virtio-snd 配置;
3, 在Linux中添加virtio-snd驱动。
-
添加io-audio设备
添加io-audio设备定义需要先做,否则在解析linux_la.config的时候,会出现找不到设备的问题。
这一步骤比较复杂,细节跳过。详细需要参考- io-audio:
高通8295里面已经配置了一些设备枚举:
apps/qnx_ap/AMSS/multimedia/audio/audio_ar/qnx_audio/src/hardware/deva/ctrl/qc/deva_demo_platform.c
我们选取某个已有的配置,然后作为下一步vdev virtio-snd的匹配设备。比如:
{TRUE, DEVA_DEVICE_ID_PLAYBACK_A2B, "eight_channel_a2bp", SND_PCM_INFO_PLAYBACK, "eight_channel_a2bp_id", "/dev/snd/eight_channel_a2bp", NULL, SND_PCM_CHANNEL_PLAYBACK, FALSE },
{TRUE, DEVA_DEVICE_ID_PLAYBACK_STEREO, "stereo_speakerp", SND_PCM_INFO_PLAYBACK, "stereo_speakerp_id", "/dev/snd/stereo_speakerp", NULL, SND_PCM_CHANNEL_PLAYBACK, TRUE },
这些设备可以使用命令验证
wave -a [device_path] -p [volume] [media_path]
示例,从耳机插口听:
wave -a stereo_speakerp /mnt/123.wav
-
添加 vdev virtio-snd 配置
3.1 拷贝黑莓预编译的virtio-snd.so
拷贝virtio-snd.so 驱动到高通qnx代码sa8295p-hqx-4-2-4-1_hlos_dev_qnx
高通默认没有virtio-snd功能,需要先要把vdev-virtio-snd.so从qnx7.1的预编译文件中拷贝出来,在高通工程里面预编译。
Qnx7.1预编译文件在:
prebuilt_HYP710/target/qnx7/aarch64le/lib/dll/vdev-virtio-snd.so
把上述.so放到高通基线代码:
sa8295p-hqx-4-2-4-1_hlos_dev_qnx/src/apps/qnx_ap/prebuilt/aarch64le/lib/dll/vdev-virtio-snd.so
并在src/apps/qnx_ap/target/hypervisor/host/build_files/system.build.tmpl添加预编译规则:
lib64/dll/vdev-virtio-snd.so=aarch64le/lib/dll/vdev-virtio-snd.so
3.2 配置虚拟机虚拟设备
高通平台的虚拟机设备驱动配置文件在如下文件配置:
src/apps/qnx_ap/target/hypervisor/gvm/ivi/la/linux-la.config
匹配到eight_channel_a2bp参考配置如下:
vdev vdev-virtio-snd.so
loc 0x20020000
intr gic:48
stream playback
nid 0
pcmpath eight_channel_a2bp
chmap guest_fl=host_fl:guest_fr=host_fr:guest_rl=host_rl:guest_rr=host_rr:guest_fc=host_fc:guest_lfe=host_lfe:guest_sl=host_sl:guest_sr=host_sr:guest_tfl=host_tfl:guest_tfr=host_tfr:guest_trl=host_trl:guest_trr=host_trr
stream playback
nid 1
pcmpath eight_channel_a2bp
chmap guest_fl=host_rrc:guest_fr=host_flw
stream playback
nid 2
pcmpath eight_channel_a2bp
chmap guest_fl=host_frw
stream playback
nid 3
pcmpath eight_channel_a2bp
chmap guest_fl=host_flh
其中intr gic 需要一个不冲突的Interrupt编号,例如48, pcmpath就是与前面deva定义匹配的名字
Guest端4声道匹配到stereo_speakerp的参考如下:
vdev vdev-virtio-snd.so
loc 0x20020000
intr gic:48
stream playback
nid 0
pcmpath stereo_speakerp
chmap guest_fl=host_fl:guest_fr=host_fr:guest_rl=host_fl:guest_rr=host_fr
由于host只有2声道,chmap会有重复
3.3 添加sepol权限
diff --git a/apps/qnx_ap/target/filesets/secpol/gvm_la.txt b/apps/qnx_ap/target/filesets/secpol/gvm_la.txt
index b262f6f8..0a46a99d 100755
--- a/apps/qnx_ap/target/filesets/secpol/gvm_la.txt
+++ b/apps/qnx_ap/target/filesets/secpol/gvm_la.txt
@@ -291,6 +291,7 @@ allow gvm_la_t self:ability {
interrupt:157 # ufs2 pass-through
#endif
+ interrupt:48 # heyang add for virtio-snd
};
@@ -306,10 +307,18 @@ allow gvm_la_t self:ability {
channel_connect:pps_t
channel_connect:ssr_service_t
channel_connect:qcpe_qhee_t
+ channel_connect:io_audio_t # heyang add for virtio-snd
channel_connect:vm_ssr_be_t
channel_connect:vmm_service_t
};
+# heyang add for virtio-snd
+allow gvm_la_t self:ability {
+ nonroot
+ channel_connect:io_audio_t
+};
+
+
diff --git a/apps/qnx_ap/target/filesets/secpol/io_audio.txt b/apps/qnx_ap/target/filesets/secpol/io_audio.txt
index 44040c8b..7773487d 100755
--- a/apps/qnx_ap/target/filesets/secpol/io_audio.txt
+++ b/apps/qnx_ap/target/filesets/secpol/io_audio.txt
@@ -50,7 +50,8 @@ allow io_audio_t__run self:ability {
nonroot
pathspace
rsrcdbmgr
- xprocess_query:0
+ xprocess_query:0
+ xprocess_query:206 # heyang add for virtio-snd
};
allow io_audio_t__run {
pps_t
-
在android/kernel中添加virtio-snd驱动
导入virtio-snd驱动到Kernel5.4,参考代码:
ALSA: virtio: add virtio sound driver - kernel/git/tiwai/sound.git - Sound sub-system tree
或者直接下载下面的patch:
kernel5.4virtio-sndpatch资源-CSDN文库
-
测试
QNX测试添加的设备,测试在virtio未使能之前是否OK:
wave -a eight_channel_a2bp audio.wav
wave -a pcmPreferredp audio.wav
Android测试virtio,使用tinyplay tinymix tinypcminfo等命令检测。
适配virtio-snd的audio-hal
可以修改模拟器代码:
android/device/generic/car/emulator/audio/driver
来实现。默认实现的是stereo。
如果你想用virtio-snd默认传输12声道音频,需要深度客制化上述audio-hal。有需要的可以站内发私信。