Rockchip RK3399 - HDMI音频

本文详细介绍了如何在Rockchip RK3399开发板上通过HDMI接口输出音频,涉及I2S2接口、设备树配置、内核配置和测试步骤。内容包括hdmi_sound、hdmi和i2s2设备节点的配置,以及内核的编译和烧录。测试部分涵盖查看音频设备节点、声卡配置和播放音频测试。

----------------------------------------------------------------------------------------------------------------------------

开发板 :NanoPC-T4开发板eMMC :16GBLPDDR3 :4GB显示屏 :15.6英寸HDMI接口显示屏u-boot :2023.04linux   :6.3----------------------------------------------------------------------------------------------------------------------------

在前面的章节我们已经介绍了machine驱动(simple-audio-card)、platform驱动(i2s)、以及codec驱动(Realtek ALC5651),并测试了通过耳机进行音频的输出。

如果我们想通过HDMI接口进行音频输出的话,我们应该怎么做呢?

我们知道音频驱动主要由三部分组成、machine、platform、codec,这里我们仅仅是更换了codec,将ALC5651更换为了HDMI,其他的并没有什么变化,因此我们只需要进行少量的调整就可以实现通过HDMI进行音频的输出。

一、I2S2接口

我们在Rockchip RK3399 - ALC5651 & I2S基础说过RK3399的I2S2模块,其连接到HDMI和DP的音频接口,支持8通道音频数据传输。

I2S2与HDMI连接(这些引脚没有对外暴露,所以是看不到的):

引脚引脚(I2S2) 方向 功能引脚(HDMI) 方向
I2S2_SCLK_OUT O ii2sclk I
I2S2_TX_LRCK_OUT O ii2slrclk I
I2S2_8CH_SDO[3:0] O ii2sdata[3:0] I

I2S2与DP连接(这些引脚没有对外暴露,所以是看不到的):

引脚引脚(I2S2) 方向 功能引脚(DP) 方向
I2S2_SCLK_OUT O source_i2s_clk I
I2S2_TX_LRCK_OUT O source_i2s_ws I
I2S2_8CH_SDO[3:0] O source_i2s_data[3:0] I

二、设备树配置

2.1 hdmi_sound设备节点

在arch/arm64/boot/dts/rockchip/rk3399.dtsi文件根节点下已经定义了hdmi_sound设备节点:

hdmi_sound: hdmi-sound {
        compatible = "simple-audio-card";
        simple-audio-card,format = "i2s";
        simple-audio-card,mclk-fs = <256>;
        simple-audio-card,name = "hdmi-sound";
        status = "disabled";

        simple-audio-card,cpu {
                sound-dai = <&i2s2>;
        };
        simple-audio-card,codec {
                sound-dai = <&hdmi>;
        };
};

(1) compatible:指定设备驱动程序的兼容性,即告诉内核该设备可以被哪些驱动程序所使用;

(2) simple-audio-card,format:指定数字音频接口格式为“I2S”,即使用I2S接口传输音频数据;

此外还支持的数字音频接口格式有:right_j、left_j、dsp_a、dsp_b、ac97、pdm、msb、lsb。

(3) simple-audio-card,mclk-fs:指定主时钟频率MCLK与采样频率之前的比值,例如256表示主时钟频率为系统频率的256倍;

(4) simple-audio-card,name:指定声卡的名称为“hdmi-sound”;

(5) status:指定设备状态为“禁止”,表示该设备状态为禁止运行;

(6) simple-audio-card,cpu:指定cpu接入音频编解码的dai;这里配置为&i2s2,即i2s2设备节点的句柄;

(7) simple-audio-card,codec:指定编解码音频接入cpu的dai;这里配置为&hdmi,即hdmi设备节点的句柄;

我们需要在arch/arm64/boot/dts/rockchip/rk3399-evb.dts文件添加如下属性,启用machine驱动:

&hdmi_sound{
        status = "okay";

};
2.2 hdmi设备节点
### Rockchip RK3399 simple-audio-card Machine驱动的实现与配置 在Rockchip RK3399平台上,`simple-audio-card`驱动是一种用于音频子系统的简化实现方式。它通过设备树(Device Tree)定义音频硬件的连接关系,并利用内核中的通用音频框架完成驱动功能。以下是关于`simple-audio-card`驱动在RK3399平台上的实现与配置方法。 #### 1. 设备树中的`simple-audio-card`节点配置 在RK3399的设备树文件中,`simple-audio-card`节点被用来描述音频硬件的连接关系。例如,在`rk3399-nanopi4-common.dtsi`文件中,存在一个名为`rt5651_card`的`simple-audio-card`节点[^1]: ```dts rt5651_card: rt5651-sound { status = "okay"; compatible = "simple-audio-card"; pinctrl-names = "default"; pinctrl-0 = <&hp_det>; simple-audio-card,name = "realtek,rt5651-codec"; simple-audio-card,format = "i2s"; simple-audio-card,mclk-fs = <256>; simple-audio-card,hp-det-gpio = <&gpio4 28 GPIO_ACTIVE_HIGH>; simple-audio-card,widgets = "Microphone", "Mic Jack", "Headphone", "Headphone Jack"; simple-audio-card,routing = "Mic Jack", "MICBIAS1", "IN1P", "Mic Jack", "Headphone Jack", "HPOL", "Headphone Jack", "HPOR"; simple-audio-card,cpu { sound-dai = <&i2s0>; }; simple-audio-card,codec { sound-dai = <&rt5651>; }; }; ``` 此节点定义了以下关键属性: - `compatible`:指定为`"simple-audio-card"`,表明使用的是通用音频驱动框架。 - `sound-dai`:分别指向CPU端和Codec端的音频接口。 - `mclk-fs`:设置主时钟频率与采样率的比例。 - `widgets`和`routing`:定义音频路径中的输入输出设备及其连接关系。 对于HDMI音频支持,`rk3399.dtsi`文件中还定义了一个`hdmi_sound`节点[^2]: ```dts hdmi_sound: hdmi-sound { compatible = "simple-audio-card"; simple-audio-card,format = "i2s"; simple-audio-card,mclk-fs = <256>; simple-audio-card,name = "hdmi-sound"; status = "disabled"; simple-audio-card,cpu { sound-dai = <&i2s2>; }; simple-audio-card,codec { sound-dai = <&hdmi>; }; }; ``` 此节点提供了HDMI音频的配置选项,但默认状态为`disabled`,需要根据实际需求启用。 #### 2. 内核中的`simple-audio-card`驱动实现 `simple-audio-card`驱动的核心实现在`kernel/sound/soc/generic/simple-card.c`文件中[^3]。其主要功能是解析设备树中的`simple-audio-card`节点,并动态生成音频机器驱动(Machine Driver)。以下是其实现的关键点: - **设备匹配**:通过`of_device_id`结构体匹配`compatible`属性为`"simple-audio-card"`的设备节点。 - **音频路径配置**:根据设备树中的`widgets`和`routing`属性,自动构建音频输入输出路径。 - **DAI链路初始化**:将设备树中的`cpu`和`codec`节点映射为具体的DAI链路,并完成初始化。 #### 3. 配置步骤 为了在RK3399平台上启用`simple-audio-card`驱动,需执行以下步骤: 1. **修改设备树**:确保设备树中包含正确的`simple-audio-card`节点,并根据硬件连接调整相关属性。 2. **编译内核**:确认内核配置中启用了`CONFIG_SND_SOC_SIMPLE_CARD`选项。 3. **测试音频功能**:通过播放音频文件或使用工具(如`aplay`)验证音频输出是否正常。 #### 示例代码 以下是一个简单的音频播放测试命令: ```bash aplay -D plughw:0,0 test.wav ``` 此命令将音频文件`test.wav`通过默认音频设备播放。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Graceful_scenery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值