LCOV - code coverage report
Current view: top level - zephyr/drivers - cellular.h Hit Total Coverage
Test: new.info Lines: 17 25 68.0 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           1 : /*
       2             :  * Copyright (c) 2023 Bjarki Arge Andreasen
       3             :  * Copyright (c) 2023 Lucas Denefle
       4             :  *
       5             :  * SPDX-License-Identifier: Apache-2.0
       6             :  */
       7             : 
       8             : /**
       9             :  * @file drivers/cellular.h
      10             :  * @brief Public cellular network API
      11             :  */
      12             : 
      13             : #ifndef ZEPHYR_INCLUDE_DRIVERS_CELLULAR_H_
      14             : #define ZEPHYR_INCLUDE_DRIVERS_CELLULAR_H_
      15             : 
      16             : /**
      17             :  * @brief Cellular interface
      18             :  * @defgroup cellular_interface Cellular Interface
      19             :  * @ingroup io_interfaces
      20             :  * @{
      21             :  */
      22             : 
      23             : #include <zephyr/types.h>
      24             : #include <zephyr/device.h>
      25             : #include <errno.h>
      26             : 
      27             : #ifdef __cplusplus
      28             : extern "C" {
      29             : #endif
      30             : 
      31             : /** Cellular access technologies */
      32           0 : enum cellular_access_technology {
      33             :         CELLULAR_ACCESS_TECHNOLOGY_GSM = 0,
      34             :         CELLULAR_ACCESS_TECHNOLOGY_GPRS,
      35             :         CELLULAR_ACCESS_TECHNOLOGY_UMTS,
      36             :         CELLULAR_ACCESS_TECHNOLOGY_EDGE,
      37             :         CELLULAR_ACCESS_TECHNOLOGY_LTE,
      38             :         CELLULAR_ACCESS_TECHNOLOGY_LTE_CAT_M1,
      39             :         CELLULAR_ACCESS_TECHNOLOGY_LTE_CAT_M2,
      40             :         CELLULAR_ACCESS_TECHNOLOGY_NB_IOT,
      41             : };
      42             : 
      43             : /** Cellular network structure */
      44           1 : struct cellular_network {
      45             :         /** Cellular access technology */
      46           1 :         enum cellular_access_technology technology;
      47             :         /**
      48             :          * List of bands, as defined by the specified cellular access technology,
      49             :          * to enables. All supported bands are enabled if none are provided.
      50             :          */
      51           1 :         uint16_t *bands;
      52             :         /** Size of bands */
      53           1 :         uint16_t size;
      54             : };
      55             : 
      56             : /** Cellular signal type */
      57           0 : enum cellular_signal_type {
      58             :         CELLULAR_SIGNAL_RSSI,
      59             :         CELLULAR_SIGNAL_RSRP,
      60             :         CELLULAR_SIGNAL_RSRQ,
      61             : };
      62             : 
      63             : /** Cellular modem info type */
      64           1 : enum cellular_modem_info_type {
      65             :         /** International Mobile Equipment Identity */
      66             :         CELLULAR_MODEM_INFO_IMEI,
      67             :         /** Modem model ID */
      68             :         CELLULAR_MODEM_INFO_MODEL_ID,
      69             :         /** Modem manufacturer */
      70             :         CELLULAR_MODEM_INFO_MANUFACTURER,
      71             :         /** Modem fw version */
      72             :         CELLULAR_MODEM_INFO_FW_VERSION,
      73             :         /** International Mobile Subscriber Identity */
      74             :         CELLULAR_MODEM_INFO_SIM_IMSI,
      75             :         /** Integrated Circuit Card Identification Number (SIM) */
      76             :         CELLULAR_MODEM_INFO_SIM_ICCID,
      77             : };
      78             : 
      79           0 : enum cellular_registration_status {
      80             :         CELLULAR_REGISTRATION_NOT_REGISTERED = 0,
      81             :         CELLULAR_REGISTRATION_REGISTERED_HOME,
      82             :         CELLULAR_REGISTRATION_SEARCHING,
      83             :         CELLULAR_REGISTRATION_DENIED,
      84             :         CELLULAR_REGISTRATION_UNKNOWN,
      85             :         CELLULAR_REGISTRATION_REGISTERED_ROAMING,
      86             : };
      87             : 
      88             : /** API for configuring networks */
      89           1 : typedef int (*cellular_api_configure_networks)(const struct device *dev,
      90             :                                                const struct cellular_network *networks,
      91             :                                                uint8_t size);
      92             : 
      93             : /** API for getting supported networks */
      94           1 : typedef int (*cellular_api_get_supported_networks)(const struct device *dev,
      95             :                                                    const struct cellular_network **networks,
      96             :                                                    uint8_t *size);
      97             : 
      98             : /** API for getting network signal strength */
      99           1 : typedef int (*cellular_api_get_signal)(const struct device *dev,
     100             :                                        const enum cellular_signal_type type, int16_t *value);
     101             : 
     102             : /** API for getting modem information */
     103           1 : typedef int (*cellular_api_get_modem_info)(const struct device *dev,
     104             :                                            const enum cellular_modem_info_type type,
     105             :                                            char *info, size_t size);
     106             : 
     107             : /** API for getting registration status */
     108           1 : typedef int (*cellular_api_get_registration_status)(const struct device *dev,
     109             :                                                     enum cellular_access_technology tech,
     110             :                                                     enum cellular_registration_status *status);
     111             : 
     112             : /** Cellular driver API */
     113           1 : __subsystem struct cellular_driver_api {
     114           0 :         cellular_api_configure_networks configure_networks;
     115           0 :         cellular_api_get_supported_networks get_supported_networks;
     116           0 :         cellular_api_get_signal get_signal;
     117           0 :         cellular_api_get_modem_info get_modem_info;
     118           0 :         cellular_api_get_registration_status get_registration_status;
     119             : };
     120             : 
     121             : /**
     122             :  * @brief Configure cellular networks for the device
     123             :  *
     124             :  * @details Cellular network devices support at least one cellular access technology.
     125             :  * Each cellular access technology defines a set of bands, of which the cellular device
     126             :  * will support all or a subset of.
     127             :  *
     128             :  * The cellular device can only use one cellular network technology at a time. It must
     129             :  * exclusively use the cellular network configurations provided, and will prioritize
     130             :  * the cellular network configurations in the order they are provided in case there are
     131             :  * multiple (the first cellular network configuration has the highest priority).
     132             :  *
     133             :  * @param dev Cellular network device instance.
     134             :  * @param networks List of cellular network configurations to apply.
     135             :  * @param size Size of list of cellular network configurations.
     136             :  *
     137             :  * @retval 0 if successful.
     138             :  * @retval -EINVAL if any provided cellular network configuration is invalid or unsupported.
     139             :  * @retval -ENOTSUP if API is not supported by cellular network device.
     140             :  * @retval Negative errno-code otherwise.
     141             :  */
     142           1 : static inline int cellular_configure_networks(const struct device *dev,
     143             :                                               const struct cellular_network *networks, uint8_t size)
     144             : {
     145             :         const struct cellular_driver_api *api = (const struct cellular_driver_api *)dev->api;
     146             : 
     147             :         if (api->configure_networks == NULL) {
     148             :                 return -ENOSYS;
     149             :         }
     150             : 
     151             :         return api->configure_networks(dev, networks, size);
     152             : }
     153             : 
     154             : /**
     155             :  * @brief Get supported cellular networks for the device
     156             :  *
     157             :  * @param dev Cellular network device instance
     158             :  * @param networks Pointer to list of supported cellular network configurations.
     159             :  * @param size Size of list of cellular network configurations.
     160             :  *
     161             :  * @retval 0 if successful.
     162             :  * @retval -ENOTSUP if API is not supported by cellular network device.
     163             :  * @retval Negative errno-code otherwise.
     164             :  */
     165           1 : static inline int cellular_get_supported_networks(const struct device *dev,
     166             :                                                   const struct cellular_network **networks,
     167             :                                                   uint8_t *size)
     168             : {
     169             :         const struct cellular_driver_api *api = (const struct cellular_driver_api *)dev->api;
     170             : 
     171             :         if (api->get_supported_networks == NULL) {
     172             :                 return -ENOSYS;
     173             :         }
     174             : 
     175             :         return api->get_supported_networks(dev, networks, size);
     176             : }
     177             : 
     178             : /**
     179             :  * @brief Get signal for the device
     180             :  *
     181             :  * @param dev Cellular network device instance
     182             :  * @param type Type of the signal information requested
     183             :  * @param value Signal strength destination (one of RSSI, RSRP, RSRQ)
     184             :  *
     185             :  * @retval 0 if successful.
     186             :  * @retval -ENOTSUP if API is not supported by cellular network device.
     187             :  * @retval -ENODATA if device is not in a state where signal can be polled
     188             :  * @retval Negative errno-code otherwise.
     189             :  */
     190           1 : static inline int cellular_get_signal(const struct device *dev,
     191             :                                       const enum cellular_signal_type type, int16_t *value)
     192             : {
     193             :         const struct cellular_driver_api *api = (const struct cellular_driver_api *)dev->api;
     194             : 
     195             :         if (api->get_signal == NULL) {
     196             :                 return -ENOSYS;
     197             :         }
     198             : 
     199             :         return api->get_signal(dev, type, value);
     200             : }
     201             : 
     202             : /**
     203             :  * @brief Get modem info for the device
     204             :  *
     205             :  * @param dev Cellular network device instance
     206             :  * @param type Type of the modem info requested
     207             :  * @param info Info string destination
     208             :  * @param size Info string size
     209             :  *
     210             :  * @retval 0 if successful.
     211             :  * @retval -ENOTSUP if API is not supported by cellular network device.
     212             :  * @retval -ENODATA if modem does not provide info requested
     213             :  * @retval Negative errno-code from chat module otherwise.
     214             :  */
     215           1 : static inline int cellular_get_modem_info(const struct device *dev,
     216             :                                           const enum cellular_modem_info_type type, char *info,
     217             :                                           size_t size)
     218             : {
     219             :         const struct cellular_driver_api *api = (const struct cellular_driver_api *)dev->api;
     220             : 
     221             :         if (api->get_modem_info == NULL) {
     222             :                 return -ENOSYS;
     223             :         }
     224             : 
     225             :         return api->get_modem_info(dev, type, info, size);
     226             : }
     227             : 
     228             : /**
     229             :  * @brief Get network registration status for the device
     230             :  *
     231             :  * @param dev Cellular network device instance
     232             :  * @param tech Which access technology to get status for
     233             :  * @param status Registration status for given access technology
     234             :  *
     235             :  * @retval 0 if successful.
     236             :  * @retval -ENOSYS if API is not supported by cellular network device.
     237             :  * @retval -ENODATA if modem does not provide info requested
     238             :  * @retval Negative errno-code from chat module otherwise.
     239             :  */
     240           1 : static inline int cellular_get_registration_status(const struct device *dev,
     241             :                                                    enum cellular_access_technology tech,
     242             :                                                    enum cellular_registration_status *status)
     243             : {
     244             :         const struct cellular_driver_api *api = (const struct cellular_driver_api *)dev->api;
     245             : 
     246             :         if (api->get_registration_status == NULL) {
     247             :                 return -ENOSYS;
     248             :         }
     249             : 
     250             :         return api->get_registration_status(dev, tech, status);
     251             : }
     252             : 
     253             : #ifdef __cplusplus
     254             : }
     255             : #endif
     256             : 
     257             : /**
     258             :  * @}
     259             :  */
     260             : 
     261             : #endif /* ZEPHYR_INCLUDE_DRIVERS_CELLULAR_H_ */

Generated by: LCOV version 1.14