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 static SpinelManager &GetSpinelManager(void); 51 52 /** 53 * Returns the static instance of the SpinelDriver. 54 */ GetSpinelDriver(void)55 Spinel::SpinelDriver &GetSpinelDriver(void) { return mSpinelDriver; } 56 57 /** 58 * Constructor of the SpinelManager 59 */ 60 SpinelManager(void); 61 62 /** 63 * Destructor of the SpinelManager 64 */ 65 ~SpinelManager(void); 66 67 /** 68 * Initializes the SpinelManager. 69 * 70 * @param[in] aUrl A pointer to the null-terminated spinel URL. 71 * 72 * @retval OT_COPROCESSOR_UNKNOWN The initialization fails. 73 * @retval OT_COPROCESSOR_RCP The Co-processor is a RCP. 74 * @retval OT_COPROCESSOR_NCP The Co-processor is a NCP. 75 */ 76 CoprocessorType Init(const char *aUrl); 77 78 /** 79 * Deinitializes the SpinelManager. 80 */ 81 void Deinit(void); 82 83 /** 84 * Returns the spinel interface. 85 * 86 * @returns The spinel interface. 87 */ GetSpinelInterface(void)88 Spinel::SpinelInterface &GetSpinelInterface(void) 89 { 90 assert(mSpinelInterface != nullptr); 91 return *mSpinelInterface; 92 } 93 94 private: 95 #if OPENTHREAD_POSIX_VIRTUAL_TIME 96 void VirtualTimeInit(void); 97 #endif 98 void GetIidListFromUrl(spinel_iid_t (&aIidList)[Spinel::kSpinelHeaderMaxNumIid]); 99 100 Spinel::SpinelInterface *CreateSpinelInterface(const char *aInterfaceName); 101 102 #if OPENTHREAD_POSIX_CONFIG_SPINEL_HDLC_INTERFACE_ENABLE && OPENTHREAD_POSIX_CONFIG_SPINEL_SPI_INTERFACE_ENABLE 103 static constexpr size_t kSpinelInterfaceRawSize = sizeof(Posix::SpiInterface) > sizeof(Posix::HdlcInterface) 104 ? sizeof(Posix::SpiInterface) 105 : sizeof(Posix::HdlcInterface); 106 #elif OPENTHREAD_POSIX_CONFIG_SPINEL_HDLC_INTERFACE_ENABLE 107 static constexpr size_t kSpinelInterfaceRawSize = sizeof(Posix::HdlcInterface); 108 #elif OPENTHREAD_POSIX_CONFIG_SPINEL_SPI_INTERFACE_ENABLE 109 static constexpr size_t kSpinelInterfaceRawSize = sizeof(Posix::SpiInterface); 110 #elif OPENTHREAD_POSIX_CONFIG_SPINEL_VENDOR_INTERFACE_ENABLE 111 static constexpr size_t kSpinelInterfaceRawSize = sizeof(Posix::VendorInterface); 112 #else 113 #error "No Spinel interface is specified!" 114 #endif 115 116 RadioUrl mUrl; 117 Spinel::SpinelDriver mSpinelDriver; 118 Spinel::SpinelInterface *mSpinelInterface; 119 120 OT_DEFINE_ALIGNED_VAR(mSpinelInterfaceRaw, kSpinelInterfaceRawSize, uint64_t); 121 }; 122 123 } // namespace Posix 124 } // namespace ot 125 126 #endif // POSIX_PLATFORM_SPINEL_MANAGER_HPP_ 127