Q:指紋在開機時序有異常,首先是RST有臺階,其次是CS在AVDD上電之前有1.5V左右的電。這兩點不符合指紋開機時序。
A1:關於RST半高
匯頂的指紋幾乎都伴隨着RST半高的問題,這個問題只要在GPIO初始化的時候講RST設置爲output low的模式即可。
MTK平臺配置GPIO使用DCT工具,具體使用再說。如下:
本項目GPIO21口爲rst
A2:關於CS初始化狀態爲高電平
MTK回覆,CS爲spi模式,那麼他們平臺的默認狀態就是高電平。且在DWS文件中SPI口無法選擇輸出低。因此給瞭解決方案是,在DWS文件中配置爲普通的GPIO口,並且修改默認狀態爲輸出低,如上RST口。之後在DTSI中將着四個口改爲SPI mode。
.../mediatek/cust_camellia_fingerprint.dtsi | 12 ++++++-
drivers/input/fingerprint/goodix/gf_spi_tee.c | 7 ++++
drivers/input/fingerprint/goodix/gf_spi_tee.h | 2 +-
drivers/misc/mediatek/dws/mt6853/camellia.dws | 32 +++++++++----------
4 files changed, 35 insertions(+), 18 deletions(-)
diff --git a/arch/arm64/boot/dts/mediatek/cust_camellia_fingerprint.dtsi b/arch/arm64/boot/dts/mediatek/cust_camellia_fingerprint.dtsi
index 24eb048b594a..c959e89d4861 100644
--- a/arch/arm64/boot/dts/mediatek/cust_camellia_fingerprint.dtsi
+++ b/arch/arm64/boot/dts/mediatek/cust_camellia_fingerprint.dtsi
@@ -29,10 +29,11 @@
&goodix_fp {
fpc,gpio_irq = <&pio 22 0>;
- pinctrl-names = "default", "reset_high", "reset_low";
+ pinctrl-names = "default", "reset_high", "reset_low","spi_mode"; //添加pinctrl控制,這裏相當於定義pinctrl腳使用在驅動中
pinctrl-0 = <&fingerprint_default>;
pinctrl-1 = <&fingerprint_reset_high>;
pinctrl-2 = <&fingerprint_reset_low>;
+ pinctrl-3= <&fingerprint_spi_mode>;
status = "okay";
};
@@ -58,6 +59,15 @@
output-low;
};
};
+ fingerprint_spi_mode:spi_mode{ //將幾個口複用爲對應的SPI口
+ pins_cmd_dat {
+ pinmux = <PINMUX_GPIO35__FUNC_SPI5_CLK>,
+ <PINMUX_GPIO36__FUNC_SPI5_CSB>,
+ <PINMUX_GPIO37__FUNC_SPI5_MO>,
+ <PINMUX_GPIO38__FUNC_SPI5_MI>;
+ drive-strength = <2>;
+ };
+ };
};
/* add goodix fingerprint end*/
diff --git a/drivers/input/fingerprint/goodix/gf_spi_tee.c b/drivers/input/fingerprint/goodix/gf_spi_tee.c
index 0a04ace3ac26..43bd66f627eb 100644
--- a/drivers/input/fingerprint/goodix/gf_spi_tee.c
+++ b/drivers/input/fingerprint/goodix/gf_spi_tee.c
@@ -281,6 +281,13 @@ static int gf_get_gpio_dts_info(struct gf_device *gf_dev)
gf_debug(ERR_LOG, "%s can't find fingerprint pinctrl reset_low\n", __func__);
return ret;
}
+ gf_dev->pins_spi_mode = pinctrl_lookup_state(gf_dev->pinctrl_gpios, "spi_mode"); //需要在供應商的驅動代碼中切換狀態
+ if (IS_ERR(gf_dev->pins_spi_mode)) {
+ ret = PTR_ERR(gf_dev->pins_spi_mode);
+ gf_debug(ERR_LOG, "%s can't find fingerprint pinctrl spi_mode\n", __func__);
+ return ret;
+ }
+ pinctrl_select_state(gf_dev->pinctrl_gpios, gf_dev->pins_spi_mode);
gf_debug(DEBUG_LOG, "%s, get pinctrl success!\n", __func__);
#endif
diff --git a/drivers/input/fingerprint/goodix/gf_spi_tee.h b/drivers/input/fingerprint/goodix/gf_spi_tee.h
index 6259c76e2392..8fd656efe432 100644
--- a/drivers/input/fingerprint/goodix/gf_spi_tee.h
+++ b/drivers/input/fingerprint/goodix/gf_spi_tee.h
@@ -219,7 +219,7 @@ struct gf_device {
#ifdef CONFIG_OF
struct pinctrl *pinctrl_gpios;
struct pinctrl_state *pins_irq;
- struct pinctrl_state *pins_miso_spi, *pins_miso_pullhigh, *pins_miso_pulllow, *pins_spi_cs_high, *pins_spi_cs_low;
//添加對應的定義
+ struct pinctrl_state *pins_miso_spi, *pins_miso_pullhigh, *pins_miso_pulllow, *pins_spi_cs_high, *pins_spi_cs_low, *pins_spi_mode;
struct pinctrl_state *pins_reset_high, *pins_reset_low;
#endif
};
修改後時序正常:
經過此次問題,感覺對於DTSI文件修改時序有了新的認識。