小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

miscdevice、platform_device區(qū)別

 nt_bookworm 2012-08-06

miscdevice、platform_device區(qū)別?

最近研究Linux設(shè)備驅(qū)動(dòng)程序遇到混亂,請(qǐng)大俠過(guò)來(lái)理理頭緒。
Linux設(shè)備模型中:bus_type、device、device_driver
《Linux設(shè)備驅(qū)動(dòng)程序》的linux設(shè)備模型章中說(shuō)到設(shè)備模型中,所有設(shè)備都通過(guò)總線相連。
添加設(shè)備devA,必須指定其device結(jié)構(gòu)體的bus_type域,初始化其他域,然后調(diào)用device_register(&devA),將設(shè)備devA
注冊(cè)到指定總線。
添加該設(shè)備驅(qū)動(dòng)driverA,也必須指定其device_driver結(jié)構(gòu)體的bus_type域,初始化其他域,然后調(diào)用driver_register(&driverA),
將該驅(qū)動(dòng)注冊(cè)到總線上。
如果驅(qū)動(dòng)driverA和設(shè)備devA匹配成功,即調(diào)用probe函數(shù)成功,則建立他們之間的符號(hào)鏈接,即將設(shè)備與驅(qū)動(dòng)捆綁起來(lái)。
而實(shí)際我看Linux源代碼中卻大量使用platform_device,
struct platform_device {       
        const char        * name;        
        u32                id;                
        struct device        dev;       
        u32                num_resources;     
        struct resource        * resource;
};

struct platform_driver {                                                                                 
        int (*probe)(struct platform_device *);                           
        int (*remove)(struct platform_device *);                          
        void (*shutdown)(struct platform_device *);                       
        int (*suspend)(struct platform_device *, pm_message_t state);     
        int (*suspend_late)(struct platform_device *, pm_message_t state);
        int (*resume_early)(struct platform_device *);                    
        int (*resume)(struct platform_device *);                          
        struct device_driver driver;                                      
};
從結(jié)構(gòu)體可以看出,platform_device是device派生出,platform_driver是device_driver派生出
同樣添加設(shè)備PlatformDevA,初始化platform_device結(jié)構(gòu)體的dev域時(shí),沒(méi)有初始化其bus_type域,而實(shí)際將該設(shè)備添加在sys/bus/platform/devices目錄下,
在源代碼中哪里可以看到這部分代碼。
同樣添加驅(qū)動(dòng)PlatformDrvA,初始化platform_driver結(jié)構(gòu)體的driver域時(shí),沒(méi)有初始化其bus_type域,而實(shí)際將該驅(qū)動(dòng)添加在sys/bus/platform/drivers目錄下,
在源代碼中哪里可以看到這部分代碼。

還有
struct miscdevice  {                                  
        int minor;                         
        const char *name;                  
        const struct file_operations *fops;
        struct list_head list;             
        struct device *parent;             
        struct device *this_device;        
}; 
與字符型設(shè)備
struct cdev {
        struct kobject kobj;
        struct module *owner;
        const struct file_operations *ops;
        struct list_head list;
        dev_t dev;
        unsigned int count;
};
從結(jié)構(gòu)體可以看出,miscdevice是device派生出,它與platform_device區(qū)別:
1、platform_device中有設(shè)備使用的資源的信息resource。
2、miscdevice中有該設(shè)備的使用方法file_operations。

在驅(qū)動(dòng)函數(shù)初始化中注冊(cè)這個(gè)混雜設(shè)備

misc_register(&misc);

驅(qū)動(dòng)卸載時(shí),注銷這個(gè)設(shè)備

misc_deregister(&misc);


設(shè)備注冊(cè)和注銷

extern int misc_register(struct miscdevice * misc);

extern int misc_deregister(struct miscdevice *misc);

函數(shù)具體實(shí)現(xiàn)在/drivers/char/misc.c

在misc_init()函數(shù)中

調(diào)用class_create()函數(shù)創(chuàng)建了一個(gè)名misc的類,注冊(cè)了一個(gè)主設(shè)備號(hào)為10,設(shè)備名為misc的字符設(shè)備。

misc_register()函數(shù)用于注冊(cè)一個(gè)混雜設(shè)備,其主設(shè)備號(hào)為10,如果次設(shè)備號(hào)指定為MISC_DYNAMIC_MINOR將由系統(tǒng)去指定一個(gè)次設(shè)備號(hào),調(diào)用device_create創(chuàng)建設(shè)備節(jié)點(diǎn)。

misc_deregister用于注銷這個(gè)混雜設(shè)備,其中調(diào)用了device_destroy刪除設(shè)備節(jié)點(diǎn)。

所以說(shuō),混雜設(shè)備就是主設(shè)備號(hào)為10,所有的混雜設(shè)備形成一個(gè)鏈表,次設(shè)備號(hào)由注冊(cè)時(shí)指定,類名為misc,自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)的字符設(shè)備,是一種節(jié)約主設(shè)備號(hào),為驅(qū)動(dòng)程序員簡(jiǎn)化的字符設(shè)備驅(qū)動(dòng)注冊(cè)方式。


從設(shè)備驅(qū)動(dòng)源代碼中:
第一步
static struct platform_device at91sam9260_adc_device = {
    .name       = "at91_adc",
    .id     = -1,
    .dev        = {
                .platform_data  = &adc_data,
    },  
    .resource   = adc_resources,
    .num_resources  = ARRAY_SIZE(adc_resources),
};
static struct resource spi0_resources[] = {
    [0] = {
        .start  = AT91SAM9260_BASE_SPI0,
        .end    = AT91SAM9260_BASE_SPI0 + SZ_16K - 1,
        .flags  = IORESOURCE_MEM,
    },
    [1] = {
        .start  = AT91SAM9260_ID_SPI0,
        .end    = AT91SAM9260_ID_SPI0,
        .flags  = IORESOURCE_IRQ,
    },
};
//向系統(tǒng)添加此設(shè)備,注冊(cè)設(shè)備的資源
platform_device_register(&at91sam9260_adc_device);


第二步:
static struct file_operations at91_adc_fops = {
        .owner =        THIS_MODULE,
       .ioctl =        at91_adc_ioctl,
       .read =        at91_adc_readdata,       
       .open =                at91_adc_open,        
       .release =        at91_adc_release,        
};
static struct miscdevice at91_adc_dev = {        
        .minor =        MISC_DYNAMIC_MINOR,
        .name =                "adc",
        .fops =                &at91_adc_fops,
};
//向系統(tǒng)添加此設(shè)備,注冊(cè)設(shè)備的使用方法
misc_register(&at91_adc_dev);


第三步:
static struct platform_driver at91_i2c_driver = {
        .probe                = at91_adc_probe,
        .remove                = __devexit_p(at91_adc_remove),
        .suspend        = at91_adc_suspend,
        .resume                = at91_adc_resume,
        .driver                = {
                .name        = "at91_adc",
                .owner        = THIS_MODULE,
        },
};
//注冊(cè)此設(shè)備驅(qū)動(dòng)
platform_driver_register(&at91_i2c_driver);

這三個(gè)結(jié)構(gòu)體關(guān)系:
                     (基類)
                     kobject --------------------
                    /               /                     /
                   /                 /                      /
                device        cdev                   driver
               /          / (設(shè)備驅(qū)動(dòng)操作方法)           /
              /            /                                        /
    miscdevice         platform_device               platform_driver
(設(shè)備驅(qū)動(dòng)操作方法)    (設(shè)備的資源)                   (設(shè)備驅(qū)動(dòng)) 
我的疑問(wèn):
1、當(dāng)寫字符型設(shè)備驅(qū)動(dòng)時(shí),我一般只使用cdev結(jié)構(gòu)體,使用此種方式,好像無(wú)法在sysfs中顯示出該設(shè)備。
2、miscdevice是否支持字符設(shè)備和塊設(shè)備,如果使用它怎么辨別塊設(shè)備或字符設(shè)備。
3、miscdevice、platform_device、platform_driver是否可以作為通用的設(shè)備驅(qū)動(dòng)方法,由platform_device注冊(cè)設(shè)備資源
platform_driver注冊(cè)設(shè)備驅(qū)動(dòng)、miscdevice注冊(cè)設(shè)備使用方法。

來(lái)源:http://www./bbs/thread-178770-1-1.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多