高永相

摘要:在產品設計和開發中,需要在arm平臺下進行驅動開發,根據旋轉編碼器的基本工作原理,利用Linux 設備驅動的輸入子系統進行了驅動和應用程序的設計。實驗結果表明,方案切實可行。
關鍵詞: Linux; 旋轉編碼器; Input子系統
中圖分類號: TP273 文獻標志碼: A
選擇EC11旋轉編碼器作為輸入按鈕,向右旋轉,按步長增加參數,向左旋轉,按步長遞減參數。為實現設計目標,研究旋轉編碼器的輸出特性以及linux平臺的輸入子系統特性,并成功移植到當前設備并設計應用程序[1]。
1硬件結構及基本原理
硬件平臺以NXP的I.MX6ULL 為核心的。EC11是AB 相旋轉編碼器。在正向旋轉時A相超前B相 90°; 在編碼器反轉時,B相超前A相 90°。通過判斷A、B兩相邊沿處的電平高低就可判斷方向。
2 輸入子系統的組成
輸入設備有共同的特點,輸入子系統自下而上分為驅動層、核心層和事件處理層。驅動層是與硬件相關的實現。核心層承上啟下,為驅動層提供輸入設備注冊和操作接口。事件處理層主要和用戶空間進行交互,負責創建設備文件并將報告的事件傳遞給用戶空間[2]。最底層就是具體設備,比如按鍵,旋轉編碼器等。
3 驅動的設計與實現
設備驅動程序是 Linux 內核的一部分,它提供內核接口,運行在內核態。驅動程序主要完成如下功能:
1) 完成rotary encoder設備初始化、資源申請和釋放等操作;
2) 完成數據在內核和硬件設備間的讀取和寫入;
3) 接收應用程序傳給硬件設備的數據并返回應用程序請求的數據;
input 核心層會向 Linux 內核注冊一個字符設備,input.c 就是 input 輸入子系統的核心層。class_registe注冊一個input 類,系統啟動以后就會在/sys/class 目錄下生成 input 子 目錄。register_chrdev_region注冊一個字符設備[3]。設備驅動流程圖見圖1的左邊。
3.1引腳的配置和初始化
EC_A連接到IMX6ULL 的GPIO5_1引腳,EC_B連接到IMX6ULL的GPIO1_1引腳。
引腳的配置和初始化,是外界硬件設備和內核溝通的橋梁。使用設備樹來描述板級設備信息。
compatible = "rotary-encoder";用來和設備驅動匹配
gpios = <&gpio5 1 GPIO_ACTIVE_LOW>,<&gpio1 1 GPIO_ACTIVE_LOW>;配置rotary encoder 驅動的兩個輸入引腳,低電平有效。
3.2 驅動加載函數
輸入對象的初始化是在驅動加載入口函數內完成的。輸入對象描述了一個輸入設備,包括它可能報告的事件,使用input 子系統的時候需注冊一個input設備,input_dev結構體表示input設備。調用devm_input_allocate_device(struct input_dev*)實現input 設備的內存分配。使用input_set_capability(input, EV_REL, encoder->axis)注冊此驅動,事件為EV_REL,使旋轉編碼器支持相對坐標。之后調用input_register_device(struct input_dev*)函數實現將輸入設備注冊到輸入子系統中,并配置中斷函數。使用devm_request_threaded_irq注冊中斷,handler = &rotary_encoder_irq設定中斷函數。
3.3中斷函數的實現
中斷函數根據引腳當前的狀態和之前狀態,判斷方向并上報方向數據。用state變量來保存兩個輸入引腳的電平狀態。state=2之后state=1,判斷為順時針。state=2之后state=3,判斷為逆時針,input_report_rel(encoder->input, encoder->axis, encoder->dir)報告事件。調用函數input_sync(encoder->input)來通知輸入子系統同步到用戶層。
4用戶層應用實現
根據 Linux 下內核調用機制,實現應用程序讀取旋轉編碼器的值,有兩個值,1表示順時針旋轉,-1表示逆時針旋轉,由上層應用程序對數據進一步處理后輸出。流程如圖1的右圖。將應用程序交叉編譯后在ARM平臺上執行。此時轉動旋轉編碼器運行結果正向旋轉value=1 反向旋轉value=-1。
5結束語
本文設計并實現了Linux 下的旋轉編碼器驅動程序,實現了旋轉編碼器相對值旋轉方向檢測功能,在實際應用中運行良好,達到了預期目的。
參考文獻
[1] 屈克文,石奮蘇基于 ARM- Linux 的旋轉編碼器接口與驅動程序的設計[J] 計算機應用,2011,12:31
[2] 宋寶華.Linux設備驅動開發詳解[M].機械工業出版社,2015.7