先說一下背景:
新入手了一個開發板,開發板帶有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;
};
};
再次編譯,下載。按鍵就全部可以使用了。
總體上說,做過一次之後這個東西很簡單,只是在設備樹中添加相應的屬性即可。