Zephyr API Documentation  3.5.0
A Scalable Open Source RTOS
3.5.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
byteorder.h
Go to the documentation of this file.
1
5/*
6 * Copyright (c) 2015-2016, Intel Corporation.
7 *
8 * SPDX-License-Identifier: Apache-2.0
9 */
10
11#ifndef ZEPHYR_INCLUDE_SYS_BYTEORDER_H_
12#define ZEPHYR_INCLUDE_SYS_BYTEORDER_H_
13
14#include <zephyr/types.h>
15#include <stddef.h>
16#include <zephyr/sys/__assert.h>
17#include <zephyr/toolchain.h>
18
19/* Internal helpers only used by the sys_* APIs further below */
20#define __bswap_16(x) ((uint16_t) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
21#define __bswap_24(x) ((uint32_t) ((((x) >> 16) & 0xff) | \
22 (((x)) & 0xff00) | \
23 (((x) & 0xff) << 16)))
24#define __bswap_32(x) ((uint32_t) ((((x) >> 24) & 0xff) | \
25 (((x) >> 8) & 0xff00) | \
26 (((x) & 0xff00) << 8) | \
27 (((x) & 0xff) << 24)))
28#define __bswap_48(x) ((uint64_t) ((((x) >> 40) & 0xff) | \
29 (((x) >> 24) & 0xff00) | \
30 (((x) >> 8) & 0xff0000) | \
31 (((x) & 0xff0000) << 8) | \
32 (((x) & 0xff00) << 24) | \
33 (((x) & 0xff) << 40)))
34#define __bswap_64(x) ((uint64_t) ((((x) >> 56) & 0xff) | \
35 (((x) >> 40) & 0xff00) | \
36 (((x) >> 24) & 0xff0000) | \
37 (((x) >> 8) & 0xff000000) | \
38 (((x) & 0xff000000) << 8) | \
39 (((x) & 0xff0000) << 24) | \
40 (((x) & 0xff00) << 40) | \
41 (((x) & 0xff) << 56)))
42
214#ifdef CONFIG_LITTLE_ENDIAN
215#define sys_le16_to_cpu(val) (val)
216#define sys_cpu_to_le16(val) (val)
217#define sys_le24_to_cpu(val) (val)
218#define sys_cpu_to_le24(val) (val)
219#define sys_le32_to_cpu(val) (val)
220#define sys_cpu_to_le32(val) (val)
221#define sys_le48_to_cpu(val) (val)
222#define sys_cpu_to_le48(val) (val)
223#define sys_le64_to_cpu(val) (val)
224#define sys_cpu_to_le64(val) (val)
225#define sys_be16_to_cpu(val) __bswap_16(val)
226#define sys_cpu_to_be16(val) __bswap_16(val)
227#define sys_be24_to_cpu(val) __bswap_24(val)
228#define sys_cpu_to_be24(val) __bswap_24(val)
229#define sys_be32_to_cpu(val) __bswap_32(val)
230#define sys_cpu_to_be32(val) __bswap_32(val)
231#define sys_be48_to_cpu(val) __bswap_48(val)
232#define sys_cpu_to_be48(val) __bswap_48(val)
233#define sys_be64_to_cpu(val) __bswap_64(val)
234#define sys_cpu_to_be64(val) __bswap_64(val)
235
236#define sys_uint16_to_array(val) { \
237 ((val) & 0xff), \
238 (((val) >> 8) & 0xff)}
239
240#define sys_uint32_to_array(val) { \
241 ((val) & 0xff), \
242 (((val) >> 8) & 0xff), \
243 (((val) >> 16) & 0xff), \
244 (((val) >> 24) & 0xff)}
245
246#define sys_uint64_to_array(val) { \
247 ((val) & 0xff), \
248 (((val) >> 8) & 0xff), \
249 (((val) >> 16) & 0xff), \
250 (((val) >> 24) & 0xff), \
251 (((val) >> 32) & 0xff), \
252 (((val) >> 40) & 0xff), \
253 (((val) >> 48) & 0xff), \
254 (((val) >> 56) & 0xff)}
255
256#else
257#define sys_le16_to_cpu(val) __bswap_16(val)
258#define sys_cpu_to_le16(val) __bswap_16(val)
259#define sys_le24_to_cpu(val) __bswap_24(val)
260#define sys_cpu_to_le24(val) __bswap_24(val)
261#define sys_le32_to_cpu(val) __bswap_32(val)
262#define sys_cpu_to_le32(val) __bswap_32(val)
263#define sys_le48_to_cpu(val) __bswap_48(val)
264#define sys_cpu_to_le48(val) __bswap_48(val)
265#define sys_le64_to_cpu(val) __bswap_64(val)
266#define sys_cpu_to_le64(val) __bswap_64(val)
267#define sys_be16_to_cpu(val) (val)
268#define sys_cpu_to_be16(val) (val)
269#define sys_be24_to_cpu(val) (val)
270#define sys_cpu_to_be24(val) (val)
271#define sys_be32_to_cpu(val) (val)
272#define sys_cpu_to_be32(val) (val)
273#define sys_be48_to_cpu(val) (val)
274#define sys_cpu_to_be48(val) (val)
275#define sys_be64_to_cpu(val) (val)
276#define sys_cpu_to_be64(val) (val)
277
278#define sys_uint16_to_array(val) { \
279 (((val) >> 8) & 0xff), \
280 ((val) & 0xff)}
281
282#define sys_uint32_to_array(val) { \
283 (((val) >> 24) & 0xff), \
284 (((val) >> 16) & 0xff), \
285 (((val) >> 8) & 0xff), \
286 ((val) & 0xff)}
287
288#define sys_uint64_to_array(val) { \
289 (((val) >> 56) & 0xff), \
290 (((val) >> 48) & 0xff), \
291 (((val) >> 40) & 0xff), \
292 (((val) >> 32) & 0xff), \
293 (((val) >> 24) & 0xff), \
294 (((val) >> 16) & 0xff), \
295 (((val) >> 8) & 0xff), \
296 ((val) & 0xff)}
297
298#endif
299
309static inline void sys_put_be16(uint16_t val, uint8_t dst[2])
310{
311 dst[0] = val >> 8;
312 dst[1] = val;
313}
314
324static inline void sys_put_be24(uint32_t val, uint8_t dst[3])
325{
326 dst[0] = val >> 16;
327 sys_put_be16(val, &dst[1]);
328}
329
339static inline void sys_put_be32(uint32_t val, uint8_t dst[4])
340{
341 sys_put_be16(val >> 16, dst);
342 sys_put_be16(val, &dst[2]);
343}
344
354static inline void sys_put_be48(uint64_t val, uint8_t dst[6])
355{
356 sys_put_be16(val >> 32, dst);
357 sys_put_be32(val, &dst[2]);
358}
359
369static inline void sys_put_be64(uint64_t val, uint8_t dst[8])
370{
371 sys_put_be32(val >> 32, dst);
372 sys_put_be32(val, &dst[4]);
373}
374
384static inline void sys_put_le16(uint16_t val, uint8_t dst[2])
385{
386 dst[0] = val;
387 dst[1] = val >> 8;
388}
389
399static inline void sys_put_le24(uint32_t val, uint8_t dst[3])
400{
401 sys_put_le16(val, dst);
402 dst[2] = val >> 16;
403}
404
414static inline void sys_put_le32(uint32_t val, uint8_t dst[4])
415{
416 sys_put_le16(val, dst);
417 sys_put_le16(val >> 16, &dst[2]);
418}
419
429static inline void sys_put_le48(uint64_t val, uint8_t dst[6])
430{
431 sys_put_le32(val, dst);
432 sys_put_le16(val >> 32, &dst[4]);
433}
434
444static inline void sys_put_le64(uint64_t val, uint8_t dst[8])
445{
446 sys_put_le32(val, dst);
447 sys_put_le32(val >> 32, &dst[4]);
448}
449
460static inline uint16_t sys_get_be16(const uint8_t src[2])
461{
462 return ((uint16_t)src[0] << 8) | src[1];
463}
464
475static inline uint32_t sys_get_be24(const uint8_t src[3])
476{
477 return ((uint32_t)src[0] << 16) | sys_get_be16(&src[1]);
478}
479
490static inline uint32_t sys_get_be32(const uint8_t src[4])
491{
492 return ((uint32_t)sys_get_be16(&src[0]) << 16) | sys_get_be16(&src[2]);
493}
494
505static inline uint64_t sys_get_be48(const uint8_t src[6])
506{
507 return ((uint64_t)sys_get_be32(&src[0]) << 16) | sys_get_be16(&src[4]);
508}
509
520static inline uint64_t sys_get_be64(const uint8_t src[8])
521{
522 return ((uint64_t)sys_get_be32(&src[0]) << 32) | sys_get_be32(&src[4]);
523}
524
535static inline uint16_t sys_get_le16(const uint8_t src[2])
536{
537 return ((uint16_t)src[1] << 8) | src[0];
538}
539
550static inline uint32_t sys_get_le24(const uint8_t src[3])
551{
552 return ((uint32_t)src[2] << 16) | sys_get_le16(&src[0]);
553}
554
565static inline uint32_t sys_get_le32(const uint8_t src[4])
566{
567 return ((uint32_t)sys_get_le16(&src[2]) << 16) | sys_get_le16(&src[0]);
568}
569
580static inline uint64_t sys_get_le48(const uint8_t src[6])
581{
582 return ((uint64_t)sys_get_le32(&src[2]) << 16) | sys_get_le16(&src[0]);
583}
584
595static inline uint64_t sys_get_le64(const uint8_t src[8])
596{
597 return ((uint64_t)sys_get_le32(&src[4]) << 32) | sys_get_le32(&src[0]);
598}
599
613static inline void sys_memcpy_swap(void *dst, const void *src, size_t length)
614{
615 uint8_t *pdst = (uint8_t *)dst;
616 const uint8_t *psrc = (const uint8_t *)src;
617
618 __ASSERT(((psrc < pdst && (psrc + length) <= pdst) ||
619 (psrc > pdst && (pdst + length) <= psrc)),
620 "Source and destination buffers must not overlap");
621
622 psrc += length - 1;
623
624 for (; length > 0; length--) {
625 *pdst++ = *psrc--;
626 }
627}
628
639static inline void sys_mem_swap(void *buf, size_t length)
640{
641 size_t i;
642
643 for (i = 0; i < (length/2); i++) {
644 uint8_t tmp = ((uint8_t *)buf)[i];
645
646 ((uint8_t *)buf)[i] = ((uint8_t *)buf)[length - 1 - i];
647 ((uint8_t *)buf)[length - 1 - i] = tmp;
648 }
649}
650
651#endif /* ZEPHYR_INCLUDE_SYS_BYTEORDER_H_ */
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__UINT64_TYPE__ uint64_t
Definition: stdint.h:91
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
static void sys_memcpy_swap(void *dst, const void *src, size_t length)
Swap one buffer content into another.
Definition: byteorder.h:613
static void sys_put_le24(uint32_t val, uint8_t dst[3])
Put a 24-bit integer as little-endian to arbitrary location.
Definition: byteorder.h:399
static void sys_put_be32(uint32_t val, uint8_t dst[4])
Put a 32-bit integer as big-endian to arbitrary location.
Definition: byteorder.h:339
static void sys_put_be64(uint64_t val, uint8_t dst[8])
Put a 64-bit integer as big-endian to arbitrary location.
Definition: byteorder.h:369
static uint32_t sys_get_be32(const uint8_t src[4])
Get a 32-bit integer stored in big-endian format.
Definition: byteorder.h:490
static uint16_t sys_get_le16(const uint8_t src[2])
Get a 16-bit integer stored in little-endian format.
Definition: byteorder.h:535
static uint64_t sys_get_le48(const uint8_t src[6])
Get a 48-bit integer stored in little-endian format.
Definition: byteorder.h:580
static uint64_t sys_get_le64(const uint8_t src[8])
Get a 64-bit integer stored in little-endian format.
Definition: byteorder.h:595
static void sys_put_be16(uint16_t val, uint8_t dst[2])
Put a 16-bit integer as big-endian to arbitrary location.
Definition: byteorder.h:309
static void sys_put_be24(uint32_t val, uint8_t dst[3])
Put a 24-bit integer as big-endian to arbitrary location.
Definition: byteorder.h:324
static void sys_put_le64(uint64_t val, uint8_t dst[8])
Put a 64-bit integer as little-endian to arbitrary location.
Definition: byteorder.h:444
static uint16_t sys_get_be16(const uint8_t src[2])
Get a 16-bit integer stored in big-endian format.
Definition: byteorder.h:460
static void sys_put_le48(uint64_t val, uint8_t dst[6])
Put a 48-bit integer as little-endian to arbitrary location.
Definition: byteorder.h:429
static uint32_t sys_get_le32(const uint8_t src[4])
Get a 32-bit integer stored in little-endian format.
Definition: byteorder.h:565
static uint32_t sys_get_le24(const uint8_t src[3])
Get a 24-bit integer stored in little-endian format.
Definition: byteorder.h:550
static void sys_put_be48(uint64_t val, uint8_t dst[6])
Put a 48-bit integer as big-endian to arbitrary location.
Definition: byteorder.h:354
static uint32_t sys_get_be24(const uint8_t src[3])
Get a 24-bit integer stored in big-endian format.
Definition: byteorder.h:475
static uint64_t sys_get_be48(const uint8_t src[6])
Get a 48-bit integer stored in big-endian format.
Definition: byteorder.h:505
static uint64_t sys_get_be64(const uint8_t src[8])
Get a 64-bit integer stored in big-endian format.
Definition: byteorder.h:520
static void sys_mem_swap(void *buf, size_t length)
Swap buffer content.
Definition: byteorder.h:639
static void sys_put_le16(uint16_t val, uint8_t dst[2])
Put a 16-bit integer as little-endian to arbitrary location.
Definition: byteorder.h:384
static void sys_put_le32(uint32_t val, uint8_t dst[4])
Put a 32-bit integer as little-endian to arbitrary location.
Definition: byteorder.h:414
Macros to abstract toolchain specific capabilities.