(DTシリーズ一)DTS構造及びそのコンパイル方法

6286 ワード

DTS構造とそのコンパイル方法
一:主な問題
1,dtsiとdtsの関係を知る必要がある
2,dtsの構造モデル
3,dtsがどのようにコンパイルするか、コンパイル後にどのようなファイルが生成されるか.
二:参考文字

1,DTS(device tree source)


.dtsファイルはASCIIテキスト形式のDeviceTree記述です.基本的には、ARMLinux内で、1つ.dtsファイルはARMのmachineに対応し、カーネルのarch/arm/boot/dts/ディレクトリに一般的に配置されます.1つのSoCが複数のmachine(1つのSoCが複数の製品や回路基板に対応可能)に対応する可能性があるため、これらは必須である.dtsファイルには多くの共通の部分が含まれている必要があります.Linuxカーネルは簡略化のため、SoC共通の部分または複数のmachine共通の部分を一般的に精製する.dtsiは、C言語のヘッダファイルに似ています.他のmachineが対応しています.これだdtsi.
2,dtsの構造モデル
DeviceTreeの構造を理解するには、まずDeviceTreeの例を示します.
/o device-tree       |- name ="device-tree"      |- model ="MyBoardName"      |-compatible = "MyBoardFamilyName"     |- #address-cells = <2>       |-#size-cells = <2>       |-linux,phandle = <0>       |      o cpus       | | - name = "cpus"     | | - linux,phandle = <1>       | |- #address-cells = <1>       | | -#size-cells = <0>       | |      | o PowerPC,970@0       | |- name ="PowerPC,970"      | |-device_type = "cpu"      | |-reg = <0>       | |-clock-frequency = <0x5f5e1000>      | |- 64-bit       | |- linux,phandle =<2>       |      o memory@0       | |- name ="memory"      | |- device_type= "memory"      | |- reg =<0x00000000 0x00000000 0x00000000 0x20000000>      | |- linux,phandle = <3>      |       o chosen        |- name = "chosen"       |- bootargs = "root=/dev/sda2"       |- linux,phandle = <4>
上図からdevicetreeの基本ユニットはnodeであることがわかる.これらのnodeはrootnodeを除いて1つのparentしかないツリー構造に組織されている.1つのdevicetreeファイルにrootnodeは1つしかありません.各nodeには、nodeのいくつかの特性を記述するためにいくつかのproperty/valueが含まれている.各nodeはノード名(nodename)で識別され、ノード名のフォーマットはnode-name@unit-address.ノードにregプロパティがない場合(このpropertyは後述する)、ノード名に@とunit-addressを含めることはできません.unit-addressの具体的なフォーマットは、デバイスがそのbusに掛けられていることに関連しています.例えばcpuの場合、そのunit-addressは0からアドレス付けされ、1つ加算される.具体的なデバイス、例えばイーサネットコントローラは、unit-addressがレジスタアドレスである.rootnodeのnodenameは確定しており、「/」でなければならない.
3,dtsがどのようにコンパイルされたのか,コンパイル後にどのようなファイルが生成されるのか.
  • DTC(device tree compiler)


  • dtcは将です.dtsは.dtbのツール.DTCのソースコードはカーネルのscripts/dtcディレクトリにあり、LinuxカーネルがDeviceTreeを使用可能にした場合、カーネルをコンパイルするとホストツールdtcがコンパイルされ、scripts/dtc/Makefileの「hostprogs-y:=dtc」というhostprogsに対応してtargetがコンパイルされます.
    Linuxカーネルのarch/arm/boot/dts/Makefileには、あるSoCが選択すると、どのようなものが記述されている.dtbファイルがコンパイルされます.例を次に示します.
    VEXPRESSに対応する.dtbは以下を含む.
    	dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb \
            	vexpress-v2p-ca9.dtb \
            	vexpress-v2p-ca15-tc1.dtb \
            	vexpress-v2p-ca15_a7.dtb \
            	xenvm-4.2.dtb

    LinuxではDeviceTreeファイルを個別にコンパイルできます.Linuxカーネルの下でmakedtbsを実行すると、前にARCH_を選択した場合VEXPRESS,上記.dtbはいずれも対応する.dtsをコンパイルします.arch/arm/Makefileにはdtbsコンパイルtargetプロジェクトが含まれているからです.
  • DeviceTree Blob (.dtb)



  • dtbはい.dtsはDTCによってコンパイルされたバイナリ形式のDeviceTree記述であり,Linuxカーネルによって解析できる.通常、回路基板にNAND、SD起動イメージを作成する場合は、dtbファイルは単独で小さな領域を残して保存する、bootloaderはkernelを起動する過程で、先にこれを読み取る.dtbからメモリへ.
  • ソースコードの実装


  • DTを使用するには2つの方法があります.第1種は、複数のdtbを含むdtを組み込むことができる.img、boot.img.2つ目は1つのdtbのみを含み、kernelimageの後ろに直接追加しbootを入れる.img. dtcはkernel/Android Kernelにコンパイルされている.mkで定義します.まず定義「DTS_NAMES」変数を用いて、その各entry(「DTS_NAME」変数と表記する、以下の$$arch)にarchとrevの2つの部分がある可能性がある.configでは関連構成について、次の方法で見つけます.
    while (<>) {
    $$a = $$1 if /CONFIG_ARCH_((?:MSM|QSD|MPQ)[a-zA-Z0-9]+)=y/;
    $$r = $$1 if /CONFIG_MSM_SOC_REV_(?!NONE)(\w+)=y/;
    $$arch = $$arch.lc("$$a$$r ") if /CONFIG_ARCH_((?:MSM|QSD|MPQ)[a-zA-Z0-9]+)=y/
    } print $$arch;

    上記の「DTS_NAMES」変数が得られ、「kernel/arch/arm/boot/dts/」で「$(DTS_NAME)*.dts」で一致する.「cat」コマンドは、DT付きkernelimageを生成する定義を参照してください.
    define append-dtb
    mkdir -p $(KERNEL_OUT)/arch/arm/boot;\
    $(foreach DTS_NAME, $(DTS_NAMES), \
       $(foreach d, $(DTS_FILES), \
          $(DTC) -p 1024 -O dtb -o $(call DTB_FILE,$(d)) $(d); \
          cat $(KERNEL_ZIMG) $(call DTB_FILE,$(d)) > $(call ZIMG_FILE,$(d));))
    endef

    2つ目の方法はbootを入れる方法を見ていません.img.1つ目の方法では、「device/qcom/common/generate_extra_images.mk」で定義された次のルールで「dt.img」が作成されます.
    $(INSTALLED_DTIMAGE_TARGET): $(DTBTOOL) $(INSTALLED_KERNEL_TARGET)
            $(build-dtimage-target)

    「build/core/Makefile」でbootに次の文を組み込む.img.
    ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true)
      INTERNAL_BOOTIMAGE_ARGS += --dt $(INSTALLED_DTIMAGE_TARGET)
      BOOTIMAGE_EXTRA_DEPS   s:= $(INSTALLED_DTIMAGE_TARGET)
    endif