LCOV - code coverage report
Current view: top level - zephyr/devicetree - spi.h Hit Total Coverage
Test: new.info Lines: 11 11 100.0 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           1 : /**
       2             :  * @file
       3             :  * @brief SPI Devicetree macro public API header file.
       4             :  */
       5             : 
       6             : /*
       7             :  * Copyright (c) 2020 Nordic Semiconductor
       8             :  *
       9             :  * SPDX-License-Identifier: Apache-2.0
      10             :  */
      11             : 
      12             : #ifndef ZEPHYR_INCLUDE_DEVICETREE_SPI_H_
      13             : #define ZEPHYR_INCLUDE_DEVICETREE_SPI_H_
      14             : 
      15             : #ifdef __cplusplus
      16             : extern "C" {
      17             : #endif
      18             : 
      19             : /**
      20             :  * @defgroup devicetree-spi Devicetree SPI API
      21             :  * @ingroup devicetree
      22             :  * @{
      23             :  */
      24             : 
      25             : /**
      26             :  * @brief Does a SPI controller node have chip select GPIOs configured?
      27             :  *
      28             :  * SPI bus controllers use the "cs-gpios" property for configuring
      29             :  * chip select GPIOs. Its value is a phandle-array which specifies the
      30             :  * chip select lines.
      31             :  *
      32             :  * Example devicetree fragment:
      33             :  *
      34             :  *     spi1: spi@... {
      35             :  *             compatible = "vnd,spi";
      36             :  *             cs-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>,
      37             :  *                        <&gpio2 20 GPIO_ACTIVE_LOW>;
      38             :  *     };
      39             :  *
      40             :  *     spi2: spi@... {
      41             :  *             compatible = "vnd,spi";
      42             :  *     };
      43             :  *
      44             :  * Example usage:
      45             :  *
      46             :  *     DT_SPI_HAS_CS_GPIOS(DT_NODELABEL(spi1)) // 1
      47             :  *     DT_SPI_HAS_CS_GPIOS(DT_NODELABEL(spi2)) // 0
      48             :  *
      49             :  * @param spi a SPI bus controller node identifier
      50             :  * @return 1 if "spi" has a cs-gpios property, 0 otherwise
      51             :  */
      52           1 : #define DT_SPI_HAS_CS_GPIOS(spi) DT_NODE_HAS_PROP(spi, cs_gpios)
      53             : 
      54             : /**
      55             :  * @brief Number of chip select GPIOs in a SPI controller's cs-gpios property
      56             :  *
      57             :  * Example devicetree fragment:
      58             :  *
      59             :  *     spi1: spi@... {
      60             :  *             compatible = "vnd,spi";
      61             :  *             cs-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>,
      62             :  *                        <&gpio2 20 GPIO_ACTIVE_LOW>;
      63             :  *     };
      64             :  *
      65             :  *     spi2: spi@... {
      66             :  *             compatible = "vnd,spi";
      67             :  *     };
      68             :  *
      69             :  * Example usage:
      70             :  *
      71             :  *     DT_SPI_NUM_CS_GPIOS(DT_NODELABEL(spi1)) // 2
      72             :  *     DT_SPI_NUM_CS_GPIOS(DT_NODELABEL(spi2)) // 0
      73             :  *
      74             :  * @param spi a SPI bus controller node identifier
      75             :  * @return Logical length of spi's cs-gpios property, or 0 if "spi" doesn't
      76             :  *         have a cs-gpios property
      77             :  */
      78           1 : #define DT_SPI_NUM_CS_GPIOS(spi) \
      79             :         COND_CODE_1(DT_SPI_HAS_CS_GPIOS(spi), \
      80             :                     (DT_PROP_LEN(spi, cs_gpios)), (0))
      81             : 
      82             : /**
      83             :  * @brief Does a SPI device have a chip select line configured?
      84             :  * Example devicetree fragment:
      85             :  *
      86             :  *     spi1: spi@... {
      87             :  *             compatible = "vnd,spi";
      88             :  *             cs-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>,
      89             :  *                        <&gpio2 20 GPIO_ACTIVE_LOW>;
      90             :  *
      91             :  *             a: spi-dev-a@0 {
      92             :  *                     reg = <0>;
      93             :  *             };
      94             :  *
      95             :  *             b: spi-dev-b@1 {
      96             :  *                     reg = <1>;
      97             :  *             };
      98             :  *     };
      99             :  *
     100             :  *     spi2: spi@... {
     101             :  *             compatible = "vnd,spi";
     102             :  *             c: spi-dev-c@0 {
     103             :  *                     reg = <0>;
     104             :  *             };
     105             :  *     };
     106             :  *
     107             :  * Example usage:
     108             :  *
     109             :  *     DT_SPI_DEV_HAS_CS_GPIOS(DT_NODELABEL(a)) // 1
     110             :  *     DT_SPI_DEV_HAS_CS_GPIOS(DT_NODELABEL(b)) // 1
     111             :  *     DT_SPI_DEV_HAS_CS_GPIOS(DT_NODELABEL(c)) // 0
     112             :  *
     113             :  * @param spi_dev a SPI device node identifier
     114             :  * @return 1 if spi_dev's bus node DT_BUS(spi_dev) has a chip select
     115             :  *         pin at index DT_REG_ADDR(spi_dev), 0 otherwise
     116             :  */
     117           1 : #define DT_SPI_DEV_HAS_CS_GPIOS(spi_dev) DT_SPI_HAS_CS_GPIOS(DT_BUS(spi_dev))
     118             : 
     119             : /**
     120             :  * @brief Get a SPI device's chip select GPIO controller's node identifier
     121             :  *
     122             :  * Example devicetree fragment:
     123             :  *
     124             :  *     gpio1: gpio@... { ... };
     125             :  *
     126             :  *     gpio2: gpio@... { ... };
     127             :  *
     128             :  *     spi@... {
     129             :  *             compatible = "vnd,spi";
     130             :  *             cs-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>,
     131             :  *                        <&gpio2 20 GPIO_ACTIVE_LOW>;
     132             :  *
     133             :  *             a: spi-dev-a@0 {
     134             :  *                     reg = <0>;
     135             :  *             };
     136             :  *
     137             :  *             b: spi-dev-b@1 {
     138             :  *                     reg = <1>;
     139             :  *             };
     140             :  *     };
     141             :  *
     142             :  * Example usage:
     143             :  *
     144             :  *     DT_SPI_DEV_CS_GPIOS_CTLR(DT_NODELABEL(a)) // DT_NODELABEL(gpio1)
     145             :  *     DT_SPI_DEV_CS_GPIOS_CTLR(DT_NODELABEL(b)) // DT_NODELABEL(gpio2)
     146             :  *
     147             :  * @param spi_dev a SPI device node identifier
     148             :  * @return node identifier for spi_dev's chip select GPIO controller
     149             :  */
     150           1 : #define DT_SPI_DEV_CS_GPIOS_CTLR(spi_dev) \
     151             :         DT_GPIO_CTLR_BY_IDX(DT_BUS(spi_dev), cs_gpios, DT_REG_ADDR_RAW(spi_dev))
     152             : 
     153             : /**
     154             :  * @brief Get a SPI device's chip select GPIO pin number
     155             :  *
     156             :  * It's an error if the GPIO specifier for spi_dev's entry in its
     157             :  * bus node's cs-gpios property has no pin cell.
     158             :  *
     159             :  * Example devicetree fragment:
     160             :  *
     161             :  *     spi1: spi@... {
     162             :  *             compatible = "vnd,spi";
     163             :  *             cs-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>,
     164             :  *                        <&gpio2 20 GPIO_ACTIVE_LOW>;
     165             :  *
     166             :  *             a: spi-dev-a@0 {
     167             :  *                     reg = <0>;
     168             :  *             };
     169             :  *
     170             :  *             b: spi-dev-b@1 {
     171             :  *                     reg = <1>;
     172             :  *             };
     173             :  *     };
     174             :  *
     175             :  * Example usage:
     176             :  *
     177             :  *     DT_SPI_DEV_CS_GPIOS_PIN(DT_NODELABEL(a)) // 10
     178             :  *     DT_SPI_DEV_CS_GPIOS_PIN(DT_NODELABEL(b)) // 20
     179             :  *
     180             :  * @param spi_dev a SPI device node identifier
     181             :  * @return pin number of spi_dev's chip select GPIO
     182             :  */
     183           1 : #define DT_SPI_DEV_CS_GPIOS_PIN(spi_dev) \
     184             :         DT_GPIO_PIN_BY_IDX(DT_BUS(spi_dev), cs_gpios, DT_REG_ADDR_RAW(spi_dev))
     185             : 
     186             : /**
     187             :  * @brief Get a SPI device's chip select GPIO flags
     188             :  *
     189             :  * Example devicetree fragment:
     190             :  *
     191             :  *     spi1: spi@... {
     192             :  *             compatible = "vnd,spi";
     193             :  *             cs-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>;
     194             :  *
     195             :  *             a: spi-dev-a@0 {
     196             :  *                     reg = <0>;
     197             :  *             };
     198             :  *     };
     199             :  *
     200             :  * Example usage:
     201             :  *
     202             :  *     DT_SPI_DEV_CS_GPIOS_FLAGS(DT_NODELABEL(a)) // GPIO_ACTIVE_LOW
     203             :  *
     204             :  * If the GPIO specifier for spi_dev's entry in its bus node's
     205             :  * cs-gpios property has no flags cell, this expands to zero.
     206             :  *
     207             :  * @param spi_dev a SPI device node identifier
     208             :  * @return flags value of spi_dev's chip select GPIO specifier, or
     209             :  *         zero if there is none
     210             :  */
     211           1 : #define DT_SPI_DEV_CS_GPIOS_FLAGS(spi_dev) \
     212             :         DT_GPIO_FLAGS_BY_IDX(DT_BUS(spi_dev), cs_gpios, DT_REG_ADDR_RAW(spi_dev))
     213             : 
     214             : /**
     215             :  * @brief Equivalent to DT_SPI_DEV_HAS_CS_GPIOS(DT_DRV_INST(inst)).
     216             :  * @param inst DT_DRV_COMPAT instance number
     217             :  * @return 1 if the instance's bus has a CS pin at index
     218             :  *         DT_INST_REG_ADDR(inst), 0 otherwise
     219             :  * @see DT_SPI_DEV_HAS_CS_GPIOS()
     220             :  */
     221           1 : #define DT_INST_SPI_DEV_HAS_CS_GPIOS(inst) \
     222             :         DT_SPI_DEV_HAS_CS_GPIOS(DT_DRV_INST(inst))
     223             : 
     224             : /**
     225             :  * @brief Get GPIO controller node identifier for a SPI device instance
     226             :  * This is equivalent to DT_SPI_DEV_CS_GPIOS_CTLR(DT_DRV_INST(inst)).
     227             :  * @param inst DT_DRV_COMPAT instance number
     228             :  * @return node identifier for instance's chip select GPIO controller
     229             :  * @see DT_SPI_DEV_CS_GPIOS_CTLR()
     230             :  */
     231           1 : #define DT_INST_SPI_DEV_CS_GPIOS_CTLR(inst) \
     232             :         DT_SPI_DEV_CS_GPIOS_CTLR(DT_DRV_INST(inst))
     233             : 
     234             : /**
     235             :  * @brief Equivalent to DT_SPI_DEV_CS_GPIOS_PIN(DT_DRV_INST(inst)).
     236             :  * @param inst DT_DRV_COMPAT instance number
     237             :  * @return pin number of the instance's chip select GPIO
     238             :  * @see DT_SPI_DEV_CS_GPIOS_PIN()
     239             :  */
     240           1 : #define DT_INST_SPI_DEV_CS_GPIOS_PIN(inst) \
     241             :         DT_SPI_DEV_CS_GPIOS_PIN(DT_DRV_INST(inst))
     242             : 
     243             : /**
     244             :  * @brief DT_SPI_DEV_CS_GPIOS_FLAGS(DT_DRV_INST(inst)).
     245             :  * @param inst DT_DRV_COMPAT instance number
     246             :  * @return flags value of the instance's chip select GPIO specifier,
     247             :  *         or zero if there is none
     248             :  * @see DT_SPI_DEV_CS_GPIOS_FLAGS()
     249             :  */
     250           1 : #define DT_INST_SPI_DEV_CS_GPIOS_FLAGS(inst) \
     251             :         DT_SPI_DEV_CS_GPIOS_FLAGS(DT_DRV_INST(inst))
     252             : 
     253             : /**
     254             :  * @}
     255             :  */
     256             : 
     257             : #ifdef __cplusplus
     258             : }
     259             : #endif
     260             : 
     261             : #endif  /* ZEPHYR_INCLUDE_DEVICETREE_SPI_H_ */

Generated by: LCOV version 1.14