国产无码免费,人妻口爆,国产V在线,99中文精品7,国产成人无码AA精品一,制度丝袜诱惑av,久久99免费麻辣视频,蜜臀久久99精品久久久久久酒店
        訂閱
        糾錯
        加入自媒體

        Linux設備驅動統一模型解析

        2021-04-13 09:48
        一口Linux
        關注

        1. 設備樹概念

         1.1.設備樹感性認識

        設備樹(Device Tree),將這個詞分開就是“設備”和“樹”,描述設備樹的文件叫做DTS(Device Tree Source),這個DTS 文件采用樹形結構描述板級設備,比如CPU 數量、 內存基地址、IIC 接口上接了哪些設備、SPI 接口上接了哪些設備等等。設備樹是樹形數據結構,具有描述系統中設備的節點。每個節點都有描述所代表設備特征的鍵值對。每個節點只有一個父節點,而根節點則沒有父節點。

        1.2.DTS、DTB、DTC

        DTS:設備樹源碼文件;DTB:將DTS編譯后得到的二進制文件;DTC:DTS的編譯工具,其源碼在內核的scriptsdtc目錄下。基于同樣arm架構的CPU有很多,同一個CPU會制作很多配置不一的板子,如何正確的編譯所選的板子的DTS文件呢?在內核的arch/arm/boot/dts/Makefile中:

        dtb-$(CONFIG_ARCH_XXX) += xxx.dtb
        dtb-$(CONFIG_ARCH_XXX) += xxx-sip.dtb
        dtb-$(CONFIG_ARCH_XXX) += xxx.dtb
        dtb-$(CONFIG_ARCH_XXX) += xxx.dtb

        例如xxxx的開發板,只要設置CONFIG_ARCH_xxx=y,所有用到這顆SOC的DTS都會編譯成DTB。如果后續還用到了這顆SOC設計的開發板,只要新建一個DTS文件,并將對應名稱的DTB文件名加到dtb-$(CONFIG_ARCH_xxx)中,在編譯設備樹時就會將DTS編譯為二進制的DTB文件。

        1.3.Device Tree語法

        以下語法分析均以xxx.dts為例。

        1.3.1. dtsi頭文件

        設備樹的頭文件擴展名為 .dtsi。以xxx.dts為例,其包含以下頭文件。

        #include "skeleton.dtsi"
        #include xxx.h"
        #include "xxx-clocks.dtsi"
        #include "xxx-pinctrl.dtsi"
        #include "xxx-camera.dtsi"

        需要注意的是.dts文件不但可以引用.dtsi文件,還可以引用.h文件和其他的.dts文件。Q1:每一個.dtsi和.dts都有自己的根節點,但是一個設備樹文件只允許有一個根節點,DTC如何處理?將根節點合并,保留最后一級的根節點。包含的頭文件內容會被展開,展開的位置在/memory和/cpus之間。(存疑,只用xxx.dts編譯過)Q2:如果包含過程中有重復的compatible,DTC怎么處理?編譯時不會報錯,會生成兩個compatible屬性一樣的節點。

        1.3.2. 設備節點

        設備樹中的每一個節點都按照以下格式命名:

        node-name@unit-address

        node-name表示節點名稱,它的長度范圍應該是1~31個字符,可以由以下的字符組成:

        字符說明0~9數字a-z小寫字母A-Z大寫字母,逗號(英文).句號(英文)_下劃線(英文)+加號-減號

        表 2-1節點名稱的有效字符

        節點名稱應以較低或大寫字符開頭,并應描述設備的一般類別。節點的單位地址特定于節點所在的總線類型。它由表2-1中字符集中的一個或多個ASCII字符組成。單位地址必須與節點的reg屬性中指定的第一個地址匹配。如果節點沒有reg屬性,則必須省略@unit-address,并且單獨使用節點名稱將節點與樹中相同級別的其他節點區分開來。對于reg格式和單位地址,特定總線的綁定可能會指定附加更具體的要求。根節點沒有節點名稱或單位地址。它由正斜杠(/)標識。

        圖 2-1節點名稱示例

        在圖2-1中,節點名稱為cpu的兩個節點通過uint-address 0和1區分;節點名稱為ethernet的兩個節點通過uint-address fe002000和fe003000區分。在設備樹中經常會看到以下設備名稱:

        watchdog: watchdog@04009800

        冒號前的是節點標簽(label),冒號后是節點名稱。引入label的目的是方便訪問節點,可以直接通過&label來訪問這個節點。比如上述節點就可以使用&watchdog來訪問。

        1.3.2.1. 通用名稱建議

        節點的名稱應該有些通用,反映設備的功能,而不是其精確的編程模型。如適用,名稱應為以下選擇之一:

        ? adc    ? accelerometer
        ? atm    ? audio-codec
        ? audio-controller ? backlight:
        ? bluetooth   ? bus
        ? cache-controller ? camera
        ? can    ? charger
        ? clock:   ? clock-controller
        ? compact-flash  ? cpu
        ? cpus    ? crypto
        ? disk    ? display
        ? dma-controller ? dsp
        ? eeprom   ? efuse:
        ? mdio    ? memory
        ? memory-controller ? mmc
        ? mmc-slot   ? mouse
        ? nand-controller ? nvram
        ? oscillator  ? parallel
        ? pc-card   ? pci
        ? pcie    ? phy
        ? pinctrl   ? pmic
        ? pmu    ? port
        ? ports    ? pwm
        1.3.2.2. 路徑名稱

        通過指定從根節點到所需節點的完整路徑(通過所有子節點),可以唯一識別devicetree中的節點。指定設備路徑的約定是:

        /node-name-1/node-name-2/.../node-name-N

        例如,在圖2-1中,到cpu#1的設備路徑為:

        /cpus/cpu@1

        /為根節點,在保證完整路徑明確的前提下,可以省略uint-address。

        1.3.3. 屬性

        設備樹中的每個節點都有描述節點特性的屬性。屬性由名稱和值組成。

        1.3.3.1. 屬性名稱

        屬性名稱的長度范圍應該是1~31個字符,可以由以下的字符組成:

        字符說明0~9數字a-z小寫字母A-Z大寫字母,逗號(英文).句號(英文)_下劃線(英文)+加號?問號(英文)##號(hash)

        非標準屬性名稱應指定唯一的字符串前綴,例如股票代號,用于標識定義該屬性的公司或組織的名稱。示例:

        xxx,pin-function = <6>;
        fsl,channel-fifo-len
         linux,network-index
         ibm,ppc-interrupt-server#s
        1.3.3.2. 屬性值

        屬性值是包含與屬性關聯的信息的零或多個字節的數組。

        數值描述、值為空,用于描述bool信息。個人理解類似于flag參數、32位整數,采用big-endian格式。示例:32位值0x11223344將在內存中表示為:地址    11  地址 + 1 22  地址 + 2 33   地址 + 3 44、表示采用big-endian格式的64位整數。包括兩個值,其中第一個值包含整數的最有效位,第二個值包含最小有效位。例如:64位值0x1122334455667788將表示為兩個單元格:<0x11223344 0x55667788>。、格式特定于屬性,參見屬性定義。、字符串可打印且以空值()結尾。、一個值。phandle值是引用設備樹中另一個節點的方法。可被引用的任何節點都用唯一的定義了phandle屬性數值。該數字用于帶有phandle值類型的屬性值。、串聯在一起的值列表。

        big-endian和little-endian(大小端):big-endian:是指低地址端存放高位字節;little-endian:是指高地址端存放低位字節;

        1.3.3.3. 標準屬性Compatible(兼容)屬性名稱兼容值值類型<stringlist>描述兼容屬性值由定義設備特定編程模型的一個或多個字符串組成。客戶端程序應使用此字符串列表選擇設備驅動程序。該屬性值包含一個從最特定到最通用的null終止字符串的串聯列表。它們允許設備表達其與一系列類似設備的兼容性,可能允許單個設備驅動器與幾個設備匹配。推薦的格式是“制造商,型號”,其中制造商是描述制造商名稱的字符串(如股票代號)。

        示例:

        compatible =“fsl,mpc8641”,“ns16550”;

        在此示例中,操作系統將首先嘗試查找支持fsl,mpc8641-uartmpc8641的設備驅動程序。如果找不到驅動程序,然后,它將嘗試定位受支持的更通用的ns16550設備類型驅動程序 。

        一般驅動程序文件都會有個OF匹配表,此匹配表保存著一些compatible值,如果設備節點的 compatible屬性值和OF匹配表中的任何一個值相等,那么就表示設備可以使用這驅動。比如在文件drvier/misc/memctrl.c中:

        static struct of_device_id_xxx_memctrl_of_match[] = {
            { .compatible = "xxxx,memctrl", },
            {},
        };

        對應的,在arch/arm/boot/dts/xxx.dts中有:

        memctrl: memctrl {
          compatible = "xxxx,memctrl";
          reg = <0x0121B000 0x1044>;
          clocks = <&sdram_bandw_clk>, <&mem_axi_clk>;
          clock-names = "sdram_bandwidth_clk", "mem_axi_clk";
          interrupts = <GIC_SPI INT_SDRAM IRQ_TYPE_LEVEL_HIGH>;
          interrupt-controller;
          #interrupt-cells = <1>;
        };
        Model(型號)屬性名稱模型值值類型
        描述指定設備的制造商型號。推薦的格式為:“制造商,型號”,其中制造商是描述制造商名稱的字符串(如股票代號)。

        示例:

        model =“fsl,MPC8349EMITX”;
        Phandle(pointer handle)屬性名稱pointer handle值值類型
        描述phandle屬性指定設備樹中唯一節點的數字標識符。phandle屬性值被需要引用與該屬性關聯的節點的其他節點使用。

        示例:

        pic@10000000 {
        phandle = <1>;
        interrupt-controller;
        };

        定義了1的phandle值。另一個設備節點可以引用phandle值為1的pic節點:

        another-device-node {
        interrupt-parent = <1>;
        };
        Status屬性名稱狀態值值類型<string>描述狀態屬性指示設備的操作狀態,其有效值如下:"okay":指示設備可運行。"disabled":表明設備目前尚未運行,但未來可能會運行(例如,未插入或關閉某物)。"fail":表示設備無法運行,在設備中檢測到嚴重錯誤,如果不進行維修就不太可能運行"fail-sss":表示設備無法運行,在設備中檢測到嚴重錯誤,如果不進行維修就不太可能運行,sss部分特定于設備,并指示檢測到的錯誤情況。#address-cells and #size-cells屬性名稱#address-cells,#size-cells值類型<u32>描述#address-cells和#size-cells屬性可用于設備樹層次結構中包含子節點并描述如何解決子設備節點的任何設備節點。#address-cells屬性定義用于編碼子節點的reg屬性中地址字段的個單元格的數量。#size-cells屬性定義用于編碼子節點的reg屬性中大小字段的個單元格的數量。#address-cells = <1>;
         #size-cells = <0>;

        表示reg屬性中有一個u32表示address,沒有表示reg大小的數據,所以:reg = <0x0>; 即reg的起始地址為0x0,不描述其大小

        #address-cells = <1>;
          #size-cells = <1>;

        表示reg屬性中有一個u32表示address,有一個u32表示size,所以:reg = <0x00000000 0x00040000>; 即reg的起始地址為0x00000000,大小是0x00040000

        Reg屬性名稱reg值類型<prop-encoded-array> 編碼為任意數量(地址、長度)對描述reg屬性描述設備資源在其父總線定義的地址空間內的地址。這通常意味著內存映射IO寄存器塊的偏移和長度,但在某些總線類型上可能有不同的含義。根節點定義的地址空間中的地址為cpu真實地址。該值是一個,由任意數量的地址和長度對組成,<地址長度>。指定地址和長度所需的單元格的數量是總線特定的,由設備節點父級中的#address-cells和#size-cells屬性指定。如果父節點為#size-cells單元格指定值0,則應忽略reg值中的長度字段。

        示例:假設系統芯片中的設備包含兩個寄存器塊,SOC中偏移0x3000的32字節塊和偏移0xFE00的256字節塊。reg屬性的編碼如下(假設#address-cells和#size-cells值為1):

        reg=<0x3000 0x20 0xFE00 0x100>;
        virtual-reg屬性名稱virtual-reg值類型<u32>描述virtual-reg屬性指定一個有效地址,該地址映射到設備節點的reg屬性中指定的第一個物理地址。此屬性使引導程序能夠為客戶端程序提供已設置的虛擬到物理映射。Ranges屬性名稱range值類型<empty>或編碼為任意數量的(子總線地址、父總線地址、長度)三聯體描述range屬性提供了一種在總線地址空間(子地址空間)和總線節點父地址空間(父地址空間)之間定義映射或轉換的方法。range屬性值的格式是任意數量的三聯體(子總線地址、父總線地址、長度):1.子總線地址是子總線地址空間內的物理地址。表示地址的單元格數取決于總線,可以通過此節點(出現range屬性的節點)的#address-cells確定。2. 父總線地址是父總線地址空間中的物理地址。表示父地址的單元格數取決于總線,可以通過定義父地址空間的節點的#address-cells屬性確定。3. 長度指定子地址空間中范圍的大小。表示大小的單元格數可以根據該節點(出現range屬性的節點)的#size-cells確定。如果屬性用值定義,則它指定父地址和子地址空間相同,并且不需要地址轉換。如果總線節點中不存在該屬性,則假設節點的子節點和父地址空間之間不存在映射。

        示例:

        soc {
        compatible = "simple-bus";
        #address-cells = <1>;
        #size-cells = <1>;
        ranges = <0x0 0xe0000000 0x00100000>;
        serial {
         device_type = "serial";
         compatible = "ns16550";
         reg = <0x4600 0x100>;
         clock-frequency = <0>;
         interrupts = <0xA 0x8>;
         interrupt-parent = <&ipic>;
        };
        };

        1  2  3  下一頁>  
        聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

        發表評論

        0條評論,0人參與

        請輸入評論內容...

        請輸入評論/評論長度6~500個字

        您提交的評論過于頻繁,請輸入驗證碼繼續

        暫無評論

        暫無評論

          掃碼關注公眾號
          OFweek人工智能網
          獲取更多精彩內容
          文章糾錯
          x
          *文字標題:
          *糾錯內容:
          聯系郵箱:
          *驗 證 碼:

          粵公網安備 44030502002758號

          主站蜘蛛池模板: 屯昌县| 内射视频在线观看| 婷婷开心中文字幕| 图木舒克市| 精品自拍网| 文安县| 欧美丝袜性交| 内射视频在线观看| 无码偷拍| 亚洲自拍电影| 中文字字幕在线中文| 小泽玛利亚一区| 无码色亚洲| 广元市| 亚洲天堂av在线免费| 理塘县| 午夜社区| 在线看不卡av| 蜜桃视频在线播放| 91免费高清| 精品3P| 日韩无| 亚洲wwww| 国产精品久久久久无码日韩| 51精品视频| 欧美A片在线观看| 亚洲尤物你懂的视频在线看| 东山县| 最新亚洲中文字幕在线| 金湖县| 定安县| 蓝田县| 伊人精品| 日韩福利在线视频| av无码免费| 国产wwww| 人人肏| 黑人VA| 极品国模无码国产在线观看| 三级91| 丰满人妻一区二区三区在线视频53|