在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            博客專欄

            EEPW首頁 > 博客 > RK3568驅(qū)動指南|第二篇 字符設(shè)備基礎(chǔ)-第12章 字符設(shè)備驅(qū)動框架實驗

            RK3568驅(qū)動指南|第二篇 字符設(shè)備基礎(chǔ)-第12章 字符設(shè)備驅(qū)動框架實驗

            發(fā)布人:紅李亞 時間:2024-03-19 來源:工程師 發(fā)布文章
            瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工藝,搭載一顆四核Cortex-A55處理器和Mali G52 2EE 圖形處理器。RK3568 支持4K 解碼和 1080P 編碼,支持SATA/PCIE/USB3.0 外圍接口。RK3568內(nèi)置獨立NPU,可用于輕量級人工智能應(yīng)用。RK3568 支持安卓 11 和 linux 系統(tǒng),主要面向物聯(lián)網(wǎng)網(wǎng)關(guān)、NVR 存儲、工控平板、工業(yè)檢測、工控盒、卡拉 OK、云終端、車載中控等行業(yè)。
            第12章 字符設(shè)備驅(qū)動框架實驗
            下面對前面三個章節(jié)進行總結(jié),首先驅(qū)動向Linux內(nèi)核進行設(shè)備號申請,之后的字符設(shè)備注冊時,會對申請的設(shè)備號進行使用。而Linux 內(nèi)核會將字符設(shè)備抽象成一個具體的struct cdev結(jié)構(gòu)體,該結(jié)構(gòu)體記錄了字符設(shè)備的字符設(shè)備號、內(nèi)核對象等信息,cdev_init(…)函數(shù)對結(jié)構(gòu)體進行初始化之后,cdev_add(…)函數(shù)將設(shè)備號和cdev結(jié)構(gòu)體進行鏈接,這時設(shè)備號才真正指向了內(nèi)核中注冊的設(shè)備。設(shè)備注冊成功之后,此時還不能對字符設(shè)備進行文件操作,所以需要設(shè)備節(jié)節(jié)點來充當內(nèi)核和用戶層通信的橋梁,至此,前面三個章節(jié)就總結(jié)完成了,以上步驟并沒有涉及到操作設(shè)備文件,本章節(jié)將對字符設(shè)備框架進行最終的完善。

            12.1 文件操作集簡介
            在進行注冊字符設(shè)備實驗章節(jié)中,使用cdev_init(…)函數(shù)對struct cdev結(jié)構(gòu)體類型變量和struct file_operations結(jié)構(gòu)體類型變量相鏈接,struct file_operations結(jié)構(gòu)體就是把系統(tǒng)調(diào)用和驅(qū)動程序關(guān)聯(lián)起來的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。該結(jié)構(gòu)體的每一個成員都對應(yīng)著一個系統(tǒng)調(diào)用,讀取file_operation中相應(yīng)的函數(shù)指針,接著把控制權(quán)轉(zhuǎn)交給函數(shù),從而完成了Linux設(shè)備驅(qū)動程序的工作。

            file_operations結(jié)構(gòu)體定義在“內(nèi)核源碼/include/linux/fs.h”文件中,下面對部分常用函數(shù)進行說明:
            struct module *owner;
            owner是第一個 file_operations 成員,它并不是一個操作, 而一個指向擁有該結(jié)構(gòu)的模塊的指針,避免正在操作時被卸載,一般為初始化為THIS_MODULES (在 <linux/module.h> 中定義的宏)
            ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
            read函數(shù)指針用來從設(shè)備中同步讀取數(shù)據(jù),讀取成功返回讀取的字節(jié)數(shù)。與應(yīng)用程序中的 read函數(shù)對應(yīng)。
            ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
            write函數(shù)指針用來發(fā)送數(shù)據(jù)給設(shè)備. 寫入成功返回寫入的字節(jié)數(shù)。與應(yīng)用程序中的write函數(shù)對應(yīng)。
            long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
            unlocked_ioctl函數(shù)指針提供對于設(shè)備的控制功能,與應(yīng)用程序中的ioctl函數(shù)對應(yīng)。
            int (*open) (struct inode *, struct file *);
            open函數(shù)指針用于打開設(shè)備,與應(yīng)用程序中的open函數(shù)對應(yīng)。
            int (*release) (struct inode *, struct file *);
            release函數(shù)指針在file結(jié)構(gòu)體釋放時被調(diào)用
            至此對于file_operations文件操作集的部分常用函數(shù)就介紹完了,填充了部分常用函數(shù)的 file_operations結(jié)構(gòu)體如下(圖12-1)所示:
            static struct file_operations cdev_fops_test = {
            .owner = THIS_MODULE,//將owner字段指向本模塊,可以避免在模塊的操作正在被使用時卸載該模塊
            .open = chrdev_open,//將open字段指向chrdev_open(...)函數(shù)
            .read = chrdev_read,//將open字段指向chrdev_read(...)函數(shù)
            .write = chrdev_write,//將open字段指向chrdev_write(...)函數(shù)
            .release = chrdev_release,//將open字段指向chrdev_release(...)函數(shù)
            };//定義file_operations結(jié)構(gòu)體類型的變量cdev_test_ops
            會在下個小節(jié)進行字符設(shè)備驅(qū)動框架實驗代碼的編寫,在上一章節(jié)實驗的基礎(chǔ)上加入file_operations結(jié)構(gòu)體,并通過應(yīng)用程序?qū)ψ址O(shè)備驅(qū)動進行文件操作測試。
            更多內(nèi)容可以B站搜索:迅為RK3568,關(guān)注公眾號:迅為電子


            *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



            關(guān)鍵詞: 開發(fā)板

            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉