-
[커널][디바이스트리] Label을 사용하는 이유와 참조시 주의점Linux/kernel 2023. 8. 3. 02:25
디바이스트리에 노드를 작성할 때, 아래와 같은 양식을 따른다.
[ Label : ] Name@[ Addres ] : { ... }
대괄호로 묶인 Label과 Address는 옵션이다. 여기서 Label을 사용하는 이유와 참조시 주의점에 대해 알아보자.
1. Label을 선언하는 이유는 해당 노드를 참조하기 위해서는 반드시 Label을 선언한다.
soc { rpi3b { compatible = "rpi3b"; }; }; // compile error 1 &rpi3b { phandle = <20108472>; };
rpi3b 노드는 레이블이 선언하지 않았기 때문에, 컴파일 에러를 낸다.
2. 특정 노드의 프로퍼티를 수정하기 위해 노드를 참조할 경우, 가장 최상위에 &{NODE_NAME} 식으로 선언해야 한다.
soc { rpi3b { compatible = "rpi3b"; }; yohda: yohda { compatible = "yohda"; }; }; &temp { status = "okay"; // compile error 2 &yohda { status = "okay"; }; }; &yohda { phandle = <23947212>; }; // compile error 1 &rpi3b { phandle = <20108472>; };
yohda 노드는 두 군데서 참조가 되고 있다. 하나는 temp 노드 아래이고 나머지는 디바이스 트리의 Top-level 이다. 여기서 컴파일 에러는 temp 노드에서 발생한다. 왜냐면, 값을 수정하기 위해 참조되는 곳이 디바이스 트리의 Top-level이 아니기 때문이다.
참고로 phandle 프로퍼티가 보이는데, 이 프로퍼티는 해당 노드의 유일한 유니크한 값이라고 보면 된다. phandle 값을 통해 해당 노드의 프로퍼티에 접근이 가능하다. 그런데 대부분의 디바이스 트리의 노드는 phandle을 정의하지 않는다. 왜냐면, DTC가 컴파일 과정에서 자동으로 phandle을 노드에 입력하기 때문이다.
- Reference
'Linux > kernel' 카테고리의 다른 글
[리눅스 커널] platform driver probe를 호출하는 4가지 방법. (0) 2023.08.03 [커널][디바이스트리] 디바이스 트리에서 8, 16, 64 비트값 선언하고 읽기. (0) 2023.08.03 [리눅스 커널] 커널 컨텍스트 (0) 2023.08.03 [리눅스 커널] Loadable Kernel Module(LKM) (0) 2023.08.03 [리눅스 커널] PM - Power Management Interface (2) 2023.08.03