本文主要以分析通用gpio按鍵驅動:gpio_keys.c檔案為主,將其中牽涉到linux驅動架構流程,以及架構設計思想進行分析。
【概述】gpio_keys是基於input架構實現的乙個通用gpio按鍵驅動。該驅動基於pladform_driver架構,實現了驅動和裝置分離,減少了程式的耦合性,同時提高程式的可移植性。符合linux裝置驅動模型的設計思想。工程中一般都會基於gpio_keys來寫。下面我們來理清程式的整體流程思路。
【驅動程式的分析】
step1:根據linux驅動模型,驅動檔案中該有的flow給他加上
step2:當驅動driver模組載入成功,根據compatible屬性(name)與device 匹配match成功之後,進入驅動的主入口函式probe
具體程式如下:
static
int__devinit gpio_keys_probe(structplatform_device *pdev)
platform_set_drvdata(pdev,ddata);
/* 設定input裝置屬性 */
input->name= pdev->name;
input->phys= "gpio-keys/input0"
; input->dev.parent= &pdev->dev;
input->id.bustype= bus_host;
input->id.vendor= 0x0001;
input->id.product= 0x0001;
input->id.version= 0x0100;
/*enable auto repeat feature of linux input subsystem */
if(pdata->rep)
__set_bit(ev_rep,input->evbit);
ddata->input= input;
for(i = 0; i nbuttons; i++)
/* 把gpio設為輸入 */
error= gpio_direction_input(button->gpio);
if(error
/*獲取gpio對應的中斷*/
irq= gpio_to_irq(button->gpio);
if(irq
/*註冊中斷 */
error= request_irq(irq, gpio_keys_isr,
irqf_shared |
irqf_trigger_rising | irqf_trigger_falling,
button->desc ? button->desc :"gpio_keys"
, bdata);
if(error)
if(button->wakeup)
wakeup= 1; 後續討論
/*設定裝置對事件的支援,比如設定對鍵1和鍵2的支援*/
input_set_capability(input,type, button->code);
} /*註冊input裝置*/
error= input_register_device(input);
if(error)
device_init_wakeup(&pdev->dev,wakeup);
return0;
……
returnerror;
} 1、
2、【最終實現】還需要設定具體的platform device的實現:高通和mtk平台是在dtsi裡面配置的
結構體中標綠色的項是讀取dts檔案屬性配置,其他的,如value,active_low等在**中設定。反正都是需要設定完成才能使用。
struct gpio_keys_button ,
Linux Input子系統 概述
輸入裝置總類繁雜,包括按鍵,鍵盤,觸控螢幕,滑鼠,搖桿等等,它們本身都是字元裝置,不過核心為了能將這些裝置的共性抽象出來,簡化驅動的開發,建立了乙個input子系統。input子系統分為三層,從下至上分別是輸入裝置驅動層,輸入核心層以及輸入事件驅動層。這三層中的輸入核心層和輸入事件驅動層都是核心已經...
Linux INPUT子系統實驗
按鍵 滑鼠 鍵盤 觸控螢幕都屬於輸入裝置,針對這些裝置linux核心提供了乙個叫做input的子系統框架來處理輸入時間,本質上還是字元裝置,只是在此基礎上加上了input框架,使用者只需要負責上報輸入事件,input核心層負責處理這些事件。input子系統分為input驅動層 input核心層 in...
linux input 子系統例項分析
一,前言 1,近日要寫乙個很特殊的鍵盤驅動,故對linux的input子系統分析了一番,寫下分析筆記,以防不日即忘。2,使用input子系統的一般流程為 input allocate device 申請乙個input dev裝置 初始化該input dev input register device...