或按照S5PV210學習秩序。我們首先解決的關鍵問題。TQ335x有六個用戶按鈕,每個上、下、剩下、對、Enter和ESC。
我想開始學習S5PV210當同一,寫輸入子系統驅動器的關鍵問題要解決,但瀏覽driver/input/keyboardgpio-keys.c,大體上看下該驅動程序,其功能是實現了通用的gpio按鍵。
再去看了下DTS,發現DTS中有對gpio-keys的引用。于是猜到。新的內核不須要自己編寫輸入子系統驅動,能夠通過配置DTS直接解決按鍵問題。本人終于通過實驗證實了這個猜想,以下是實驗筆記及本人的一些理解。
(1)確定GPIO管腳
通過查看TQ335x的原理圖能夠看到,TQ335x的6個按鍵分別接在GPIO1的20~25管腳上,原理圖例如以下:
(2)查看原有的dts配置
進行DTS文件改動之前能夠閱讀下內核相關文檔。在Documentation/devicetree/文件夾下有非常多關于devicetree的記載,事實上,這些第一手的資料才是最具參考價值的資料。
我還沒來得及系統的閱讀這些文檔,急于實現功能,僅閱讀了gpio-key和pinmux相關的部分就開始了改動工作,這是浮躁的表現。大家不要養成這樣的惡習啊。
通過細致閱讀原dts文件能夠發現am335x-evm開發板上有個gpio矩陣鍵盤和gpio的音量+、音量-鍵。且矩陣鍵盤和音量鍵與TQ335x的按鍵管腳有沖突。因此,刪除這兩組配置并又一次加入適應TQ335x按鍵的配置。改動后的DTS代碼片段例如以下:
gpio_keypad: gpio_keyad@0{compatible = "gpio-keys";#address-cells = <1>;#size-cells = <0>;autorepeat;switch@1 {label = "up";linux,code = <103>;gpios = <&gpio1 20 GPIO_ACTIVE_LOW>;gpio-key,wakeup;};switch@2 {label = "down";linux,code = <108>;gpios = <&gpio1 21 GPIO_ACTIVE_LOW>;gpio-key,wakeup;};switch@3 {label = "left";linux,code = <105>;gpios = <&gpio1 22 GPIO_ACTIVE_LOW>;gpio-key,wakeup;};switch@4 {label = "right";linux,code = <106>;gpios = <&gpio1 23 GPIO_ACTIVE_LOW>;gpio-key,wakeup;};switch@5 {label = "enter";linux,code = <28>;gpios = <&gpio1 24 GPIO_ACTIVE_LOW>;gpio-key,wakeup;};switch@6 {label = "esc";linux,code = <1>;gpios = <&gpio1 25 GPIO_ACTIVE_LOW>;gpio-key,wakeup;};
};
當中,linux,code后面相應的是linux標準的鍵值,能夠在linux系統中找到。路徑是:/usr/include/linux/input.h。
因為這六個按鍵使用的是gpio管腳,還須要通過后面的pinmux配置下gpio相關寄存器。相同的,刪除gpio矩陣鍵盤和音量鍵相關的配置。加入使用TQ335x的配置,改動后的代碼片段例如以下:
&am33xx_pinmux {
pinctrl-names = "default";
pinctrl-0 = <&clkout2_pin>;gpio_key_pins: gpio_keys_s0 {pinctrl-single,pins = <0x50 (PIN_INPUT_PULLUP | MUX_MODE7) /* gpmc_a3.gpio1_20 */0x54 (PIN_INPUT_PULLUP | MUX_MODE7) /* gpmc_a5.gpio1_21 */0x58 (PIN_INPUT_PULLUP | MUX_MODE7) /* gpmc_a6.gpio1_22 */0x5C (PIN_INPUT_PULLUP | MUX_MODE7) /* gpmc_a7.gpio1_23 */0x60 (PIN_INPUT_PULLUP | MUX_MODE7) /* gpmc_a8.gpio1_24 */0x64 (PIN_INPUT_PULLUP | MUX_MODE7) /* gpmc_a9.gpio1_25 */>;
};i2c0_pins: pinmux_i2c0_pins {pinctrl-single,pins = <0x188 (PIN_INPUT_PULLUP | MUX_MODE0) /* i2c0_sda.i2c0_sda */0x18c (PIN_INPUT_PULLUP | MUX_MODE0) /* i2c0_scl.i2c0_scl */>;
};
須要注意的是,pinctrl-0后與矩陣鍵盤和音量鍵相關的配置項名稱也要刪除,對于phandler,眼下還沒有看懂什么意思,這里先讓按鍵功能正常,之后再去具體的研究dts。學習dts的時候也會來寫筆記的。
(3)又一次編譯dts
與之前編譯dts的方法一樣:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- tq335x.dtb
(4)用新的dtb啟動內核 將新的tq335x.dtb復制到SD卡的boot文件夾下(能夠直接覆蓋掉原來的)并給開發板上電,同一時候按隨意鍵使u-boot進入命令行模式。使用命令啟動內核:
load mmc 0 ${fdtaddr} /boot/tq335x.dtb
load mmc 0 ${loadaddr} /boot/zImage
load mmc 0 ${rdaddr} /boot/ramdisk.img
bootz ${loadaddr} ${rdaddr} ${fdtaddr}
(5)測試按鍵 從終端上無法直接看到按鍵效果,只是能夠同hexdump命令來測試按鍵功能是否正常,用法例如以下:
hexdump /dev/input/event0
因為gpio-keys驅動將按鍵事件映射到了/dev/input/event0設備節點上。因此,對該設備節點使用hexdump工具能夠讀取到按鍵事件。運行上述指令后按鍵,能夠從終端上看到輸出。
我依照上、下、左、右、Enter和ESC的順序短按這六個鍵,能夠看到例如以下Log:
@tq335x #hexdump /dev/input/event0
0000000 4b7c 386d f9b4 0005 0001 0067 0001 0000
0000010 4b7c 386d f9b4 0005 0000 0000 0000 0000
0000020 4b7c 386d 80c4 0008 0001 0067 0000 0000
0000030 4b7c 386d 80c4 0008 0000 0000 0000 0000
0000040 4b7d 386d 09f8 0008 0001 006c 0001 0000
0000050 4b7d 386d 09f8 0008 0000 0000 0000 0000
0000060 4b7d 386d 1005 000a 0001 006c 0000 0000
0000070 4b7d 386d 1005 000a 0000 0000 0000 0000
0000080 4b7f 386d 1304 000d 0001 0069 0001 0000
0000090 4b7f 386d 1304 000d 0000 0000 0000 0000
00000a0 4b80 386d 48e6 0000 0001 0069 0000 0000
00000b0 4b80 386d 48e6 0000 0000 0000 0000 0000
00000c0 4b80 386d f340 000a 0001 006a 0001 0000
00000d0 4b80 386d f340 000a 0000 0000 0000 0000
00000e0 4b80 386d cd6f 000c 0001 006a 0000 0000
00000f0 4b80 386d cd6f 000c 0000 0000 0000 0000
0000100 4b81 386d a2d7 0007 0001 001c 0001 0000
0000110 4b81 386d a2d7 0007 0000 0000 0000 0000
0000120 4b81 386d b39d 0009 0001 001c 0000 0000
0000130 4b81 386d b39d 0009 0000 0000 0000 0000
0000140 4b82 386d 5aa3 0002 0001 0001 0001 0000
0000150 4b82 386d 5aa3 0002 0000 0000 0000 0000
0000160 4b82 386d 4bf3 0004 0001 0001 0000 0000
0000170 4b82 386d 4bf3 0004 0000 0000 0000 0000
通過hexdump工具看到的數字是16進制的。因為linux的input_event事件定義例如以下: struct input_event {struct timeval time;__u16 type;__u16 code;__s32 value;
};
結合之前設置的linux,code分析可知。hexdump打印的各列數據含義例如以下: 第一列:行號
第2~5列:輸入事件時間戳,即結構體中的time。
第6列:輸入事件類型,即結構體中的type。
第7列:按鍵的鍵值,即結構體中的code。
第8列:按鍵的狀態,即結構體中的value,1表示按下,0表示松開。
細心的朋友會發現,按下并松開一個按鍵后能看到四行數據,這是因為每一個input_event后會接一個linux同步事件,從上述log能夠看到。同步事件的type,code,value都為0。
到這里,就完畢了TQ335x的按鍵驅動移植。盡管過程非常easy,但已經體會到了DTS的優點。對于一些通用的功能,能夠不改動內核源代碼、不又一次編譯內核。僅改動dts配置就能實現所需的功能,如這里的gpio按鍵功能。
dts方式啟動內核有著巨大的優勢。必須弄清DTS的編寫規則,以后會記錄DTS相關的筆記的。
本文作者:girlkoo
此鏈接:http://blog.csdn.net/girlkoo/article/details/41323563