高通SPI指紋模組driver除錯
阿新 • • 發佈:2019-02-19
對於指紋模組,剛接手的時候覺得不就是個SPI很簡單。後來發現,供應商的deamon給我埋下了好多坑。因此做此記錄。
1、dts配置解析,由模組和原理圖上看,得知需要配置模組reset引腳,模組irq引腳,然後就是SPI介面線路,CS,MISO,MOSI,CLK,這些資訊如下
復位引腳,復位引腳特別說明一下,模組供應商給的參考就是個大坑。根據datasheet說明來看,低電平後需要輸出高電平啟用工作。而供應商給的參考並非如此。因此這裡是我在除錯過程中修改過的配置。
fp_shutdown_active { qcom,pins = <&gp 23>; qcom,pin-func = <0>; qcom,num-grp-pins = <1>; label = "shutdown_gpio_active"; fp_shutdown_active: fp_shutdown_active { drive-strength = <6>; <span style="color:#ff0000;">output-high;</span> bias-disable= <0>; }; }; fp_shutdown_suspend { qcom,pins = <&gp 23>; qcom,pin-func = <0>; qcom,num-grp-pins = <1>; label = "shutdown_gpio_suspend"; fp_shutdown_suspend: fp_shutdown_suspend { drive-strength = <2>; <span style="color:#ff0000;">output-low;</span> bias-pull-down; }; };
中斷引腳,中斷引腳也存在一些問題。但不是節點本身配置的問題。而是平臺供應商實際上由應用層利用JNI操作了16號引腳,因此導致驅動中配置正常,開機後檢視
sys/kernel/debug/gpio中發現狀態被修改!!而且是在點開設定的時候狀態被修改成了輸出狀態。因此查詢package/app/settings找到了jni操作該16號引腳的問題。直接遮蔽了。坑爹的平臺供應商,問了是不是程式碼某個地方操作了該引腳,矢口否認。這裡也是造成該driver的除錯時間花費的所在。
SPI配置引腳spi0_silead_irq_active { /* DRDY-N/IRQ */ qcom,pins = <&gp 16>; qcom,num-grp-pins = <1>; qcom,pin-func = <0>; label = "silead_irq_active"; /* active state */ silead_irq_active: active { drive-strength = <12>; /* 12 MA */ bias-didable = <0>; /* No PULL */ }; /* suspended state */ silead_irq_suspend: suspend { drive-strength = <2>; /* 2 MA */ bias-disable = <0>; /* No PULL */ }; };
片選引腳<span style="white-space:pre"> </span>spi0_active { /* MOSI, MISO, CLK */ qcom,pins = <&gp 8>, <&gp 9>, <&gp 11>; qcom,num-grp-pins = <3>; qcom,pin-func = <1>; label = "spi0-active"; /* active state */ spi0_default: spi0_default { drive-strength = <12>; /* 12 MA */ bias-disable = <0>; /* No PULL */ }; }; spi0_suspend { /* MOSI, MISO, CLK */ qcom,pins = <&gp 8>, <&gp 9>, <&gp 11>; qcom,num-grp-pins = <3>; qcom,pin-func = <0>; label = "spi0-suspend"; /* suspended state */ spi0_sleep: spi0_sleep { drive-strength = <2>; /* 2 MA */ bias-pull-down; /* pull down */ }; };
spi0_cs0_active {
/* CS */
qcom,pins = <&gp 10>;
qcom,num-grp-pins = <1>;
qcom,pin-func = <1>;
label = "spi0-cs0-active";
spi0_cs0_active: cs0_active {
drive-strength = <2>;
bias-disable = <0>;
};
};
spi0_cs0_suspend {
/* CS */
qcom,pins = <&gp 10>;
qcom,num-grp-pins = <1>;
qcom,pin-func = <0>;
label = "spi0-cs0-suspend";
spi0_cs0_sleep: cs0_sleep {
drive-strength = <2>;
bias-disable = <0>;
};
};
以上內容在xxx-pinctl.dtsi中配置
接下去是SPI功能配置
spi_0: spi@78ba000 { /* BLSP1 QUP6 */
compatible = "qcom,spi-qup-v2";
#address-cells = <1>;
#size-cells = <0>;
reg-names = "spi_physical", "spi_bam_physical";
reg = <0x78ba000 0x600>,
<0x7884000 0x23000>;
interrupt-names = "spi_irq", "spi_bam_irq";
interrupts = <0 100 0>, <0 238 0>;
spi-max-frequency = <19200000>;
pinctrl-names = "spi_default", "spi_sleep";
pinctrl-0 = <&spi0_default &spi0_cs0_active>;
pinctrl-1 = <&spi0_sleep &spi0_cs0_sleep>;
clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>,
<&clock_gcc clk_gcc_blsp1_qup6_spi_apps_clk>;
clock-names = "iface_clk", "core_clk";
qcom,infinite-mode = <0>;
qcom,use-bam;
qcom,use-pinctrl;
qcom,ver-reg-exists;
qcom,bam-consumer-pipe-index = <14>;
qcom,bam-producer-pipe-index = <15>;
qcom,master-id = <86>;
最後呢就是對應的SPI掛接裝置的設定了,這裡供應商也給我挖了個大坑。就是SPI-MAX-FREQUENCY的配置項,實際上drver裡面並沒有使用該值,而是從IOCTL的介面由應用傳入設定。這點實在是不符合Linux驅動的設計標準,因此查詢該BUG花費了好多時間。
silead,spi@0 {
compatible = "silead,silead_fp";
reg = <0>;
spi-max-frequency = <4800000>;
pinctrl-names = "active","suspend";
pinctrl-0 = <&fp_shutdown_active &silead_irq_active>;
pinctrl-1 = <&fp_shutdown_suspend &silead_irq_suspend>;
shutdown_gpio = <&msm_gpio 23 0>;
silead,irq-gpio = <&msm_gpio 16 0>;
interrupt-parent = <&msm_gpio>;
interrupts = <16 0>;
interrupt-names = "sl_wake_up";
linux,wakeup;
};
最後就是framework的修改了,由於是5.1.1的Android系統。並沒有支援指紋的標準架構,因此修改幅度較大。好在模組供應商有支援。這裡就不在敖述了。