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

或按照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

轉載于:https://www.cnblogs.com/yxwkf/p/5042492.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272627.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272627.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272627.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

程序員偷偷深愛的9個不良編程習慣

新媒體管家下面這9個編碼習慣&#xff0c;雖然在編程規則中是被駁斥的&#xff0c;但我們很多人就是會不由自主地使用它們。我們曾經都做過這樣的事情&#xff1a;當媽媽不注意的時候&#xff0c;偷偷地吃糖果零食&#xff0c;然后導致有了蛀牙。同樣的&#xff0c;我們都違背過…

emacs c語言 自動補全,Emacs 與 C/C++ 代碼自動補全

基于 Emacs 的 company 模式并配合 semantic 文法分析器&#xff0c;實現 Emacs 的 C/C 代碼自動補全。關于 Emacs 的代碼自動補全代碼自動補全的功能&#xff0c;對于使用 Emacs 寫代碼的程序員而言其重要性不言而喻的&#xff0c;但是搜了一些所謂的 “Emacs 完美的 C 自動補…

linux(fedora) 下dvwa 建筑環境

linux(fedora)下dvwa組態 1.下載httpd,dvwa,mysql,mysqlserver, php-mysql,php 除了dvwa 這是外界進入下一官方網站。該服務通過休息install 安裝 yum install httpd, mysql, php-mysql, php 假設出現安裝的問題。能夠先yum search xxx 2.安裝完之后&#xff0c;檢查安裝的狀…

c語言一元二次方程 ii(分支嵌套),C程序設計——求一元二次方程算法

要求&#xff1a;從鍵盤上輸入一元二次方程的三個參數&#xff0c;編程判斷并求一元二次方程的實根(a,b,c均為整數)算法分析&#xff1a;一元二次方程是只含有一個未知數&#xff0c;且未知數的最高次數是二次的多項式方程。一元二次方程經過整理都可化成一般形式axbxc0(a≠0)&…

程序員如何優雅度過一生的15個建議

首先&#xff0c;我要說明一下精彩的職業生涯應該是什么樣。他們不是這樣的一個線性圖形&#xff0c;不是每過一個月你就會有對應的成長。&#xff08;就算是普通的職業生涯也不會這樣。你不會每個月都有提升。每個月你都會變的好一點&#xff0c;但是每次有提升都是大幅度的&a…

cocos2d-x游戲開發 跑酷(四) 關聯與物理世界

原創。轉載注明出處http://blog.csdn.net/dawn_moon/article/details/21451077 前面一節盡管實現了一個跑動的人物&#xff0c;可是他只不過一個精靈在運行一個跑動的幀動畫而已。這一節我要實現精靈和物理世界關聯。讓這個人跟實際的Parkour一樣&#xff0c;有實際體積&#x…

kmp算法的c語言,KMP算法 純C實現

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓我自己寫的KMP算法&#xff1a;int nt[256];void get_next1(char* T, int next[], int tlen){int i 0;int j 1;next[0] -1;while( j {if ( T[i] T[j] ){next[j] 0;i;}else{next[j] i;i 0;}j;}}int Index_KMP1(char* S, cha…

MyBatis多條件查詢

1.MyBatis多條件查詢1.1&#xff1a;使用實體類 將參數封裝成對象接口&#xff1a;public List<User> getUserListByUser(User user);Mapper映射文件&#xff1a;<select id"getUserListByUser" resultType"User" parameterType"User"…

android 定位 廣播,android - 如何觸發廣播接收器在GPS開啟/關閉? - SO中文參考 - www.soinside.com...

如何觸發廣播接收器在GPS開啟/關閉&#xff1f;問題描述 投票&#xff1a;35回答&#xff1a;5public class BootReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().matches("android.locatio…

sphinx數據文件簡析

Sphinx使用的文件包括 “sph”&#xff0c; “spa”&#xff0c; “spi”&#xff0c; “spd”, “spp”&#xff0c; “spm” &#xff0c;還有鎖文件&#xff08;.spl&#xff09;。其中sph是系統的配置文件。其它則為索引文件。 l Spi 文件&#xff1a;保存WordId及指向此Wo…

收集一些常用的正則表達式

1 . 校驗密碼強度密碼的強度必須是包含大小寫字母和數字的組合&#xff0c;不能使用特殊字符&#xff0c;長度在8-10之間。^(?.*\\d)(?.*[a-z])(?.*[A-Z]).{8,10}$2. 校驗中文字符串僅能是中文。^[\\u4e00-\\u9fa5]{0,}$3. 由數字、26個英文字母或下劃線組成的字符串^\\w$4.…

C#實現圖片的無損壓縮

/// <summary>/// 圖像縮略圖處理/// </summary>/// <param name"bytes">圖像源數據</param>/// <param name"compression">壓縮質量 1-100</param>/// <param name"thumbWidth">縮略圖的寬</para…

部署和調優 1.3 pureftp部署和優化-1

FTP 是 File Transfe Protocol&#xff08;文件傳輸協議&#xff09;的英文簡稱&#xff0c;而中文簡稱為 “文傳協議” 用于 Internet 上的控制件的雙向傳輸。 可以訪問 www.pureftpd.org 官網 切換到下載目錄 cd /usr/local/src 下載 wget http://download.pureftpd.org/…

android通知圖標變白色,android 7.0通知圖標出現白色方塊

我使用下面的代碼片段在我的Android應用程序中生成通知.private void sendNotification(String contentText, String message) {Intent resultIntent new Intent(this, MainActivity.class);resultIntent.putExtra("clear","clear");resultIntent.setFlag…

sqlserver 查找某個字段在哪張表里

如何查找某個字段屬于哪張表&#xff1f;select [name] from [庫名].[dbo].sysobjects where id in(select id from [庫名].[dbo].syscolumns Where name字段名)

性能

成員嵌套越深&#xff0c;訪問速度越慢。location.href 總是快于window.location.href&#xff0c;而后者也要比window.location.href.toString()更快。如果這些屬性不是對象的實例屬性&#xff0c;那么成員解析還要在每個點上搜索原形鏈&#xff0c;這將需要更長時間。 functi…

身份證號碼有效性檢測算法 ( js版 轉 C#版 )

C#版#region 檢測是否是正確的身份證/// <summary>/// 身份證驗證/// </summary>/// <param name"num"></param>/// <returns></returns>public static bool isIdCardNo(string cardid){string num cardid.ToUpper();int[] fac…

android藍牙移植,平板藍牙測試與移植一

一&#xff0e;平板藍牙測試硬件連接&#xff1a;進入系統的”設置”&#xff0c;開啟“藍牙”&#xff1a;可以看到掃描到其他的藍牙設備&#xff0c;“Bluez”是平板的名稱。點擊“Bluez”&#xff0c;設置如下&#xff1a;點擊要配對的藍牙設備(手機等)&#xff0c;進行藍牙…

ASP.NET系列:自定義配置節點的復用

appSettings太簡單&#xff0c;為每個程序自定義配置節點太復雜&#xff0c;因此要解決app.config&web.config自定義配置的復用問題。 1.讀取不依賴SectionName,根節點可以定義為任何名稱。 2.足夠簡單&#xff0c;配置項采用name value的形式&#xff1b;足夠復雜&#xf…

Web的26項基本概念和技術

Web開發是比較費神的&#xff0c;需要掌握很多很多的東西&#xff0c;特別是從事前端開發的朋友&#xff0c;需要通十行才行。今天&#xff0c;本文向初學者介紹一些Web開發中的基本概念和用到的技術&#xff0c;從A到Z總共26項&#xff0c;每項對應一個概念或者技術。Internet…