편집하다:이것은 phandle을 사용하여 포트를 참조하는 것에 대한 일반적인 질문입니다. 제가 게시한 예는 동시에 다른 노드에서 동일한 동작을 관찰했기 때문에 제 특정 사례와 관련이 없습니다.
장치 트리 포함(dtsi)에서 기존 포트 노드를 참조하고 여기에 엔드포인트를 추가하고 싶습니다. 이 기존 노드는 mipi_in이라고 하며 다른 노드(mipi_dsi) 내의 포트로 정의됩니다.
mipi_dsi: mipi@ff960000 {
compatible = "rockchip,rk3399-mipi-dsi", "snps,dw-mipi-dsi";
reg = <0x0 0xff960000 0x0 0x8000>;
interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH 0>;
clocks = <&cru SCLK_DPHY_PLL>, <&cru PCLK_MIPI_DSI0>,
<&cru SCLK_DPHY_TX0_CFG>, <&cru PCLK_VIO_GRF>;
clock-names = "ref", "pclk", "phy_cfg", "grf";
power-domains = <&power RK3399_PD_VIO>;
resets = <&cru SRST_P_MIPI_DSI0>;
reset-names = "apb";
rockchip,grf = <&grf>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
ports {
#address-cells = <1>;
#size-cells = <0>;
mipi_in: port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
...
포트 노드에 뭔가를 추가하기만 하면 되므로 장치 트리에서 다음과 같이 참조합니다.
&mipi_in {
mipi_in_ep: endpoint {
data-lanes = <1 2>;
link-frequencies = /bits/ 64 <720000000>;
remote-endpoint = <&device_ep>;
};
};
그러나 컴파일러는 엔드포인트가 포트 노드에 포함되어야 한다고 불평하고 말합니다. 하지만 mipi_in의 정의에 따르면 이미 포트입니다! 포트 노드를 다시 정의하면 컴파일러는 더 이상 다음과 같이 불평하지 않습니다.
&mipi_in {
port {
mipi_in_ep: endpoint {
data-lanes = <1 2>;
link-frequencies = /bits/ 64 <720000000>;
remote-endpoint = <&device_ep>;
};
};
};
하지만 이 해킹으로 인해 하드웨어가 제대로 작동하지 않으므로 경고가 단지 컴파일러의 버그인지, 아니면 포트를 참조하는 더 깔끔한 방법이 있는지 궁금합니다.
감사합니다.
답변1
dtc가 오류를 보고하지 않는데도 다음이 작동하지 않는 이유는 무엇입니까?
&mipi_in {
port {
mipi_in_ep: endpoint {
data-lanes = <1 2>;
link-frequencies = /bits/ 64 <720000000>;
remote-endpoint = <&device_ep>;
};
};
};
이제 끝점 경로는 다음과 같습니다.
<>/mipi@ff960000/ports/port@0/port/endpoint
하지만 원래의 나무를 참고하면,
<>/mipi@ff960000/ports/port@0/endpoint
그러므로 운전자는 이를 제대로 이해하지 못했을 것입니다.
포트를 참조할 때 장치 트리 컴파일러가 오류를 보고하는 이유가 확실하지 않지만(dtc 버전은 이를 지원하지 않을 가능성이 높음) 다음과 같은 것을 시도해 볼 수 있습니다.
&mipi_dsi {
status = "okay";
ports {
mipi_in: port@0 {
mipi_in_ep: endpoint {
:
};
};
};
};