国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 2622|回復: 0
打印 上一主題 下一主題

輸入子系統框架

[復制鏈接]
跳轉到指定樓層
樓主
發表于 2012-2-18 19:34:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
輸入子系統框架新人報道,試著發個帖子試試。

字符設備驅動程序框架:
1.    major
2.    file-operation
3.    register
4.    入口函數
5.    出口函數
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

如果寫的程序想很通用,要引入輸入子系統框架
輸入子系統由 輸入子系統核心層( Input Core ),驅動層和事件處理層(Event Handler)三部份組成。一個輸入事件,如鼠標移動,通過 Driver -> InputCore -> Eventhandler -> userspace 的順序到達用戶空間傳給應用程序。
        其中Input Core 即 Input Layer 由 driver/input/input.c及相關頭文件實現。對下提供了設備驅動的接口,對上提供了Event Handler層的編程接口。
具體過程需要仔細體會代碼。

這部分可以仔細看韋東山老師的視頻講解,理解會更快些,百度下有很多。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

目的:我們寫驅動的目的是為了構造一些函數,使上層可以調用,也就是構造file-operation。
先看下別人寫的驅動程序是什么樣子
drivers/input/input.c:
static int __init input_init(void)中有注冊驅動的過程,調用了
err = register_chrdev(INPUT_MAJOR, "input", &input_fops);

找一下input_fops,發現只有一個結構體,那再看看input_open_file都做了什么事情。

struct input_handler *handler = input_table[iminor(inode) >> 5];
定義一個input_handler指針,根據傳入文件的次設備號從input_table中提取出一個input_handler

new_fops = fops_get(handler->fops);//從input_handler中提取出new_fops
file->f_op = new_fops;//將new_fops賦值給當前文件的file_operations

其實目的是將打開的新的文件的fop 指向所找到的 handler的里面的fop,將兩者對應起來,這樣以后操作這個文件的fop 實際上是操作handler的里面的fop。所以這里的驅動程序最重要的是怎么來構造這個handler里面的fop,也就是怎么來構造input_table里面的東西。這樣看來input.c只是起到了一個中轉的作用。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

找到input_table數組由誰構造?在input_register_handler這個函數里面來構造
搜索內核可知:
    evdev.c,tsdev.c,joydev.c,keyboard.c,mousedev.c等文件調用了    input_register_handler,在每種設備里面,都構造了 input_handler 這種結構,我們以evdev.c為例。這些通用的文件已經將常規的操作都寫好了,也就是fop結構。
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,
};
evdev_fops 可以看到很多讀寫函數,相當于幫我們去寫了那些驅動函數。看下EVDEV_MINOR_BASE = 64,那么input_table[iminor(inode) >> 5];相當于
input_table[2].
id_table 表示這個evdev_handler里面有個列表,記錄了可以支持的硬件設備。因為這里的handler是個軟件的概念,寫的是通用的函數,最后要轉化的還是具體各種不同的硬件,比如有很多的鼠標,很多的鍵盤,這里提供一個通用的接口,開發人員要用一種新的鼠標,只要自己把硬件相關的模塊寫好就行。所以這個evdev_handler可能會支持很多硬件,要找到他跟硬件之間的聯系。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
反過來看input.c中有注冊input_handler跟注冊輸入設備的兩個過程。
**********************************************************************************************
注冊input_handler:
input_register_handler
    // 放入數組
    input_table[handler->minor >> 5] = handler;
    // 放入鏈表
    list_add_tail(&handler->node, &input_handler_list);
    // 對于每個input_dev,調用input_attach_handler
    list_for_each_entry(dev, &input_dev_list, node)
        input_attach_handler(dev, handler); // 根據input_handler的id_table判斷能否支持這個input_dev

**********************************************************************************************
注冊輸入設備:
input_register_device
    // 放入鏈表
    list_add_tail(&dev->node, &input_dev_list);
              // 對于每一個input_handler,都調用input_attach_handler
    list_for_each_entry(handler, &input_handler_list, node)
        input_attach_handler(dev, handler); // 根據input_handler的id_table判斷能否支持這個input_dev
**********************************************************************************************
兩邊是個對稱的過程。
注冊input_dev或input_handler時,會兩兩比較左邊的input_dev和右邊的input_handler,
根據input_handler的id_table判斷這個input_handler能否支持這個input_dev,
如果能支持,則調用input_handler的connect函數建立"連接
注意這里的每一種類型的設備只有一個input_handler的結構,而device的結構有很多鐘,那我們的目標就要去建立這些device.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

看下dev 跟 handler兩者怎么樣建立連接:
struct input_handle handle;  
input_handle結構是個核心的結構體,在每個設備中都建立了這個結構體,這個結構體是在input.h中定義的,這樣被很多文件調用比如evdev,里面建立了自己的input_handle結構。這個結構體里面又定義了兩種結構

struct input_dev *dev;
struct input_handler *handler;

這樣就把dev 跟handler進行了關聯(通過h_list 進行關聯)。
這樣搞清楚了之間的聯系,evdev.c,tsdev.c,joydev.c,keyboard.c,mousedev.c等文件,已經寫好了,里面是軟件的操作代碼,具體操作會用到dev設備的代碼,我們寫驅動,主要就是寫這些設備的驅動,然后將這些設備驅動進行注冊跟evdev等進行關聯就行。最后上層調用讀寫等函數,實際上是調用evdev等里面的讀寫函數,進而通過h_list 找到對應的dev函數進行操作
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线天堂新版最新版在线8 在线天堂新版在线观看 | 黄色网址免费在线观看 | 亚洲综合色在线观看 | 情欲综合网 | 青草娱乐极品免费视频 | 侠盗高飞免费完整版国语在线播放 | 国产成人+综合亚洲+天堂 | 麻豆网站免费 | 狠狠综合欧美综合欧美色 | 国产一区二区三区久久精品 | 中国xxxxx高清免费看视频 | 欧美一区2区三区4区公司贰佰 | 成人韩免费网站 | 欧美影院在线观看完整版 mp4 | 俄罗斯美女破苞 | 成人性生片全套 | 男人毛片| www.av.cn| 色8影院| 韩国毛片基地 | 国产日韩欧美亚洲 | 四虎成人精品免费影院 | 一级做性色a爰片久久毛片免费 | 欧美韩国日本一区 | 亚洲欧美婷婷 | 激情视频网址 | tom影院亚洲国产日本一区 | 精品一区二区在线欧美日韩 | 亚洲欧美日韩精品一区 | 日本中文字幕一区二区高清在线 | 茄子黄瓜石榴香蕉草莓绿巨人 | 欧美videos另类精品 | 青青青手机在线观看 | 国产精品1024在线永久免费 | 激情五月激情综合 | 欧美精品久久一区二区三区 | 久草视频国产 | 最近高清中文国语在线观看 | 91亚洲精品福利在线播放 | 91国内在线视频 | 四虎影院最新地址 |