The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.
Dependents: hello SerialTestv11 SerialTestv12 Sierpinski ... more
mbed 2
This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.
TARGET_LPC546XX/TOOLCHAIN_GCC_ARM/fsl_otp.h@172:65be27845400, 2019-02-20 (annotated)
- Committer:
- AnnaBridge
- Date:
- Wed Feb 20 20:53:29 2019 +0000
- Revision:
- 172:65be27845400
- Parent:
- 171:3a7713b1edbc
mbed library release version 165
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AnnaBridge | 171:3a7713b1edbc | 1 | /* |
AnnaBridge | 171:3a7713b1edbc | 2 | * The Clear BSD License |
AnnaBridge | 171:3a7713b1edbc | 3 | * Copyright (c) 2016, Freescale Semiconductor, Inc. |
AnnaBridge | 171:3a7713b1edbc | 4 | * Copyright 2016-2017 NXP |
AnnaBridge | 171:3a7713b1edbc | 5 | * All rights reserved. |
AnnaBridge | 171:3a7713b1edbc | 6 | * |
AnnaBridge | 171:3a7713b1edbc | 7 | * Redistribution and use in source and binary forms, with or without modification, |
AnnaBridge | 171:3a7713b1edbc | 8 | * are permitted (subject to the limitations in the disclaimer below) provided |
AnnaBridge | 171:3a7713b1edbc | 9 | * that the following conditions are met: |
AnnaBridge | 171:3a7713b1edbc | 10 | * |
AnnaBridge | 171:3a7713b1edbc | 11 | * o Redistributions of source code must retain the above copyright notice, this list |
AnnaBridge | 171:3a7713b1edbc | 12 | * of conditions and the following disclaimer. |
AnnaBridge | 171:3a7713b1edbc | 13 | * |
AnnaBridge | 171:3a7713b1edbc | 14 | * o Redistributions in binary form must reproduce the above copyright notice, this |
AnnaBridge | 171:3a7713b1edbc | 15 | * list of conditions and the following disclaimer in the documentation and/or |
AnnaBridge | 171:3a7713b1edbc | 16 | * other materials provided with the distribution. |
AnnaBridge | 171:3a7713b1edbc | 17 | * |
AnnaBridge | 171:3a7713b1edbc | 18 | * o Neither the name of the copyright holder nor the names of its |
AnnaBridge | 171:3a7713b1edbc | 19 | * contributors may be used to endorse or promote products derived from this |
AnnaBridge | 171:3a7713b1edbc | 20 | * software without specific prior written permission. |
AnnaBridge | 171:3a7713b1edbc | 21 | * |
AnnaBridge | 171:3a7713b1edbc | 22 | * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE. |
AnnaBridge | 171:3a7713b1edbc | 23 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
AnnaBridge | 171:3a7713b1edbc | 24 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
AnnaBridge | 171:3a7713b1edbc | 25 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
AnnaBridge | 171:3a7713b1edbc | 26 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR |
AnnaBridge | 171:3a7713b1edbc | 27 | * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
AnnaBridge | 171:3a7713b1edbc | 28 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
AnnaBridge | 171:3a7713b1edbc | 29 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
AnnaBridge | 171:3a7713b1edbc | 30 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
AnnaBridge | 171:3a7713b1edbc | 31 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
AnnaBridge | 171:3a7713b1edbc | 32 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
AnnaBridge | 171:3a7713b1edbc | 33 | */ |
AnnaBridge | 171:3a7713b1edbc | 34 | #ifndef _FSL_OTP_H_ |
AnnaBridge | 171:3a7713b1edbc | 35 | #define _FSL_OTP_H_ |
AnnaBridge | 171:3a7713b1edbc | 36 | |
AnnaBridge | 171:3a7713b1edbc | 37 | #include "fsl_common.h" |
AnnaBridge | 171:3a7713b1edbc | 38 | |
AnnaBridge | 171:3a7713b1edbc | 39 | /*! |
AnnaBridge | 171:3a7713b1edbc | 40 | * @addtogroup otp |
AnnaBridge | 171:3a7713b1edbc | 41 | * @{ |
AnnaBridge | 171:3a7713b1edbc | 42 | */ |
AnnaBridge | 171:3a7713b1edbc | 43 | |
AnnaBridge | 171:3a7713b1edbc | 44 | /******************************************************************************* |
AnnaBridge | 171:3a7713b1edbc | 45 | * Definitions |
AnnaBridge | 171:3a7713b1edbc | 46 | *******************************************************************************/ |
AnnaBridge | 171:3a7713b1edbc | 47 | |
AnnaBridge | 171:3a7713b1edbc | 48 | /*! @name Driver version */ |
AnnaBridge | 171:3a7713b1edbc | 49 | /*@{*/ |
AnnaBridge | 171:3a7713b1edbc | 50 | /*! @brief OTP driver version 2.0.0. |
AnnaBridge | 171:3a7713b1edbc | 51 | * |
AnnaBridge | 171:3a7713b1edbc | 52 | * Current version: 2.0.0 |
AnnaBridge | 171:3a7713b1edbc | 53 | * |
AnnaBridge | 171:3a7713b1edbc | 54 | * Change log: |
AnnaBridge | 171:3a7713b1edbc | 55 | * - Version 2.0.0 |
AnnaBridge | 171:3a7713b1edbc | 56 | * - Initial version. |
AnnaBridge | 171:3a7713b1edbc | 57 | */ |
AnnaBridge | 171:3a7713b1edbc | 58 | #define FSL_OTP_DRIVER_VERSION (MAKE_VERSION(2, 0, 0)) |
AnnaBridge | 171:3a7713b1edbc | 59 | /*@}*/ |
AnnaBridge | 171:3a7713b1edbc | 60 | |
AnnaBridge | 171:3a7713b1edbc | 61 | /*! @brief Bank bit flags. */ |
AnnaBridge | 171:3a7713b1edbc | 62 | typedef enum _otp_bank |
AnnaBridge | 171:3a7713b1edbc | 63 | { |
AnnaBridge | 171:3a7713b1edbc | 64 | kOTP_Bank0 = 0x1U, /*!< Bank 0. */ |
AnnaBridge | 171:3a7713b1edbc | 65 | kOTP_Bank1 = 0x2U, /*!< Bank 1. */ |
AnnaBridge | 171:3a7713b1edbc | 66 | kOTP_Bank2 = 0x4U, /*!< Bank 2. */ |
AnnaBridge | 171:3a7713b1edbc | 67 | kOTP_Bank3 = 0x8U /*!< Bank 3. */ |
AnnaBridge | 171:3a7713b1edbc | 68 | } otp_bank_t; |
AnnaBridge | 171:3a7713b1edbc | 69 | |
AnnaBridge | 171:3a7713b1edbc | 70 | /*! @brief Bank word bit flags. */ |
AnnaBridge | 171:3a7713b1edbc | 71 | typedef enum _otp_word |
AnnaBridge | 171:3a7713b1edbc | 72 | { |
AnnaBridge | 171:3a7713b1edbc | 73 | kOTP_Word0 = 0x1U, /*!< Word 0. */ |
AnnaBridge | 171:3a7713b1edbc | 74 | kOTP_Word1 = 0x2U, /*!< Word 1. */ |
AnnaBridge | 171:3a7713b1edbc | 75 | kOTP_Word2 = 0x4U, /*!< Word 2. */ |
AnnaBridge | 171:3a7713b1edbc | 76 | kOTP_Word3 = 0x8U /*!< Word 3. */ |
AnnaBridge | 171:3a7713b1edbc | 77 | } otp_word_t; |
AnnaBridge | 171:3a7713b1edbc | 78 | |
AnnaBridge | 171:3a7713b1edbc | 79 | /*! @brief Lock modifications of a read or write access to a bank register. */ |
AnnaBridge | 171:3a7713b1edbc | 80 | typedef enum _otp_lock |
AnnaBridge | 171:3a7713b1edbc | 81 | { |
AnnaBridge | 171:3a7713b1edbc | 82 | kOTP_LockDontLock = 0U, /*!< Do not lock. */ |
AnnaBridge | 171:3a7713b1edbc | 83 | kOTP_LockLock = 1U /*!< Lock till reset. */ |
AnnaBridge | 171:3a7713b1edbc | 84 | } otp_lock_t; |
AnnaBridge | 171:3a7713b1edbc | 85 | |
AnnaBridge | 171:3a7713b1edbc | 86 | /*! @brief OTP error codes. */ |
AnnaBridge | 171:3a7713b1edbc | 87 | enum _otp_status |
AnnaBridge | 171:3a7713b1edbc | 88 | { |
AnnaBridge | 171:3a7713b1edbc | 89 | kStatus_OTP_WrEnableInvalid = MAKE_STATUS(kStatusGroup_OTP, 0x1U), /*!< Write enable invalid. */ |
AnnaBridge | 171:3a7713b1edbc | 90 | kStatus_OTP_SomeBitsAlreadyProgrammed = MAKE_STATUS(kStatusGroup_OTP, 0x2U), /*!< Some bits already programmed. */ |
AnnaBridge | 171:3a7713b1edbc | 91 | kStatus_OTP_AllDataOrMaskZero = MAKE_STATUS(kStatusGroup_OTP, 0x3U), /*!< All data or mask zero. */ |
AnnaBridge | 171:3a7713b1edbc | 92 | kStatus_OTP_WriteAccessLocked = MAKE_STATUS(kStatusGroup_OTP, 0x4U), /*!< Write access locked. */ |
AnnaBridge | 171:3a7713b1edbc | 93 | kStatus_OTP_ReadDataMismatch = MAKE_STATUS(kStatusGroup_OTP, 0x5U), /*!< Read data mismatch. */ |
AnnaBridge | 171:3a7713b1edbc | 94 | kStatus_OTP_UsbIdEnabled = MAKE_STATUS(kStatusGroup_OTP, 0x6U), /*!< USB ID enabled. */ |
AnnaBridge | 171:3a7713b1edbc | 95 | kStatus_OTP_EthMacEnabled = MAKE_STATUS(kStatusGroup_OTP, 0x7U), /*!< Ethernet MAC enabled. */ |
AnnaBridge | 171:3a7713b1edbc | 96 | kStatus_OTP_AesKeysEnabled = MAKE_STATUS(kStatusGroup_OTP, 0x8U), /*!< AES keys enabled. */ |
AnnaBridge | 171:3a7713b1edbc | 97 | kStatus_OTP_IllegalBank = MAKE_STATUS(kStatusGroup_OTP, 0x9U), /*!< Illegal bank. */ |
AnnaBridge | 171:3a7713b1edbc | 98 | kStatus_OTP_ShufflerConfigNotValid = MAKE_STATUS(kStatusGroup_OTP, 0xAU), /*!< Shuffler config not valid. */ |
AnnaBridge | 171:3a7713b1edbc | 99 | kStatus_OTP_ShufflerNotEnabled = MAKE_STATUS(kStatusGroup_OTP, 0xBU), /*!< Shuffler not enabled. */ |
AnnaBridge | 171:3a7713b1edbc | 100 | kStatus_OTP_ShufflerCanOnlyProgSingleKey = |
AnnaBridge | 171:3a7713b1edbc | 101 | MAKE_STATUS(kStatusGroup_OTP, 0xBU), /*!< Shuffler can only program single key. */ |
AnnaBridge | 171:3a7713b1edbc | 102 | kStatus_OTP_IllegalProgramData = MAKE_STATUS(kStatusGroup_OTP, 0xCU), /*!< Illegal program data. */ |
AnnaBridge | 171:3a7713b1edbc | 103 | kStatus_OTP_ReadAccessLocked = MAKE_STATUS(kStatusGroup_OTP, 0xDU), /*!< Read access locked. */ |
AnnaBridge | 171:3a7713b1edbc | 104 | }; |
AnnaBridge | 171:3a7713b1edbc | 105 | |
AnnaBridge | 171:3a7713b1edbc | 106 | #define _OTP_ERR_BASE (0x70000U) |
AnnaBridge | 171:3a7713b1edbc | 107 | #define _OTP_MAKE_STATUS(errorCode) \ |
AnnaBridge | 171:3a7713b1edbc | 108 | ((errorCode == 0U) ? kStatus_Success : MAKE_STATUS(kStatusGroup_OTP, ((errorCode)-_OTP_ERR_BASE))) |
AnnaBridge | 171:3a7713b1edbc | 109 | |
AnnaBridge | 171:3a7713b1edbc | 110 | /******************************************************************************* |
AnnaBridge | 171:3a7713b1edbc | 111 | * API |
AnnaBridge | 171:3a7713b1edbc | 112 | *******************************************************************************/ |
AnnaBridge | 171:3a7713b1edbc | 113 | |
AnnaBridge | 171:3a7713b1edbc | 114 | #if defined(__cplusplus) |
AnnaBridge | 171:3a7713b1edbc | 115 | extern "C" { |
AnnaBridge | 171:3a7713b1edbc | 116 | #endif |
AnnaBridge | 171:3a7713b1edbc | 117 | |
AnnaBridge | 171:3a7713b1edbc | 118 | /*! |
AnnaBridge | 171:3a7713b1edbc | 119 | * @brief Initializes OTP controller. |
AnnaBridge | 171:3a7713b1edbc | 120 | * |
AnnaBridge | 171:3a7713b1edbc | 121 | * @return kStatus_Success upon successful execution, error status otherwise. |
AnnaBridge | 171:3a7713b1edbc | 122 | */ |
AnnaBridge | 171:3a7713b1edbc | 123 | static inline status_t OTP_Init(void) |
AnnaBridge | 171:3a7713b1edbc | 124 | { |
AnnaBridge | 171:3a7713b1edbc | 125 | uint32_t status = OTP_API->otpInit(); |
AnnaBridge | 171:3a7713b1edbc | 126 | return _OTP_MAKE_STATUS(status); |
AnnaBridge | 171:3a7713b1edbc | 127 | } |
AnnaBridge | 171:3a7713b1edbc | 128 | |
AnnaBridge | 171:3a7713b1edbc | 129 | /*! |
AnnaBridge | 171:3a7713b1edbc | 130 | * @brief Unlock one or more OTP banks for write access. |
AnnaBridge | 171:3a7713b1edbc | 131 | * |
AnnaBridge | 171:3a7713b1edbc | 132 | * @param bankMask bit flag that specifies which banks to unlock. |
AnnaBridge | 171:3a7713b1edbc | 133 | * |
AnnaBridge | 171:3a7713b1edbc | 134 | * @return kStatus_Success upon successful execution, error status otherwise. |
AnnaBridge | 171:3a7713b1edbc | 135 | */ |
AnnaBridge | 171:3a7713b1edbc | 136 | static inline status_t OTP_EnableBankWriteMask(otp_bank_t bankMask) |
AnnaBridge | 171:3a7713b1edbc | 137 | { |
AnnaBridge | 171:3a7713b1edbc | 138 | uint32_t status = OTP_API->otpEnableBankWriteMask(bankMask); |
AnnaBridge | 171:3a7713b1edbc | 139 | return _OTP_MAKE_STATUS(status); |
AnnaBridge | 171:3a7713b1edbc | 140 | } |
AnnaBridge | 171:3a7713b1edbc | 141 | |
AnnaBridge | 171:3a7713b1edbc | 142 | /*! |
AnnaBridge | 171:3a7713b1edbc | 143 | * @brief Lock one or more OTP banks for write access. |
AnnaBridge | 171:3a7713b1edbc | 144 | * |
AnnaBridge | 171:3a7713b1edbc | 145 | * @param bankMask bit flag that specifies which banks to lock. |
AnnaBridge | 171:3a7713b1edbc | 146 | * |
AnnaBridge | 171:3a7713b1edbc | 147 | * @return kStatus_Success upon successful execution, error status otherwise. |
AnnaBridge | 171:3a7713b1edbc | 148 | */ |
AnnaBridge | 171:3a7713b1edbc | 149 | static inline status_t OTP_DisableBankWriteMask(otp_bank_t bankMask) |
AnnaBridge | 171:3a7713b1edbc | 150 | { |
AnnaBridge | 171:3a7713b1edbc | 151 | uint32_t status = OTP_API->otpDisableBankWriteMask(bankMask); |
AnnaBridge | 171:3a7713b1edbc | 152 | return _OTP_MAKE_STATUS(status); |
AnnaBridge | 171:3a7713b1edbc | 153 | } |
AnnaBridge | 171:3a7713b1edbc | 154 | |
AnnaBridge | 171:3a7713b1edbc | 155 | /*! |
AnnaBridge | 171:3a7713b1edbc | 156 | * @brief Locks or unlocks write access to a register of an OTP bank and possibly lock un/locking of it. |
AnnaBridge | 171:3a7713b1edbc | 157 | * |
AnnaBridge | 171:3a7713b1edbc | 158 | * @param bankIndex OTP bank index, 0 = bank 0, 1 = bank 1 etc. |
AnnaBridge | 171:3a7713b1edbc | 159 | * @param regEnableMask bit flag that specifies for which words to enable writing. |
AnnaBridge | 171:3a7713b1edbc | 160 | * @param regDisableMask bit flag that specifies for which words to disable writing. |
AnnaBridge | 171:3a7713b1edbc | 161 | * @param lockWrite specifies if access set can be modified or is locked till reset. |
AnnaBridge | 171:3a7713b1edbc | 162 | * |
AnnaBridge | 171:3a7713b1edbc | 163 | * @return kStatus_Success upon successful execution, error status otherwise. |
AnnaBridge | 171:3a7713b1edbc | 164 | */ |
AnnaBridge | 171:3a7713b1edbc | 165 | static inline status_t OTP_EnableBankWriteLock(uint32_t bankIndex, |
AnnaBridge | 171:3a7713b1edbc | 166 | otp_word_t regEnableMask, |
AnnaBridge | 171:3a7713b1edbc | 167 | otp_word_t regDisableMask, |
AnnaBridge | 171:3a7713b1edbc | 168 | otp_lock_t lockWrite) |
AnnaBridge | 171:3a7713b1edbc | 169 | { |
AnnaBridge | 171:3a7713b1edbc | 170 | uint32_t status = OTP_API->otpEnableBankWriteLock(bankIndex, regEnableMask, regDisableMask, lockWrite); |
AnnaBridge | 171:3a7713b1edbc | 171 | return _OTP_MAKE_STATUS(status); |
AnnaBridge | 171:3a7713b1edbc | 172 | } |
AnnaBridge | 171:3a7713b1edbc | 173 | |
AnnaBridge | 171:3a7713b1edbc | 174 | /*! |
AnnaBridge | 171:3a7713b1edbc | 175 | * @brief Locks or unlocks read access to a register of an OTP bank and possibly lock un/locking of it. |
AnnaBridge | 171:3a7713b1edbc | 176 | * |
AnnaBridge | 171:3a7713b1edbc | 177 | * @param bankIndex OTP bank index, 0 = bank 0, 1 = bank 1 etc. |
AnnaBridge | 171:3a7713b1edbc | 178 | * @param regEnableMask bit flag that specifies for which words to enable reading. |
AnnaBridge | 171:3a7713b1edbc | 179 | * @param regDisableMask bit flag that specifies for which words to disable reading. |
AnnaBridge | 171:3a7713b1edbc | 180 | * @param lockWrite specifies if access set can be modified or is locked till reset. |
AnnaBridge | 171:3a7713b1edbc | 181 | * |
AnnaBridge | 171:3a7713b1edbc | 182 | * @return kStatus_Success upon successful execution, error status otherwise. |
AnnaBridge | 171:3a7713b1edbc | 183 | */ |
AnnaBridge | 171:3a7713b1edbc | 184 | static inline status_t OTP_EnableBankReadLock(uint32_t bankIndex, |
AnnaBridge | 171:3a7713b1edbc | 185 | otp_word_t regEnableMask, |
AnnaBridge | 171:3a7713b1edbc | 186 | otp_word_t regDisableMask, |
AnnaBridge | 171:3a7713b1edbc | 187 | otp_lock_t lockWrite) |
AnnaBridge | 171:3a7713b1edbc | 188 | { |
AnnaBridge | 171:3a7713b1edbc | 189 | uint32_t status = OTP_API->otpEnableBankReadLock(bankIndex, regEnableMask, regDisableMask, lockWrite); |
AnnaBridge | 171:3a7713b1edbc | 190 | return _OTP_MAKE_STATUS(status); |
AnnaBridge | 171:3a7713b1edbc | 191 | } |
AnnaBridge | 171:3a7713b1edbc | 192 | |
AnnaBridge | 171:3a7713b1edbc | 193 | /*! |
AnnaBridge | 171:3a7713b1edbc | 194 | * @brief Program a single register in an OTP bank. |
AnnaBridge | 171:3a7713b1edbc | 195 | * |
AnnaBridge | 171:3a7713b1edbc | 196 | * @param bankIndex OTP bank index, 0 = bank 0, 1 = bank 1 etc. |
AnnaBridge | 171:3a7713b1edbc | 197 | * @param regIndex OTP register index. |
AnnaBridge | 171:3a7713b1edbc | 198 | * @param value value to write. |
AnnaBridge | 171:3a7713b1edbc | 199 | * |
AnnaBridge | 171:3a7713b1edbc | 200 | * @return kStatus_Success upon successful execution, error status otherwise. |
AnnaBridge | 171:3a7713b1edbc | 201 | */ |
AnnaBridge | 171:3a7713b1edbc | 202 | static inline status_t OTP_ProgramRegister(uint32_t bankIndex, uint32_t regIndex, uint32_t value) |
AnnaBridge | 171:3a7713b1edbc | 203 | { |
AnnaBridge | 171:3a7713b1edbc | 204 | uint32_t status = OTP_API->otpProgramReg(bankIndex, regIndex, value); |
AnnaBridge | 171:3a7713b1edbc | 205 | return _OTP_MAKE_STATUS(status); |
AnnaBridge | 171:3a7713b1edbc | 206 | } |
AnnaBridge | 171:3a7713b1edbc | 207 | |
AnnaBridge | 171:3a7713b1edbc | 208 | /*! |
AnnaBridge | 171:3a7713b1edbc | 209 | * @brief Returns the version of the OTP driver in ROM. |
AnnaBridge | 171:3a7713b1edbc | 210 | * |
AnnaBridge | 171:3a7713b1edbc | 211 | * @return version. |
AnnaBridge | 171:3a7713b1edbc | 212 | */ |
AnnaBridge | 171:3a7713b1edbc | 213 | static inline uint32_t OTP_GetDriverVersion(void) |
AnnaBridge | 171:3a7713b1edbc | 214 | { |
AnnaBridge | 171:3a7713b1edbc | 215 | return OTP_API->otpGetDriverVersion(); |
AnnaBridge | 171:3a7713b1edbc | 216 | } |
AnnaBridge | 171:3a7713b1edbc | 217 | |
AnnaBridge | 171:3a7713b1edbc | 218 | #if defined(__cplusplus) |
AnnaBridge | 171:3a7713b1edbc | 219 | } |
AnnaBridge | 171:3a7713b1edbc | 220 | #endif |
AnnaBridge | 171:3a7713b1edbc | 221 | |
AnnaBridge | 171:3a7713b1edbc | 222 | /*! @}*/ |
AnnaBridge | 171:3a7713b1edbc | 223 | |
AnnaBridge | 171:3a7713b1edbc | 224 | #endif /* _FSL_OTP_H_ */ |