高通8295平台合入virtio-snd方法,primay audio hal客制化

 

  • 概述

使能virtio-snd的方法参考QNX官网步骤:

https://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.qavf.overview/topic/audio_components.html

需要代码包括: 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 配置

这个步骤具体方法参考:https://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.qavf.overview/topic/vdev_virtio-snd.html

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。有需要的可以站内发私信。

 

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值