RK3308的spdif的应用

如果有问题,请加QQ群 891339868 进行交流

最近有时间搞了一下RK3308的spdif接口,配置配置还是比较简单的,在这里记录一下

一、内核的配置:

内核中主要是配置simple-sound-card、spdif、dummy,如下图所示:

首先配置支持simple-sound-card框架和spdif

再配置虚拟声卡dummy的驱动

到这里,驱动这边就配置完成了。

二、设备树的配置:

设备树的配置稍微有点儿复杂

首先要理清一下simple-sound-card、spdif、dummy_codec这三者之间的关系,才能比较清晰的配置设备树

simple-sound-card是一个为了简化音频框架,在alsa上面的一个封装,所谓的简单声卡,我理解的意思就是让我们更简单的使用声卡;

spdif在物理接口上是一个soc上的一个port,在逻辑上是soc_dai,即是soc与codec之间soc这边的接口;

dummy_codec字面意思是虚拟声卡的意思,所谓的虚拟声卡,就是像这种soc外部没有外接codec的情况下,为了匹配声卡驱动框架,虚拟的一个设备,类似于占位符之类的东西的作用;

所以,他们三者之间的关系,从硬件角度考虑,就是simple-sound-card就是个板子,spdif就是soc上的接口,dummy_codec就是codec上的接口,在simple-sound-card这个板子上soc通过spdif这个接口于dummy_codec这个codec上的接口进行连接;从软件的角度考虑,simple-sound-card就是个较高层的封装,它的内部的soc这边的cpu_dai是spdif,codec_dai是dummy_codec;好了,废话不多说了,直接上代码:

1、我用的设备树文件是rk3308-rock-pi-s.dts,其实用哪个不重要,都差不多,首先看一下这个文件里面和spdif相关的配置:

上图中就是我们的声卡在simple-audio-card的框架下的最外层配置,下面详细说一下:

status:声卡目前的状态,目前是未**;

compatible:设备文件中的的名字,系统靠这个去匹配驱动代码中的simple-audio-card层的驱动程序;

simple-audio-card,name:声卡在系统中的名字;

simple-audio-card,cpu {

      sound-dai:soc端的dai 配置,就是rk3308的spdif接口的配置;

}

simple-audio-card,codec {

      sound-dai:codec端的dai配置,就是soc外界codec的接口的配置,这里是虚拟声卡;

}

2、下面再看一下soc端dai的配置,即是spdif_tx的配置,这个在rk3308的公共头文件中,即rk3308.dtsi中:

咱们再一项一项的理一理:

compatible:和上面一样,与驱动匹配的名称

reg:这个是和spdif_相关的寄存器,因为RK3308是64bit的处理器,所以分别用两个U32来表示,前两个是代表寄存器的地址,后两个数代表数据空间,也就是从前面的那个寄存器地址开始,有多大的势力范围归spdif_tx这个东西;

interrupts:和中断相关的中断号、有效极性等;

clocks:和时钟源相关的配置,一个是主时钟源,一个是总线时钟源;

clock-names:和上面匹配的时钟的名称,第一个是主时钟,第二个是总线时钟;

dmas:和dma相关配置;

dma-names:dma名称;

pinctrl-names:gpig复用的相关配置;

pingctrl-0:spdif_tx配置的gpio的配置;

status:使能开关;

#sound-dai-cells:

3、接下来在看一下和spdif_tx相关的gpio配置:

这个gpio配置主要是制定rk3308的gpio和gpio的配置,具体的解读如下:

0:rk3308的gpio域0;

RK_PC1:rk3308的PC1;

RK_FUNC_1:gpio的功能1;

pcfg_pull_up:上拉;

合起来的意思就是rk3308的gpio域0的pc1,使用它的功能1,默认上拉;

4、接下来看一下dummy_codec的配置:

这里主要是需要配置一下clock和clock-names,另外两项都是一样的;

clocks:dummy_codec的时钟来源;

clock-names:时钟名称;

5、最后使能spdif_sound和spdif_tx就可以了:

6、更新一下内核,在系统中就能找到spdif_tx_sound了,如下图所示:

好了,这个问题就记录到这里!