[Linux Audio Driver] SM6350平台音频bring up ( 一 )

news/2024/12/22 19:54:53/

0. 背景

这个是高通5G平台,音频的内容改的比较多,比较直接的是platform.c就直接移动到vendor了;目前
高通那边的趋势还是把音频逐渐从kernel剥离,android 7/android 8的时候,machine driver,codec driver都在kernel;android 9、android 10之后machine driver,codec driver都移动到了vendor;

到这个5G平台的时候,platform.c以及XML都移到vendor里面去了。 最近准备写几篇从零开始bring up
音频的文档,但是更新不会很快。(最近比较没时间)这一篇主要是讲的是:
确定音频走的设备树。

#更新2021.07.13
这里更新下,我后来发现更新的android11的基线,machine driver又被移到 kernel了。。。
#更新2021.07.13

1. 检索machine

先抓一份开机log,原则上音频的调试开始,需要保证modem没有问题,adsp正确加载,然后kernel
可以跑起来,android 进不去其实没关系。因为可以用tinyalsa验证功能。

App Log Flush : 23 ms
Exit EBS        [13291] UEFI End
[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x51df805e]
[    0.000000] Linux version 4.19.81 (Data.BU@Meig.China) 
(clang version 8.0.12 for Android NDK) #1 SMP PREEMPT Sat Aug 29 01:49:13 CST 2020
[    0.000000] Machine model: Qualcomm Technologies, Inc. Lagoon MTP
[    0.000000] earlycon: msm_geni_serial0 at MMIO 0x000000000098c000 (options '')
[    0.000000] bootconsole [msm_geni_serial0] enabled
[    0.000000] efi: Getting EFI parameters from FDT:

检索machine之后,我们可以得到重要信息:Machine model: Qualcomm Technologies, Inc. Lagoon MTP,然后检索这个log。(为啥上来确定这个log在vendor里面检索呢,一是可以直接搜所有代码,
二是从高通提供的大量文档,可以了解到设备树在vendor,音频核心的一些API其实还是在kernel)

grep -nr "Qualcomm Technologies, Inc. Lagoon MTP" ./vendor/qcom/proprietary/devicetree-4.19

在这里插入图片描述

返回的log如下,但是我们期望的dts肯定不是:lagoon-mtp-usbc.dts和lagoon-mtp-usbc-overlay.dts,原因是我们开机检索machine是不带usbc后缀的;

#更新2020.12.01
<
这个打印的调用关系如下:
./kernel/msm-4.19/drivers/of/fdt.c

const void * __init of_flat_dt_match_machine(const void *default_match,const void * (*get_next_compat)(const char * const**)){const void *data = NULL;const void *best_data = default_match;const char *const *compat;unsigned long dt_root;unsigned int best_score = ~1, score = 0;dt_root = of_get_flat_dt_root();while ((data = get_next_compat(&compat))) {score = of_flat_dt_match(dt_root, compat);if (score > 0 && score < best_score) {best_data = data;best_score = score;}}if (!best_data) {const char *prop;int size;pr_err("\n unrecognized device tree list:\n[ ");prop = of_get_flat_dt_prop(dt_root, "compatible", &size);if (prop) {while (size > 0) {printk("'%s' ", prop);size -= strlen(prop) + 1;prop += strlen(prop) + 1;}}printk("]\n\n");return NULL;}pr_info("Machine model: %s\n", of_flat_dt_get_machine_name());return best_data;}

然后调用:of_flat_dt_get_machine_name函数,

 const char * __init of_flat_dt_get_machine_name(void){const char *name;unsigned long dt_root = of_get_flat_dt_root();name = of_get_flat_dt_prop(dt_root, "model", NULL);if (!name)name = of_get_flat_dt_prop(dt_root, "compatible", NULL);return name;}

of_get_flat_dt_prop函数会获取到dts里面定义的model后面的字符串,然后把它打印出来。

#更新2020.12.01

2. 查看makefile

还剩下两个dts不晓得用哪个,我们进入这些dts下面的makefile看下;

vim ./vendor/qcom/proprietary/devicetree-4.19/qcom/Makefile

很明显,我们只需要看lagoon前缀的,

在这里插入图片描述

makefile里面有个宏,我们需要查下:

grep -nr "CONFIG_BUILD_ARM64_DT_OVERLAY" ./

看到这个kernel以及qssi,qssi直接拉高通代码编译,会在out目录有这个文件夹,具体干嘛的俺还不知道,但是可以明确这个CONFIG_BUILD_ARM64_DT_OVERLAY被设置成了y。
在这里插入图片描述

从编译生成的dtb可以看出,这里采用lagoon.dtb以及lagoon加两个后缀的dtb,排除加一个后缀的dtb,
所以lagoon-mtp.dts被排除了,最终确定音频走的就是:lagoon-mtp-overlay.dts

#更新2020.12.01

由于CONFIG_BUILD_ARM64_DT_OVERLAY宏已经被定义,所以根据lagoon-mtp-overlay.dtbo-base := lagoon.dtb, 此处还可以确定lagoon.dts也会走,注意一般一套设备树会走两个dts。

#更新2020.12.01

3. 进一步确定

vim ./vendor/qcom/proprietary/devicetree-4.19/qcom/lagoon-mtp-overlay.dts
#include <dt-bindings/interrupt-controller/arm-gic.h>#include "lagoon-mtp.dtsi"/ {model = "Qualcomm Technologies, Inc. Lagoon MTP";compatible = "qcom,lagoon-mtp", "qcom,lagoon", "qcom,mtp";qcom,msm-id = <434 0x10000>, <459 0x10000>;qcom,board-id = <8 0>;};

vim进去看一下,发现了msm-id以及board-id。 再看下它包含的lagoon-mtp.dtsi,这里注意lagoon-mtp.dts被排除了,不代表 lagoon-mtp.dtsi也被排除了。 然后我们看看lagoon-mtp.dtsi,

在这里插入图片描述
这里从名字可以看到,音频还走lagoon-audio-overlay.dtsi,我们进去看看这个设备树的话,可以找到
大量的设备时钟、供电gpio,codec匹配的名字配置等等。一般来说都是平台相关的,尽量别乱改这个时钟,还有map的东西;常改的就是把不用的disabled,要用的加上status = “ok”,虽然默认不disabled的话,一般也是ok的,但是我还是习惯加上。

在这里插入图片描述

其他建议的地方就是注意,设备树复用,一些重要的修改,还是要多grep 一下,重复的删除,让代码简洁干净。(这个一般要参考高通文档)。

当前确定这三个肯定是走的:lagoon-mtp-overlay.dts、lagoon-mtp.dtsi、lagoon-audio-overlay.dtsi。这就是我们要找的音频设备树。当然也有其他的,就看他们还包含了哪些了。

4. 补充说明

这里需要补充说明下msm-id和board-id,msm-id是高通CPU里面的信息,不可修改(必须完全匹配); board-id是从modem传过来的(遵从最佳匹配原则,而不是完全匹配)。

我们回到lagoon-mtp-overlay.dts,

vim ./vendor/qcom/proprietary/devicetree-4.19/qcom/lagoon-mtp-overlay.dts

在这里插入图片描述

回到modem,检索BP侧代码:

sm6350/bitra-la-1-0_amss_standard_oem$ find BOOT.XF.3.3/boot_images/ -name boot_cdt_array.c
BOOT.XF.3.3/boot_images/QcomPkg/SocPkg/Library/XBLLoaderLib/boot_cdt_array.c

在这里插入图片描述
(msm-id 图)

回到qcom,board-id = <8 0>; 这个是10进制的,换成16进制,应为<0x08 0x00>,0x00与modem那边的board id设置其实根本没有关系,它只匹配了0x08,但是依然能匹配上,这就是所谓的有限匹配的意思。

#更新2020.10.12
最后这里描述错误,上图中我们圈了四个16进制数字。

在这里插入图片描述
设备树里面的qcom,board-id = <8 0>; 8对应0x08,匹配了hardware id, 0对应0x00,匹配了sub id。
#更新2020.10.12

5. 作者注

/******
@article{Linux Audio Driver,
Author = { 1byte ≠ 8bit},
Year = { 2020},
}
******/

http://www.ppmy.cn/news/172585.html

相关文章

华为USG6350防洪墙SNMP最简单功能配置

https://www.cnblogs.com/vincent-liang/p/7785089.html

spring cloud搭建(service)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Markdown 语法的使用

1.标题的使用 #加空格 代表一级标题 &#xff0c;##加空格代表二级标题&#xff0c;一次类推&#xff0c;最多支持六级标题。 2.文本居中 <center>这是要居中的文本内容</center> 3.插入图片 方式简单粗暴 直接截图粘贴。 4.超链接 第一种&#xff1a;百度一…

“超低能,劲搞笑”笑话管理系统 v2.0

导读&#xff1a; 1、常规管理 网站管理、公告管理、发布公告、留言管理、模板管理、评论管理 2、FSO生成管理 生成首页、生成栏目、生成内容页 3、文章管理 发表文章、文章管理、栏目管理 默认后台地址:admin/login.asp 用户名admin 密码admin 上传后需要重新生成所…

英语字母的搞笑故事

我们看习惯了汉语的笔画,刚接触英语字母时会觉得抵触,不容易接受.仿佛字母仅仅是一个枯燥无趣的符号.如果我们把每一个英语字母都与一些有趣的事联起来,看着英语时就更有感觉点啊.当然至于什么是有趣的事,这个就较难说,要看每个人的经验,爱好. 英语字母为什么26个 假如你设计…

新东方老师上课讲的笑话

[ 张洪伟] 起名字的问题&#xff1a;中西方都不愿意以鲜花、野草起名字&#xff0c;什么牡丹玫瑰&#xff0c;小红小翠了&#xff0c;一听就变味了&#xff1b;张建、李建&#xff0c;但不能叫范建&#xff08;贱&#xff09;了&#xff1b;北京以前有个建&#xff08;贱&#…

没知识真可怕——应用密码学的笑话之MD5+Salt不安全

看到一篇很有意思的文章&#xff0c;故转载之。 原博地址&#xff1a;http://blog.sina.com.cn/s/blog_77e8d1350100wfc7.html 这段时间诸多爆库的新闻&#xff0c;里面有许多饶有趣味的事情。那些用简单密码&#xff0c;或者一个密码走天下的笑话就不说了&#xff0c;咱说点有…

有点搞笑之序列化存储中的坑

要做一个文件存储的功能&#xff0c;将原来一个对象存储到文件中&#xff0c;然后在用的时候读出来。 为什么要文件存储&#xff1f; 不要问我为什么非要用文件巴拉巴拉&#xff0c;正好赶在这了。 不能放内存里啊&#xff0c;因为这个对象大的时候&#xff0c;算了一下&…