安卓添加返回鍵+菜單鍵+HOME鍵--基於高通平臺

先說一下背景:

       新入手了一個開發板,開發板帶有BACK+HOME+MENU實體按鍵,還有兩個實體的音量加減按鍵。但是開機後發現音量鍵都是可以正常使用的,另外三個按鍵無法正常使用,在按鍵沒有按下時測量這幾個按鍵的電壓發現音量鍵的電壓是1.8V,另外三個按鍵的電壓則是0V。根據電壓值可推測,應該是在系統內部沒有對這三個IO設置導致這幾個IO不能體現其正常的功能。

        既然要使用這幾個實體按鍵,就只能老老實實的查看代碼把功能添加上去了,這裏我先說明一下,其實把按鍵對應的功能添加上非常容易,但是由於自己第一次做這樣的工作,因此記錄一下自己的想法和方法。

        首先,這5個按鍵都是通過GPIO和soc鏈接的,既然音量鍵能正常工作就看這幾個按鍵和音量鍵的GPIO設置有哪些區別唄,首先查看dtsi中設備樹中這幾個GPIO有哪些區別,發現在某個文件中有以下代碼。

      
gpio_keys {
        compatible = "gpio-keys";
        input-name = "gpio-keys";
        pinctrl-names = "tlmm_gpio_key_active","tlmm_gpio_key_suspend";
        pinctrl-0 = <&gpio_key_active>;
        pinctrl-1 = <&gpio_key_suspend>;
        vol_up {
            label = "volume_up";
            gpios = <&msm_gpio 15 0x1>;
            linux,input-type = <1>;
            linux,code = <115>;
            gpio-key,wakeup;
            debounce-interval = <15>;
        };  
        vol_down {
            label = "volume_down";
            gpios = <&msm_gpio 8 0x1>;
            linux,input-type = <1>;
            linux,code = <114>;
            gpio-key,wakeup;
            debounce-interval = <15>;
        };
};

根據硬件鏈接可以知道音量“+”使用的時GPIO15,音量“-”使用的是GPIO8剛好和設備樹中的gpios對應,故感覺這個就是音量相關的設備樹的配置,那就嘗試這找driver中的代碼吧,看看驅動中是如何使用這些屬性的。根據compatible = "gpio-keys"在找到了對應的驅動文件,翻閱了一下驅動文件好像也並沒有對vol_up和vol_down做特別的處理,只是讀取了設備樹的屬性,然後根據這些屬性進行設置。既然這樣,那直接把HOME+MENU+BACK按鍵的屬性添加上去不就大功告成了,這樣想着就把BACK+MENU+HOME對應的按鍵添加到了

gpio_keys {
    ......
    ......
    vol_up{
        ......
        ......
    };

    vol_down{
        ......
        ......
    };
    home_key {
        label = "home_key";
        gpios = <&msm_gpio 9 0x1>;
        linux,input-type = <1>;
        linux,code = <102>;
        gpio-key,wakeup;
        debounce-interval = <15>;
    };  
    back_button {           
        label = "back_button";          
        gpios = <&msm_gpio 10 0x1>;         
        linux,code = <158>;         
        linux,input-type = <1>;         
        gpio-key,wakeup;            
        debounce-interval = <15>;           
    };  
    menu_button {
        label = "list_button";
        gpios = <&msm_gpio 13 0x1>;
        linux,code = <139>;
        linux,input-type = <1>;
        gpio-key,wakeup;
        debounce-interval = <15>;
   };  

};
    

然後編譯系統,下載進去之後測試,發現另外三個按鍵不能正常工作,但是不應該啊,因爲驅動中沒有特別針對音量鍵,想着是不是設備樹中的設置有問題啊,於是又仔細看了一下設備樹中gpio_keys的屬性,發現有pinctrl-0 = <&gpio_key_active>;
        pinctrl-1 = <&gpio_key_suspend>;這兩個屬性,於是就搜索了一下gpio_key_active和gpio_key_suspend,發現這兩個屬性在另外一個文件中定義,該文件中代碼如下

tlmm_gpio_key {                                                                             
            qcom,pins = <&gp 15>, <&gp 8>;
            qcom,pin-func = <0>; 
            qcom,num-grp-pins = <2>;
            label = "tlmm_gpio_key";
            gpio_key_active: gpio_key_active {
                drive-strength = <2>; 
                bias-pull-up;
            };   
            gpio_key_suspend: gpio_key_suspend {
                drive-strength = <2>; 
                bias-pull-up;
            };
};

看到這裏就只有把BACK+MENU+HOME對應的gpio加入到這裏了,代碼如下

tlmm_gpio_key {                                                                             
            qcom,pins = <&gp 15>, <&gp 8>, <&gp 9>, <&gp 10>, <&gp 13>; 
            qcom,pin-func = <0>; 
            qcom,num-grp-pins = <5>;
            label = "tlmm_gpio_key";
            gpio_key_active: gpio_key_active {
                drive-strength = <2>; 
                bias-pull-up;
            };   
            gpio_key_suspend: gpio_key_suspend {
                drive-strength = <2>; 
                bias-pull-up;
            };
};

再次編譯,下載。按鍵就全部可以使用了。

總體上說,做過一次之後這個東西很簡單,只是在設備樹中添加相應的屬性即可。

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