RK3399三屏显示及声音调试
这个文档主要讲述怎么调试三屏显示及三个声卡配置及调试过程
声卡调试
最近在调试RK3399平板,调试到HDMI和cdn_dp过程中出现一些问题,我的目标是三屏分别是HDMI、edp、cdn_dp,分别对的声卡为HDMI_sound,rt5640_codec,rockchip-cdndp-sound,三屏同显,声音自动切换输出。
在调试过程中,cdn_dp的声音一直无法输出,发现参考官方提供的
/{
hdmi_dp_sound: hdmi-dp-sound {
status = “disabled”;
compatible = “rockchip,rk3399-hdmi-dp”;
rockchip,cpu = <&i2s2>;
rockchip,codec = <&hdmi>, <&cdn_dp>;
};
};
&hdmi_dp_sound{
status = “okay”;
};
这样设置只能出现一个声卡就是rt5640,其他的声卡都无法注册成功。
经过rockchip工程师指导,将kernel-4.19\sound\soc\rockchip\rockchip_cdndp.c和kernel-4.19\sound\soc\rockchip\rockchip_hdmi_dp.c加入编译,并修改设备树为
/{
dp_sound: dp-sound {
status = “disabled”;
compatible = “rockchip,cdndp-sound”;
rockchip,cpu = <&spdif>;
rockchip,codec = <&cdn_dp 1>;
};
};
&cdn_dp {
status = “okay”;
extcon = <&fusb0>;
phys = <&tcphy0_dp>;
};
&dp_sound {
status = “okay”;
};
&spdif{
status = “okay”;
};
这个时候发现dp_sound 还是注册不上,最后通过查看代码发现是rockchip_cdndp.c中固定了.codec_dai_name = “spdif-hifi”,
static struct snd_soc_dai_link cdndp_dailink = {
.name = “DP”,
.stream_name = “DP PCM”,
.codec_dai_name = “spdif-hifi”,
.ops = &rockchip_sound_cdndp_ops,
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBS_CFS,
};
从而将设备树修改下,最终可以注册成功,使用tinyplay播放音频正常。
/{
dp_sound: dp-sound {
status = “disabled”;
compatible = “rockchip,cdndp-sound”;
rockchip,cpu = <&spdif>;
rockchip,codec = <&cdn_dp>;
};
};
至此声卡调试OK
同显调试
最后在测试的过程中发现把HDMI和扩展坞的HDMI都插上之后,扩展坞插着的HDMI显示器,显示的图像颜色不对,偏粉。
查看HDMI的显示模式,得到的是YUV444,由于cdn_dp和HDMI是在一个VOP上,从而导致扩展坞上的HDMI显示不正确。通过帖子https://blog.youkuaiyun.com/qq_37858386/article/details/114267928中的修改方法修改。最终得到正确的颜色
至此三屏同显调试完成。
最终的设备树及修改的详情
/{
dp_sound: dp-sound {
status = “disabled”;
compatible = “rockchip,cdndp-sound”;
rockchip,cpu = <&spdif>;
rockchip,codec = <&cdn_dp>;
};
hdmi_sound: hdmi-sound {
status = “okay”;
compatible = “simple-audio-card”;
simple-audio-card,format = “i2s”;
simple-audio-card,mclk-fs = <256>;
simple-audio-card,name = “rockchip,hdmi”;
simple-audio-card,cpu {
sound-dai = <&i2s2>;
};
simple-audio-card,codec {
sound-dai = <&hdmi>;
};
};
rt5640-sound {
compatible = "simple-audio-card";
simple-audio-card,format = "i2s";
simple-audio-card,name = "rockchip,rt5640-codec";
simple-audio-card,mclk-fs = <256>;
simple-audio-card,widgets =
"Microphone", "Mic Jack",
"Line", "Mic Headset",
"Headphone", "Headphone Jack";
simple-audio-card,routing =
"Mic Jack", "MICBIAS1",
"IN2P", "Mic Jack",
"DMIC1", "Mic Headset",
"DMIC2", "Mic Headset",
"Headphone Jack", "HPOL",
"Headphone Jack", "HPOR";
simple-audio-card,cpu {
sound-dai = <&i2s0>;
};
simple-audio-card,codec {
sound-dai = <&rt5640>;
};
};
panel {
compatible = "simple-panel";
backlight = <&backlight>;
status = "okay";
//power-supply = <&vcc3v3_lcd_edp>;
enable-gpios = <&gpio3 RK_PA3 GPIO_ACTIVE_HIGH>;
bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;
bpc = <8>;
prepare-delay-ms = <210>;
enable-delay-ms = <210>;
display-timings {
native-mode = <&timing0>;
timing0: timing0 {
clock-frequency = <148500000>; //1080P50Hz 117800000
hactive = <1920>;
vactive = <1080>;
hfront-porch = <192>;
hsync-len = <44>;
hback-porch = <44>;
vfront-porch = <36>;
vsync-len = <5>;
vback-porch = <4>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};
ports {
panel_in: endpoint {
remote-endpoint = <&edp_out>;
};
};
};
};
&pwm3{
pinctrl-0 = <&pwm3a_pin>;
status = “okay”;
};
//EDP、HDMI、DP
&cdn_dp {
status = “okay”;
extcon = <&fusb0>;
phys = <&tcphy0_dp>;
};
&dp_sound {
status = “okay”;
};
&spdif{
status = “okay”;
};
&hdmi_sound{
status = “okay”;
};
&display_subsystem {
status = “okay”;
};
&vopb {
status = “okay”;
assigned-clocks = <&cru DCLK_VOP0_DIV>;
assigned-clock-parents = <&cru PLL_VPLL>;
};
&vopl {
status = “okay”;
assigned-clocks = <&cru DCLK_VOP1_DIV>;
assigned-clock-parents = <&cru PLL_CPLL>;
};
&vopb_mmu {
status = “okay”;
};
&vopl_mmu {
status = “okay”;
};
&edp {
status = “okay”;
force-hpd;
//enable-delay-ms = <200>;
ports {
port@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
edp_out: endpoint {
remote-endpoint = <&panel_in>;
};
};
};
};
&edp_in_vopb {
status = “disabled”;
};
&edp_in_vopl {
status = “okay”;
};
&route_edp{
status = “okay”;
logo,uboot = “logo.bmp”; // 指定U-Boot logo显示的图片
logo,kernel = “logo_kernel.bmp”; // 指定kernel logo显示的图片
logo,mode = “center”; // center:居中显示,fullscreen:全屏显示
charge_logo,mode = “center”; // center:居中显示,fullscreen:全屏显示
connect = <&vopl_out_edp>;
};
&hdmi {
pinctrl-names = “default”;
pinctrl-0 = <&hdmi_i2c_xfer>, <&hdmi_cec>;
// #address-cells = <1>;
// #size-cells = <0>;
#sound-dai-cells = <0>;
// rockchip,defaultmode = <4>;
status = “okay”;
};
&hdmi_in_vopl {
status = “disabled”;
};
&hdmi_in_vopb {
status = “okay”;
};
&hdmi {
status = “okay”;
};
&dp_in_vopb {
status = “okay”;
};
&dp_in_vopl {
status = “disabled”;
};
&i2s2 {
#sound-dai-cells = <0>;
status = “okay”;
};
&tcphy0 {
extcon = <&fusb0>;
status = “okay”;
};
&u2phy0 {
status = “okay”;
extcon = <&fusb0>;
u2phy0_otg: otg-port {
status = "okay";
};
u2phy0_host: host-port {
phy-supply = <&vcc5v0_host>;
status = "okay";
};
};
&usbdrd3_0 {
status = “okay”;
};
&usbdrd_dwc3_0 {
status = “okay”;
extcon = <&fusb0>;
};
引用:
[1]: https://blog.youkuaiyun.com/qq_37858386/article/details/114267928