1 /* 2 * Copyright (c) 2024, The OpenThread Authors. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 3. Neither the name of the copyright holder nor the 13 * names of its contributors may be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef POSIX_PLATFORM_SPINEL_MANAGER_HPP_ 30 #define POSIX_PLATFORM_SPINEL_MANAGER_HPP_ 31 32 #include <assert.h> 33 34 #include "common/code_utils.hpp" 35 #include "lib/spinel/spinel_driver.hpp" 36 #include "posix/platform/hdlc_interface.hpp" 37 #include "posix/platform/radio_url.hpp" 38 #include "posix/platform/spi_interface.hpp" 39 #include "posix/platform/vendor_interface.hpp" 40 41 namespace ot { 42 namespace Posix { 43 44 class SpinelManager 45 { 46 public: 47 /** 48 * Returns the static instance of the SpinelManager. 49 * 50 */ 51 static SpinelManager &GetSpinelManager(void); 52 53 /** 54 * Returns the static instance of the SpinelDriver. 55 * 56 */ GetSpinelDriver(void)57 Spinel::SpinelDriver &GetSpinelDriver(void) { return mSpinelDriver; } 58 59 /** 60 * Constructor of the SpinelManager 61 * 62 */ 63 SpinelManager(void); 64 65 /** 66 * Destructor of the SpinelManager 67 * 68 */ 69 ~SpinelManager(void); 70 71 /** 72 * Initializes the SpinelManager. 73 * 74 * @param[in] aUrl A pointer to the null-terminated spinel URL. 75 * 76 * @retval OT_COPROCESSOR_UNKNOWN The initialization fails. 77 * @retval OT_COPROCESSOR_RCP The Co-processor is a RCP. 78 * @retval OT_COPROCESSOR_NCP The Co-processor is a NCP. 79 * 80 */ 81 CoprocessorType Init(const char *aUrl); 82 83 /** 84 * Deinitializes the SpinelManager. 85 * 86 */ 87 void Deinit(void); 88 89 /** 90 * Returns the spinel interface. 91 * 92 * @returns The spinel interface. 93 * 94 */ GetSpinelInterface(void)95 Spinel::SpinelInterface &GetSpinelInterface(void) 96 { 97 assert(mSpinelInterface != nullptr); 98 return *mSpinelInterface; 99 } 100 101 private: 102 #if OPENTHREAD_POSIX_VIRTUAL_TIME 103 void VirtualTimeInit(void); 104 #endif 105 void GetIidListFromUrl(spinel_iid_t (&aIidList)[Spinel::kSpinelHeaderMaxNumIid]); 106 107 Spinel::SpinelInterface *CreateSpinelInterface(const char *aInterfaceName); 108 109 #if OPENTHREAD_POSIX_CONFIG_SPINEL_HDLC_INTERFACE_ENABLE && OPENTHREAD_POSIX_CONFIG_SPINEL_SPI_INTERFACE_ENABLE 110 static constexpr size_t kSpinelInterfaceRawSize = sizeof(Posix::SpiInterface) > sizeof(Posix::HdlcInterface) 111 ? sizeof(Posix::SpiInterface) 112 : sizeof(Posix::HdlcInterface); 113 #elif OPENTHREAD_POSIX_CONFIG_SPINEL_HDLC_INTERFACE_ENABLE 114 static constexpr size_t kSpinelInterfaceRawSize = sizeof(Posix::HdlcInterface); 115 #elif OPENTHREAD_POSIX_CONFIG_SPINEL_SPI_INTERFACE_ENABLE 116 static constexpr size_t kSpinelInterfaceRawSize = sizeof(Posix::SpiInterface); 117 #elif OPENTHREAD_POSIX_CONFIG_SPINEL_VENDOR_INTERFACE_ENABLE 118 static constexpr size_t kSpinelInterfaceRawSize = sizeof(Posix::VendorInterface); 119 #else 120 #error "No Spinel interface is specified!" 121 #endif 122 123 RadioUrl mUrl; 124 Spinel::SpinelDriver mSpinelDriver; 125 Spinel::SpinelInterface *mSpinelInterface; 126 127 OT_DEFINE_ALIGNED_VAR(mSpinelInterfaceRaw, kSpinelInterfaceRawSize, uint64_t); 128 }; 129 130 } // namespace Posix 131 } // namespace ot 132 133 #endif // POSIX_PLATFORM_SPINEL_MANAGER_HPP_ 134