원본은 NXP 사이트에서 바로 받을 수 있다.
Introduction to Device Trees - 1
Introduction to Device Trees - 2
Introduction to Device Trees - 3
Introduction to Device Trees - 5
Introduction to Device Trees - 6
Introduction to Device Trees - 7
8. Device tree compiler
Device Tree Compiler(DTC)는 소스를 바이너리 형식으로 컴파일하는 도구이다. DTC에서 사용하는 소스 코드는 scripts/dtc 안에 있다.
Device Tree Compiler 결과은 부트 로더에 의해 로드되고, 부팅시 Linux 커널에 의해 구문 분석되는 이진 형식인 Device Tree Blob(DTB)입니다.
ARM® 및 ARM® 64-bit 아키텍처에서 빌드시 생성 될 DTB는 arch /../ boot / dts / Makefile에 나열되지만, 언제든지 DTC에서 수동으로 컴파일 할 수 있습니다.
DTC 명령어 사용 형식은 아래와 같습니다.
dtc [option] <input filename>
주요 option은 아래와 같습니다.
- -I
- -O
- -b
: set the physical boot cpu
입력 형식은 .dts, .dtb 또는 .fs 일 수 있습니다 (.fs는 현재 파일 시스템 /proc/device-tree 에서 읽습니다). 출력 형식은 .dts, .dtb 또는 .asm 일 수 있습니다. 바이트 채우는 옵션등과 같이 다른 옵션이 많이 있습니다 (-R, -S, -P). 예를 들어, 위에서 언급 한 bsc9131rdb.dts 파일을 컴파일하려면 다음을 수행하십시오.
dtc –I dts –O dtb bsc9131rdb.dts > bsc9131rdb.dtb
DTC는 DTB를 역컴파일을 하여 쉽게 읽을 수 있게 변경할 수 있습니다.
dtc –I dtb –O dts bsc9131rdb.dtb > bsc9131rdb_output.dts
9. U-Boot
U-Boot는 RCW (Reset Configuration Word), 환경 변수 및 하드웨어 구성에서 파생된 정보와 같은 플랫폼별 정보로 FDT (flattened device tree)를 업데이트합니다. U-Boot의 가장 일반적인 영역은 주파수, MAC 주소, LIODN (Peripheral MMU settings) 및 메모리 크기와 관련이 있습니다. 실제 수정은 보드별로 다르며, U-Boot 코드 이외의 다른 곳에서는 문서화되어 있지 않습니다. U-Boot 내에서 이 모든 것이 발생하는 핵심 함수는 ft_board_setup() 입니다.
U-Boot 자체는 현재 Freescale 플랫폼에서 Device Tree를 사용하지 않지만, FDT 자체를 보고 조작 할수 있는 몇 가지 명령이 있습니다.
- bottom은 FDT 관련 하위 명령어가 있습니다.
- bootm fdt — relocates the flattened device tree
- bootm go — performs fix-up actions and boots the operating system
- fdt는 FDT를 조작합니다.
- fdt addr
[ ] — sets the FDT location to - fdt boardsetup — performs board-specific setup
- fdt move
— copies the FDT to and makes it active - fdt resize — resizes the FDT to size + padding to 4 K address
- fdt print
[ ] — recursive print starting at - fdt set
[ ] — sets [to ] - fdt mknode
— creates a new node after - fdt rm
[ ] — deletes the node or - fdt header — displays header information
- fdt chosen [
] — adds/updates the /chosen branch in the tree , / — initrd the start/end address
- fdt addr
10. Linux
10.1. Reading the flattened device tree (FDT)
커널 구성 옵션에 CONFIG_PROC_DEVICETREE가 설정되어 있으면, 부팅 후 /proc 파일 시스템 내에서 커널이 파싱한 실제 Device Tree를 볼 수 있습니다.
예를 들어 /proc/device-tree 에서 모든 노드를 찾을 수 있습니다.
[root@p4080ds]# cd /proc/device-tree
[root@p4080ds]# find
.
./name
[...]
./model
./fsl,dpaa/ethernet@0/fsl,qman-channel
[...]
./soc@ffe000000/fman@500000/ethernet@f0000/phy-connection-type
[...]
./soc@ffe000000/dma@100300/dma-channel@100/interrupts
[...]
./chosen/linux,initrd-start
dtc 도구를 사용하여 /proc/device-tree를 DTS 파일로 컴파일 할 수도 있습니다.
[root@p4080DS]# dtc -I fs -O dts /proc/device-tree/
[...]
chosen {
bootargs = "root=/dev/ram rw console=ttyS0,115200 ramdisk_size=128000";
linux,stdout-path = "/soc@ffe000000/serial@11c500";
linux,initrd-start = <0x2f320000>;
linux,initrd-end = <0x2ffffd15>;
};
10.2. Device tree bindings
Device Tree 바인딩은 특정 유형 및 장치 클래스를 설명하는데 사용되는 구문을 설명합니다. 장치 노드의 compatible 속성은 노드가 따르는 특정 바인딩 또는 바인딩을 설명합니다. 커널이 인식하는 Device Tree 바인딩은 Documentation / devicetree / bindings에 문서화되어 있습니다.
각 문서에는 허용되는 속성, 값, 필수 속성 또는 선택적 속성이 설명되어 있습니다. 최신 Devie Tree 바인딩은 upstream에서 찾을 수 있습니다.
예를 들어 아래는 Documentation/devicetree/bindings/powerpc/fsl/ifc.txt에 있는 IFC 바인딩 문서입니다.
10.2.1. Manually parsing bindings
때때로 더 자주 모듈의 경우 Device Tree 바인딩이 문서화되어 있지 않습니다. 커널 소스가 열려 있기 때문에, 코드를 살펴보고 노드 사용 방법과 드라이버 코드를 정확하게 식별할 수 있습니다.
compatible 속성 문자열은 장치를 드라이버와 바인딩하는데 사용됩니다. 아래는 Freescale Wireless SDK Release 1.5의 bsc9131rdb.dts 파일에있는 SPI 노드의 예입니다.
spi@6000 {
rfphy0: ad9361_phy@0{
compatible = "fsl,espi-ad_phy","ad9361";
reg = <0>;
spi-max-frequency = <20000000>;
spi-cpha;
band_group1 = <1 7>;
band_group2 = <41>;
band_group3 = <>;
band_group4 = <13 40>;
band_group_sniff1 = <>;
band_group_sniff2 = <13>;
band_group_sniff3 = <1 7>;
band_group_sniff4 = <>;
band_group_config1 = <&pa_en 0 &lna_en 0>;
band_group_config2 = <&pa_en 0 &lna_en 1>;
band_group_config3 = <&pa_en 1 &lna_en 0>;
band_group_config4 = <&pa_en 1 &lna_en 1>;
reset: reset {
label = "reset";
gpios = <&gpio1 2 1>;
};
pa_en: pa_en {
#num-val = <1>;
label = "pa_en";
gpios = <&gpio 18 1>;
};
lna_en: lna_en {
#num-val = <1>;
label = "lna_en";
gpios = <&gpio 17 1>;
};
};
);
노드의 바인딩에서 하드웨어가 fsl, espi-ad_phy 및 ad9361과 호환됨을 알 수 있습니다. compatible 속성은 커널에서 하드웨어를 식별하고 커널에 등록된 드라이버와 일치시키는 데 사용됩니다.
소스를 살펴보면 espi-ad_phy가 ad9361_phy (drivers / of / base.c)에 별칭으로 표시되어 있음을 알 수 있습니다. 추가적인 검색에서 ad9361_phy의 드라이버는 drivers / rf / phy / ad9361.c 있는 것을 찾을 수 있습니다.
#define DRV_NAME "ad9361_phy"
static struct spi_driver ad_phy_driver = {
.driver = {
.name = DRV_NAME,
.bus = &spi_bus_type,
.owner = THIS_MODULE,
},
.probe = ad_phy_probe,
.remove = __devexit_p(ad_phy_remove),
};
드라이버 이름은 ad9361_phy로 커널에 등록 되므로, 이 특정 드라이버가 사용됩니다.
Probe는 Device Tree를 구문 분석하는데 사용되는 함수인 ad_phy_probe로 정의됩니다. 이 RF 모듈에 대한 Device Tree 노드의 속성이 사용되는 위치와 방법을 정확히 파악하기 위해서 이 함수를 쓸 수 있습니다.
또 다른 예제로 QorIQ SDK 1.6에 있는 T1040 Device Tree를 살펴 볼 수 있습니다. 다음은 t1040rdb.dts의 내용입니다.
ucc@2200{
compatible = "fsl,ucc_hdlc";
rx-clock-name = "brg2";
tx-clock-name = "brg2";
fsl,rx-sync-clock = "none";
fsl,tx-sync-clock = "none";
fsl,tx-timeslot = <0xfffffffe>;
fsl,rx-timeslot = <0xfffffffe>;
fsl,tdm-framer-type = "e1";
fsl,tdm-mode = "normal";
fsl,tdm-id = <1>;
fsl,siram-entry-id = <2>;
fsl,inter-loopback;
};
이 예제에서 하드웨어는 fsl,ucc_hdlc와 호환이 가능합니다. 하드웨어 디바이스 드라이버는 drivers / net / wan / fsl_ucc.hdlc.c에 있습니다.
#define DRV_DESC "Freescale QE UCC HDLC Driver"
#define DRV_NAME "ucc_hdlc"
static struct platform_driver_ucc_hdlc_driver = {
.probe = ucc_hdlc_probe,
.remove = ucc_hdlc_remove,
.driver = {
.owner = THIS_MODULE,
.name = DRV_NAME,
.pm = HDLC_PM_OPS,
.of_match_table = fsl_ucc_hdlc_of_match,
},
};
이 경우 probe 는 ucc_hdlc_probe로 정의 되고, Device Tree를 구문 분석하는데 사용되는 함수입니다.