目次
Standard Properties" >Standard Properties
Interrupts" >Interrupts
Base Device Node Types" >Base Device Node Types
Device Bindings" >Device Bindings
Devicetree Blob (DTB) Structure" >Devicetree Blob (DTB) Structure
Header" >Header
Memory Reservation Block" >Memory Reservation Block
Structure Block" >Structure Block
Devicetree Source (DTS) Format" >Devicetree Source (DTS) Format
Node and property definitions" >Node and property definitions
File layout" >File layout
ホームページ システムチュートリアル Linux Linux デバイス ドライバーのデバイスツリー: ハードウェア デバイスを記述および管理する効率的な方法

Linux デバイス ドライバーのデバイスツリー: ハードウェア デバイスを記述および管理する効率的な方法

Feb 10, 2024 pm 05:33 PM
linux Linuxチュートリアル Linuxシステム Linuxコマンド シェルスクリプト メモリ使用量 埋め込みLinux Linux を始める Linux学習

Linux でハードウェア デバイスのドライバーを作成する方法を考えたことはありますか? Linux のさまざまなハードウェア プラットフォームや構成にドライバーを適応させる方法を考えたことはありますか?ドライバーでホットプラグ、電源管理、デバイス共有などの高度な機能を Linux システムに実装できるようにする方法を考えたことはありますか?これらの問題に興味がある場合、この記事では、これらの目標を達成するための効果的な方法である Linux デバイス ドライバー デバイスツリーを紹介します。 Devicetree はハードウェアデバイスを記述するためのデータ構造であり、ハードウェアデバイスの情報と属性をシンプルかつ統一的にカーネルに渡すことで、デバイスの識別とドライバを実現します。 Devicetree はハードウェアの独立性を実現するメカニズムでもあり、柔軟かつ移植可能な方法でハードウェア デバイスの構成と管理をドライバー コードから分離できるため、マルチプラットフォームのサポートが実現します。 Devicetree は高度な機能を実装するためのフレームワークでもあり、さまざまなハードウェア デバイスのインターフェイスやプロトコルを標準的かつ汎用的な方法で定義して使用できるため、ホットプラグ、電源管理、デバイス共有などの機能を実現できます。この記事では、devicetree の基本的な概念、文法規則、記述方法、コンパイルプロセス、ロード方法などから、Linux デバイスドライバーにおける devicetree の用途と役割を詳しく紹介し、この便利で強力な方法をマスターするのに役立ちます。

Devicetree (デバイスツリー) は、カーネルを統合するために設計された、システムのハードウェア情報を記述するために使用されるツリー モデルです。デバイスツリー情報はブートローダーを通じてカーネルに渡され、カーネルはこれらのデバイス記述に基づいて対応するボードレベルのドライバーを初期化し、複数のプラットフォーム間で 1 つのカーネルを共有するという目的を達成します。

#########概要######
Devicetree は主に、非プラグ可​​能 (非動的) デバイスのボードレベルのハードウェア情報を記述するように設計されています。これは、デバイス情報を記述するノードの階層ツリー構造で構成されます。各ノードに含まれるコンテンツは、プロパティと値のペアで表されます。ルート ノードを除くすべてのノードには親があります。写真が示すように:

ノード名
Linux デバイス ドライバーのデバイスツリー: ハードウェア デバイスを記述および管理する効率的な方法

「/」で表されるルート ノード名を除き、他のノードの名前は

node-name@unit-address で付けられ、同じレベルで一意である必要があります。

ノード名 リーリー

  • ユニットアドレス

    リーリー
  • パス名
はノードのフルパスを表します。例えば: ### リーリー ######プロパティ######

各ノードに含まれる主な内容は、記述されているデバイスの属性情報であり、名前と値で構成されます。

プロパティ名

リーリー

プロパティ値

###############価値### ###説明### ###############空の### 属性値は空で、真偽情報を表すために使用されます

を追加してください。
u32/u64 32/64ビットビッグエンディアン符号なし整数を表現する場合は、
文字列,文字列リスト ヌル終了文字列またはそのリスト

Standard Properties

  • compatible

    Value type: 
    Description:
        表示兼容的设备类型,内核据此选择合适的驱动程序。由多个字符串组成,从左到由列出
    
    这个设备兼容的驱动(from most specific to most general)。
        推荐的格式为:“制造商名,具体型号”。
    Example:
        compatible = "fsl,mpc8641-uart", "ns16550";
        内核先搜索支持“fsl,mpc8641-uart”的驱动,如未找到,则搜索支持更通用的“ns16550”
    
    
    设备类型的驱动。
    
    ログイン後にコピー
  • model

    Value type: 
    Description:
        表明设备型号。
        推荐的格式为:“制造商名,具体型号”。
    Example:
        model = "fsl,MPC8349EMITX";
    
    ログイン後にコピー
  • phandle

    Value type: 
    Description:
        用一个树内唯一的数字标识所在的这个节点,其他节点可以直接通过这个数字标识来引用
    
    这个节点。
    Example:
        pic@10000000 {
            phandle = ;
            interrupt-controller;
        };
        interrupt-parent = ;
    
    ログイン後にコピー
  • status

    Value type: 
    Description:
        表示设备的可用状态:
        "okay" -> 设备可用
        "disabled" -> 目前不可用,但以后可能会可用
        "fail" -> 不可用。出现严重问题,得修一下
        "fail-sss" -> 不可用。出现严重问题,得修一下。sss指明错误类型。
    
    ログイン後にコピー
  • #address-cells and #size-cells

    Value type: 
    Description:
        在拥有子节点的节点中使用,来描述它的字节点的地址分配问题。即分别表示子节点中使
    
    用多少个u32大小的cell来编码reg属性中的address域和size域。
    
        这两个属性不会继承,必须明确指出。如未指出,默认#address-cells=2,#size-
    cells=1。
    Example:
        soc {
            #address-cells = ;
            #size-cells = ;
            serial {
                reg = ;
            };
        };
    
    ログイン後にコピー
  • reg

    Value type:  encoded as an arbitraty number of (address, length) pairs.
    Description:
        描述该设备在parent bus定义的地址空间中的地址资源分配。
    Example:
        reg = ;
        a 32-byte block at offset 0x3000 and a 256-byte block at offset 0xFE00。
    
    ログイン後にコピー
  • virtual-reg

    Value type: 
    Description:
        表示映射到reg第一个物理地址对应的effective address。使bootloader能够提供给内
    
    核它所建立的virtual-to-physical mappings。
    
    ログイン後にコピー
  • ranges

    Value type:  or  encoded as an arbitrary number of (child-bus-address,parent-bus-
    
    address, length) triplets.
    Description:
        提供了子地址空间与父地址空间的映射关系,如果值为空则父子地址相等,无需转换。
    Example:
        soc {
            compatible = "simple-bus";
            #address-cells = ;
            #size-cells = ;
            ranges = ;
    
            serial {
                compatible = "ns16550";
                reg = ;
            };
        };
        将子节点serial的0x0地址映射到父节点soc的0xe0000000,映射长度为0x100000。此时
    
    reg的实际物理地址就为0xe0004600。
    
    ログイン後にコピー
  • dma-ranges

    Value type:  or  encoded as an arbitrary number of (child-bus-address,parent-bus-address, length) triplets.
    Description:
        提供了dma地址的映射方法。
    
    ログイン後にコピー

Interrupts

描述中断的属性有4个:

  • interrupt-controller

    一个空的属性用来指示这个节点设备是接收中断信号的控制器。
    
    ログイン後にコピー
  • #interrupt-cells

    这是上面所说中断控制器中的一个属性,用来描述需要用多少个cell来描述这个中断控制器的
    
    interrupt specifier(类似#address-cells和#size-cells)。
    
    ログイン後にコピー
  • interrupt-parent

    常出现在根节点的一个属性,它的属性值是指向interrupt-controller的一个phandle。可从
    
    parent继承。
    
    ログイン後にコピー
  • interrupts

    包含interrupt specifiers列表,每一个specifier表示一个中断输出信号。
    
    ログイン後にコピー

Example

/ {
    interrupt-parent = ;

    intc: interrupt-controller@10140000 {        
              compatible = "arm,pl190";        
              reg = ;        
              interrupt-controller;        
                #interrupt-cells = ;    
    };
    serial@101f0000 {        
        interrupts = ;    
    };
};
ログイン後にコピー

Base Device Node Types

所有的设备树都必须有一个root节点,且root节点下必须包含一个cpus节点和至少一个memory节点。

  • root node

    root节点须包含 #address-cells、#size-cells、model、compatible等属性。
    
    ログイン後にコピー
  • /cpus node

    是cpu子节点的父节点容器。须包含 #address-cells、#size-cells属性。
    
    ログイン後にコピー
  • /cpus/cpu* node

    是描述系统cpu的节点。
    
    ログイン後にコピー
  • /memory node

    描述系统物理内存的layout。须包含reg节点。
    Example:
    假如一个64位系统有如下两块物理内存:
    - RAM: starting address 0x0, length 0x80000000 (2GB)
    - RAM: starting address 0x100000000, length 0x100000000 (4GB)
    则我们可以有下面两种描述方法(#address-cells =  and #size-cells =):
    Example #1
        memory@0 {
            reg = ;
        };
    Example #2
        memory@0 {
            reg = ;
        };
        memory@100000000 {
            reg = ;
        };
    
    ログイン後にコピー
  • /chosen node

    根节点下的一个子节点,不是描述设备而是描述运行时参数。常用来给内核传递bootargs:
    chosen {
        bootargs = "root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200";
    };
    
    ログイン後にコピー
  • /aliases node

    由1-31个字母、数字或下划线组成的设备节点full path的别名。它的值是节点的全路径,因此最终会被编码成字符串。
    aliases {
        serial0 = "/simple-bus@fe000000/serial@llc500";
    }
    
    ログイン後にコピー

Device Bindings

更多具体设备具体类别的描述信息:内核源代码/Documentation/devicetree/bindings。


DTS是描述devicetree的源文本文件,它通过内核中的DTC(Devicetree Compiler)编译后生成相应平台可烧写的二进制DTB。

Devicetree Blob (DTB) Structure

DTB又称Flattened Devicetree(FDT),在内存中的结构如下图所示:
Linux デバイス ドライバーのデバイスツリー: ハードウェア デバイスを記述および管理する効率的な方法

Header

大端字节序结构体:

struct fdt_header {
    uint32_t magic; /* contain the value 0xd00dfeed (big-endian) */
    uint32_t totalsize; /* the total size of the devicetree data structure */
    uint32_t off_dt_struct; /* offset in bytes of the structure block */
    uint32_t off_dt_strings; /* offset in bytes of the strings block */
    uint32_t off_mem_rsvmap; /* offset in bytes of the memory reservation block */
    uint32_t version; /* the version of the devicetree data structure */
    uint32_t last_comp_version; /* the lowest version used is backwards compatible */
    uint32_t boot_cpuid_phys; /* the physical ID of the system’s boot CPU */
    uint32_t size_dt_strings; /* the length in bytes of the strings block */
    uint32_t size_dt_struct; /* the length in bytes of the structure block */
};
ログイン後にコピー

Memory Reservation Block

  • Purpose

    为系统保留一些特殊用途的memory。这些保留内存不会进入内存管理系统。
    
    ログイン後にコピー
  • Format

    struct fdt_reserve_entry {
        uint64_t address;
        uint64_t size;
    };
    
    ログイン後にコピー

Structure Block

Devicetree结构体存放的位置。由一行行“token+内容”片段线性组成。

  • token
    每一行内容都由一个32位的整形token起始。token指明了其后内容的属性及格式。共有以下5种token:
token Description
FDT_BEGIN_NODE (0x00000001) 节点起始,其后内容为节点名
FDT_END_NODE (0x00000002) 节点结束
FDT_PROP (0x00000003) 描述属性
FDT_NOP (0x00000004) nothing,devicetree解析器忽略它
FDT_END (0x00000009) block结束
  • tree structure
    • (optionally) any number of FDT_NOP tokens
    • FDT_BEGIN_NODE
      • The node’s name as a null-terminated string
      • [zeroed padding bytes to align to a 4-byte boundary]
    • For each property of the node:
      • (optionally) any number of FDT_NOP tokens
      • FDT_PROP token
        • property information
        • [zeroed padding bytes to align to a 4-byte boundary]
    • Representations of all child nodes in this format
    • (optionally) any number of FDT_NOP tokens
    • FDT_END_NODE token

Devicetree Source (DTS) Format

Node and property definitions

    [label:] node-name[@unit-address] {
        [properties definitions]
            [child nodes]
    };
ログイン後にコピー

File layout

Version 1 DTS files have the overall layout:

/dts-v1/; /* dts 版本1 */
[memory reservations] /* DTB中内存保留表的入口 */
    / {
        [property definitions]
        [child nodes]
    };
ログイン後にコピー

通过本文,我们了解了devicetree在Linux设备驱动中的应用和作用,学习了如何编写、编译、加载、修改和调试devicetree。我们发现,devicetree是一种非常适合嵌入式系统开发的方法,它可以让我们方便地描述和管理硬件设备,实现硬件无关性和高级功能。当然,devicetree也有一些注意事项和限制,比如需要遵循语法规范、需要注意兼容性问题、需要注意内存占用和性能影响等。因此,在使用devicetree时,我们需要有一定的硬件知识和经验,以及良好的编程习惯和调试技巧。希望本文能够为你提供一个入门级的指导,让你对devicetree有一个初步的认识和理解。如果你想深入学习devicetree,建议你参考更多的资料和示例,以及自己动手实践和探索。

以上がLinux デバイス ドライバーのデバイスツリー: ハードウェア デバイスを記述および管理する効率的な方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Android TV Box が非公式の Ubuntu 24.04 アップグレードを取得 Android TV Box が非公式の Ubuntu 24.04 アップグレードを取得 Sep 05, 2024 am 06:33 AM

多くのユーザーにとって、Android TV ボックスをハッキングするのは気が遠くなるように思えます。しかし、開発者の Murray R. Van Luyn は、Broadcom チップが不足する中、Raspberry Pi に代わる適切な代替品を探すという課題に直面しました。アルムビアとの共同作業

Deepseek Webバージョンの入り口Deepseek公式ウェブサイトの入り口 Deepseek Webバージョンの入り口Deepseek公式ウェブサイトの入り口 Feb 19, 2025 pm 04:54 PM

DeepSeekは、Webバージョンと公式Webサイトの2つのアクセス方法を提供する強力なインテリジェント検索および分析ツールです。 Webバージョンは便利で効率的であり、公式ウェブサイトは包括的な製品情報、ダウンロードリソース、サポートサービスを提供できます。個人であろうと企業ユーザーであろうと、DeepSeekを通じて大規模なデータを簡単に取得および分析して、仕事の効率を向上させ、意思決定を支援し、イノベーションを促進することができます。

DeepSeekをインストールする方法 DeepSeekをインストールする方法 Feb 19, 2025 pm 05:48 PM

DeepSeekをインストールするには、Dockerコンテナ(最も便利な場合は、互換性について心配する必要はありません)を使用して、事前コンパイルパッケージ(Windowsユーザー向け)を使用してソースからコンパイル(経験豊富な開発者向け)を含む多くの方法があります。公式文書は慎重に文書化され、不必要なトラブルを避けるために完全に準備します。

BitPie Bitpie ウォレット アプリのダウンロード アドレス BitPie Bitpie ウォレット アプリのダウンロード アドレス Sep 10, 2024 pm 12:10 PM

BitPie Bitpie ウォレット アプリをダウンロードするにはどうすればよいですか?手順は次のとおりです。 AppStore (Apple デバイス) または Google Play ストア (Android デバイス) で「BitPie Bitpie Wallet」を検索します。 「入手」または「インストール」ボタンをクリックしてアプリをダウンロードします。コンピューター版の場合は、BitPie ウォレットの公式 Web サイトにアクセスし、対応するソフトウェア パッケージをダウンロードしてください。

Bitget公式ウェブサイトのインストール(2025初心者ガイド) Bitget公式ウェブサイトのインストール(2025初心者ガイド) Feb 21, 2025 pm 08:42 PM

Bitgetは、スポット取引、契約取引、デリバティブなど、さまざまな取引サービスを提供する暗号通貨交換です。 2018年に設立されたこのExchangeは、シンガポールに本社を置き、安全で信頼性の高い取引プラットフォームをユーザーに提供することに取り組んでいます。 Bitgetは、BTC/USDT、ETH/USDT、XRP/USDTなど、さまざまな取引ペアを提供しています。さらに、この取引所はセキュリティと流動性について評判があり、プレミアム注文タイプ、レバレッジド取引、24時間年中無休のカスタマーサポートなど、さまざまな機能を提供します。

Zabbix 3.4 ソースコードコンパイルのインストール Zabbix 3.4 ソースコードコンパイルのインストール Sep 04, 2024 am 07:32 AM

1. インストール環境 (Hyper-V 仮想マシン): $hostnamectlStatichostname:localhost.localdomainIconname:computer-vmChassis:vmMachineID:renwoles1d8743989a40cb81db696400BootID:renwoles272f4aa59935dcdd0d456501Virtualization:microsoftOperatingSystem:CentOS Linux7(Core)CPEOSName: CP:

OUYI OKXインストールパッケージが直接含まれています OUYI OKXインストールパッケージが直接含まれています Feb 21, 2025 pm 08:00 PM

世界をリードするデジタル資産交換であるOuyi Okxは、安全で便利な取引体験を提供するために、公式のインストールパッケージを開始しました。 OUYIのOKXインストールパッケージは、ブラウザに直接インストールでき、ユーザー向けの安定した効率的な取引プラットフォームを作成できます。インストールプロセスは、簡単で理解しやすいです。

gate.ioインストールパッケージを無料で入手してください gate.ioインストールパッケージを無料で入手してください Feb 21, 2025 pm 08:21 PM

Gate.ioは、インストールパッケージをダウンロードしてデバイスにインストールすることで使用できる人気のある暗号通貨交換です。インストールパッケージを取得する手順は次のとおりです。Gate.ioの公式Webサイトにアクセスし、「ダウンロード」をクリックし、対応するオペレーティングシステム(Windows、Mac、またはLinux)を選択し、インストールパッケージをコンピューターにダウンロードします。スムーズなインストールを確保するために、インストール中に一時的にウイルス対策ソフトウェアまたはファイアウォールを一時的に無効にすることをお勧めします。完了後、ユーザーはGATE.IOアカウントを作成して使用を開始する必要があります。

See all articles