android13 kernel5.10 RK3566 音频调试记录
耳机、喇叭、HDMI音频输出。
硬件



硬件存在一个问题:RK809的喇叭输出接口本身就有1W功放输出了,这里又接一个NS4110B功放,导致播放声音时会有底噪。
frameworks_base.patch
具体路径:SDK根目录/frameworks/base/services/core/java/com/android/server/WiredAccessoryManager.javadiff --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 {
®ulators {
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[] = {
调试方法
通过SD卡准备一个 .wav 的音频。播放这个音频看看有没有声音。
通过命令
cat /proc/asound/cards查看RK809的音频驱动有没有起来。通过命令
tinymix查看有什么音频链路,通过格式tinymix xxx xxx切换音频链路,测试能不能输出声音。如果能够输出声音则直接通过修改SDK,将音频链路互换一下即可。


评论