LCOV - code coverage report
Current view: top level - zephyr/devicetree - port-endpoint.h Coverage Total Hit
Test: new.info Lines: 100.0 % 5 5
Test Date: 2025-09-05 20:47:19

            Line data    Source code
       1            1 : /**
       2              :  * @file
       3              :  * @brief Port / Endpoint Devicetree macro public API header file.
       4              :  */
       5              : 
       6              : /*
       7              :  * Copyright 2024 NXP
       8              :  * Copyright (c) 2024 tinyVision.ai Inc
       9              :  *
      10              :  * SPDX-License-Identifier: Apache-2.0
      11              :  */
      12              : 
      13              : #ifndef ZEPHYR_INCLUDE_DEVICETREE_PORT_ENDPOINT_H_
      14              : #define ZEPHYR_INCLUDE_DEVICETREE_PORT_ENDPOINT_H_
      15              : 
      16              : #ifdef __cplusplus
      17              : extern "C" {
      18              : #endif
      19              : 
      20              : /**
      21              :  * @defgroup devicetree-port-endpoint Devicetree Port Endpoint API
      22              :  * @ingroup devicetree
      23              :  * @{
      24              :  */
      25              : 
      26              : /**
      27              :  * @brief Helper for @ref DT_INST_PORT_BY_ID
      28              :  *
      29              :  * This behaves the same way as @ref DT_INST_PORT_BY_ID but does not work if there is only
      30              :  * a single port without address.
      31              :  *
      32              :  * @param inst instance number
      33              :  * @param pid port ID
      34              :  * @return port node associated with @p pid
      35              :  */
      36              : #define _DT_INST_PORT_BY_ID(inst, pid)                                                             \
      37              :         COND_CODE_1(DT_NODE_EXISTS(DT_INST_CHILD(inst, ports)),                                    \
      38              :             (DT_CHILD(DT_INST_CHILD(inst, ports), port_##pid)), (DT_INST_CHILD(inst, port_##pid)))
      39              : 
      40              : /**
      41              :  * @brief Get a port node from its id
      42              :  *
      43              :  * Given a device instance number, return a port node specified by its ID.
      44              :  * It handles various ways of how a port could be defined.
      45              :  *
      46              :  * Example usage with DT_INST_PORT_BY_ID() to get the @c port@0 or @c port node:
      47              :  *
      48              :  * @code{.c}
      49              :  *      DT_INST_PORT_BY_ID(inst, 0)
      50              :  * @endcode
      51              :  *
      52              :  * Example devicetree fragment:
      53              :  *
      54              :  * @code{.dts}
      55              :  *      &device {
      56              :  *              ports {
      57              :  *                      #address-cells = <1>;
      58              :  *                      #size-cells = <0>;
      59              :  *                      port@0 {
      60              :  *                              reg = <0x0>;
      61              :  *                      };
      62              :  *              };
      63              :  *      };
      64              :  * @endcode
      65              :  *
      66              :  * @code{.dts}
      67              :  *      &device {
      68              :  *              #address-cells = <1>;
      69              :  *              #size-cells = <0>;
      70              :  *              port@0 {
      71              :  *                      reg = <0x0>;
      72              :  *              };
      73              :  *      };
      74              :  * @endcode
      75              :  *
      76              :  * @code{.dts}
      77              :  *      &device {
      78              :  *              port {
      79              :  *              };
      80              :  *      };
      81              :  * @endcode
      82              :  *
      83              :  * @param inst instance number
      84              :  * @param pid port ID
      85              :  * @return port node associated with @p pid
      86              :  */
      87            1 : #define DT_INST_PORT_BY_ID(inst, pid)                                                              \
      88              :         COND_CODE_1(DT_NODE_EXISTS(_DT_INST_PORT_BY_ID(inst, pid)),                                \
      89              :                 (_DT_INST_PORT_BY_ID(inst, pid)), (DT_INST_CHILD(inst, port)))
      90              : 
      91              : /**
      92              :  * @brief Helper for @ref DT_INST_ENDPOINT_BY_ID
      93              :  *
      94              :  * This behaves the same way as @ref DT_INST_PORT_BY_ID but does not work if there is only
      95              :  * a single endpoint without address.
      96              :  *
      97              :  * @param inst instance number
      98              :  * @param pid port ID
      99              :  * @param eid endpoint ID
     100              :  * @return endpoint node associated with @p eid and @p pid
     101              :  */
     102              : #define _DT_INST_ENDPOINT_BY_ID(inst, pid, eid)                                                    \
     103              :         DT_CHILD(DT_INST_PORT_BY_ID(inst, pid), endpoint_##eid)
     104              : 
     105              : /**
     106              :  * @brief Get an endpoint node from its id and its parent port id
     107              :  *
     108              :  * Given a device instance number, a port ID and an endpoint ID, return the endpoint node.
     109              :  * It handles various ways of how a port and an endpoint could be defined as described in
     110              :  * @ref DT_INST_PORT_BY_ID and below.
     111              :  *
     112              :  * Example usage with DT_INST_ENDPOINT_BY_ID() to get the @c endpoint or @c endpoint@0 node:
     113              :  *
     114              :  * @code{.c}
     115              :  *      DT_INST_ENDPOINT_BY_ID(inst, 0, 0)
     116              :  * @endcode
     117              :  *
     118              :  * Example devicetree fragment:
     119              :  *
     120              :  * @code{.dts}
     121              :  *      &device {
     122              :  *              port {
     123              :  *                      endpoint {
     124              :  *                      };
     125              :  *              };
     126              :  *      };
     127              :  * @endcode
     128              :  *
     129              :  * @code{.dts}
     130              :  *      &device {
     131              :  *              port {
     132              :  *                      #address-cells = <1>;
     133              :  *                      #size-cells = <0>;
     134              :  *                      endpoint@0 {
     135              :  *                              reg = <0x0>;
     136              :  *                      };
     137              :  *              };
     138              :  *      };
     139              :  * @endcode
     140              :  *
     141              :  * @code{.dts}
     142              :  *      &device {
     143              :  *              ports {
     144              :  *                      #address-cells = <1>;
     145              :  *                      #size-cells = <0>;
     146              :  *                      port@0 {
     147              :  *                              reg = <0x0>;
     148              :  *                              #address-cells = <1>;
     149              :  *                              #size-cells = <0>;
     150              :  *                              endpoint@0 {
     151              :  *                                      reg = <0x0>;
     152              :  *                              };
     153              :  *                      };
     154              :  *              };
     155              :  *      };
     156              :  * @endcode
     157              :  *
     158              :  * @param inst instance number
     159              :  * @param pid port ID
     160              :  * @param eid endpoint ID
     161              :  * @return endpoint node associated with @p eid and @p pid
     162              :  */
     163            1 : #define DT_INST_ENDPOINT_BY_ID(inst, pid, eid)                                                     \
     164              :         COND_CODE_1(DT_NODE_EXISTS(_DT_INST_ENDPOINT_BY_ID(inst, pid, eid)),                       \
     165              :                 (_DT_INST_ENDPOINT_BY_ID(inst, pid, eid)),                                         \
     166              :                         (DT_CHILD(DT_INST_PORT_BY_ID(inst, pid), endpoint)))
     167              : 
     168              : /**
     169              :  * @brief Get the device node from its endpoint node.
     170              :  *
     171              :  * Given an endpoint node id, return its device node id.
     172              :  * This handles various ways of how a port and an endpoint could be defined as described in
     173              :  * @ref DT_NODE_BY_ENDPOINT.
     174              :  *
     175              :  * Example usage with DT_NODE_BY_ENDPOINT() to get the @c &device node from its @c ep0 node:
     176              :  *
     177              :  * @code{.c}
     178              :  *      DT_NODE_BY_ENDPOINT(DT_NODELABEL(ep0))
     179              :  * @endcode
     180              :  *
     181              :  * Example devicetree fragment:
     182              :  *
     183              :  * @code{.dts}
     184              :  *      &device {
     185              :  *              port {
     186              :  *                      #address-cells = <1>;
     187              :  *                      #size-cells = <0>;
     188              :  *                      ep0: endpoint@0 {
     189              :  *                              reg = <0x0>;
     190              :  *                      };
     191              :  *              };
     192              :  *      };
     193              :  * @endcode
     194              :  *
     195              :  * @code{.dts}
     196              :  *      &device {
     197              :  *              ports {
     198              :  *                      #address-cells = <1>;
     199              :  *                      #size-cells = <0>;
     200              :  *                      port@0 {
     201              :  *                              reg = <0x0>;
     202              :  *                              #address-cells = <1>;
     203              :  *                              #size-cells = <0>;
     204              :  *                              ep0: endpoint@0 {
     205              :  *                                      reg = <0x0>;
     206              :  *                              };
     207              :  *                      };
     208              :  *              };
     209              :  *      };
     210              :  * @endcode
     211              :  *
     212              :  * @param ep endpoint node
     213              :  * @return device node associated with @p ep
     214              :  */
     215            1 : #define DT_NODE_BY_ENDPOINT(ep)                                                                    \
     216              :         COND_CODE_1(DT_NODE_EXISTS(DT_CHILD(DT_PARENT(DT_GPARENT(ep)), ports)),                    \
     217              :                 (DT_PARENT(DT_GPARENT(ep))), (DT_GPARENT(ep)))
     218              : 
     219              : /**
     220              :  * @brief Get the remote device node from a local endpoint node.
     221              :  *
     222              :  * Given an endpoint node id, return the remote device node that connects to this device via this
     223              :  * local endpoint. This handles various ways of how a port and an endpoint could be defined as
     224              :  * described in @ref DT_INST_PORT_BY_ID and @ref DT_INST_ENDPOINT_BY_ID.
     225              :  *
     226              :  * Example usage with DT_NODE_REMOTE_DEVICE() to get the remote device node @c &device1 from the
     227              :  * local endpoint @c endpoint@0 node of the device @c &device0 node:
     228              :  *
     229              :  * @code{.c}
     230              :  *      DT_NODE_REMOTE_DEVICE(DT_NODELABEL(device0_ep_out))
     231              :  * @endcode
     232              :  *
     233              :  * Example devicetree fragment:
     234              :  *
     235              :  * @code{.dts}
     236              :  *      &device0 {
     237              :  *              port {
     238              :  *                      #address-cells = <1>;
     239              :  *                      #size-cells = <0>;
     240              :  *                      device0_ep_out: endpoint@0 {
     241              :  *                              reg = <0x0>;
     242              :  *                              remote-endpoint-label = "device1_ep_in";
     243              :  *                      };
     244              :  *              };
     245              :  *      };
     246              :  *
     247              :  *      &device1 {
     248              :  *              ports {
     249              :  *                      #address-cells = <1>;
     250              :  *                      #size-cells = <0>;
     251              :  *                      port@0 {
     252              :  *                              reg = <0x0>;
     253              :  *                              device1_ep_in: endpoint {
     254              :  *                                      remote-endpoint-label = "device0_ep_out";
     255              :  *                              };
     256              :  *                      };
     257              :  *              };
     258              :  *      };
     259              :  * @endcode
     260              :  *
     261              :  * @param ep endpoint node
     262              :  * @return remote device node that connects to this device via @p ep
     263              :  */
     264            1 : #define DT_NODE_REMOTE_DEVICE(ep)                                                                \
     265              :         DT_NODE_BY_ENDPOINT(DT_NODELABEL(DT_STRING_TOKEN(ep, remote_endpoint_label)))
     266              : 
     267              : /**
     268              :  * @}
     269              :  */
     270              : 
     271              : #ifdef __cplusplus
     272              : }
     273              : #endif
     274              : 
     275              : #endif /* ZEPHYR_INCLUDE_DEVICETREE_PORT_ENDPOINT_H_ */
        

Generated by: LCOV version 2.0-1