Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 17 23:23:45 2019 +0000
Revision:
0:5b88d5760320
mbed-os5 only for TYBLE16

Who changed what in which revision?

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