首页 > 其他分享 >Rockchip RK3399 - HDMI音频

Rockchip RK3399 - HDMI音频

时间:2023-08-06 16:47:15浏览次数:45  
标签:HDMI hdmi Rockchip I2S2 RK3399 rk3399 CONFIG card

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

开发板 :NanoPC-T4开发板
eMMC :16GB
LPDDR3 :4GB
显示屏 :15.6英寸HDMI接口显示屏
u-boot :2023.04
linux   :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设备节点

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

hdmi: hdmi@ff940000 {
        compatible = "rockchip,rk3399-dw-hdmi";
        reg = <0x0 0xff940000 0x0 0x20000>;
        interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH 0>;
        clocks = <&cru PCLK_HDMI_CTRL>,
                 <&cru SCLK_HDMI_SFR>,
                 <&cru SCLK_HDMI_CEC>,
                 <&cru PCLK_VIO_GRF>,
                 <&cru PLL_VPLL>;
        clock-names = "iahb", "isfr", "cec", "grf", "ref";
        power-domains = <&power RK3399_PD_HDCP>;
        reg-io-width = <4>;
        rockchip,grf = <&grf>;
        #sound-dai-cells = <0>;
        status = "disabled";

        ports {
                hdmi_in: port {
                        #address-cells = <1>;
                        #size-cells = <0>;

                        hdmi_in_vopb: endpoint@0 {
                                reg = <0>;
                                remote-endpoint = <&vopb_out_hdmi>;
                        };
                        hdmi_in_vopl: endpoint@1 {
                                reg = <1>;
                                remote-endpoint = <&vopl_out_hdmi>;
                        };
                };
        };
};

关于HDMI设备节点各个属性等我们后面单独介绍。

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

&hdmi {
        ddc-i2c-bus = <&i2c7>;
        pinctrl-names = "default";
        pinctrl-0 = <&hdmi_cec>;
        status = "okay";
};

2.3 i2s2设备节点

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

i2s2: i2s@ff8a0000 {
        compatible = "rockchip,rk3399-i2s", "rockchip,rk3066-i2s";
        reg = <0x0 0xff8a0000 0x0 0x1000>;
        interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH 0>;
        dmas = <&dmac_bus 4>, <&dmac_bus 5>;
        dma-names = "tx", "rx";
        clock-names = "i2s_clk", "i2s_hclk";
        clocks = <&cru SCLK_I2S2_8CH>, <&cru HCLK_I2S2_8CH>;
        power-domains = <&power RK3399_PD_SDIOAUDIO>;
        #sound-dai-cells = <0>;
        status = "disabled";
};

这是Rockchip RK3399中I2S2设备节点描述。它包括以下属性:

  • compatible:指定设备驱动程序的兼容性,即告诉内核该设备可以被哪些驱动程序所使用;
  • reg:指定I2S0控制器的基地址和地址空间大小,从0xff8a0000到0xff8a1000共有0x1000个字节的寄存器空间,其中0xff8a0000为I2S2寄存器基地址;
  • interrupts:指定I2S控制器的中断号为GIC_SPI 41,并且取值方式为IRQ_TYPE_LEVEL_HIGH,意味着中断信号为高电平触发;
  • dmas:指定数据传输时使用的DMA控制器,第一个表示tx数据使用的DMA控制器,第二个表示rx数据使用的DMA控制器;
  • dma-names:分别对应"tx"和"rx"的DMA名称;
  • clock-names:指定时钟名称,"i2s_clk"表示I2S0控制器时钟,"i2s_hclk" 表示I2S总线时钟;
  • clocks:i2s_clk时钟来自SCLK_I2S2_8CH,i2s_hclk时钟来自HCLK_I2S2_8CH;
  • power-domains:指定设备隶属于的电源域,这里是 RK3399_PD_SDIOAUDIO;
  • #sound-dai-cells:表示定义这个节点的sound DAI数据单元格的数量,这里为0表示没有单元格;
  • status:表示设备状态,这里 "disabled" 表示该设备当前是禁用状态;

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

&i2s2 {
        status = "okay";
};

三、内核配置 

3.1 内核配置

3.1.1 HDMI配置

在linux内核根目录下执行make menuconfig配置以下选项:

Device Drivers  --->                                                                                                       
    Graphics support --->      
        [*] Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)  ---> 
        [*] DRM Support for Rockchip  
        Display Interface Bridges --->                                                                                                     
            [*] Synopsys Designware I2S Audio interface    # 对应DRM_DW_HDMI_I2S_AUDIO
          

确保编译配置里有HDMI相关配置,如果缺少了自己补上:

CONFIG_DRM=y                   #必须
CONFIG_DRM_ROCKCHIP=y          #必须
CONFIG_ROCKCHIP_DW_HDMI=y      #必须
CONFIG_ROCKCHIP_INNO_HDMI=y
CONFIG_DRM_PANEL_SIMPLE=y      #必须
CONFIG_DRM_DW_HDMI_I2S_AUDIO=y #必须
CONFIG_DRM_DW_HDMI_CEC=y
3.1.2 其他

关于I2S、以及simple-audio-card驱动的配置,我们在Rockchip RK3399 - ALC5651音频调试起始已经介绍过了:

Device Drivers --->
  <*> Sound card support  --->
     <*> Advanced Linux Sound Architecture  --->          
<*> Sequencer support <*> ALSA for SoC audio support ---> <*> ASoC support for Rockchip {*} Rockchip I2S Device Driver <*> ASoC Simple sound card support

确保编译配置里有如下相关配置,如果缺少了自己补上:

CONFIG_SND_SEQUENCER=y
CONFIG_SND_SEQ_DUMMY=y
CONFIG_SND_HRTIMER=y
CONFIG_SND_DYNAMIC_MINORS=y
CONFIG_SND_SOC=y
CONFIG_SND_SOC_ROCKCHIP=y
CONFIG_SND_SOC_ROCKCHIP_I2S=y
CONFIG_SND_SIMPLE_CARD=y

配置完内核之后记得保存配置,存档:

root@zhengyang:/work/sambashare/rk3399/linux-6.3# mv rk3399_defconfig ./arch/arm64/configs/

重新配置内核:

root@zhengyang:/work/sambashare/rk3399/linux-6.3# make rk3399_defconfig

3.2 编译内核

在linux内核根目录下执行如下命令进行编译内核:

root@zhengyang:/work/sambashare/rk3399/linux-6.3# make -j8

u-boot-2023.04路径下的mkimage工具拷贝过来,然后在命令行使用mkimage工具编译即可:

root@zhengyang:/work/sambashare/rk3399/linux-6.3# cp ../u-boot-2023.04/tools/mkimage ./
root@zhengyang:/work/sambashare/rk3399/linux-6.3# ./mkimage -f kernel.its kernel.itb

3.3 通过tftp烧录内核

给开发板上电,同时连接上网线,进入uboot命令行。我们将内核拷贝到tftp文件目录:

root@zhengyang:/work/sambashare/rk3399/linux-6.3# cp kernel.itb /work/tftpboot/

接着给开发板上电。通过uboot命令行将kernel.itb下到内存地址0x10000000处:

=> tftp 0x10000000 kernel.itb

通过mmc write命令将内核镜像烧录到eMMC第0x8000个扇区处:

=> mmc erase 0x8000 0xA000
=> mmc write 0x10000000 0x8000 0xA000

 

 

 

标签:HDMI,hdmi,Rockchip,I2S2,RK3399,rk3399,CONFIG,card
From: https://www.cnblogs.com/zyly/p/17609535.html

相关文章

  • 熊猫B7PRO主板3865U3965U输出HDMI音频及视频解码能力
    之前有人咨询过,最近又有一些人咨询,经常发嘛太麻烦,找了个以前截的图。如图采用的USBHDMI采集卡,名称为HDMITOUSB,如果是普通显示器或者电视机,会显示正常的显示器名称之类的。有一些人连接了之后,并没有这个设备,就是因为没有BIOS启用功能。BIOS的设置https://blog.51cto.com/infrado/......
  • msm8909_MIPI转HDMI调试记录
    项目中需要把开发板的MIPI输出信号转换为HDMI和LVDS输出,使用龙迅的LT8912B进行转换。龙迅的FAE提供的资料相对来说还是比较少的。先简单的看一下吧:厂商资料寄存器配置该文件提供了对LT8912B初始化的寄存器配置。对于我们来说需要做的就是,写一个驱动,在开机的时候调用相关的函数,......
  • CS5801国产HDMI转DP/edp(4k60)转换器方案芯片 可替代LT6711
    CS5801是HDMI2.0b到DP1.4a转换器方案IC。CS5801有一个HDMI2.0b.输入,带宽高达18Gbps.它支持辨别率是4k@60Hz。对于DP1.4输出,由4条数据通道组成,支持1.62Gbps、2.7Gbps、5.4Gbps链路速率。内置可选SSC功能可降低EMI影响。嵌入式MCU基于32位RISC-V内核,带有内部串行闪存。CS5801参数......
  • HDMI图像传输(等宽十色彩条)
    第41章、HDMI(等宽十色彩条)41.1DVI(数字视频接口)VGA接口之后,首先推出的的是DVI接口(数字视频接口),DVI是基于TMDS(TransitionMinimizedDifferentialSignaling,最小化传输差分信号)技术来传输数字信号。TMDS运用先进的编码算法把8bit数据(R、G、B中的每路基色信号)通过......
  • Rockchip RK3399 - ALC5651音频调试
    ----------------------------------------------------------------------------------------------------------------------------开发板:NanoPC-T4开发板eMMC:16GBLPDDR3:4GB显示屏:15.6英寸HDMI接口显示屏u-boot:2023.04linux:6.3-----------------------......
  • CS5213 国产HDMI转VGA带音频方案芯片|CS5213规格书|CS5213原理图
    集睿致远/ASL推出的CS5213芯片是一个国产HDMI(高清多媒体接口)到VGA桥接芯片。它将HDMI信号转换为标准VGA信号它可以在适配器、智能电缆等设备中设计CS5213特征将HDMI信号转换为VGA输出支持数字信号到模似信号的转换支持HDCP1.0/1.1/1.2操作简单,无需设置支持热插拔.HDMI视频输入格......
  • Rockchip RK3399 - Machine驱动(simple-card)
     ----------------------------------------------------------------------------------------------------------------------------开发板:NanoPC-T4开发板eMMC:16GBLPDDR3:4GB显示屏:15.6英寸HDMI接口显示屏u-boot:2023.04linux  :6.3------------------------......
  • Rockchip RK3399 - Codec驱动( Realtek ALC5651)
    ----------------------------------------------------------------------------------------------------------------------------开发板:NanoPC-T4开发板eMMC:16GBLPDDR3:4GB显示屏:15.6英寸HDMI接口显示屏u-boot:2023.04linux :6.3----------------------------......
  • Rockchip RK3399 - Platform驱动(DMA&i2s0)
    Platfromdriver提供了配置/使能SoC音频接口的能力;Plaftrom驱动分为两个部分:snd_soc_platform_driver、snd_soc_dai_driver。snd_soc_platform_driver:负责管理音频数据,把音频数据通过DMA或其他操作传送至CPUDAI中;snd_soc_dai_driver:负责完成SoC一侧的DAI参数配置,同时也会通过......
  • 替代LT8611芯片设计|CS5218设计方案|DP++转HDMI4K30HZ转换芯片方案
    ASL北京集睿致远研发CS5218DP转HDMI4K30HZ转换芯片,支持高达3840x2160@30Hz或者4096x2160@30Hz,主要用于设计TYEPC拓展坞和DP转接线的开发与应用。CS5218芯片设计电路:CS5218替代LT8611芯片包括2路双模DP电缆适配器寄存器,可用于识别电缆适配器的功能。可以更好地满足更高数......