版权声明:本文为博主原创文章,转载请注明出处:https://blog.csdn.net/huang_165/article/details/85340002
这是“rk3399调试alc5651”的第二篇,这篇以源码分析simple-card framework机制。
在《rk3399调试alc5651之操作方法》讲述了如何移植alc5651,现在我们分析从源码simple-card framework框架。
本篇博文不展示asoc调用过程(因为笔记内容有点多),如想获取其asoc调用过程请从这里下载本人的笔记。
环境:
硬件:realtek alc5651
内核:Linux4.4
分析一个复杂的子系统代码需要找到入口,明确自己想要的东西。
先抓住主要的函数调用流,理清思路。为日后深入分析打下基础。现在有了设备树之后,我们可以从设备树上开始我们的研究。
参考文档:
Documentation/devicetree/bindings/sound/rockchip-rt5645.txt
Documentation/devicetree/bindings/sound/rockchip-i2s.txt
rt5651-sound { //machine 匹配层的驱动节点。
status = "okay"; //默认打开
compatible = "simple-audio-card"; //simple-card framework框架
simple-audio-card,format = "i2s";
simple-audio-card,name = "realtek,rt5651-codec";
simple-audio-card,mclk-fs = <256>; //主控供给编解码芯片用的时钟
simple-audio-card,widgets = //指定相关组件
"Microphone", "Mic Jack", //mic
"Headphone", "Headphone Jack"; //耳机
simple-audio-card,routing = //音频路径,如mic输入、耳机输出走那些通路。
"Mic Jack", "MICBIAS1",
"IN1P", "Mic Jack",
"Headphone Jack", "HPOL",
"Headphone Jack", "HPOR";
simple-audio-card,cpu {
sound-dai = <&i2s0>; //指定cpu接入音频编解码的dai(数字化接口)
};
simple-audio-card,codec {
sound-dai = <&rt5651>; //指定编解码音频接入cpu的dai(数字化接口)
};
};
rt5651: rt5651@1a {
#sound-dai-cells = <0>;
compatible = "rockchip,rt5651";
reg = <0x1a>; //控制音频芯片i2c通道的设备地址
clocks = <&cru SCLK_I2S_8CH_OUT>;
clock-names = "mclk";
pinctrl-names = "default";
pinctrl-0 = <&i2s_8ch_mclk>;
spk-con-gpio = <&gpio0 11 GPIO_ACTIVE_HIGH>;
hp-det-gpio = <&gpio4 28 GPIO_ACTIVE_LOW>;
};
i2s0: i2s@ff880000 {
compatible = "rockchip,rk3399-i2s", "rockchip,rk3066-i2s";
reg = <0x0 0xff880000 0x0 0x1000>;
rockchip,grf = <&grf>;
interrupts = <0 39 4 0>;
dmas = <&dmac_bus 0>, <&dmac_bus 1>;
dma-names = "tx", "rx";
clock-names = "i2s_clk", "i2s_hclk";
clocks = <&cru 86>, <&cru 468>;
pinctrl-names = "default";
pinctrl-0 = <&i2s0_8ch_bus>;
power-domains = <&power 28>;
status = "disabled";
};
我们看一下simple-card 和asoc结合的框架
我们直接分析sound/soc/generic/simple-card.c
可以看得出,simple-card framework框架在machine driver上封装了薄薄的一层。
它起到一个收集信息、将信息组织起来并注册到asoc系统的作用,统一管理声卡设备的加入、退出。
结论:
当 simple-card framework成功调用devm_snd_soc_register_card后
就向asoc系统提交一个machine driver,这样就回到传统的asoc(machine platform codec 关系分析了)。
想验证结论,获取本人的笔记。