1. 程式人生 > >AM335x(TQ335x)學習筆記——GPIO按鍵驅動移植

AM335x(TQ335x)學習筆記——GPIO按鍵驅動移植

還是按照S5PV210的學習順序來,我們首先解決按鍵問題。TQ335x有六個使用者按鍵,分別是上、下、左、右、Enter和ESC。開始我想到的是跟學習S5PV210時一樣,編寫輸入子系統驅動解決按鍵問題,但是瀏覽driver/input/keyboard目錄時意外的發現了gpio-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: [email protected]{
    compatible = "gpio-keys";
    #address-cells = <1>;
    #size-cells = <0>;
    autorepeat;

    [email protected] {
        label = "up";
        linux,code = <103>;
        gpios = <&gpio1 20 GPIO_ACTIVE_LOW>;
        gpio-key,wakeup;
    };

    
[email protected]
{ label = "down"; linux,code = <108>; gpios = <&gpio1 21 GPIO_ACTIVE_LOW>; gpio-key,wakeup; }; [email protected] { label = "left"; linux,code = <105>; gpios = <&gpio1 22 GPIO_ACTIVE_LOW>; gpio-key,wakeup; }; [email protected] { label = "right"; linux,code = <106>; gpios = <&gpio1 23 GPIO_ACTIVE_LOW>; gpio-key,wakeup; }; [email protected] { label = "enter"; linux,code = <28>; gpios = <&gpio1 24 GPIO_ACTIVE_LOW>; gpio-key,wakeup; }; [email protected] { 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的按鍵驅動移植。雖然過程很簡單,但已經體會到了DTS的好處。對於一些通用的功能,可以不修改核心原始碼、不重新編譯核心,僅修改dts配置就能實現所需的功能,如這裡的gpio按鍵功能。dts方式啟動核心有著巨大的優勢,必須弄清DTS的編寫規則,以後會記錄DTS相關的筆記的。


本文作者:girlkoo

相關推薦

AM335x(TQ335x)學習筆記——GPIO按鍵驅動移植

還是按照S5PV210的學習順序來,我們首先解決按鍵問題。TQ335x有六個使用者按鍵,分別是上、下、左、右、Enter和ESC。開始我想到的是跟學習S5PV210時一樣,編寫輸入子系統驅動解決按鍵問題,但是瀏覽driver/input/keyboard目錄時意外的發現了g

AM335x(TQ335x)學習筆記——WM8960音效卡驅動移植

經過一段時間的除錯,終於調好了TQ335x的音效卡驅動。TQ335x採用的Codec是WM8960,本文來總結下WM8960驅動在AM335x平臺上的移植方法。Linux音效卡驅動架構有OSS和ALSA兩種架構,目前最常用的架構是ALSA,本文也使用ALSA架構對WM

AM335x(TQ335x)學習筆記——LCD驅動移植

TI的LCD控制器驅動是非常完善的,共通的地方已經由驅動封裝好了,與按鍵一樣,我們可以通過DTS配置完成LCD的顯示。下面,我們來討論下使用DTS方式配置核心完成LCD驅動的思路。 (1)初步分析 由於TQ335x使用的晶片是AM335x,故仍然可以參考am335x-evm

AM335x(TQ335x)學習筆記——USB驅動移植

對於AM335x來講,TI維護的USB驅動已經非常完善了,本文稱之為移植,實際上僅僅是配置核心選項使能USB HOST/OTG功能。廢話少說,直接動手開啟AM335x的USB驅動配置項。 Step1. 配置核心支援USB 預設的配置項沒有配置USB相關的選項,但是DTS已

AM335x(TQ335x)學習筆記——觸控式螢幕驅動編寫

前面幾篇文章已經通過配置DTS的方式完成了多個驅動的移植,接下來我們解決TQ335x的觸控驅動問題。由於種種原因,TQ335x的觸控式螢幕驅動是以模組方式提供的,且Linux官方核心中也沒有帶該觸控式螢幕的驅動原始碼,單純的配置DTS是無法完成TQ335x的觸控驅動移植工作

AM335x(TQ335x)學習筆記——u-boot-2014.10移植

最近移植了下u-boot-2014.10到TQ335x,如果基於am335x evm進行移植,需要修改的地方並不多。 由於TI的am335x evm開發使用了一個eeprom儲存了板載配置資訊,用來區分不同板子的型號的,而TQ335x沒有這個eeprom,因此,需要修改ee

Arduino 入門學習筆記5 按鍵控制鐳射發生器

程式碼 /**********************************************/ const int keyPin = 13; //the "s" of relay module attach to const int laserPin = 7; /*****

【迅為iTop4412學習筆記】6. 驅動註冊

宣告 以下都是我剛開始看驅動視訊的個人強行解讀,如果有誤請指出,共同進步。 本節目標 驅動註冊 上一篇我們註冊了裝置,接下來就是要註冊驅動,而註冊完驅動,就可以基佬配對了… 首先我們開啟標頭檔案,看一下驅動註

Spring Cloud學習筆記28——訊息驅動的微服務:Spring Cloud Stream

Spring Cloud Stream是一個用來為微服務應用構建訊息驅動能力的框架。它可以基於Spring Boot來建立獨立的、可用於生產的Spring應用程式。它通過使用Spring Integration來連線訊息代理中介軟體以實現訊息事件驅動。Spring Cloud Stream為

DSP學習筆記----GPIO學習及實驗(附程式)

一. GPIO暫存器 TMS320VC5509A有八個GPIO引腳. 它的配置暫存器有兩個: GPIO方向暫存器IODIR 和 GPIO資料暫存器IODATA GPIO方向暫存器(IODIR):

Tensor on Android學習筆記(三) ----將Yolo移植到android平臺

yolo v2移植到android已經有很多案例了專案地址在https://github.com/chentyjpm/DarknetDemoInAndroid不過原博主提供的apk是經過優化的,我自己編譯的還達不到原博主的效果,還需要再改善然後我們要做的就是將v3版本移植夠來

程式碼大全學習筆記之表驅動

資料壓倒一切。如果選擇了正確的資料結構並把一切組織的井井有條,正確的演算法就不言自明。程式設計的核心是資料結構,而不是演算法。 ——Rob Pike  說明      本文基於這樣的認識:資料是易變的,邏輯是穩定的。      本文例舉的程式設計實現多為程式碼片段,但不

MongoDB學習筆記~關於官方驅動整合IQueryable之後的一些事

回到目錄 關於官方驅動整合IQueryable之後的一些事,有好事也有壞事,好事就是它會將你的linq語句非常友好的翻譯成MongoDB語句,而壞事就是有一些linq語句不會被翻譯,不會被翻譯的代價就是將整個結果集裝到記憶體,然後進行linq to object的查詢,效率自然是非常低的,呵呵。 好事

arduino學習筆記2 按鍵控制LED和搶答器

ps. 每個例程實驗的第一組程式碼來自購買arduino板是附贈的例程程式碼,第二組程式碼為根據前者進行的修改練習。 1.按鍵控制LED int ledpin=11;//定義數字11 介面 int inpin=7;//定義數字7 介面 int val;//定義變數val void

IMX6Q學習筆記———編寫LED驅動和測試程式以及相關管腳配置

剛接觸IMX6Q不久,通過一個簡單的LED驅動和測試程式的編寫來了解管腳配置過程。 LED驅動 找到以前編寫驅動的基本框架,如下: static long xxx_ioctl(struct

樹莓派學習筆記——GPIO功能學習

    可以在windows中編寫程式碼,如果是Python指令碼可通過FTP軟體傳輸到樹莓派中,然後使用SSH客戶端登入到樹莓派中執行Python指令碼。如果是C語言檔案,除了使用FTP傳輸之外還需要在樹莓派上編譯才可以生成可執行檔案(相當於windows上的exe檔案)。相關軟體操作請參考【樹莓派學習筆記

樹莓派學習筆記——Linux I2C驅動說明

1.前言通常情況下,I2C裝置由核心驅動控制,但是某些情況下I2C裝置也可由使用者空間控制。如果在使用者空間控制I2C裝置,需要訪問/dev目錄中所提供的介面,在使用I2C裝置之前必須要載入i2c-dev裝置。每一個已經註冊的IC裝置都有一個編號,該編號從0開始計算。可以檢視

STM32學習筆記——GPIO之從庫函式到暫存器

/**   * @brief  Initializes the GPIOx peripheral according to the specified   *         parameters in the GPIO_InitStruct.   * @param  GPIOx: where x can 

樹莓派學習筆記-GPIO介面程式設計-WiringPi

一. 兩種編號方式: 1. WiringPi 編號方式 2. Broadcom 編號方式 fritzin電子設計軟體採用Broadcom編號方式 二. 常用API WiringPi初始化函式:wiringPiSetup() ——使用WiringPi的

Android(4.2) Sensors 學習——G-sensor,Gyroscope驅動移植

         本人對驅動可謂是一點不懂,鑑於公司目前高驅動的人手不夠,所以我也只能兩眼一抹黑硬上咯,最原來Android 4.1上的正常使用的驅動完整的移植到Android 4.2上。這篇檔案講記錄自己一步一步移植過程,已備不時之需。在移植前,先來高明白android