【K19】MTK指紋時序異常問題

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文件修改時序有了新的認識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章