BA / Mbed OS BaBoRo_test2
Committer:
borlanic
Date:
Tue Apr 24 11:45:18 2018 +0000
Revision:
0:02dd72d1d465
BaBoRo_test2 - backup 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
borlanic 0:02dd72d1d465 1 /*
borlanic 0:02dd72d1d465 2 * Copyright (c) 2014-2015 ARM Limited. All rights reserved.
borlanic 0:02dd72d1d465 3 * SPDX-License-Identifier: Apache-2.0
borlanic 0:02dd72d1d465 4 * Licensed under the Apache License, Version 2.0 (the License); you may
borlanic 0:02dd72d1d465 5 * not use this file except in compliance with the License.
borlanic 0:02dd72d1d465 6 * You may obtain a copy of the License at
borlanic 0:02dd72d1d465 7 *
borlanic 0:02dd72d1d465 8 * http://www.apache.org/licenses/LICENSE-2.0
borlanic 0:02dd72d1d465 9 *
borlanic 0:02dd72d1d465 10 * Unless required by applicable law or agreed to in writing, software
borlanic 0:02dd72d1d465 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
borlanic 0:02dd72d1d465 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
borlanic 0:02dd72d1d465 13 * See the License for the specific language governing permissions and
borlanic 0:02dd72d1d465 14 * limitations under the License.
borlanic 0:02dd72d1d465 15 */
borlanic 0:02dd72d1d465 16 #ifndef COMMON_FUNCTIONS_H_
borlanic 0:02dd72d1d465 17 #define COMMON_FUNCTIONS_H_
borlanic 0:02dd72d1d465 18
borlanic 0:02dd72d1d465 19 #include "ns_types.h"
borlanic 0:02dd72d1d465 20
borlanic 0:02dd72d1d465 21 #ifdef __cplusplus
borlanic 0:02dd72d1d465 22 extern "C" {
borlanic 0:02dd72d1d465 23 #endif
borlanic 0:02dd72d1d465 24
borlanic 0:02dd72d1d465 25 /*
borlanic 0:02dd72d1d465 26 * Common write 64-bit variable to 8-bit pointer.
borlanic 0:02dd72d1d465 27 *
borlanic 0:02dd72d1d465 28 * Write 64 bits in big-endian (network) byte order.
borlanic 0:02dd72d1d465 29 *
borlanic 0:02dd72d1d465 30 * \param value 64-bit variable
borlanic 0:02dd72d1d465 31 * \param ptr pointer where data to be written
borlanic 0:02dd72d1d465 32 *
borlanic 0:02dd72d1d465 33 * \return updated pointer
borlanic 0:02dd72d1d465 34 */
borlanic 0:02dd72d1d465 35 NS_INLINE uint8_t *common_write_64_bit(uint64_t value, uint8_t ptr[__static 8]);
borlanic 0:02dd72d1d465 36
borlanic 0:02dd72d1d465 37 /*
borlanic 0:02dd72d1d465 38 * Common read 64-bit variable from 8-bit pointer.
borlanic 0:02dd72d1d465 39 *
borlanic 0:02dd72d1d465 40 * Read 64 bits in big-endian (network) byte order.
borlanic 0:02dd72d1d465 41 *
borlanic 0:02dd72d1d465 42 * \param data_buf pointer where data to be read
borlanic 0:02dd72d1d465 43 *
borlanic 0:02dd72d1d465 44 * \return 64-bit variable
borlanic 0:02dd72d1d465 45 */
borlanic 0:02dd72d1d465 46 NS_INLINE uint64_t common_read_64_bit(const uint8_t data_buf[__static 8]);
borlanic 0:02dd72d1d465 47
borlanic 0:02dd72d1d465 48 /*
borlanic 0:02dd72d1d465 49 * Common write 32-bit variable to 8-bit pointer.
borlanic 0:02dd72d1d465 50 *
borlanic 0:02dd72d1d465 51 * Write 32 bits in big-endian (network) byte order.
borlanic 0:02dd72d1d465 52 *
borlanic 0:02dd72d1d465 53 * \param value 32-bit variable
borlanic 0:02dd72d1d465 54 * \param ptr pointer where data to be written
borlanic 0:02dd72d1d465 55 *
borlanic 0:02dd72d1d465 56 * \return updated pointer
borlanic 0:02dd72d1d465 57 */
borlanic 0:02dd72d1d465 58 NS_INLINE uint8_t *common_write_32_bit(uint32_t value, uint8_t ptr[__static 4]);
borlanic 0:02dd72d1d465 59
borlanic 0:02dd72d1d465 60 /*
borlanic 0:02dd72d1d465 61 * Common read 32-bit variable from 8-bit pointer.
borlanic 0:02dd72d1d465 62 *
borlanic 0:02dd72d1d465 63 * Read 32 bits in big-endian (network) byte order.
borlanic 0:02dd72d1d465 64 *
borlanic 0:02dd72d1d465 65 * \param data_buf pointer where data to be read
borlanic 0:02dd72d1d465 66 *
borlanic 0:02dd72d1d465 67 * \return 32-bit variable
borlanic 0:02dd72d1d465 68 */
borlanic 0:02dd72d1d465 69 NS_INLINE uint32_t common_read_32_bit(const uint8_t data_buf[__static 4]);
borlanic 0:02dd72d1d465 70
borlanic 0:02dd72d1d465 71 /*
borlanic 0:02dd72d1d465 72 * Common write 32-bit variable to 8-bit pointer.
borlanic 0:02dd72d1d465 73 *
borlanic 0:02dd72d1d465 74 * Write 32 bits in little-endian byte order.
borlanic 0:02dd72d1d465 75 *
borlanic 0:02dd72d1d465 76 * \param value 32-bit variable
borlanic 0:02dd72d1d465 77 * \param ptr pointer where data to be written
borlanic 0:02dd72d1d465 78 *
borlanic 0:02dd72d1d465 79 * \return updated pointer
borlanic 0:02dd72d1d465 80 */
borlanic 0:02dd72d1d465 81 NS_INLINE uint8_t *common_write_32_bit_inverse(uint32_t value, uint8_t ptr[__static 4]);
borlanic 0:02dd72d1d465 82
borlanic 0:02dd72d1d465 83 /*
borlanic 0:02dd72d1d465 84 * Common read 32-bit variable from 8-bit pointer.
borlanic 0:02dd72d1d465 85 *
borlanic 0:02dd72d1d465 86 * Read 32 bits in little-endian byte order.
borlanic 0:02dd72d1d465 87 *
borlanic 0:02dd72d1d465 88 * \param data_buf pointer where data to be read
borlanic 0:02dd72d1d465 89 *
borlanic 0:02dd72d1d465 90 * \return 32-bit variable
borlanic 0:02dd72d1d465 91 */
borlanic 0:02dd72d1d465 92 NS_INLINE uint32_t common_read_32_bit_inverse(const uint8_t data_buf[__static 4]);
borlanic 0:02dd72d1d465 93
borlanic 0:02dd72d1d465 94 /*
borlanic 0:02dd72d1d465 95 * Common write 24-bit variable to 8-bit pointer.
borlanic 0:02dd72d1d465 96 *
borlanic 0:02dd72d1d465 97 * Write 24 bits in big-endian (network) byte order.
borlanic 0:02dd72d1d465 98 *
borlanic 0:02dd72d1d465 99 * \param value 24-bit variable
borlanic 0:02dd72d1d465 100 * \param ptr pointer where data to be written
borlanic 0:02dd72d1d465 101 *
borlanic 0:02dd72d1d465 102 * \return updated pointer
borlanic 0:02dd72d1d465 103 */
borlanic 0:02dd72d1d465 104 NS_INLINE uint8_t *common_write_24_bit(uint_fast24_t value, uint8_t ptr[__static 3]);
borlanic 0:02dd72d1d465 105
borlanic 0:02dd72d1d465 106 /*
borlanic 0:02dd72d1d465 107 * Common read 24-bit variable from 8-bit pointer.
borlanic 0:02dd72d1d465 108 *
borlanic 0:02dd72d1d465 109 * Read 24 bits in big-endian (network) byte order.
borlanic 0:02dd72d1d465 110 *
borlanic 0:02dd72d1d465 111 * \param data_buf pointer where data to be read
borlanic 0:02dd72d1d465 112 *
borlanic 0:02dd72d1d465 113 * \return 24-bit variable
borlanic 0:02dd72d1d465 114 */
borlanic 0:02dd72d1d465 115 NS_INLINE uint_fast24_t common_read_24_bit(const uint8_t data_buf[__static 3]);
borlanic 0:02dd72d1d465 116
borlanic 0:02dd72d1d465 117 /*
borlanic 0:02dd72d1d465 118 * Common write 16-bit variable to 8-bit pointer.
borlanic 0:02dd72d1d465 119 *
borlanic 0:02dd72d1d465 120 * Write 16 bits in big-endian (network) byte order.
borlanic 0:02dd72d1d465 121 *
borlanic 0:02dd72d1d465 122 * \param value 16-bit variable
borlanic 0:02dd72d1d465 123 * \param ptr pointer where data to be written
borlanic 0:02dd72d1d465 124 *
borlanic 0:02dd72d1d465 125 * \return updated pointer
borlanic 0:02dd72d1d465 126 */
borlanic 0:02dd72d1d465 127 NS_INLINE uint8_t *common_write_16_bit(uint16_t value, uint8_t ptr[__static 2]);
borlanic 0:02dd72d1d465 128
borlanic 0:02dd72d1d465 129 /*
borlanic 0:02dd72d1d465 130 * Common read 16-bit variable from 8-bit pointer.
borlanic 0:02dd72d1d465 131 *
borlanic 0:02dd72d1d465 132 * Read 16 bits in big-endian (network) byte order.
borlanic 0:02dd72d1d465 133 *
borlanic 0:02dd72d1d465 134 * \param data_buf pointer where data to be read
borlanic 0:02dd72d1d465 135 *
borlanic 0:02dd72d1d465 136 * \return 16-bit variable
borlanic 0:02dd72d1d465 137 */
borlanic 0:02dd72d1d465 138 NS_INLINE uint16_t common_read_16_bit(const uint8_t data_buf[__static 2]);
borlanic 0:02dd72d1d465 139
borlanic 0:02dd72d1d465 140 /*
borlanic 0:02dd72d1d465 141 * Common write 16-bit variable to 8-bit pointer.
borlanic 0:02dd72d1d465 142 *
borlanic 0:02dd72d1d465 143 * Write 16 bits in little-endian byte order.
borlanic 0:02dd72d1d465 144 *
borlanic 0:02dd72d1d465 145 * \param value 16-bit variable
borlanic 0:02dd72d1d465 146 * \param ptr pointer where data to be written
borlanic 0:02dd72d1d465 147 *
borlanic 0:02dd72d1d465 148 * \return updated pointer
borlanic 0:02dd72d1d465 149 */
borlanic 0:02dd72d1d465 150 NS_INLINE uint8_t *common_write_16_bit_inverse(uint16_t value, uint8_t ptr[__static 2]);
borlanic 0:02dd72d1d465 151
borlanic 0:02dd72d1d465 152 /*
borlanic 0:02dd72d1d465 153 * Common read 16-bit variable from 8-bit pointer.
borlanic 0:02dd72d1d465 154 *
borlanic 0:02dd72d1d465 155 * Read 16 bits in little-endian byte order.
borlanic 0:02dd72d1d465 156 *
borlanic 0:02dd72d1d465 157 * \param data_buf pointer where data to be read
borlanic 0:02dd72d1d465 158 *
borlanic 0:02dd72d1d465 159 * \return 16-bit variable
borlanic 0:02dd72d1d465 160 */
borlanic 0:02dd72d1d465 161 NS_INLINE uint16_t common_read_16_bit_inverse(const uint8_t data_buf[__static 2]);
borlanic 0:02dd72d1d465 162
borlanic 0:02dd72d1d465 163 /*
borlanic 0:02dd72d1d465 164 * Count bits in a byte
borlanic 0:02dd72d1d465 165 *
borlanic 0:02dd72d1d465 166 * \param byte byte to inspect
borlanic 0:02dd72d1d465 167 *
borlanic 0:02dd72d1d465 168 * \return number of 1-bits in byte
borlanic 0:02dd72d1d465 169 */
borlanic 0:02dd72d1d465 170 NS_INLINE uint_fast8_t common_count_bits(uint8_t byte);
borlanic 0:02dd72d1d465 171
borlanic 0:02dd72d1d465 172 /*
borlanic 0:02dd72d1d465 173 * Count leading zeros in a byte
borlanic 0:02dd72d1d465 174 *
borlanic 0:02dd72d1d465 175 * \deprecated Use common_count_leading_zeros_8
borlanic 0:02dd72d1d465 176 *
borlanic 0:02dd72d1d465 177 * \param byte byte to inspect
borlanic 0:02dd72d1d465 178 *
borlanic 0:02dd72d1d465 179 * \return number of leading zeros in byte (0-8)
borlanic 0:02dd72d1d465 180 */
borlanic 0:02dd72d1d465 181 NS_INLINE uint_fast8_t common_count_leading_zeros(uint8_t byte);
borlanic 0:02dd72d1d465 182
borlanic 0:02dd72d1d465 183 /*
borlanic 0:02dd72d1d465 184 * Count leading zeros in a byte
borlanic 0:02dd72d1d465 185 *
borlanic 0:02dd72d1d465 186 * \param byte byte to inspect
borlanic 0:02dd72d1d465 187 *
borlanic 0:02dd72d1d465 188 * \return number of leading zeros in byte (0-8)
borlanic 0:02dd72d1d465 189 */
borlanic 0:02dd72d1d465 190 NS_INLINE uint_fast8_t common_count_leading_zeros_8(uint8_t byte);
borlanic 0:02dd72d1d465 191
borlanic 0:02dd72d1d465 192 /*
borlanic 0:02dd72d1d465 193 * Count leading zeros in a 16-bit value
borlanic 0:02dd72d1d465 194 *
borlanic 0:02dd72d1d465 195 * \param value value to inspect
borlanic 0:02dd72d1d465 196 *
borlanic 0:02dd72d1d465 197 * \return number of leading zeros in byte (0-16)
borlanic 0:02dd72d1d465 198 */
borlanic 0:02dd72d1d465 199 NS_INLINE uint_fast8_t common_count_leading_zeros_16(uint16_t value);
borlanic 0:02dd72d1d465 200
borlanic 0:02dd72d1d465 201 /*
borlanic 0:02dd72d1d465 202 * Count leading zeros in a 32-bit value
borlanic 0:02dd72d1d465 203 *
borlanic 0:02dd72d1d465 204 * \param value value to inspect
borlanic 0:02dd72d1d465 205 *
borlanic 0:02dd72d1d465 206 * \return number of leading zeros in byte (0-32)
borlanic 0:02dd72d1d465 207 */
borlanic 0:02dd72d1d465 208 NS_INLINE uint_fast8_t common_count_leading_zeros_32(uint32_t value);
borlanic 0:02dd72d1d465 209
borlanic 0:02dd72d1d465 210 /*
borlanic 0:02dd72d1d465 211 * Compare 8-bit serial numbers
borlanic 0:02dd72d1d465 212 *
borlanic 0:02dd72d1d465 213 * Compare two 8-bit serial numbers, according to RFC 1982 Serial Number
borlanic 0:02dd72d1d465 214 * Arithmetic.
borlanic 0:02dd72d1d465 215 *
borlanic 0:02dd72d1d465 216 * \param s1 first serial number
borlanic 0:02dd72d1d465 217 * \param s2 second serial number
borlanic 0:02dd72d1d465 218 *
borlanic 0:02dd72d1d465 219 * \return true if s1 > s2
borlanic 0:02dd72d1d465 220 * \return false if s1 <= s2, or the comparison is undefined
borlanic 0:02dd72d1d465 221 */
borlanic 0:02dd72d1d465 222 NS_INLINE bool common_serial_number_greater_8(uint8_t s1, uint8_t s2);
borlanic 0:02dd72d1d465 223
borlanic 0:02dd72d1d465 224 /*
borlanic 0:02dd72d1d465 225 * Compare 16-bit serial numbers
borlanic 0:02dd72d1d465 226 *
borlanic 0:02dd72d1d465 227 * Compare two 16-bit serial numbers, according to RFC 1982 Serial Number
borlanic 0:02dd72d1d465 228 * Arithmetic.
borlanic 0:02dd72d1d465 229 *
borlanic 0:02dd72d1d465 230 * \param s1 first serial number
borlanic 0:02dd72d1d465 231 * \param s2 second serial number
borlanic 0:02dd72d1d465 232 *
borlanic 0:02dd72d1d465 233 * \return true if s1 > s2
borlanic 0:02dd72d1d465 234 * \return false if s1 <= s2, or the comparison is undefined
borlanic 0:02dd72d1d465 235 */
borlanic 0:02dd72d1d465 236 NS_INLINE bool common_serial_number_greater_16(uint16_t s1, uint16_t s2);
borlanic 0:02dd72d1d465 237
borlanic 0:02dd72d1d465 238 /*
borlanic 0:02dd72d1d465 239 * Compare 32-bit serial numbers
borlanic 0:02dd72d1d465 240 *
borlanic 0:02dd72d1d465 241 * Compare two 32-bit serial numbers, according to RFC 1982 Serial Number
borlanic 0:02dd72d1d465 242 * Arithmetic.
borlanic 0:02dd72d1d465 243 *
borlanic 0:02dd72d1d465 244 * \param s1 first serial number
borlanic 0:02dd72d1d465 245 * \param s2 second serial number
borlanic 0:02dd72d1d465 246 *
borlanic 0:02dd72d1d465 247 * \return true if s1 > s2
borlanic 0:02dd72d1d465 248 * \return false if s1 <= s2, or the comparison is undefined
borlanic 0:02dd72d1d465 249 */
borlanic 0:02dd72d1d465 250 NS_INLINE bool common_serial_number_greater_32(uint32_t s1, uint32_t s2);
borlanic 0:02dd72d1d465 251
borlanic 0:02dd72d1d465 252 /*
borlanic 0:02dd72d1d465 253 * Test a bit in an bit array.
borlanic 0:02dd72d1d465 254 *
borlanic 0:02dd72d1d465 255 * Check whether a particular bit is set in a bit string. The bit array
borlanic 0:02dd72d1d465 256 * is in big-endian (network) bit order.
borlanic 0:02dd72d1d465 257 *
borlanic 0:02dd72d1d465 258 * \param bitset pointer to bit array
borlanic 0:02dd72d1d465 259 * \param bit index of bit - 0 is the most significant bit of the first byte
borlanic 0:02dd72d1d465 260 *
borlanic 0:02dd72d1d465 261 * \return true if the bit is set
borlanic 0:02dd72d1d465 262 */
borlanic 0:02dd72d1d465 263 NS_INLINE bool bit_test(const uint8_t *bitset, uint_fast8_t bit);
borlanic 0:02dd72d1d465 264
borlanic 0:02dd72d1d465 265 /*
borlanic 0:02dd72d1d465 266 * Set a bit in an bit array.
borlanic 0:02dd72d1d465 267 *
borlanic 0:02dd72d1d465 268 * Set a bit in a bit array. The array is in big-endian (network) bit order.
borlanic 0:02dd72d1d465 269 *
borlanic 0:02dd72d1d465 270 * \param bitset pointer to bit array
borlanic 0:02dd72d1d465 271 * \param bit index of bit - 0 is the most significant bit of the first byte
borlanic 0:02dd72d1d465 272 */
borlanic 0:02dd72d1d465 273 NS_INLINE void bit_set(uint8_t *bitset, uint_fast8_t bit);
borlanic 0:02dd72d1d465 274
borlanic 0:02dd72d1d465 275 /*
borlanic 0:02dd72d1d465 276 * Clear a bit in an bit array.
borlanic 0:02dd72d1d465 277 *
borlanic 0:02dd72d1d465 278 * Clear a bit in a bit array. The bit array is in big-endian (network) bit order.
borlanic 0:02dd72d1d465 279 *
borlanic 0:02dd72d1d465 280 * \param bitset pointer to bit array
borlanic 0:02dd72d1d465 281 * \param bit index of bit - 0 is the most significant bit of the first byte
borlanic 0:02dd72d1d465 282 */
borlanic 0:02dd72d1d465 283 NS_INLINE void bit_clear(uint8_t *bitset, uint_fast8_t bit);
borlanic 0:02dd72d1d465 284
borlanic 0:02dd72d1d465 285 /*
borlanic 0:02dd72d1d465 286 * Compare two bitstrings.
borlanic 0:02dd72d1d465 287 *
borlanic 0:02dd72d1d465 288 * Compare two bitstrings of specified length. The bit strings are in
borlanic 0:02dd72d1d465 289 * big-endian (network) bit order.
borlanic 0:02dd72d1d465 290 *
borlanic 0:02dd72d1d465 291 * \param a pointer to first string
borlanic 0:02dd72d1d465 292 * \param b pointer to second string
borlanic 0:02dd72d1d465 293 * \param bits number of bits to compare
borlanic 0:02dd72d1d465 294 *
borlanic 0:02dd72d1d465 295 * \return true if the strings compare equal
borlanic 0:02dd72d1d465 296 */
borlanic 0:02dd72d1d465 297 bool bitsequal(const uint8_t *a, const uint8_t *b, uint_fast8_t bits);
borlanic 0:02dd72d1d465 298
borlanic 0:02dd72d1d465 299 /*
borlanic 0:02dd72d1d465 300 * Copy a bitstring
borlanic 0:02dd72d1d465 301 *
borlanic 0:02dd72d1d465 302 * Copy a bitstring of specified length. The bit string is in big-endian
borlanic 0:02dd72d1d465 303 * (network) bit order. Bits beyond the bitlength at the destination are not
borlanic 0:02dd72d1d465 304 * modified.
borlanic 0:02dd72d1d465 305 *
borlanic 0:02dd72d1d465 306 * For example, copying 4 bits sets the first 4 bits of dst[0] from src[0],
borlanic 0:02dd72d1d465 307 * the lower 4 bits of dst[0] are unmodified.
borlanic 0:02dd72d1d465 308 *
borlanic 0:02dd72d1d465 309 * \param dst destination pointer
borlanic 0:02dd72d1d465 310 * \param src source pointer
borlanic 0:02dd72d1d465 311 * \param bits number of bits to copy
borlanic 0:02dd72d1d465 312 *
borlanic 0:02dd72d1d465 313 * \return the value of dst
borlanic 0:02dd72d1d465 314 */
borlanic 0:02dd72d1d465 315 uint8_t *bitcopy(uint8_t *restrict dst, const uint8_t *restrict src, uint_fast8_t bits);
borlanic 0:02dd72d1d465 316
borlanic 0:02dd72d1d465 317 /*
borlanic 0:02dd72d1d465 318 * Copy a bitstring and pad last byte with zeros
borlanic 0:02dd72d1d465 319 *
borlanic 0:02dd72d1d465 320 * Copy a bitstring of specified length. The bit string is in big-endian
borlanic 0:02dd72d1d465 321 * (network) bit order. Bits beyond the bitlength in the last destination byte are
borlanic 0:02dd72d1d465 322 * zeroed.
borlanic 0:02dd72d1d465 323 *
borlanic 0:02dd72d1d465 324 * For example, copying 4 bits sets the first 4 bits of dst[0] from src[0], and
borlanic 0:02dd72d1d465 325 * the lower 4 bits of dst[0] are set to 0.
borlanic 0:02dd72d1d465 326 *
borlanic 0:02dd72d1d465 327 * \param dst destination pointer
borlanic 0:02dd72d1d465 328 * \param src source pointer
borlanic 0:02dd72d1d465 329 * \param bits number of bits to copy
borlanic 0:02dd72d1d465 330 *
borlanic 0:02dd72d1d465 331 * \return the value of dst
borlanic 0:02dd72d1d465 332 */
borlanic 0:02dd72d1d465 333 uint8_t *bitcopy0(uint8_t *restrict dst, const uint8_t *restrict src, uint_fast8_t bits);
borlanic 0:02dd72d1d465 334
borlanic 0:02dd72d1d465 335 /* Provide definitions, either for inlining, or for common_functions.c */
borlanic 0:02dd72d1d465 336 #if defined NS_ALLOW_INLINING || defined COMMON_FUNCTIONS_FN
borlanic 0:02dd72d1d465 337 #ifndef COMMON_FUNCTIONS_FN
borlanic 0:02dd72d1d465 338 #define COMMON_FUNCTIONS_FN NS_INLINE
borlanic 0:02dd72d1d465 339 #endif
borlanic 0:02dd72d1d465 340
borlanic 0:02dd72d1d465 341 COMMON_FUNCTIONS_FN uint8_t *common_write_64_bit(uint64_t value, uint8_t ptr[__static 8])
borlanic 0:02dd72d1d465 342 {
borlanic 0:02dd72d1d465 343 *ptr++ = value >> 56;
borlanic 0:02dd72d1d465 344 *ptr++ = value >> 48;
borlanic 0:02dd72d1d465 345 *ptr++ = value >> 40;
borlanic 0:02dd72d1d465 346 *ptr++ = value >> 32;
borlanic 0:02dd72d1d465 347 *ptr++ = value >> 24;
borlanic 0:02dd72d1d465 348 *ptr++ = value >> 16;
borlanic 0:02dd72d1d465 349 *ptr++ = value >> 8;
borlanic 0:02dd72d1d465 350 *ptr++ = value;
borlanic 0:02dd72d1d465 351 return ptr;
borlanic 0:02dd72d1d465 352 }
borlanic 0:02dd72d1d465 353
borlanic 0:02dd72d1d465 354 COMMON_FUNCTIONS_FN uint64_t common_read_64_bit(const uint8_t data_buf[__static 8])
borlanic 0:02dd72d1d465 355 {
borlanic 0:02dd72d1d465 356 uint64_t temp_64;
borlanic 0:02dd72d1d465 357 temp_64 = (uint64_t)(*data_buf++) << 56;
borlanic 0:02dd72d1d465 358 temp_64 += (uint64_t)(*data_buf++) << 48;
borlanic 0:02dd72d1d465 359 temp_64 += (uint64_t)(*data_buf++) << 40;
borlanic 0:02dd72d1d465 360 temp_64 += (uint64_t)(*data_buf++) << 32;
borlanic 0:02dd72d1d465 361 temp_64 += (uint64_t)(*data_buf++) << 24;
borlanic 0:02dd72d1d465 362 temp_64 += (uint64_t)(*data_buf++) << 16;
borlanic 0:02dd72d1d465 363 temp_64 += (uint64_t)(*data_buf++) << 8;
borlanic 0:02dd72d1d465 364 temp_64 += *data_buf++;
borlanic 0:02dd72d1d465 365 return temp_64;
borlanic 0:02dd72d1d465 366 }
borlanic 0:02dd72d1d465 367
borlanic 0:02dd72d1d465 368 COMMON_FUNCTIONS_FN uint8_t *common_write_32_bit(uint32_t value, uint8_t ptr[__static 4])
borlanic 0:02dd72d1d465 369 {
borlanic 0:02dd72d1d465 370 *ptr++ = value >> 24;
borlanic 0:02dd72d1d465 371 *ptr++ = value >> 16;
borlanic 0:02dd72d1d465 372 *ptr++ = value >> 8;
borlanic 0:02dd72d1d465 373 *ptr++ = value;
borlanic 0:02dd72d1d465 374 return ptr;
borlanic 0:02dd72d1d465 375 }
borlanic 0:02dd72d1d465 376
borlanic 0:02dd72d1d465 377 COMMON_FUNCTIONS_FN uint32_t common_read_32_bit(const uint8_t data_buf[__static 4])
borlanic 0:02dd72d1d465 378 {
borlanic 0:02dd72d1d465 379 uint32_t temp_32;
borlanic 0:02dd72d1d465 380 temp_32 = (uint32_t)(*data_buf++) << 24;
borlanic 0:02dd72d1d465 381 temp_32 += (uint32_t)(*data_buf++) << 16;
borlanic 0:02dd72d1d465 382 temp_32 += (uint32_t)(*data_buf++) << 8;
borlanic 0:02dd72d1d465 383 temp_32 += *data_buf++;
borlanic 0:02dd72d1d465 384 return temp_32;
borlanic 0:02dd72d1d465 385 }
borlanic 0:02dd72d1d465 386
borlanic 0:02dd72d1d465 387 COMMON_FUNCTIONS_FN uint8_t *common_write_32_bit_inverse(uint32_t value, uint8_t ptr[__static 4])
borlanic 0:02dd72d1d465 388 {
borlanic 0:02dd72d1d465 389 *ptr++ = value;
borlanic 0:02dd72d1d465 390 *ptr++ = value >> 8;
borlanic 0:02dd72d1d465 391 *ptr++ = value >> 16;
borlanic 0:02dd72d1d465 392 *ptr++ = value >> 24;
borlanic 0:02dd72d1d465 393 return ptr;
borlanic 0:02dd72d1d465 394 }
borlanic 0:02dd72d1d465 395
borlanic 0:02dd72d1d465 396 COMMON_FUNCTIONS_FN uint32_t common_read_32_bit_inverse(const uint8_t data_buf[__static 4])
borlanic 0:02dd72d1d465 397 {
borlanic 0:02dd72d1d465 398 uint32_t temp_32;
borlanic 0:02dd72d1d465 399 temp_32 = *data_buf++;
borlanic 0:02dd72d1d465 400 temp_32 += (uint32_t)(*data_buf++) << 8;
borlanic 0:02dd72d1d465 401 temp_32 += (uint32_t)(*data_buf++) << 16;
borlanic 0:02dd72d1d465 402 temp_32 += (uint32_t)(*data_buf++) << 24;
borlanic 0:02dd72d1d465 403 return temp_32;
borlanic 0:02dd72d1d465 404 }
borlanic 0:02dd72d1d465 405
borlanic 0:02dd72d1d465 406 COMMON_FUNCTIONS_FN uint8_t *common_write_24_bit(uint_fast24_t value, uint8_t ptr[__static 3])
borlanic 0:02dd72d1d465 407 {
borlanic 0:02dd72d1d465 408 *ptr++ = value >> 16;
borlanic 0:02dd72d1d465 409 *ptr++ = value >> 8;
borlanic 0:02dd72d1d465 410 *ptr++ = value;
borlanic 0:02dd72d1d465 411 return ptr;
borlanic 0:02dd72d1d465 412 }
borlanic 0:02dd72d1d465 413
borlanic 0:02dd72d1d465 414 COMMON_FUNCTIONS_FN uint_fast24_t common_read_24_bit(const uint8_t data_buf[__static 3])
borlanic 0:02dd72d1d465 415 {
borlanic 0:02dd72d1d465 416 uint_fast24_t temp_24;
borlanic 0:02dd72d1d465 417 temp_24 = (uint_fast24_t)(*data_buf++) << 16;
borlanic 0:02dd72d1d465 418 temp_24 += (uint_fast24_t)(*data_buf++) << 8;
borlanic 0:02dd72d1d465 419 temp_24 += *data_buf++;
borlanic 0:02dd72d1d465 420 return temp_24;
borlanic 0:02dd72d1d465 421 }
borlanic 0:02dd72d1d465 422
borlanic 0:02dd72d1d465 423 COMMON_FUNCTIONS_FN uint8_t *common_write_16_bit(uint16_t value, uint8_t ptr[__static 2])
borlanic 0:02dd72d1d465 424 {
borlanic 0:02dd72d1d465 425 *ptr++ = value >> 8;
borlanic 0:02dd72d1d465 426 *ptr++ = value;
borlanic 0:02dd72d1d465 427 return ptr;
borlanic 0:02dd72d1d465 428 }
borlanic 0:02dd72d1d465 429
borlanic 0:02dd72d1d465 430 COMMON_FUNCTIONS_FN uint16_t common_read_16_bit(const uint8_t data_buf[__static 2])
borlanic 0:02dd72d1d465 431 {
borlanic 0:02dd72d1d465 432 uint16_t temp_16;
borlanic 0:02dd72d1d465 433 temp_16 = (uint16_t)(*data_buf++) << 8;
borlanic 0:02dd72d1d465 434 temp_16 += *data_buf++;
borlanic 0:02dd72d1d465 435 return temp_16;
borlanic 0:02dd72d1d465 436 }
borlanic 0:02dd72d1d465 437
borlanic 0:02dd72d1d465 438 COMMON_FUNCTIONS_FN uint8_t *common_write_16_bit_inverse(uint16_t value, uint8_t ptr[__static 2])
borlanic 0:02dd72d1d465 439 {
borlanic 0:02dd72d1d465 440 *ptr++ = value;
borlanic 0:02dd72d1d465 441 *ptr++ = value >> 8;
borlanic 0:02dd72d1d465 442 return ptr;
borlanic 0:02dd72d1d465 443 }
borlanic 0:02dd72d1d465 444
borlanic 0:02dd72d1d465 445 COMMON_FUNCTIONS_FN uint16_t common_read_16_bit_inverse(const uint8_t data_buf[__static 2])
borlanic 0:02dd72d1d465 446 {
borlanic 0:02dd72d1d465 447 uint16_t temp_16;
borlanic 0:02dd72d1d465 448 temp_16 = *data_buf++;
borlanic 0:02dd72d1d465 449 temp_16 += (uint16_t)(*data_buf++) << 8;
borlanic 0:02dd72d1d465 450 return temp_16;
borlanic 0:02dd72d1d465 451 }
borlanic 0:02dd72d1d465 452
borlanic 0:02dd72d1d465 453 COMMON_FUNCTIONS_FN uint_fast8_t common_count_bits(uint8_t byte)
borlanic 0:02dd72d1d465 454 {
borlanic 0:02dd72d1d465 455 /* First step sets each bit pair to be count of bits (00,01,10) */
borlanic 0:02dd72d1d465 456 /* [00-00 = 00, 01-00 = 01, 10-01 = 01, 11-01 = 10] */
borlanic 0:02dd72d1d465 457 uint_fast8_t count = byte - ((byte >> 1) & 0x55);
borlanic 0:02dd72d1d465 458 /* Add bit pairs to make each nibble contain count of bits (0-4) */
borlanic 0:02dd72d1d465 459 count = (count & 0x33) + ((count >> 2) & 0x33);
borlanic 0:02dd72d1d465 460 /* Final result is sum of nibbles (0-8) */
borlanic 0:02dd72d1d465 461 count = (count >> 4) + (count & 0x0F);
borlanic 0:02dd72d1d465 462 return count;
borlanic 0:02dd72d1d465 463 }
borlanic 0:02dd72d1d465 464
borlanic 0:02dd72d1d465 465 COMMON_FUNCTIONS_FN uint_fast8_t common_count_leading_zeros(uint8_t byte)
borlanic 0:02dd72d1d465 466 {
borlanic 0:02dd72d1d465 467 return common_count_leading_zeros_8(byte);
borlanic 0:02dd72d1d465 468 }
borlanic 0:02dd72d1d465 469
borlanic 0:02dd72d1d465 470 COMMON_FUNCTIONS_FN uint_fast8_t common_count_leading_zeros_8(uint8_t byte)
borlanic 0:02dd72d1d465 471 {
borlanic 0:02dd72d1d465 472 #ifdef __CC_ARM
borlanic 0:02dd72d1d465 473 return byte ? __clz((unsigned int) byte << 24) : 8;
borlanic 0:02dd72d1d465 474 #elif defined __GNUC__
borlanic 0:02dd72d1d465 475 return byte ? __builtin_clz((unsigned int) byte << 24) : 8;
borlanic 0:02dd72d1d465 476 #else
borlanic 0:02dd72d1d465 477 uint_fast8_t cnt = 0;
borlanic 0:02dd72d1d465 478 if (byte == 0) {
borlanic 0:02dd72d1d465 479 return 8;
borlanic 0:02dd72d1d465 480 }
borlanic 0:02dd72d1d465 481 if ((byte & 0xF0) == 0) {
borlanic 0:02dd72d1d465 482 byte <<= 4;
borlanic 0:02dd72d1d465 483 cnt += 4;
borlanic 0:02dd72d1d465 484 }
borlanic 0:02dd72d1d465 485 if ((byte & 0xC0) == 0) {
borlanic 0:02dd72d1d465 486 byte <<= 2;
borlanic 0:02dd72d1d465 487 cnt += 2;
borlanic 0:02dd72d1d465 488 }
borlanic 0:02dd72d1d465 489 if ((byte & 0x80) == 0) {
borlanic 0:02dd72d1d465 490 cnt += 1;
borlanic 0:02dd72d1d465 491 }
borlanic 0:02dd72d1d465 492
borlanic 0:02dd72d1d465 493 return cnt;
borlanic 0:02dd72d1d465 494 #endif
borlanic 0:02dd72d1d465 495 }
borlanic 0:02dd72d1d465 496
borlanic 0:02dd72d1d465 497 COMMON_FUNCTIONS_FN uint_fast8_t common_count_leading_zeros_16(uint16_t value)
borlanic 0:02dd72d1d465 498 {
borlanic 0:02dd72d1d465 499 #ifdef __CC_ARM
borlanic 0:02dd72d1d465 500 return value ? __clz((unsigned int) value << 16) : 16;
borlanic 0:02dd72d1d465 501 #elif defined __GNUC__
borlanic 0:02dd72d1d465 502 return value ? __builtin_clz((unsigned int) value << 16) : 16;
borlanic 0:02dd72d1d465 503 #else
borlanic 0:02dd72d1d465 504 uint_fast8_t cnt = 0;
borlanic 0:02dd72d1d465 505 if (value == 0) {
borlanic 0:02dd72d1d465 506 return 16;
borlanic 0:02dd72d1d465 507 }
borlanic 0:02dd72d1d465 508 if ((value & 0xFF00) == 0) {
borlanic 0:02dd72d1d465 509 value <<= 8;
borlanic 0:02dd72d1d465 510 cnt += 8;
borlanic 0:02dd72d1d465 511 }
borlanic 0:02dd72d1d465 512 if ((value & 0xF000) == 0) {
borlanic 0:02dd72d1d465 513 value <<= 4;
borlanic 0:02dd72d1d465 514 cnt += 4;
borlanic 0:02dd72d1d465 515 }
borlanic 0:02dd72d1d465 516 if ((value & 0xC000) == 0) {
borlanic 0:02dd72d1d465 517 value <<= 2;
borlanic 0:02dd72d1d465 518 cnt += 2;
borlanic 0:02dd72d1d465 519 }
borlanic 0:02dd72d1d465 520 if ((value & 0x8000) == 0) {
borlanic 0:02dd72d1d465 521 cnt += 1;
borlanic 0:02dd72d1d465 522 }
borlanic 0:02dd72d1d465 523
borlanic 0:02dd72d1d465 524 return cnt;
borlanic 0:02dd72d1d465 525 #endif
borlanic 0:02dd72d1d465 526 }
borlanic 0:02dd72d1d465 527
borlanic 0:02dd72d1d465 528 COMMON_FUNCTIONS_FN uint_fast8_t common_count_leading_zeros_32(uint32_t value)
borlanic 0:02dd72d1d465 529 {
borlanic 0:02dd72d1d465 530 #ifdef __CC_ARM
borlanic 0:02dd72d1d465 531 return __clz(value);
borlanic 0:02dd72d1d465 532 #elif defined __GNUC__
borlanic 0:02dd72d1d465 533 return value ? __builtin_clz(value) : 32;
borlanic 0:02dd72d1d465 534 #else
borlanic 0:02dd72d1d465 535 uint_fast8_t cnt = 0;
borlanic 0:02dd72d1d465 536 if (value == 0) {
borlanic 0:02dd72d1d465 537 return 32;
borlanic 0:02dd72d1d465 538 }
borlanic 0:02dd72d1d465 539 if ((value & 0xFFFF0000) == 0) {
borlanic 0:02dd72d1d465 540 value <<= 16;
borlanic 0:02dd72d1d465 541 cnt += 16;
borlanic 0:02dd72d1d465 542 }
borlanic 0:02dd72d1d465 543 if ((value & 0xFF000000) == 0) {
borlanic 0:02dd72d1d465 544 value <<= 8;
borlanic 0:02dd72d1d465 545 cnt += 8;
borlanic 0:02dd72d1d465 546 }
borlanic 0:02dd72d1d465 547 if ((value & 0xF0000000) == 0) {
borlanic 0:02dd72d1d465 548 value <<= 4;
borlanic 0:02dd72d1d465 549 cnt += 4;
borlanic 0:02dd72d1d465 550 }
borlanic 0:02dd72d1d465 551 if ((value & 0xC0000000) == 0) {
borlanic 0:02dd72d1d465 552 value <<= 2;
borlanic 0:02dd72d1d465 553 cnt += 2;
borlanic 0:02dd72d1d465 554 }
borlanic 0:02dd72d1d465 555 if ((value & 0x80000000) == 0) {
borlanic 0:02dd72d1d465 556 cnt += 1;
borlanic 0:02dd72d1d465 557 }
borlanic 0:02dd72d1d465 558
borlanic 0:02dd72d1d465 559 return cnt;
borlanic 0:02dd72d1d465 560 #endif
borlanic 0:02dd72d1d465 561 }
borlanic 0:02dd72d1d465 562
borlanic 0:02dd72d1d465 563 COMMON_FUNCTIONS_FN bool common_serial_number_greater_8(uint8_t s1, uint8_t s2)
borlanic 0:02dd72d1d465 564 {
borlanic 0:02dd72d1d465 565 return (s1 > s2 && s1 - s2 < UINT8_C(0x80)) || (s1 < s2 && s2 - s1 > UINT8_C(0x80));
borlanic 0:02dd72d1d465 566 }
borlanic 0:02dd72d1d465 567
borlanic 0:02dd72d1d465 568 COMMON_FUNCTIONS_FN bool common_serial_number_greater_16(uint16_t s1, uint16_t s2)
borlanic 0:02dd72d1d465 569 {
borlanic 0:02dd72d1d465 570 return (s1 > s2 && s1 - s2 < UINT16_C(0x8000)) || (s1 < s2 && s2 - s1 > UINT16_C(0x8000));
borlanic 0:02dd72d1d465 571 }
borlanic 0:02dd72d1d465 572
borlanic 0:02dd72d1d465 573 COMMON_FUNCTIONS_FN bool common_serial_number_greater_32(uint32_t s1, uint32_t s2)
borlanic 0:02dd72d1d465 574 {
borlanic 0:02dd72d1d465 575 return (s1 > s2 && s1 - s2 < UINT32_C(0x80000000)) || (s1 < s2 && s2 - s1 > UINT32_C(0x80000000));
borlanic 0:02dd72d1d465 576 }
borlanic 0:02dd72d1d465 577
borlanic 0:02dd72d1d465 578 COMMON_FUNCTIONS_FN bool bit_test(const uint8_t *bitset, uint_fast8_t bit)
borlanic 0:02dd72d1d465 579 {
borlanic 0:02dd72d1d465 580 return bitset[bit >> 3] & (0x80 >> (bit & 7));
borlanic 0:02dd72d1d465 581 }
borlanic 0:02dd72d1d465 582
borlanic 0:02dd72d1d465 583 COMMON_FUNCTIONS_FN void bit_set(uint8_t *bitset, uint_fast8_t bit)
borlanic 0:02dd72d1d465 584 {
borlanic 0:02dd72d1d465 585 bitset[bit >> 3] |= (0x80 >> (bit & 7));
borlanic 0:02dd72d1d465 586 }
borlanic 0:02dd72d1d465 587
borlanic 0:02dd72d1d465 588 COMMON_FUNCTIONS_FN void bit_clear(uint8_t *bitset, uint_fast8_t bit)
borlanic 0:02dd72d1d465 589 {
borlanic 0:02dd72d1d465 590 bitset[bit >> 3] &= ~(0x80 >> (bit & 7));
borlanic 0:02dd72d1d465 591 }
borlanic 0:02dd72d1d465 592
borlanic 0:02dd72d1d465 593 #endif /* defined NS_ALLOW_INLINING || defined COMMON_FUNCTIONS_FN */
borlanic 0:02dd72d1d465 594
borlanic 0:02dd72d1d465 595 #ifdef __cplusplus
borlanic 0:02dd72d1d465 596 }
borlanic 0:02dd72d1d465 597 #endif
borlanic 0:02dd72d1d465 598 #endif /*__COMMON_FUNCTIONS_H_*/