[AOSP] Device Tree

DTSI (Device Tree Source Include)๋ž€?

  • DTSI๋Š” Device Tree๋ฅผ โ€œ๋ชจ๋“ˆํ™”โ€ํ•˜๊ธฐ ์œ„ํ•œ include ํŒŒ์ผ
    # ๋นŒ๋“œ ํ๋ฆ„
    .dts + .dtsi
     โ†“
    dtc (device tree compiler)
     โ†“
    .dtb / .dtbo
     โ†“
    boot.img ํฌํ•จ
     โ†“
    kernel boot ์‹œ ์ ์šฉ
    

1. Device Tree ๊ตฌ์กฐ

.dts   โ†’ ์ตœ์ข… ๋ณด๋“œ ์„ค์ • (entry point)
.dtsi  โ†’ ๊ณตํ†ต ์„ค์ • (include ํŒŒ์ผ)
.dtbo  โ†’ overlay (๋™์  ๋ณ€๊ฒฝ์šฉ)

2. DTSI ์—ญํ• 

  • 1) DTSI๋Š” โ€œ๊ณตํ†ต ์„ค์ •์„ ๋ถ„๋ฆฌโ€
    // yupik.dtsi
    #include "yupik-qupv3.dtsi"
    #include "test_uart.dtsi"
    
    • SoC ๊ธฐ๋ณธ UART ์ •์˜ โ†’ yupik-qupv3.dtsi
    • Vendor ์ปค์Šคํ…€ UART โ†’ test_uart.dtsi
  • 2) DISI ๋ฅผ ์“ฐ๋Š” ์ด์œ 
    ๊ฐ™์€ SoC ์“ฐ๋Š” ๋ณด๋“œ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๋•Œ
    common_uart.dtsi โ†’ ๊ณตํ†ต ์ •์˜
    ๊ฐ dts โ†’ include๋งŒ ์ˆ˜ํ–‰
    

3. ์—์ œ_1 (ํŠน์ˆ˜ ๋…ธ๋“œ (UART))

/ {
  aliases {
    hsuart1 = &qupv3_se10_2uart;
  };
};
  • property = &label;ย : ๋ ˆ์ด๋ธ”์ด ์ฐธ์กฐํ•˜๋Š” ์ „์ฒด๋…ธ๋“œ ๊ฒฝ๋กœ๋ฅผ ๋ฌธ์ž์—ด ํŠน์„ฑ์œผ๋กœ ์ง€์ •
  • aliases ๋…ธ๋“œ์˜ ๊ฐ ์†์„ฑ์€ ๋‹ค๋ฅธ ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ •์˜

4. ์—์ œ_2

qupv3_se10_2uart: qcom,qup_uart@a88000 {
	compatible = "qcom,msm-geni-serial-hs";
	reg = <0xa88000 0x4000>;
	reg-names = "se_phys";
	interrupts = <GIC_SPI 355 IRQ_TYPE_LEVEL_HIGH>;
	clock-names = "se-clk", "m-ahb", "s-ahb";
	clocks = <&gcc GCC_QUPV3_WRAP1_S2_CLK>,
		<&gcc GCC_QUPV3_WRAP_1_M_AHB_CLK>,
		<&gcc GCC_QUPV3_WRAP_1_S_AHB_CLK>;
	pinctrl-names = "default", "active", "sleep";
	pinctrl-0 = <&qupv3_se10_default_txrx>;
	pinctrl-1 = <&qupv3_se10_2uart_active>;
	pinctrl-2 = <&qupv3_se10_2uart_sleep>;
	qcom,wrapper-core = <&qupv3_1>;
	status = "disabled";
};
  • compatible : "qcom,msm-geni-serial-hs"
    • ์‹œ์Šคํ…œ ์ด๋ฆ„ ์ง€์ •, โ€œ์ œ์กฐ์—…์ฒด, ๋“œ๋ผ์ด๋ฒ„๋ช…โ€ ํ˜•์‹์˜ ๋ฌธ์ž์—ด์„ ํฌํ•จ
  • reg = <0x98c000 0x4000>;
    • ์ฃผ์†Œ ์ง€์ • ๋ฐฉ๋ฒ•
    • ํ•ด๋‹น node์˜ address์™€ size๋ฅผ ์ •์˜, <address, size> ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ
  • interrupts = <GIC_SPI 355 IRQ_TYPE_LEVEL_HIGH>;
    • ๋””๋ฐ”์ด์Šค์˜ ๊ฐ ์ธํ„ฐ๋ŸฝํŠธ ์ถœ๋ ฅ ์‹ ํ˜ธ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์ธํ„ฐ๋ŸฝํŠธ ์ง€์ •์ž ๋ชฉ๋ก์„ ํฌํ•จํ•˜๋Š” ๋””๋ฐ”์ด์Šค ๋…ธ๋“œ์˜ ํŠน์„ฑ์ด
  • clock-names = "se-clk", "m-ahb", "s-ahb";
    • clock ๋ ˆ์ด๋ธ”
  • clocks = <&gcc GCC_QUPV3_WRAP1_S2_CLK>, <&gcc GCC_QUPV3_WRAP_1_M_AHB_CLK>,<&gcc GCC_QUPV3_WRAP_1_S_AHB_CLK>;
    • clock ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋ƒ„
    • ๋ณดํ†ต clock์€ ์ˆ˜์ •ํ•  ์ผ์ด ๊ฑฐ์˜ ์—†์Œ.
    • ๊ธฐ์กด kernel ํŒŒ์ผ์— ์žˆ๋Š” ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•ด์„œ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„
    • ๊ด„ํ˜ธ์— ์‚ฌ์šฉํ•˜๋Š” clock์— ๋Œ€ํ•ด ์ •์˜๋˜์–ด์žˆ์Œ. (๊ธฐ์กด kernel driver ๋‹จ์— ์ •์˜)
  • pinctrl-names = "default", "active", "sleep";
    • pin ์ƒํƒœ๋ฅผ ํ• ๋‹นํ•˜๋Š” name List
    • pinctrl์€ pin mux ์„ค์ •์„ ํ•˜๊ณ , ์‹ค์ œ ์‚ฌ์šฉํ•  ์žฅ์น˜ ๋…ธ๋“œ์™€ pin ๋…ธ๋“œ ๊ฐ„์˜ ์—ฐ๊ฒฐ ๊ด€๋ฆฌ.
    • ์žฅ์น˜ ๋…ธ๋“œ์—๋Š” ๊ณ ์œ ์˜ compatible ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ด ์ด๋ฆ„์€ ์‹ค์ œ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ ์‚ฌ์šฉ
    • pinctrl-names์™€ pinctrl-0์€ MUX ์„ค์ •์ด๋ฉฐ ์‹ค์ œ GPIO ์ ‘๊ทผ์„ ์œ„ํ•ด์„œ๋Š” ๋ณ„๋„์˜ pin ์„ค์ •์„ ํ•จ
    • status ๊ฐ€ okay๊ฐ€ ๋˜์–ด์•ผ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ํ™œ์„ฑ๋จ.
  • pinctrl-0 = <&qupv3_se10_default_txrx>;
    pinctrl-1 = <&qupv3_se10_2uart_active>;
    pinctrl-2 = <&qupv3_se10_2uart_sleep>;
    • pinctrl ๋‚ด์˜ pin configuration node๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” phandles์˜ list
  • qcom,wrapper-core = <&qupv3_1>;
    • Qualcomm ์‚ฌ์˜ qup v3 hardware ID
  • status = "ok";
    • ์žฅ์น˜์˜ ์ž‘๋™ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. (ok, diswabled ๋“ฑ)
    • ์ƒ์œ„ product / device ์„ค์ •์ด ์–ด๋–ค ๋ชจ๋“ˆ์„ ํฌํ•จํ• ์ง€ ๊ฒฐ์ •
    • make ๊ณ„์—ด ๋„๊ตฌ๊ฐ€ ์ด๋ฅผ ๋ชจ์•„ system/vendor/product ์ด๋ฏธ์ง€ ๋“ฑ์„ ์ƒ์„ฑํ•˜๋Š” ๊ตฌ์กฐ

Categories:

Updated:

Leave a comment