RK 公版 SDK 包含兩種耳機檢測處理:
- Hook ADC 模式:硬件上 HOOK 直接接到 ADC ,根據 ADC 獲取的電壓值來區分三段四段耳機類型。
流程框圖:
- Hook Interrupt 模式:硬件上 HOOK 直接接 RK 芯片端的一個 GPIO 口,通過中斷的方式來區分三段四段耳機類型。
流程框圖:
耳機檢測代碼路徑:
kernel/drivers/headset_observe
DTS配置
//RK3399_kernel4.4 adc檢測模式:
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator-edp.dts b/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator-edp.dts
old mode 100644
new mode 100755
index 92f50db..d3317fd
--- a/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator-edp.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator-edp.dts
@@ -111,6 +111,14 @@
rockchip,codec = <&rt5651 &rt5651 &tc358749x>;
status = "okay";
};
+
+ rk_headset{
+ compatible = "rockchip_headset";
+ headset_gpio = <&gpio4 28 GPIO_ACTIVE_LOW>;//GPIO4_D4
+ pinctrl-names = "default";
+ pinctrl-0 = <&hp_det>;
+ io-channels = <&saradc 2>;
+ };
};
+
+&saradc {
+ status = "okay";
+};
&backlight {
@@ -284,5 +292,11 @@
<2 12 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
+
+ headphone {
+ hp_det: hp-det {
+ rockchip,pins = <4 28 RK_FUNC_GPIO &pcfg_pull_up>;
+ };
+ };
};
//RK3288 adc檢測模式:
+/{
+ rockchip_headset {
+ compatible = "rockchip_headset";
+ headset_gpio = <&gpio0 14 GPIO_ACTIVE_LOW>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&gpio0_b6>;
+ io-channels = <&adc 2>;
+ };
+};
+
+
+&pinctrl {
+ gpio0_gpio {
+ gpio0_b6: gpio0-b6 {
+ rockchip,pins = <GPIO0_B6>;
+ rockchip,pull = <VALUE_PULL_DOWN>;
+ };
+ };
+};
+
+&adc {
+ status = "okay";
+};
(注:不同平臺 pinctrl 節點的 gpio 配置不一樣,需要結合實際調整)