linux-2.6.32在mini2440開發板上移植(10)之觸控式螢幕工作原理以及驅動程式詳細分析
阿新 • • 發佈:2019-01-30
第二部分輸入核心的作用如下:
(1) 呼叫input_register_device() used to 新增裝置,呼叫input_unregister_device() 除去裝置。(下面會結合觸控式螢幕驅動講述)
(2) 在/PROC 下產生相應的裝置資訊,下面這個例子即是:
/proc/bus/input/devices showing a USB mouse:
I: Bus=0003 Vendor=046d Product=c002 Version=0120
N: Name="Logitech USB-PS/2 Mouse M-BA47"
P: Phys=usb-00:01.2-2.2/input0
H: Handlers=mouse0 event2
B: EV=7
B: KEY=f0000 0 0 0 0 0 0 0 0
B: REL=103
(3) 通知事件處理器對事件進行處理
第三部分是事件處理器:
輸入子系統包括了您所需要的大所屬處理器,如滑鼠、鍵盤、joystick,觸控式螢幕,也有一個通用的處理器被叫做event handler(對於核心檔案evdev.C).需要注意的是隨著核心版本的發展,event handler 將用來處理更多的不同硬體的輸入事件。在Linux2.6.29 版本中,剩下的特定裝置事件處理就只有滑鼠和joystick。這就意味著越來越多的輸入裝置將通過event handler 來和使用者空間打交道。事件處理層的主要作用就是和使用者空間打交道,我們知道Linux 在使用者空間將所有裝置當成檔案來處理,在一般的驅動程式中都有提供fops 介面,以及在/dev 下生成相應的裝置檔案nod,而在輸入子系統的驅動中,這些動作都是在事件處理器層完成的,我們看看evdev.C 相關程式碼吧。
static int __init evdev_init(void)
{
return input_register_handler(&evdev_handler);
}
這是該模組的註冊程式,將在系統初始化時被呼叫。初始化得過程很簡單,就一句話,不過所有的祕密都被保藏在evdev_handler 中了:
static struct input_handler evdev_handler = {
.event = evdev_event,
.connect = evdev_connect,
.disconnect = evdev_disconnect,
.fops = &evdev_fops,
.minor = EVDEV_MINOR_BASE,
.name = "evdev",
.id_table = evdev_ids,
};
先看connect 函式中如下的程式碼:
snprintf(evdev->name, sizeof(evdev->name), "event%d", minor);
evdev = kzalloc(sizeof(struct evdev), GFP_KERNEL);
(1) 呼叫input_register_device() used to 新增裝置,呼叫input_unregister_device() 除去裝置。(下面會結合觸控式螢幕驅動講述)
(2) 在/PROC 下產生相應的裝置資訊,下面這個例子即是:
/proc/bus/input/devices showing a USB mouse:
I: Bus=0003 Vendor=046d Product=c002 Version=0120
N: Name="Logitech USB-PS/2 Mouse M-BA47"
P: Phys=usb-00:01.2-2.2/input0
H: Handlers=mouse0 event2
B: EV=7
B: KEY=f0000 0 0 0 0 0 0 0 0
B: REL=103
(3) 通知事件處理器對事件進行處理
第三部分是事件處理器:
輸入子系統包括了您所需要的大所屬處理器,如滑鼠、鍵盤、joystick,觸控式螢幕,也有一個通用的處理器被叫做event handler(對於核心檔案evdev.C).需要注意的是隨著核心版本的發展,event handler 將用來處理更多的不同硬體的輸入事件。在Linux2.6.29 版本中,剩下的特定裝置事件處理就只有滑鼠和joystick。這就意味著越來越多的輸入裝置將通過event handler 來和使用者空間打交道。事件處理層的主要作用就是和使用者空間打交道,我們知道Linux 在使用者空間將所有裝置當成檔案來處理,在一般的驅動程式中都有提供fops 介面,以及在/dev 下生成相應的裝置檔案nod,而在輸入子系統的驅動中,這些動作都是在事件處理器層完成的,我們看看evdev.C 相關程式碼吧。
static int __init evdev_init(void)
{
return input_register_handler(&evdev_handler);
}
這是該模組的註冊程式,將在系統初始化時被呼叫。初始化得過程很簡單,就一句話,不過所有的祕密都被保藏在evdev_handler 中了:
static struct input_handler evdev_handler = {
.event = evdev_event,
.connect = evdev_connect,
.disconnect = evdev_disconnect,
.fops = &evdev_fops,
.minor = EVDEV_MINOR_BASE,
.name = "evdev",
.id_table = evdev_ids,
};
先看connect 函式中如下的程式碼:
snprintf(evdev->name, sizeof(evdev->name), "event%d", minor);
evdev = kzalloc(sizeof(struct evdev), GFP_KERNEL);