10 Linux
10.1 Reading the flattened device tree (FDT)
커널 구성 옵션에 CONFIG_PROC_DEVICETREE가 설정되어 있으면, 부팅 후 /proc 파일 시스템 내에서 커널이 파싱한 실제 디바이스 트리를 볼 수 있다.
예를 들어, /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
You may also use the dtc tool to compile the /proc/device-tree into a DTS file:
[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
디바이스 트리 바인딩은 디바이스의 특정 유형과 클래스를 기술하는 데 사용되는 구문을 기술한다. 디바이스 노드의 compatible 속성은 특정 바인딩이나 노드가 준수하는 바인딩을 기술한다. 커널이 인식하는 디바이스 트리 바인딩은 Documentation/devicetree/bindings에 문서화되어 있다.
각 문서는 허용되는 속성, 값, 필수나 선택적인 속성을 기술한다. 최신 디바이스 트리 바인딩은 업스트림에서 찾을 수 있다.
예를 들어, 아래는 Documentation/devicetree/bindings/powerpc/fsl/ifc.txt에 있는 IFC 바인딩에 대한 문서이다.
10.2.1 Manually parsing bindings
경우에 따라 모듈의 경우, 디바이스 트리 바인딩이 문서화되지 않은 경우가 더 많다. 커널 소스가 오픈되어 있기 때문에, 코드를 살펴보면 노드가 어떻게 사용되고 어떤 드라이버 코드에 의해 사용되는지 정확하게 식별할 수 있다.
호환 가능한 문자열은 디바이스를 드라이버와 바인딩하는 데 사용된다. 다음은 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는 ad_phy_probe로 정의되어 있고, 디바이스 트리를 구문 분석하는 데 사용되는 함수를 나타낸다. 이 함수를 조사하여 이 RF 모듈에 대한 디바이스 트리 노드의 속성이 정확히 어디에서 어떻게 사용되는지 확인할 수 있다.
다른 예로, QorIQ SDK 1.6의 T1040 디바이스 트리를 볼 수 있다. 다음은 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로 정의되어 있고, 이는 디바이스 트리를 구문 분석하는 데 사용되는 함수를 나타낸다.
'NXP i.MX SoC Family > Device Trees' 카테고리의 다른 글
Introduction to Device Trees - Examples (0) | 2022.10.14 |
---|---|
Introduction to Device Trees - U-Boot (0) | 2022.10.14 |
Introduction to Device Trees - Device tree compiler (0) | 2022.10.13 |
Introduction to Device Trees - Device tree inclusion (0) | 2022.10.13 |
Introduction to Device Trees - Example: Device tree node (0) | 2022.10.13 |