1. 程式人生 > >高通SPI指紋模組driver除錯

高通SPI指紋模組driver除錯

對於指紋模組,剛接手的時候覺得不就是個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的除錯時間花費的所在。

        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 */
            };
        };
SPI配置引腳
 <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系統。並沒有支援指紋的標準架構,因此修改幅度較大。好在模組供應商有支援。這裡就不在敖述了。