免費谘詢熱線

13621929115
常(cháng)見問題(tí)
您的位置: 主頁 > 新聞動態 > 常見問題

展品(pǐn)展具製作

發布日(rì)期:2023-04-04 22:44瀏覽次(cì)數:

     概述在設備模型(xíng)中,Bus、Device、Device driver等等,都比較好理解,因為它們對應(yīng)了實實在在的東西,所有的邏輯都是圍繞著這(zhè)些實體展開的(de)。

    而本文所要描述的Class就有些不(bú)同了,因為它是虛擬出來的,隻是為了抽象設備的共性舉個例子展品展具製作,一些年齡相仿、需要獲(huò)取的知識相似的人,聚(jù)在一起學習,就構(gòu)成了(le)一個班級(Class)這個班(bān)級可以有自己的名稱(如295),但(dàn)如果(guǒ)離開構成它的學生(shēng)(device),它就沒有任何存在(zài)意義。

    另外,班級(jí)存在(zài)的最大意義是什麽呢?是由老師講授的(de)每一個課程(chéng)!因為老師隻需要講一遍,一個班的學生都可以聽到不然的話(例展(zhǎn)品展具製作如每個學生都在家學(xué)習),就要為每人請一個老師(shī),講授一遍(biàn)而講的內容,大(dà)多是一樣的,這就是極大的浪費。

    設備模型中的Class所提供的功能也一樣了,例如一些相似的device(學生),需要向用戶空間提供相似的接口(課程),如果每個設備的驅動都實現一遍(biàn)的(de)話,就會導致內核有大量的冗(rǒng)餘代碼,這就(jiù)是(shì)極大的浪費所以展品(pǐn)展具製作,Class說了(le),我幫你們實現吧,你們會(huì)用就行了。

    這(zhè)就是設備模型中Class的功能,再結合內核的注釋:A class is a higher-level view of a device that abstracts out low-level implementation details(incl展品展具製作ude/linux/device.h line326),就容易理解了。

    2. 數據結構描述2.1 struct classstruct class是class的抽象,它的定義如下:truct class {

        const char *name;

        struct module展品展具製作 *owner;


        const struct attribute_group **class_groups;

        const struct attribute_group **dev_groups;

        struct kobject *dev_kobj;


        展(zhǎn)品展具製作 int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env);

        char *(*devnode)(struct device *dev, umode_t *mode);


        void 展品展(zhǎn)具製作(*class_release)(struct class *class);

        void (*dev_release)(struct device *dev);


        int (*shutdown_pre)(struct device *dev);


        con展品展具製作st struct kobj_ns_type_operations *ns_type;

        const void *(*namespace)(struct device *dev);


        void (*get_ownership)(struct device *dev, k展品展具製作uid_t *uid, kgid_t *gid);


        const struct dev_pm_ops *pm;


        struct subsys_private *p;

        };

    

    其實struct class和struct bus很類似,解釋如下:name,cl展品展具製(zhì)作ass的名稱,會在“/sys/class/”目錄下體現class_atrrs,該class的默認attribute,會在class注冊到內核時,自動(dòng)在“/sys/class/xxx_class”下創建(jiàn)對應的attribute文件。

    dev_attrs,該class下每個設備的attribute,會在設展品展具製作備注冊到內核時,自動在該設備的sysfs目錄下創(chuàng)建對應的attribute文件dev_bin_attrs,類似dev_attrs,隻不(bú)過是二進製類型attribute。

    dev_kobj,表示該class下的(de)設備在/sys/dev/下的目(mù)錄,現(xiàn)在一般有char和block兩個,如果dev_kobj為N展品展具製作ULL,則默認(rèn)選擇chardev_uevent,當該class下有設備發生變化時,會調用class的uevent回(huí)調函(hán)數。

    class_release,用於release自身的回調函數dev_release,用於release class內設備的回調函(hán)數在device_release接口中,會依次檢查(chá)展品展具製作Device、Device Type以及Device所在的class,是否注冊release接口(kǒu),如果有則調用相應的(de)release接口(kǒu)release設備指針。

    p,和“Linux設備模型(6)_Bus”中struct bus結構一樣,不再說明2.2 struct class_interfacestru展品展具製作ct class_interface是這樣的一個結構:它允許(xǔ)class driver在class下(xià)有設備添加或移除(chú)的時候,調用預先設置好的回調函數(add_dev和remove_dev)。

    那調用它們做什麽呢?想做什(shí)麽(me)都行(例如修改設備的名稱),由具體的class driver實現該結構的定義如下:s展品(pǐn)展具製作truct class_interface {

        struct list_head node;

        struct class *class;


        int (*add_dev) (struct device *, struct class_interface *展品展具製(zhì)作);

        void (*remove_dev) (struct device *, struct class_interface *);

        };

    3. 功能及(jí)內部邏輯解析3.1 class的功能看完上麵(miàn)的東西,蝸蝸(wō)依舊(jiù)糊裏糊塗的,class到底提供了什麽功能?怎麽(me)使用呢?讓我(wǒ)展品展具製(zhì)作們先看一下現有Linux係統(tǒng)中有關class的狀況(這裏以input class為(wéi)例):

    root@androids:/ # ls /sys/class/input/ -l lrwxrwxrwx root root 2014-04-23 03:39 event0 -> ../../devices/pla展品展(zhǎn)具製作(zuò)tform/i2c-gpio.17/i2c-17/17-0066/max77693-muic/input/input0/event0

    lrwxrwxrwx root root 2014-04-23 03:39 event1 -> ../../devices/platform/gpio-keys.0/i展品展具製作nput/input1/event1

    lrwxrwxrwx root root 2014-04-23 03:39 event10 -> ../../devices/virtual/input/input10/event10

    lrwxrwxrwx root root 2014-04-23 03:39 ev展品展具製作ent2 -> ../../devices/platform/s3c2440-i2c.3/i2c-3/3-0048/input/input2/event2

    … lrwxrwxrwx root root 2014-04-23 03:39 event8 -> ../../devices/platform/展品展具製作soc-audio/sound/card0/input8/event8

    lrwxrwxrwx root root 2014-04-23 03:39 event9 -> ../../devices/platform/i2c-gpio.8/i2c-8/8-0020/input/input9/event9

    l展品展具製作rwxrwxrwx root root 2014-04-23 03:39 input0 -> ../../devices/platform/i2c-gpio.17/i2c-17/17-0066/max77693-muic/input/input0

    … lrwxrwxrwx root root 2014展(zhǎn)品展具製作-04-23 03:39 mice -> ../../devices/virtual/input/miceroot@androids:/ # ls /sys/devices/platform/s3c2440-i2c.3/i2c-3/3-0048/input/input2/event2/ -l

    -r--r展品(pǐn)展具製作--r-- root root 4096 2014-04-23 04:08 dev lrwxrwxrwx root root 2014-04-23 04:08 device -> ../../input2

    drwxr-xr-x root root 2014-04-23 04:08 power lrwx展(zhǎn)品展具製作rwxrwx root root 2014-04-23 04:08 subsystem -> ../../../../../../../../class/input

    -rw-r--r-- root root 4096 2014-04-23 04:08 ueventroot@androids:/ # ls展品展具製作 /sys/devices/virtual/input/mice/ -l

    -r--r--r-- root root 4096 2014-04-23 03:57 dev drwxr-xr-x root root 2014-04-23 03:57 power 

    lrwxrwxrwx root root 201展品展具製作4-04-23 03:57 subsystem -> ../../../../class/input -rw-r--r-- root root 4096 2014-04-23 03:57 uevent

    看上麵的(de)例子,發現(xiàn)input class也沒(méi)做什麽實實在在(zài)的事兒,它(input class)的(de)功能展品展具製作,僅僅是:在/sys/class/目錄下,創建一個本class的目錄(input) 在本(běn)目錄下,創建每一個屬於該class的設備的符號鏈接(如(rú),把“sys/devices/platform/s3c2440-i2c.3/i2c-3/3-0048/input/input2/event2”設備鏈接到”/s展品展具製作(zuò)ys/class/input/event2”),這樣就可以在本class目(mù)錄下,訪(fǎng)問該(gāi)設備的(de)所有特性(即attribute) 另外,device在sysfs的目錄下,也(yě)會創建一個subsystem的符號鏈接,鏈接到本class的(de)目錄

    3.2 class的注冊class的注(zhù)冊,是由__class_reg展品(pǐn)展具製作ister接口(它的實現位於"drivers/base/class.c, line 609")實(shí)現的,它的處理邏輯和(hé)bus的注冊類(lèi)似,主要包(bāo)括:

    為class結(jié)構中的struct subsys_private類型的指針(cp)分配空間,並初始化其中的字(zì)段,包括cp->subsys.kobj.kset、展品(pǐn)展具(jù)製作cp->subsys.kobj.ktype等等 調用kset_register,注(zhù)冊該(gāi)class(回憶(yì)“Linux設備模型(xíng)(6)_Bus”中的描述,一個class就是一個子係統,因此注冊class也是(shì)注冊子係統)。

    該過程結束後,在/sys/class/目錄下,就會(huì)創建對應該class(子係統)的目錄展品展具製作 調用add_class_attrs接口,將class結構中(zhōng)class_attrs指針所指(zhǐ)向的attribute,添加到內核中。

    執行完後,在/sys/class/xxx_class/目錄下,就會看到這些attribute對應的文件3.3 device注冊時,和class有(yǒu)關的動作在"Linux設備模展品展(zhǎn)具製作型(5)_device和device driver”中,www.17C.com有講過struct device和struct device_driver這兩個數據(jù)結(jié)構,其中struct device結(jié)構會包含(hán)一個struct class指針(這從側麵說明了class是device的集(jí)合,甚至,class可以是devi展品展具製作(zuò)ce的driver)。

    當某個class driver向內核注冊了一個class後,需要使用該class的device,通過把自身(shēn)的class指針指向該class即可(kě),剩下的事情,就由內核在注冊device時處理了device的注冊最終是由device_add接口(drivers/base/core.展品展(zhǎn)具製作c)實現了,該接口中和class有關的動作包括:

    調(diào)用device_add_class_symlinks接口(kǒu),創建3.1小節描述的各種符(fú)號鏈接,即:在對應class的目錄下,創(chuàng)建指向device的符號鏈接;在device的目錄下,創建名稱為(wéi)subsystem、指向對應class目錄的(de)符號鏈接 調用de展品展具製作vice_add_attrs,添(tiān)加由class指定的attributes(class->dev_attrs) 如(rú)果存在對(duì)應該class的add_dev回調函數,調用該回(huí)調函數(shù)


標簽:

產品推薦

Copyright © 2002-2020 上海潤之模型設計有限公司 版權所有(yǒu) 展示模型,展品模型,展廳模型,展示道具,展廳展品(pǐn),展品道具,模型定製,模型(xíng)公司,上海模型公司 備案號(hào):滬ICP備20018260號

13621929115
网站地图 www.17C.com_17.C-起草网登录在线_17c.一起草 在线观看视频_17c.com免费观看入口