本次介紹linux的輸入子系統的驅動開發.
linux 核心的輸入子系統為滑鼠、鍵盤、觸控螢幕、遊戲杆等輸入裝置提供了驅動框架。 當程式設計師要為自己的輸入裝置編寫驅動程式時,只需要實現從裝置獲取輸入事件即可。至於 輸入事件如何處理,使用者介面如何實現,都由輸入子系統完成。這大大減輕了輸入驅動程式 的編碼工作,也提高了驅動程式的穩健性。
同時輸入子系統為所有輸入裝置都為應用層提供了標準的介面,這大大提高了驅動程式 的易用性。
輸入子系統的驅動**在核心的目錄下。
輸入子系統構成
輸入子系統的實現需要滿足以下需求:
(1) 輸入子系統要為每個輸入裝置都在/dev/ 目錄下生成乙個裝置檔案,以方便應用程式 讀取指定輸入裝置產生的事件;
(2) 對於每乙個輸入裝置,在輸入子系統只需要實現其事件獲取即可,至於事件如何處理、如何到達裝置檔案則不需要考慮;
(3) 在linux 輸入裝置的可以分為事件類(如usb 滑鼠、usb 鍵盤、觸控螢幕等)、mouse 類(特指 ps/2 介面的輸入裝置)、遊戲杆等型別,為這些輸入裝置而實現的裝置檔案的介面必須有所差別。因此輸入子系統需要為不同型別的輸入裝置實現正確的裝置檔案介面。
本次將通過開發乙個簡單的輸入子系統**來了解輸入子系統,本次結合平台匯流排 + 輸入子系統的方式開發,以下是相關**:
先定義乙個標頭檔案:
#ifndef __plat_input_h__
#define __plat_input_h__
struct key_info ;
struct key_platdata ;
#endif
輸入子系統平台裝置資訊**:
輸入子系統平台裝置驅動**:#include #include #include #include #include #include #include "key_info.h"
struct key_info key_pdesc[4] = ,
[1] = ,
[2] = ,
[3] = ,
};struct key_platdata key_pdev_info = ;
struct platform_device key_input_pdev = ,
};static void __exit
key_platdev_exit(void)
static int __init
key_platdev_init(void)
module_init(key_platdev_init);
module_exit(key_platdev_exit);
module_license("dual bsd/gpl");
使用者層測試**:#include #include #include #include #include #include #include #include "key_info.h"
struct key_platdata *key_plat_info = null;
struct input_dev *key_inputdev = null;
irqreturn_t
key_input_irq(int irqno, void *devid)
else
}input_sync(key_inputdev);
return irq_handled;
}int
key_input_remove(struct platform_device *pdev)
int
key_input_probe(struct platform_device *pdev)
// 2, 初始化input_device物件
// 2.1, 設定能產生哪些型別的資料
__set_bit(ev_key, key_inputdev->evbit);
// 2.2, 設定能產生哪些鍵值
__set_bit(key_up, key_inputdev->keybit);
__set_bit(key_down, key_inputdev->keybit);
__set_bit(key_left, key_inputdev->keybit);
__set_bit(key_right,key_inputdev->keybit);
// 3, 註冊input device物件
ret = input_register_device(key_inputdev);
if(0 != ret)
// 4, 硬體初始化-->申請中斷
for(i = 0; i < key_plat_info->num; i++)
}return 0;
err2:
input_unregister_device(key_inputdev);
err1:
input_free_device(key_inputdev);
return ret;
}const struct platform_device_id key_id_table = ,
,};struct platform_driver key_input_pdrv = ,
.id_table = key_id_table,
};static void __exit
key_platdrv_exit(void)
static int __init
key_platdrv_init(void)
module_init(key_platdrv_init);
module_exit(key_platdrv_exit);
module_license("dual bsd/gpl");
最後是makefile檔案:#include #include #include #include #include #include #include int main(void)
for(;;)
if(ev_key == event.type)
} }if(close(fd) < 0)
return 0;
}
就這麼多吧.#linux源**路徑
kernel_dir = /home/george/1702/exynos/linux-3.5
#指定當前路徑
cur_dir = $(shell pwd)
module = plat_input_dev
module2 = plat_input_drv
all:
make -c $(kernel_dir) m=$(cur_dir) modules
clean:
make -c $(kernel_dir) m=$(cur_dir) clean
install:
#指定編譯當前目錄下哪個原始檔
obj-m = $(module).o
obj-m += $(module2).o
Tiny4412 在linux下的dnw使用
將tiny4412的usb線 串列埠線與電腦連線,在win7 虛擬機器ubuntu的環境下,在win7環境中用驅動精靈裝上串列埠的驅動,在虛擬機器中應該就能檢測到串列埠,我這裡採用的是usb轉串列埠驅動,在ubuntu中用lsusb命令可以查詢到是否檢測到串列埠,如下圖 解壓縮,之後會看到dnw l...
tiny4412 從u boot開始(一)
準備業餘時間把armv7 contex a9 的exynos4412從頭搞一下。之前學了一些簡單的彙編指令,現在開始在uboot啟動後進行裸板測試。原始碼 uboot tiny4412 20130729.tgz 先關閉mmu diff git a board samsung tiny4412 con...
4412 Linux驅動入門01
作為一名嵌入式開發工程師,學習linux是必要的。當初我在校培訓linux s3c2410開發板,結論 迷迷糊糊。所以打算從 根 上去學習,結果走上了微控制器 智慧型家居的路上。幸好目前有幸接觸linux開發專案。從頭把linux在搞一遍,成為一名合格的嵌入式開發工程師。今天要使用的板子是4412,...