久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4603|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

輸入子系統(tǒng)框架

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:34461 發(fā)表于 2012-2-18 19:46 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

輸入子系統(tǒng)框架

新人報(bào)道,試著發(fā)個(gè)帖子試試。

字符設(shè)備驅(qū)動程序框架:
1.    major
2.    file-operation
3.    register
4.    入口函數(shù)
5.    出口函數(shù)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

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

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

找一下input_fops,發(fā)現(xiàn)只有一個(gè)結(jié)構(gòu)體,那再看看input_open_file都做了什么事情。

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

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

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

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

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

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

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

struct input_dev *dev;
struct input_handler *handler;

這樣就把dev 跟handler進(jìn)行了關(guān)聯(lián)(通過h_list 進(jìn)行關(guān)聯(lián))。
這樣搞清楚了之間的聯(lián)系,evdev.c,tsdev.c,joydev.c,keyboard.c,mousedev.c等文件,已經(jīng)寫好了,里面是軟件的操作代碼,具體操作會用到dev設(shè)備的代碼,我們寫驅(qū)動,主要就是寫這些設(shè)備的驅(qū)動,然后將這些設(shè)備驅(qū)動進(jìn)行注冊跟evdev等進(jìn)行關(guān)聯(lián)就行。最后上層調(diào)用讀寫等函數(shù),實(shí)際上是調(diào)用evdev等里面的讀寫函數(shù),進(jìn)而通過h_list 找到對應(yīng)的dev函數(shù)進(jìn)行操作
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:27916 發(fā)表于 2012-2-18 20:24 | 只看該作者
一般設(shè)計(jì)到系統(tǒng)的東西,才會有所謂的分層,如果是單片機(jī)的話,只有函數(shù)
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 九九九久久久 | 午夜在线视频观看 | 色综合久久88 | 天天射一射 | 日韩中文字幕在线 | 一级特黄视频 | 国产丝袜av| 国内外成人免费视频 | 天天舔天天操 | 男女视频免费 | 日本一级片在线观看 | 亚洲狠狠| 日本特黄特色aaa大片免费 | 91免费看视频 | 国产视频一二区 | 中国第一毛片 | 黄色在线小视频 | 黄色录像免费观看 | 精品久久久久久一区二区里番 | 成人伊人网 | 亚洲最大黄色网址 | 国产传媒视频在线观看 | 中国a一片一级一片 | 黄色免费在线视频 | av一二三区 | 国语对白做受欧美 | 欧美黄色免费 | 麻豆精品一区 | 国产小视频在线 | 久久久久久久97 | 免费啪视频 | 无套内谢的新婚少妇国语播放 | 成人一级黄色片 | 一区二区视频在线 | 国产aaaaaa| 热久久中文字幕 | 日韩视频一区二区三区 | 国产传媒在线播放 | 国产剧情在线 | 天堂va蜜桃一区二区三区 | 天天操网|