友善之臂210矩陣鍵盤驅動分析與移植

2021-06-23 00:08:35 字數 4308 閱讀 7740

首先要介紹一下linux中input子系統的模型,一圖勝千言,所以直接上圖。

上圖一目了然,我們的鍵盤驅動就是工作在input子系統的最低層。單純地從驅動角度講,

我們的工作就是最終呼叫input_event()這個函式,把掃瞄到的鍵值傳遞給input core層。然後

的事情就不是我們考慮的了,這樣一來感覺很輕鬆的樣子。

好吧!正式開工了!首先說明一下硬體環境,我用的是友善之臂的tiny210開發板。出廠

配置的核心是沒有加入矩陣鍵盤的。不過驅動**是有的,所以在menuconfig裡面配置矩陣

鍵盤。        說實話,這工作真的很弱智的樣子。為什麼呢?因為210處理器上是有乙個鍵盤控制器一

樣的東西。什麼掃瞄,消抖都是硬體在幹。唯一需要改動的地方就是鍵盤的鍵值表。預設的驅

動裡面只用4*4的鍵值資料,但是我要用的鍵盤要8*8才行。

然後我們分析一下驅動的結構,鍵盤在210上是作為乙個平台裝置存在的。那麼我們就說

說這個平台裝置的驅動模型。平台裝置就相當於一條匯流排上的裝置,不過這條匯流排是抽象的。

平台裝置模型開發底層裝置驅動的大致流程如下:

platform_device定義:

一般都在linux-3.0.8\arch\arm\plat-samsung和

linux-3.0.8\arch\arm\plat-s5pv目錄下面

samsung下面可能是比較通用的平台裝置,而另乙個

就是比較專用的了

註冊平台裝置platform_add_devices():

這是由210的初始化函式統一註冊起來的。

定義平台裝置驅動platform_driver:

這裡的驅動都分布在driver的目錄下

如samsung-keypad.c

註冊平台裝置驅動platform_driver_register():

這個函式是在驅動的模組載入函式中呼叫的

同理,platform_driver_unregister()是在驅動解除安裝函式中呼叫的

匹配裝置和驅動platform_match():

這個函式是被platform_driver_register()呼叫的

這個函式會檢查所有的platform_device,如果找到了匹配的裝置

就呼叫platform_driver的探測函式probe()

platform_driver->probe():

這個函式中完成了很多任務,資源申請,初始化驅動中的各種數

據結構,算是比較重要的一環。完成這個函式的之後,驅動就基本

可以正常工作了。

我們就順著這個流程來讀讀**,首先是platform_device的定義。來看看linxu/arch/arm/

plat-samsung/裡面有什麼,發現了dev-keypad.c,一看就知道是我想要的。**如下:

#include #include #include #include #include #include static struct resource samsung_keypad_resources = ,

[1] = ,

};struct platform_device samsung_device_keypad = ;

void __init samsung_keypad_set_platdata(struct samsung_keypad_platdata *pd)

這裡面定義了矩陣鍵盤的結構體,還有就是矩陣鍵盤占用的io和中斷資源。裝置定義有了,

誰新增它呢?不急,看看linux/arch/arm/mach-s5pv210下的mach-mini210.c。這個檔案可是

210的命根子呀!擷取一段**來看看。

static void __init mini210_machine_init(void)

這platform_add-devices()是找到了,可這mini210_devices和

samsung_device_keypad

又是什麼關係呢?再貼**,還是在mach-mini210.c中。

static struct platform_device *mini210_devices __initdata = ;
這下就清楚了,mini210_devices是乙個指標陣列,指向了各種platform_device,然後平

臺裝置就成功註冊了。下一步,繼續走到platform_driver。這個驅動很好找,就是linux/driver/

input目錄下面的samsung-keypad.c。又要貼**了,我盡量少貼點。。

static bool samsung_keypad_report(struct samsung_keypad *keypad,

unsigned int *row_state)

} input_sync(keypad->input_dev);

} memcpy(keypad->row_state, row_state, sizeof(keypad->row_state));

return key_down;

}static struct platform_driver samsung_keypad_driver = ,

.id_table = samsung_keypad_driver_ids,

};static int __init samsung_keypad_init(void)

module_init(samsung_keypad_init);

static void __exit samsung_keypad_exit(void)

module_exit(samsung_keypad_exit);

一切都是很有規律,這個驅動在載入的時候就呼叫了platform_driver_register()。然後驅

動就開始在裝置列表中苦苦尋找他的她——platform_device。他們怎麼能找到對方呢?因為驅

動知道裝置的名字,就存放在那個id_table裡面。所以他們一定有情人終成眷屬了,核心真是

個好月老,不像真實世界。。。

驅動和裝置結合之後,就會呼叫驅動裡面的probe函式,這個函式真的是非常厲害,把很

多事情自己乙個人幹了。然後呢?走走初始化什麼的,驅動基本就可以工作了。遇到中斷,掃

描,匯報鍵值,生活就是這樣過了下去,有點無聊,好像。。。

工作流程就是這樣了,那麼說好的移植呢?說好的鍵值表呢?嘿嘿,馬上就來!我還是貼

貼probe()的**吧!他幹了不少活呢!

static int __devinit samsung_keypad_probe(struct platform_device *pdev)

row_shift = get_count_order(pdata->cols);

keymap_size = (pdata->rows << row_shift) * sizeof(keypad->keycodes[0]);

keypad = kzalloc(sizeof(*keypad) + keymap_size, gfp_kernel);

input_dev = input_allocate_device();

matrix_keypad_build_keymap(keymap_data, row_shift,

input_dev->keycode, input_dev->keybit);

//略//

}

看出來了一切都在這個keymap_data中,那麼他是哪兒來的呢?其實我們並不陌生,剛剛

擦肩而過。回到mach-mini210.c,它還在那裡。

static uint32_t mini210_keymap __initdata = ;

static struct matrix_keymap_data mini210_keymap_data __initdata = ;

static struct samsung_keypad_platdata mini210_keypad_data __initdata = ;

就是它,嘿嘿!看來只要改掉這個mini210_keymap裡面的東西,就大功告成了。這簡直

太easy了吧!開啟linux-*.*.*/include/linux/input.h。根據需要填表就好了。所以一切就這樣結束

了。       (後邊,我想再寫寫input子系統後面的東西,比如input core和evdev。)

友善之臂 U boot

1.嵌入式linux系統 乙個嵌入式系統從軟體角度來看分為三個層次 1 引導引導程式 包括固話在韌體 firmware 中的boot程式 可選 和bootloader兩大部分 2 linux核心kernel 特定於嵌入式平台的定製核心 3 根檔案系統 包括系統命令和應用程式 2.嵌入式linux系統...

關於友善之臂Tiny210電容屏移植tslib

bin sh export tslib tsdevice dev touchscreen 1wire export tslib conffile etc ts.conf export tslib plugindir usr lib ts export tslib calibfile etc poin...

友善之臂 開發環境準備

1.nor flash燒寫 需要工具 jlink v8 jlink flash工具燒寫superboot.bin檔案,這樣進入nor flash後才能進入superboot模式,才能使用minitools識別裝置,並且用minitools工具燒寫系統或者裸機程式 2.nand flash燒寫 暫時未...