联系管理员

开通文章发布权限

扫码 添加微信
微信图片
电话: QQ:1602036736

android13 kernel5.10 RK3566 音频调试记录

耳机、喇叭、HDMI音频输出。

硬件

图片#B #S #R #60% #auto
图片#B #S #R #60% #auto
图片#B #S #R #60% #auto

硬件存在一个问题:RK809的喇叭输出接口本身就有1W功放输出了,这里又接一个NS4110B功放,导致播放声音时会有底噪

frameworks_base.patch

具体路径:SDK根目录/frameworks/base/services/core/java/com/android/server/WiredAccessoryManager.java
diff --git a/services/core/java/com/android/server/WiredAccessoryManager.java b/services/core/java/com/android/server/WiredAccessoryManager.java
index 6162ad36009c..736829522c28 100644
--- a/services/core/java/com/android/server/WiredAccessoryManager.java
+++ b/services/core/java/com/android/server/WiredAccessoryManager.java
@@ -552,21 +552,21 @@ final class WiredAccessoryManager implements WiredAccessoryCallbacks {
             int[] maskAndState = {0, 0};
             // extcon event state changes from kernel4.9
             // new state will be like STATE=MICROPHONE=1\nHEADPHONE=0
-            if (extconInfo.hasCableType(ExtconInfo.EXTCON_HEADPHONE)) {
+            // if (extconInfo.hasCableType(ExtconInfo.EXTCON_HEADPHONE)) {
                 updateBit(maskAndState, BIT_HEADSET_NO_MIC, status, ExtconInfo.EXTCON_HEADPHONE);
-            }
-            if (extconInfo.hasCableType(ExtconInfo.EXTCON_MICROPHONE)) {
+            // }
+            // if (extconInfo.hasCableType(ExtconInfo.EXTCON_MICROPHONE)) {
                 updateBit(maskAndState, BIT_HEADSET, status, ExtconInfo.EXTCON_MICROPHONE);
-            }
-            if (extconInfo.hasCableType(ExtconInfo.EXTCON_HDMI)) {
-                //updateBit(maskAndState, BIT_HDMI_AUDIO, status, ExtconInfo.EXTCON_HDMI);
-            }
-            if (extconInfo.hasCableType(ExtconInfo.EXTCON_LINE_OUT)) {
-                updateBit(maskAndState, BIT_LINEOUT, status, ExtconInfo.EXTCON_LINE_OUT);
-            }
-
-            updateBit(maskAndState, BIT_HDMI_AUDIO,     status, "hdmi0");
-            updateBit(maskAndState, BIT_HDMI_AUDIO_1,   status, "hdmi1");
+            // }
+            // if (extconInfo.hasCableType(ExtconInfo.EXTCON_HDMI)) {
+                // updateBit(maskAndState, BIT_HDMI_AUDIO, status, ExtconInfo.EXTCON_HDMI);
+            // }
+            // if (extconInfo.hasCableType(ExtconInfo.EXTCON_LINE_OUT)) {
+               updateBit(maskAndState, BIT_LINEOUT, status, ExtconInfo.EXTCON_LINE_OUT);
+            // }
+            // liguoyi 251016 audio
+            // updateBit(maskAndState, BIT_HDMI_AUDIO,     status, "hdmi0");
+            // updateBit(maskAndState, BIT_HDMI_AUDIO_1,   status, "hdmi1");
             updateBit(maskAndState, BIT_DP_AUDIO,       status, "dp0");
             updateBit(maskAndState, BIT_DP_AUDIO_1,     status, "dp1");
             updateBit(maskAndState, BIT_HDMIIN_AUDIO,   status, "hdmirx0");

hardware_rockchip_audio.patch

diff --git a/tinyalsa_hal/audio_hw.c b/tinyalsa_hal/audio_hw.c
index 9dd81eb..4b61849 100755
--- a/tinyalsa_hal/audio_hw.c
+++ b/tinyalsa_hal/audio_hw.c
@@ -1202,14 +1202,17 @@ static int start_output_stream(struct stream_out *out)
     read_out_sound_card(out);
 
 #ifndef SUPPORT_MULTIAUDIO
-#ifdef BOX_HAL
+//liguoyi 251016 audio
+//#ifdef BOX_HAL
     open_sound_card_policy(out);
-#endif
+//#endif
 #endif
 
     for (int i = 0; i < out->num_configs; ++i) {
         ALOGD("%s: i = %d, device = 0x%x", __FUNCTION__, i, out->devices[i]);
-        if (out->devices[i] == AUDIO_DEVICE_OUT_AUX_DIGITAL) {
+        //liguoyi 251016 audio
+        //if (out->devices[i] == AUDIO_DEVICE_OUT_AUX_DIGITAL) {
+        if(1){
             audio_devices_t route_device = out->devices[i];
             route_pcm_card_open(adev->dev_out[SND_OUT_SOUND_CARD_HDMI].card, getRouteFromDevice(route_device));
             if (adev->owner[SOUND_CARD_HDMI] == NULL) {
@@ -1239,11 +1242,12 @@ static int start_output_stream(struct stream_out *out)
                 }
             }
         }
-
-        if (out->devices[i] == AUDIO_DEVICE_OUT_SPEAKER ||
-            out->devices[i] == AUDIO_DEVICE_OUT_WIRED_HEADSET ||
-            out->devices[i] == AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
-       out->devices[i] == AUDIO_DEVICE_OUT_BUS) {
+        //liguoyi 251016 audio
+        // if (out->devices[i] == AUDIO_DEVICE_OUT_SPEAKER ||
+        //     out->devices[i] == AUDIO_DEVICE_OUT_WIRED_HEADSET ||
+        //     out->devices[i] == AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
+       // out->devices[i] == AUDIO_DEVICE_OUT_BUS) {
+            if (1) {
             audio_devices_t route_device = out->devices[i];
             route_pcm_card_open(adev->dev_out[SND_OUT_SOUND_CARD_SPEAKER].card, getRouteFromDevice(route_device));
             card = adev->dev_out[SND_OUT_SOUND_CARD_SPEAKER].card;
diff --git a/tinyalsa_hal/audio_hw.h b/tinyalsa_hal/audio_hw.h
index d9d2d60..179289a 100755
--- a/tinyalsa_hal/audio_hw.h
+++ b/tinyalsa_hal/audio_hw.h
@@ -99,9 +99,10 @@
  * output only supports 1 (stereo) and the multi channel HDMI output 2 (5.1 and 7.1) */
 #define MAX_SUPPORTED_CHANNEL_MASKS 2
 #define MAX_SUPPORTED_SAMPLE_RATES 2
-
+//liguoyi 251017 audio
+#undef BOX_HAL
 #ifndef BOX_HAL
-#define RK_DENOISE_ENABLE
+//#define RK_DENOISE_ENABLE
 #endif
 
 #define HW_PARAMS_FLAG_LPCM 0

kernel-5.10.patch

diff --git a/arch/arm64/boot/dts/rockchip/tspi-rk3566-core-v10.dtsi b/arch/arm64/boot/dts/rockchip/tspi-rk3566-core-v10.dtsi
index baa81be2d619..c5c5efd693bb 100755
--- a/arch/arm64/boot/dts/rockchip/tspi-rk3566-core-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/tspi-rk3566-core-v10.dtsi
@@ -124,19 +124,7 @@ simple-audio-card,codec {
            sound-dai = <&pdmics>;
        };
    };
-   /* LINUX */
-   // rk809_sound: rk809-sound {
-   //  status = "okay";
-   //  compatible = "rockchip,multicodecs-card";
-   //  rockchip,card-name = "rockchip-rk809";
-   //  hp-det-gpio = <&gpio3 RK_PA1 GPIO_ACTIVE_LOW>;
-   //  rockchip,format = "i2s";
-   //  rockchip,mclk-fs = <256>;
-   //  rockchip,cpu = <&i2s1_8ch>;
-   //  rockchip,codec = <&rk809_codec>;
-   //  pinctrl-names = "default";
-   //  pinctrl-0 = <&hp_det>;
-   // };
+
    /* android */
    rk809_sound: rk809-sound {
        status = "okay";
@@ -144,7 +132,8 @@ rk809_sound: rk809-sound {
        simple-audio-card,format = "i2s";
        simple-audio-card,name = "rockchip,rk809-codec";
        simple-audio-card,mclk-fs = <256>;
-
+       //hp-det-gpio = <&gpio3 RK_PB5 GPIO_ACTIVE_HIGH>;
+       //rockchip,playback-path = "spk";  // "hp"表示耳机,"spk"表示喇叭
        simple-audio-card,cpu {
            sound-dai = <&i2s1_8ch>;
        };
@@ -661,7 +642,7 @@ regulator-state-mem {
        };
 
        rk809_codec: codec {
-           #sound-dai-cells = <1>;
+           #sound-dai-cells = <0>;
            compatible = "rockchip,rk809-codec", "rockchip,rk817-codec";
            clocks = <&cru I2S1_MCLKOUT>;
            clock-names = "mclk";
@@ -671,7 +652,12 @@ rk809_codec: codec {
            pinctrl-names = "default";
            pinctrl-0 = <&i2s1m0_mclk>;
            hp-volume = <20>;
-           spk-volume = <3>;
+           spk-volume = <5>;
+           /************************************************************
+           底板
+           ************************************************************/
+           //使用外放功能设备树里面就要添加 use-ext-amplifier: 这个属性
+           //use-ext-amplifier; //用耳机则不用注释 用喇叭则注释
            mic-in-differential;
            status = "okay";
        };
diff --git a/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts b/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
index 31e59689d8eb..e7a0c7ec95b1 100755
--- a/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
+++ b/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
@@ -27,23 +27,26 @@
 #include <dt-bindings/display/rockchip_vop.h>
 #include "rk3568-android.dtsi"
 
-// //tspi核心配置层,这里是几乎后期不需要怎么改动
+//tspi核心配置层,这里是几乎后期不需要怎么改动
 #include "tspi-rk3566-core-v10.dtsi"
 
-// //【开/关】EDP 显示屏幕配置,用户可以基于此复制自己的屏幕,注意EDP与MIPI屏幕互斥,因为共用了VOP如果需要同显自行修改
-// // #include "tspi-rk3566-edp-v10.dtsi"
+//【开/关】EDP 显示屏幕配置,用户可以基于此复制自己的屏幕,注意EDP与MIPI屏幕互斥,因为共用了VOP如果需要同显自行修改
+//#include "tspi-rk3566-edp-v10.dtsi"
 
-// //【开/关】mipi 显示屏幕配置,用户可以基于此复制自己的屏幕,注意EDP与MIPI屏幕互斥,因为共用了VOP如果需要同显自行修改
-// #include "tspi-rk3566-dsi-v10.dtsi"
+//【开/关】mipi 显示屏幕配置,用户可以基于此复制自己的屏幕,注意EDP与MIPI屏幕互斥,因为共用了VOP如果需要同显自行修改
+//#include "tspi-rk3566-dsi-v10.dtsi"
+
+//【开/关】LVDS 显示屏幕配置
+//#include "tspi-rk3566-lvds-v10.dtsi"
 
 //【开/关】HDMI 显示屏幕配置,里面内容几乎可以不用动,如果不需要hdmi显示直接注释掉即可
 #include "tspi-rk3566-hdmi-v10.dtsi"
 
-// //【开/关】摄像头 目前视频的是ov5659
+//【开/关】摄像头 目前视频的是ov5659
 #include "tspi-rk3566-csi-v10.dtsi"
 
 //【开/关】网口 扩展板上使用的是千兆网,不接扩展板情况下可以关闭
-//#include "tspi-rk3566-gmac1-v10.dtsi"
+#include "tspi-rk3566-gmac1-v10.dtsi"
 
 //【开/关】下方是用户定义层,所有用户修改理论上在此下方修改就好了
 / {
 @@ -52,9 +55,8 @@ / {
 
    rk_headset: rk-headset {
        compatible = "rockchip_headset";
-       headset_gpio = <&gpio0 RK_PC5 GPIO_ACTIVE_HIGH>;
+       headset_gpio = <&gpio3 RK_PB5 GPIO_ACTIVE_HIGH>;
        pinctrl-names = "default";
-       pinctrl-0 = <&hp_det>;
    };
@@ -231,13 +233,25 @@ usb30_5v_en: usb30-5v_en {
             regulator-min-microvolt = <3300000>; // 3.3V
             regulator-max-microvolt = <3300000>;
         };
+
+        // power 12V (GPIO0_D6)
+        power_12v_en: power-12v-en {
+            compatible = "regulator-fixed";
+            regulator-name = "power_12v_en";
+            gpio = <&gpio0 RK_PD6 GPIO_ACTIVE_HIGH>;  
+            enable-active-high;
+            regulator-always-on;
+            regulator-boot-on;
+            regulator-min-microvolt = <3300000>; // 3.3V
+            regulator-max-microvolt = <3300000>;
+        };
     };
 };
 
 &pinctrl {
    headphone {
        hp_det: hp-det {
-           rockchip,pins = <0 RK_PC5 RK_FUNC_GPIO &pcfg_pull_down>;
+           rockchip,pins = <3 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;
        };
    };
@@ -251,124 +265,94 @@ &leds {
 &regulators {
     status = "okay";
 };
-//耳机插入检测,不使用扩展板情况需关闭,否则默认会检测到耳机插入
+//耳机插入检测
 &rk_headset {
-   status = "disabled";
+   status = "okay";
+};

diff --git a/sound/soc/codecs/rk817_codec.c b/sound/soc/codecs/rk817_codec.c
index c178da3e52a2..c5305bda56e1 100644
--- a/sound/soc/codecs/rk817_codec.c
+++ b/sound/soc/codecs/rk817_codec.c
@@ -512,7 +512,9 @@ static int rk817_codec_power_down(struct snd_soc_component *component, int type)
 
 /* For tiny alsa playback/capture/voice call path */
 static const char * const rk817_playback_path_mode[] = {
-   "OFF", "RCV", "SPK", "HP", "HP_NO_MIC", "BT", "SPK_HP", /* 0-6 */
+   //liguoyi 251017 audio
+   //"OFF", "RCV", "SPK", "HP", "HP_NO_MIC", "BT", "SPK_HP", /* 0-6 */
+   "SPK", "RCV", "OFF", "HP", "HP_NO_MIC", "BT", "SPK_HP", /* 0-6 */
    "RING_SPK", "RING_HP", "RING_HP_NO_MIC", "RING_SPK_HP"}; /* 7-10 */
 
 static const char * const rk817_capture_path_mode[] = {

调试方法

  1. 通过SD卡准备一个 .wav 的音频。播放这个音频看看有没有声音。

  2. 通过命令 cat /proc/asound/cards 查看RK809的音频驱动有没有起来。

  3. 通过命令 tinymix查看有什么音频链路,通过格式tinymix xxx xxx切换音频链路,测试能不能输出声音。如果能够输出声音则直接通过修改SDK,将音频链路互换一下即可。
    图片#B #S #R #60% #auto

 

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册