device tree source(dts)

5226 단어
Device Tree Source 구문:
.dts도 c 언어처럼 포함할 수 있습니다.dtsi 파일, 이거.dtsi 파일은 마치.h 파일과 같습니다.거의 모든arm칩에skeleton이 포함되어 있다.dtsi  
root 노드 "/", 하위 노드 "cpu"와 "external-bus"
[label:] node-name[@unit-address] { 
   [properties definitions] 
   [child nodes] 
}

label: dts에서 어떤 노드를 인용하려면 전체 경로를 써야 합니다
각 노드에는 다음과 같은 속성이 있습니다.
(1) text string 또는 text list 속성 표시 방법: devicetype = "memory"
(2) u32의 속성 표시 방법: #size-cells = <1>
(3)binary-data 속성 표시 방법:binary-property = [0x10 0x20 0x30 0x40]
설명: #은 숫자의 뜻을 나타낸다
Basic Data Format
dts가 어떻게 사용되는지 설명하기 위해서, 우리는 견본기를 사용하여 한 걸음 한 걸음 dst를 작성한다
1   ARM Cortex-A9 32    ;   :"Acme"    :"Coyote's Revenge":
local bus
      x2        (  0x101F1000   0x101F2000)
    GPIO       (  0x101F3000)
    SPI        (  0x10170000)
              (  0x10140000)
external bus ;
    SMC SMC91111 Ethernet    (  0x10100000)
    I2C                   (  0x10160000)
        Maxim DS1338      (I2C   0x58)
    64MB NOR Flash           (  0x30000000)

1 Initial structure
/ {
    compatible = "acme,coyotes-revenge";
};

"compatible"는 시스템의 이름이고 형식은 "메이커, 모델"입니다. OS는compatible에 따라machine을 식별하기 때문에 정확성을 확보해야 합니다. 
2 CPUs
/ {
    compatible = "acme,coyotes-revenge";

    cpus {
        cpu@0 {
            compatible = "arm,cortex-a9";
        };
        cpu@1 {
            compatible = "arm,cortex-a9";
        };
    };
};

루트 노드 아래에 cpus 서브 노드를 하나 더 추가합니다. cpu 서브 노드의compatible는string이고 형식은 '제조업체, 모델' 입니다.루트 노드의compatible와 같습니다.
3 Node Names
노드의 이름 지정 사양: <이름>[@<위젯 주소>] 여기서 이름은 31자 이하의 ascii 문자열(<>는 필수 []이며 필수 옵션이 아닙니다.이름은 주로 장치 유형을 설명하는데, 예를 들어 3com 이더넷 어댑터에 대응하는 결점 이름은 3com이 아니라 ethernet이어야 한다
일반적으로 위젯 주소는 장치의 주 주소를 설명하는 데 쓰인다.만약 결점에 기술된 장치에 주소가 있다면 @unit-address를 주어야 합니다.여러 개의 같은 종류의 장치 결점의name는 위젯 주소가 다르면 됩니다. 예를 들어cpu@0、cpu@1. 
장치의 위젯 주소도 결점의reg 속성에 자주 나타납니다
4 Devices
모든 장치가 dts에서 하나의 노드에 대응하고, 아래에서 우리는 모든 장치를 트리의 노드로 채울 것이다
/ {
    compatible = "acme,coyotes-revenge";

    cpus {
        cpu@0 {
            compatible = "arm,cortex-a9";
        };
        cpu@1 {
            compatible = "arm,cortex-a9";
        };
    };

    serial@101F0000 {
        compatible = "arm,pl011";
    };

    serial@101F2000 {
        compatible = "arm,pl011";
    };

    gpio@101F3000 {
        compatible = "arm,pl061";
    };

    interrupt-controller@10140000 {
        compatible = "arm,pl190";
    };

    spi@10115000 {
        compatible = "arm,pl022";
    };

    external-bus {
        ethernet@0,0 {
            compatible = "smc,smc91c111";
        };

        i2c@1,0 {
            compatible = "acme,a1234-i2c-bus";
            rtc@58 {
                compatible = "maxim,ds1338";
            };
        };

        flash@2,0 {
            compatible = "samsung,k8f1315ebm", "cfi-flash";
        };
    };
};

dts에서 차원 구조는 하드웨어의 종속 관계를 반영했다. 현재 이 dts에는 장치 간의 연결 정보가 없고 이후에 추가될 것이다. 본 dts에서 주의해야 할 것은 다음과 같다.
(1) 모든 장치 노드에compatible(2)flash는 두 개의 문자열을 사용하고, 다음 절(3) 이름은 장치 형식이지 특정한 번호가 아니다.
5 Understanding the compatible Property
compatible는 OS가 하드웨어와 드라이브를 연결하는 관건이다. flash의 첫 번째string은 지원하는 정확한 장치이고 두 번째 문자열은 호환되는 장치를 의미한다. 
How Addressing Works
주소 지정 가능한 장치는 다음과 같은 정보를 사용하여 Device Tree에서 주소 정보를 인코딩합니다.
reg
#address-cells
#size-cells

reg의 조직 형식은reg = ,그 중 하나의addresslength는 장치가 사용하는 주소 범위를 나타냅니다. 
address는 1개 이상의 셀(즉 32비트의 정형)이고, length는 0 또는 여러 셀(#size-cells = 0)이다.address와length 필드는 가변 길이이며, 부결점의 #address-cells와 #size-cells는 각각 자결점의reg 속성의address와length 필드의 길이를 결정한다.
다음에 cpu에서reg 속성을 추가합니다
CPU addressing
 cpus {
        #address-cells = <1>;
        #size-cells = <0>;
        cpu@0 {
            compatible = "arm,cortex-a9";
            reg = <0>;
        };
        cpu@1 {
            compatible = "arm,cortex-a9";
            reg = <1>;
        };
    };

address는 1개의cell로 length를 표시하고 0개의cell로 표시하기 때문에reg는 입니다. 또한 노드에reg 속성이 있으면 위젯 주소name[@unit-addr]를 표시해야 합니다.
Memory Mapped Devices
/ {
    #address-cells = <1>;
    #size-cells = <1>;

    ...

    serial@101f0000 {
        compatible = "arm,pl011";
        reg = <0x101f0000 0x1000 >;
    };

    serial@101f2000 {
        compatible = "arm,pl011";
        reg = <0x101f2000 0x1000 >;
    };

    gpio@101f3000 {
        compatible = "arm,pl061";
        reg = <0x101f3000 0x1000
               0x101f4000 0x0010>;
    };

    interrupt-controller@10140000 {
        compatible = "arm,pl190";
        reg = <0x10140000 0x1000 >;
    };

    spi@10115000 {
        compatible = "arm,pl022";
        reg = <0x10115000 0x1000 >;
    };

    ...

};

좋은 웹페이지 즐겨찾기