編集する:これは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 {
:
};
};
};
};