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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

sysfs platform總線

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:60266 發(fā)表于 2014-8-18 02:25 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
sysfs 文件系統(tǒng)linux2.6內(nèi)核引入sysfs文件系統(tǒng),sysfs可以看成與proc,devfs和devpty同類(lèi)別的文件系統(tǒng),該文件系統(tǒng)是虛擬的文件系統(tǒng),可以更方便對(duì)系統(tǒng)設(shè)備進(jìn)行管理。它可以產(chǎn)生一個(gè)包含所有系統(tǒng)硬件層次視圖,與提供進(jìn)程和狀態(tài)信息的proc文件系統(tǒng)十分類(lèi)似。sysfs把連接在系統(tǒng)上的設(shè)備和總線組織成為一個(gè)分級(jí)的文件,它們可以由用戶(hù)空間存取,向用戶(hù)空間導(dǎo)出內(nèi)核的數(shù)據(jù)結(jié)構(gòu)以及它們的屬性。sysfs的一個(gè)目的就是展示設(shè)備驅(qū)動(dòng)模型中各組件的層次關(guān)系,其頂級(jí)目錄包括block,bus,drivers,class,power和firmware等.

它把實(shí)際連接到系統(tǒng)上的設(shè)備和總線組織成一個(gè)分級(jí)的文件,用戶(hù)空間的程序同樣可以利用這些信息以實(shí)現(xiàn)和內(nèi)核的交互,該文件系統(tǒng)是當(dāng)前系統(tǒng)上實(shí)際設(shè)備樹(shù)的一個(gè)直觀反應(yīng),它是通過(guò)kobject子系統(tǒng)來(lái)建立這個(gè)信息的,當(dāng)一個(gè)kobject被創(chuàng)建的時(shí)候,對(duì)應(yīng)的文件和目錄也就被創(chuàng)建了,位于 /sys下的相關(guān)目錄下,既然每個(gè)設(shè)備在sysfs中都有唯一對(duì)應(yīng)的目錄,那么也就可以被用戶(hù)空間讀寫(xiě)了。你可能根本沒(méi)有去關(guān)心過(guò)sysfs文件系統(tǒng)的掛載過(guò)程,它是這樣被掛載的。mount -t sysfs sysfs /sys
sysfs是一個(gè)特殊文件系統(tǒng),并沒(méi)有一個(gè)實(shí)際存放文件的介質(zhì)。sysfs的信息來(lái)源是kobject層次結(jié)構(gòu),讀一個(gè)sysfs文件,就是動(dòng)態(tài)的從kobject結(jié)構(gòu)提取信息,生成文件。重啟后里面的信息當(dāng)然就沒(méi)了
sysfs文件系統(tǒng)與kobject結(jié)構(gòu)緊密關(guān)聯(lián),每個(gè)在內(nèi)核中注冊(cè)的kobject對(duì)象都對(duì)應(yīng)于sysfs文件系統(tǒng)中的一個(gè)目錄。Kobject 是Linux 2.6引入的新的設(shè)備管理機(jī)制,在內(nèi)核中由struct kobject表示。通過(guò)這個(gè)數(shù)據(jù)結(jié)構(gòu)使所有設(shè)備在底層都具有統(tǒng)一的接口,kobject提供基本的對(duì)象管理,是構(gòu)成Linux2.6設(shè)備模型的核心結(jié)構(gòu),Kobject是組成設(shè)備模型的基本結(jié)構(gòu)。類(lèi)似于C++中的基類(lèi),它嵌入于更大的對(duì)象的對(duì)象中,用來(lái)描述設(shè)備模型的組件。如bus,devices, drivers 等。都是通過(guò)kobject連接起來(lái)了,形成了一個(gè)樹(shù)狀結(jié)構(gòu)。這個(gè)樹(shù)狀結(jié)構(gòu)就與/sys向?qū)?yīng)。
sysfs就是利用VFS的接口去讀寫(xiě)kobject的層次結(jié)構(gòu),建立起來(lái)的文件系統(tǒng)。 kobject的層次結(jié)構(gòu)的注冊(cè)與注銷(xiāo)XX_register()形成的。文件系統(tǒng)是個(gè)很模糊廣泛的概念, linux把所有的資源都看成是文件,讓用戶(hù)通過(guò)一個(gè)統(tǒng)一的文件系統(tǒng)操作界面,也就是同一組系統(tǒng)調(diào)用,對(duì)屬于不同文件系統(tǒng)的文件進(jìn)行操作。這樣,就可以對(duì)用戶(hù)程序隱藏各種不同文件系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié),為用戶(hù)程序提供了一個(gè)統(tǒng)一的,抽象的,虛擬的文件系統(tǒng)界面,這就是所謂"VFS(Virtual Filesystem Switch)"。這個(gè)抽象出來(lái)的接口就是一組函數(shù)操作。
我們要實(shí)現(xiàn)一種文件系統(tǒng)就是要實(shí)現(xiàn)VFS所定義的一系列接口,file_operations, dentry_operations, inode_operations等,供上層調(diào)用。file_operations是描述對(duì)每個(gè)具體文件的操作方法(如:讀,寫(xiě)),dentry_operations結(jié)構(gòu)體指明了VFS所有目錄的操作方法, 而inode_operations提供所有結(jié)點(diǎn)的操作方法。
舉個(gè)例子,我們寫(xiě)C程序,open(“hello.c”, O_RDONLY),它通過(guò)系統(tǒng)調(diào)用的流程是這樣的
open() -> 系統(tǒng)調(diào)用-> sys_open() -> filp_open()-> dentry_open() -> file_operations->open()         
不同的文件系統(tǒng),調(diào)用不同的file_operations->open(),在sysfs下就是sysfs_open_file()。
我們使用不同的文件系統(tǒng),就是將它們各自的文件信息都抽象到dentry和inode中去。這樣對(duì)于高層來(lái)說(shuō),我們就可以不關(guān)心底層的實(shí)現(xiàn),我們使用的都是一系列標(biāo)準(zhǔn)的函數(shù)調(diào)用。這就是VFS的精髓,實(shí)際上就是面向?qū)ο蟆?br /> 注意sysfs是典型的特殊文件。它存儲(chǔ)的信息都是由系統(tǒng)動(dòng)態(tài)的生成的,它動(dòng)態(tài)的包含了整個(gè)機(jī)器的硬件資源情況。從sysfs讀寫(xiě)就相當(dāng)于向 kobject層次結(jié)構(gòu)提取數(shù)據(jù)。

Linux內(nèi)核驅(qū)動(dòng)的的platform機(jī)制
虛擬總線platform簡(jiǎn)介

 從Linux 2.6起引入了一套新的驅(qū)動(dòng)管理和注冊(cè)機(jī)制:platform_device和platform_driver。Linux中大部分的設(shè)備驅(qū)動(dòng),都可以使用這套機(jī)制,設(shè)備用platform_device表示,驅(qū)動(dòng)用platform_driver進(jìn)行注冊(cè)。
 Linux platform. driver機(jī)制和傳統(tǒng)的device driver 機(jī)制(通過(guò)driver_register函數(shù)進(jìn)行注冊(cè))相比,一個(gè)十分明顯的優(yōu)勢(shì)在于platform機(jī)制將設(shè)備本身的資源注冊(cè)進(jìn)內(nèi)核,由內(nèi)核統(tǒng)一管理,在驅(qū)動(dòng)程序中使用這些資源時(shí)通過(guò)platform. device提供的標(biāo)準(zhǔn)接口進(jìn)行申請(qǐng)并使用。這樣提高了驅(qū)動(dòng)和資源管理的獨(dú)立性,并且擁有較好的可移植性和安全性(這些標(biāo)準(zhǔn)接口是安全的)。platform機(jī)制的本身使用并不復(fù)雜,由兩部分組成:platform_device和platfrom_driver。通過(guò)platform機(jī)制開(kāi)發(fā)底層設(shè)備驅(qū)動(dòng)的大致流程如圖所示。


platform_device簡(jiǎn)介

linux發(fā)明的platform虛擬總線,相應(yīng)的設(shè)備叫做
platform_device,相應(yīng)的驅(qū)動(dòng)叫做
platfrom_driver。

    platform_device結(jié)構(gòu)體描述設(shè)備的名稱(chēng)、資源信息等。該結(jié)構(gòu)被定include/linux/platform_device.h中,     定義的結(jié)構(gòu)體原型如下:

        struct platform_device {

               const char * name;    //定義平臺(tái)設(shè)備的名稱(chēng)

               int id;

               struct device dev;

               u32 num_resources;

               struct resource * resource; //定義平臺(tái)設(shè)備的資源。

        };

    最重要的一個(gè)成員struct resource * resource。struct resource被定義在include/linux/ioport.h中,定義原型如下:

       struct resource {

               resource_size_t start;  //定義資源的起始地址

               resource_size_t end;  //定義資源的結(jié)束地址

               const char *name;    //定義資源的名稱(chēng)

               unsigned long flags; //定義資源的類(lèi)型,比如MEM,IO,IRQ,DMA類(lèi)型

               struct resource *parent, *sibling, *child;  //資源鏈表指針

        };

    以RTC驅(qū)動(dòng)為例(為什么用RTC,RTC是一個(gè)標(biāo)準(zhǔn)的plartform device,機(jī)制是相同的,但是相對(duì)比較簡(jiǎn)單)
    在arch/arm/mach-sep4020/devices.c中加入rtc的plartform_device結(jié)構(gòu)體和resources結(jié)構(gòu)體:
        static struct resource sep4020_rtc_resource[] = {
              [0] = { .start = RTC_BASE_V,
                      .end   = RTC_BASE_V+ 0x2f,
                      .flags = IORESOURCE_MEM,
                    }
              [1] = {
                      .start = INTSRC_RTC,
                      .end   = INTSRC_RTC,
                      .flags = IORESOURCE_IRQ,
                    }
        };
        struct platform_device sep4020_device_rtc = {
              .name            = "sep4020_rtc",
              .id              = -1,
              .num_resources   = ARRAY_SIZE(sep4020_rtc_resource),
             .resource        = sep4020_rtc_resource,
        };   
    然后再通過(guò)4020.c文件中的__initdata設(shè)備數(shù)組將這個(gè)plartform_device結(jié)構(gòu)體注冊(cè)進(jìn)去了:
        static struct platform_device *devices[] __initdata = {
               &serial_device,
             &sep4020_device_rtc,
               &epson_ohci_device,
               &sep4020_device_usbgadget
        };  
    platform_add_devices(devices, ARRAY_SIZE(devices)); 通過(guò)調(diào)用platform_add_devices()向系統(tǒng)中添加該設(shè)備了,該函數(shù)內(nèi)部調(diào)用platform_device_register( )進(jìn)行設(shè)備注冊(cè)。要注意的是,這里的platform_device設(shè)備的注冊(cè)過(guò)程必須在相應(yīng)設(shè)備驅(qū)動(dòng)加載之前被調(diào)用,即執(zhí)行platform_driver_register()之前,原因是驅(qū)動(dòng)注冊(cè)時(shí)需要匹配內(nèi)核中所有已注冊(cè)的設(shè)備名。(后面會(huì)詳細(xì)介紹device和driver之間是如何通過(guò)注冊(cè)的名字進(jìn)行連接的)
                                                           platform_driver簡(jiǎn)介

   platform_driver結(jié)構(gòu)體的原型定義,在include/linux/platform_device.h中,代碼如下:

         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;
         };
   內(nèi)核提供的platform_driver結(jié)構(gòu)體的注冊(cè)函數(shù)為platform_driver_register()
   其原型定義在driver/base/platform.c文件中,具體實(shí)現(xiàn)代碼如下:
         int platform_driver_register(struct platform_driver *drv)
         {
             drv->driver.bus = &platform_bus_type;
             if (drv->probe)  
                 drv->driver.probe = platform_drv_probe;
             if (drv->remove)
                 drv->driver.remove = platform_drv_remove;
             if (drv->shutdown)
                 drv->driver.shutdown = platform_drv_shutdown;
             if (drv->suspend)
                 drv->driver.suspend = platform_drv_suspend;
             if (drv->resume)
                 drv->driver.resume = platform_drv_resume;
             return driver_register(&drv->driver);
         }
    總結(jié),通常情況下只要和內(nèi)核本身運(yùn)行依賴(lài)性不大的外圍設(shè)備,相對(duì)獨(dú)立的,擁有各自獨(dú)自的資源(地址總線和IRQs),都可以用platform_driver實(shí)現(xiàn)。如:LCD,網(wǎng)卡、USB、UART等,都可以用platfrom_driver寫(xiě),而timer,irq等小系統(tǒng)之內(nèi)的設(shè)備則最好不用platfrom_driver機(jī)制。






分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品污www一区二区三区 | 四虎影视在线 | 麻豆国产一区二区三区四区 | 国产精品视频一区二区三区, | 国产精品国产自产拍高清 | 欧美日韩成人网 | 日韩视频 中文字幕 | 日韩一区精品 | www国产亚洲精品久久网站 | 在线视频一区二区 | 亚洲国产精品久久久 | 九九伦理电影 | 狠狠狠色丁香婷婷综合久久五月 | 亚州成人 | 美日韩中文字幕 | 日韩视频在线一区 | 国产四区 | 国产精品九九九 | 国产精品久久久久久久久久 | 国产农村妇女精品一区 | 在线观看的av | 国产精品区二区三区日本 | 看片91 | 国产精品一区二区av | 五月天婷婷久久 | 性天堂网 | 日韩av第一页 | 天天草草草 | 国产美女精品 | 日韩毛片在线免费观看 | 国产乱码精品一区二区三区忘忧草 | 第一区在线观看免费国语入口 | 欧美日韩综合一区 | 在线看免费 | 高清视频一区二区三区 | 久久高清 | 国产日产精品一区二区三区四区 | 在线免费视频一区 | 日韩欧美一区二区在线播放 | 毛片黄 | 一级爱爱片|