新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之:塊設(shè)備驅(qū)動(dòng)編程

        嵌入式Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之:塊設(shè)備驅(qū)動(dòng)編程

        作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò) 收藏

        本文引用地址:http://www.104case.com/article/257109.htm

        3.塊設(shè)備注冊(cè)和初始化

        塊設(shè)備的初始化過(guò)程要比字符設(shè)備復(fù)雜,它既需要像字符設(shè)備一樣在加載內(nèi)核時(shí)完成一定的工作,還需要在內(nèi)核編譯時(shí)增加一些內(nèi)容。塊程序初始化時(shí),由驅(qū)動(dòng)程序的init()完成。

        塊設(shè)備的初始化過(guò)程如圖11.6所示。

        圖11.6塊程序初始化過(guò)程

        (1)向內(nèi)核注冊(cè)。

        使用register_blkdev()函數(shù)對(duì)設(shè)備進(jìn)行注冊(cè)。

        intregister_blkdev(unsignedintmajor,constchar*name);

        其中參數(shù)major為要注冊(cè)的塊設(shè)備的主設(shè)備號(hào),如果其值等于0,則系統(tǒng)動(dòng)態(tài)分配并返回主設(shè)備號(hào)。參數(shù)name為設(shè)備名,在/proc/devices中顯示。如果出錯(cuò),則該函數(shù)返回負(fù)值。

        與其對(duì)應(yīng)的塊設(shè)備的注銷(xiāo)函數(shù)為unregister_blkdev(),其格式如下所示。

        intunregister_blkdev(unsignedintmajor,constchar*name);

        其參數(shù)必須與注冊(cè)函數(shù)中的參數(shù)相同。如果出錯(cuò)則返回負(fù)值。

        (2)申請(qǐng)并初始化請(qǐng)求隊(duì)列。

        這一步要調(diào)用blk_init_queue()函數(shù)來(lái)申請(qǐng)并初始化請(qǐng)求隊(duì)列,其格式如下所示。

        structrequest_queue*blk_init_queue(request_fn_proc*rfn,spinlock_t*lock)

        其中參數(shù)rfn是請(qǐng)求隊(duì)列的處理函數(shù)指針,它負(fù)責(zé)執(zhí)行塊設(shè)備的讀、寫(xiě)請(qǐng)求。參數(shù)lock為自旋鎖,用于控制對(duì)所分配的隊(duì)列的訪問(wèn)。

        (3)初始化并注冊(cè)gendisk結(jié)構(gòu)。

        內(nèi)核提供的gendisk結(jié)構(gòu)相關(guān)函數(shù)如表11-16所示。

        表11-16 gendisk結(jié)構(gòu)相關(guān)函數(shù)

        函數(shù)格式

        說(shuō)明

        structgendisk*alloc_disk(intminors)

        動(dòng)態(tài)分配gendisk結(jié)構(gòu),參數(shù)為次設(shè)備號(hào)的個(gè)數(shù)

        voidadd_disk(structgendisk*disk)

        向系統(tǒng)注冊(cè)gendisk結(jié)構(gòu)

        voiddel_gendisk(structgendisk*disk)

        從系統(tǒng)注銷(xiāo)gendisk結(jié)構(gòu)

        首先使用alloc_disk()函數(shù)動(dòng)態(tài)分配gendisk結(jié)構(gòu),接下來(lái),對(duì)gendisk結(jié)構(gòu)的主設(shè)備號(hào)(major)、次設(shè)備號(hào)相關(guān)成員(first_minor和minors)、塊設(shè)備操作函數(shù)(fops)、請(qǐng)求隊(duì)列(queue)、可包含的扇區(qū)數(shù)(capacity)以及設(shè)備名稱(chēng)(disk_name)等成員進(jìn)行初始化。

        在完成對(duì)gendisk的分配和初始化之后,調(diào)用add_disk()函數(shù)向系統(tǒng)注冊(cè)塊設(shè)備。在卸載gendisk結(jié)構(gòu)的時(shí)候,要調(diào)用del_gendisk()函數(shù)。

        4.塊設(shè)備請(qǐng)求處理

        中一般要實(shí)現(xiàn)一個(gè)請(qǐng)求隊(duì)列處理函數(shù)來(lái)處理隊(duì)列中的請(qǐng)求。從塊設(shè)備的運(yùn)行流程,可知請(qǐng)求處理是塊設(shè)備的基本處理單位,也是最核心的部分。對(duì)塊設(shè)備的讀寫(xiě)操作被封裝到了每一個(gè)請(qǐng)求中。

        已經(jīng)提過(guò)調(diào)用blk_init_queue()函數(shù)來(lái)申請(qǐng)并初始化請(qǐng)求隊(duì)列。表11-17列出了一些與請(qǐng)求處理相關(guān)的函數(shù)。

        表11-17 請(qǐng)求處理相關(guān)函數(shù)

        函數(shù)格式

        說(shuō)明

        request_queue_t*blk_alloc_queue(intgfp_mask)

        分配請(qǐng)求隊(duì)列

        request_queue_t*blk_init_queue
        (request_fn_proc*rfn,spinlock_t*lock)

        分配并初始化請(qǐng)求隊(duì)列

        structrequest*blk_get_request
        (request_queue_t*q,intrw,intgfp_mask)

        從隊(duì)列中獲取一個(gè)請(qǐng)求

        voidblk_requeue_request(request_queue_t*q,structrequest*rq)

        將請(qǐng)求再次加入隊(duì)列

        voidblk_queue_max_sectors
        (request_queue_t*q,unsignedshortmax_sectors)

        設(shè)置最大訪問(wèn)扇區(qū)數(shù)

        voidblk_queue_max_phys_segments
        (request_queue_t*q,unsignedshortmax_segments)

        設(shè)置最大物理段數(shù)

        voidend_request(structrequest*req,intuptodate)

        結(jié)束本次請(qǐng)求處理

        voidblk_queue_hardsect_size
        (request_queue_t*q,unsignedshortsize)

        設(shè)置物理扇區(qū)大小

        以上簡(jiǎn)單地介紹了的最基本的概念和流程。更深入的內(nèi)容不是本書(shū)的重點(diǎn),有興趣的讀者可以參考其他書(shū)籍。

        linux相關(guān)文章:linux教程



        上一頁(yè) 1 2 下一頁(yè)

        評(píng)論


        相關(guān)推薦

        推薦視頻

        更多>>

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 明星| 璧山县| 佳木斯市| 泌阳县| 襄樊市| 绥德县| 丰台区| 安国市| 时尚| 曲周县| 浮山县| 华宁县| 洛宁县| 龙井市| 怀安县| 通海县| 兴隆县| 定西市| 中牟县| 外汇| 五河县| 区。| 阿尔山市| 青岛市| 新晃| 收藏| 怀宁县| 灌云县| 陆川县| 平顶山市| 墨脱县| 江达县| 伊宁市| 托克逊县| 林西县| 阿图什市| 金沙县| 德州市| 莆田市| 容城县| 襄城县|