Zephyr API Documentation 4.0.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
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 <string.h>
17#include <zephyr/sys/__assert.h>
19#include <zephyr/toolchain.h>
20
21#define BSWAP_16(x) ((uint16_t) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
22#define BSWAP_24(x) ((uint32_t) ((((x) >> 16) & 0xff) | \
23 (((x)) & 0xff00) | \
24 (((x) & 0xff) << 16)))
25#define BSWAP_32(x) ((uint32_t) ((((x) >> 24) & 0xff) | \
26 (((x) >> 8) & 0xff00) | \
27 (((x) & 0xff00) << 8) | \
28 (((x) & 0xff) << 24)))
29#define BSWAP_40(x) ((uint64_t) ((((x) >> 32) & 0xff) | \
30 (((x) >> 16) & 0xff00) | \
31 (((x)) & 0xff0000) | \
32 (((x) & 0xff00) << 16) | \
33 (((x) & 0xff) << 32)))
34#define BSWAP_48(x) ((uint64_t) ((((x) >> 40) & 0xff) | \
35 (((x) >> 24) & 0xff00) | \
36 (((x) >> 8) & 0xff0000) | \
37 (((x) & 0xff0000) << 8) | \
38 (((x) & 0xff00) << 24) | \
39 (((x) & 0xff) << 40)))
40#define BSWAP_64(x) ((uint64_t) ((((x) >> 56) & 0xff) | \
41 (((x) >> 40) & 0xff00) | \
42 (((x) >> 24) & 0xff0000) | \
43 (((x) >> 8) & 0xff000000) | \
44 (((x) & 0xff000000) << 8) | \
45 (((x) & 0xff0000) << 24) | \
46 (((x) & 0xff00) << 40) | \
47 (((x) & 0xff) << 56)))
48
220#ifdef CONFIG_LITTLE_ENDIAN
221#define sys_le16_to_cpu(val) (val)
222#define sys_cpu_to_le16(val) (val)
223#define sys_le24_to_cpu(val) (val)
224#define sys_cpu_to_le24(val) (val)
225#define sys_le32_to_cpu(val) (val)
226#define sys_cpu_to_le32(val) (val)
227#define sys_le40_to_cpu(val) (val)
228#define sys_cpu_to_le40(val) (val)
229#define sys_le48_to_cpu(val) (val)
230#define sys_cpu_to_le48(val) (val)
231#define sys_le64_to_cpu(val) (val)
232#define sys_cpu_to_le64(val) (val)
233#define sys_be16_to_cpu(val) BSWAP_16(val)
234#define sys_cpu_to_be16(val) BSWAP_16(val)
235#define sys_be24_to_cpu(val) BSWAP_24(val)
236#define sys_cpu_to_be24(val) BSWAP_24(val)
237#define sys_be32_to_cpu(val) BSWAP_32(val)
238#define sys_cpu_to_be32(val) BSWAP_32(val)
239#define sys_be40_to_cpu(val) BSWAP_40(val)
240#define sys_cpu_to_be40(val) BSWAP_40(val)
241#define sys_be48_to_cpu(val) BSWAP_48(val)
242#define sys_cpu_to_be48(val) BSWAP_48(val)
243#define sys_be64_to_cpu(val) BSWAP_64(val)
244#define sys_cpu_to_be64(val) BSWAP_64(val)
245
246#define sys_uint16_to_array(val) { \
247 ((val) & 0xff), \
248 (((val) >> 8) & 0xff)}
249
250#define sys_uint32_to_array(val) { \
251 ((val) & 0xff), \
252 (((val) >> 8) & 0xff), \
253 (((val) >> 16) & 0xff), \
254 (((val) >> 24) & 0xff)}
255
256#define sys_uint64_to_array(val) { \
257 ((val) & 0xff), \
258 (((val) >> 8) & 0xff), \
259 (((val) >> 16) & 0xff), \
260 (((val) >> 24) & 0xff), \
261 (((val) >> 32) & 0xff), \
262 (((val) >> 40) & 0xff), \
263 (((val) >> 48) & 0xff), \
264 (((val) >> 56) & 0xff)}
265
266#else
267#define sys_le16_to_cpu(val) BSWAP_16(val)
268#define sys_cpu_to_le16(val) BSWAP_16(val)
269#define sys_le24_to_cpu(val) BSWAP_24(val)
270#define sys_cpu_to_le24(val) BSWAP_24(val)
271#define sys_le32_to_cpu(val) BSWAP_32(val)
272#define sys_cpu_to_le32(val) BSWAP_32(val)
273#define sys_le40_to_cpu(val) BSWAP_40(val)
274#define sys_cpu_to_le40(val) BSWAP_40(val)
275#define sys_le48_to_cpu(val) BSWAP_48(val)
276#define sys_cpu_to_le48(val) BSWAP_48(val)
277#define sys_le64_to_cpu(val) BSWAP_64(val)
278#define sys_cpu_to_le64(val) BSWAP_64(val)
279#define sys_be16_to_cpu(val) (val)
280#define sys_cpu_to_be16(val) (val)
281#define sys_be24_to_cpu(val) (val)
282#define sys_cpu_to_be24(val) (val)
283#define sys_be32_to_cpu(val) (val)
284#define sys_cpu_to_be32(val) (val)
285#define sys_be40_to_cpu(val) (val)
286#define sys_cpu_to_be40(val) (val)
287#define sys_be48_to_cpu(val) (val)
288#define sys_cpu_to_be48(val) (val)
289#define sys_be64_to_cpu(val) (val)
290#define sys_cpu_to_be64(val) (val)
291
292#define sys_uint16_to_array(val) { \
293 (((val) >> 8) & 0xff), \
294 ((val) & 0xff)}
295
296#define sys_uint32_to_array(val) { \
297 (((val) >> 24) & 0xff), \
298 (((val) >> 16) & 0xff), \
299 (((val) >> 8) & 0xff), \
300 ((val) & 0xff)}
301
302#define sys_uint64_to_array(val) { \
303 (((val) >> 56) & 0xff), \
304 (((val) >> 48) & 0xff), \
305 (((val) >> 40) & 0xff), \
306 (((val) >> 32) & 0xff), \
307 (((val) >> 24) & 0xff), \
308 (((val) >> 16) & 0xff), \
309 (((val) >> 8) & 0xff), \
310 ((val) & 0xff)}
311
312#endif
313
323static inline void sys_put_be16(uint16_t val, uint8_t dst[2])
324{
325 dst[0] = val >> 8;
326 dst[1] = val;
327}
328
338static inline void sys_put_be24(uint32_t val, uint8_t dst[3])
339{
340 dst[0] = val >> 16;
341 sys_put_be16(val, &dst[1]);
342}
343
353static inline void sys_put_be32(uint32_t val, uint8_t dst[4])
354{
355 sys_put_be16(val >> 16, dst);
356 sys_put_be16(val, &dst[2]);
357}
367static inline void sys_put_be40(uint64_t val, uint8_t dst[5])
368{
369 dst[0] = val >> 32;
370 sys_put_be32(val, &dst[1]);
371}
372
382static inline void sys_put_be48(uint64_t val, uint8_t dst[6])
383{
384 sys_put_be16(val >> 32, dst);
385 sys_put_be32(val, &dst[2]);
386}
387
397static inline void sys_put_be64(uint64_t val, uint8_t dst[8])
398{
399 sys_put_be32(val >> 32, dst);
400 sys_put_be32(val, &dst[4]);
401}
402
412static inline void sys_put_le16(uint16_t val, uint8_t dst[2])
413{
414 dst[0] = val;
415 dst[1] = val >> 8;
416}
417
427static inline void sys_put_le24(uint32_t val, uint8_t dst[3])
428{
429 sys_put_le16(val, dst);
430 dst[2] = val >> 16;
431}
432
442static inline void sys_put_le32(uint32_t val, uint8_t dst[4])
443{
444 sys_put_le16(val, dst);
445 sys_put_le16(val >> 16, &dst[2]);
446}
447
457static inline void sys_put_le40(uint64_t val, uint8_t dst[5])
458{
459 sys_put_le32(val, dst);
460 dst[4] = val >> 32;
461}
462
472static inline void sys_put_le48(uint64_t val, uint8_t dst[6])
473{
474 sys_put_le32(val, dst);
475 sys_put_le16(val >> 32, &dst[4]);
476}
477
487static inline void sys_put_le64(uint64_t val, uint8_t dst[8])
488{
489 sys_put_le32(val, dst);
490 sys_put_le32(val >> 32, &dst[4]);
491}
492
503static inline uint16_t sys_get_be16(const uint8_t src[2])
504{
505 return ((uint16_t)src[0] << 8) | src[1];
506}
507
518static inline uint32_t sys_get_be24(const uint8_t src[3])
519{
520 return ((uint32_t)src[0] << 16) | sys_get_be16(&src[1]);
521}
522
533static inline uint32_t sys_get_be32(const uint8_t src[4])
534{
535 return ((uint32_t)sys_get_be16(&src[0]) << 16) | sys_get_be16(&src[2]);
536}
537
548static inline uint64_t sys_get_be40(const uint8_t src[5])
549{
550 return ((uint64_t)sys_get_be32(&src[0]) << 8) | src[4];
551}
552
563static inline uint64_t sys_get_be48(const uint8_t src[6])
564{
565 return ((uint64_t)sys_get_be32(&src[0]) << 16) | sys_get_be16(&src[4]);
566}
567
578static inline uint64_t sys_get_be64(const uint8_t src[8])
579{
580 return ((uint64_t)sys_get_be32(&src[0]) << 32) | sys_get_be32(&src[4]);
581}
582
593static inline uint16_t sys_get_le16(const uint8_t src[2])
594{
595 return ((uint16_t)src[1] << 8) | src[0];
596}
597
608static inline uint32_t sys_get_le24(const uint8_t src[3])
609{
610 return ((uint32_t)src[2] << 16) | sys_get_le16(&src[0]);
611}
612
623static inline uint32_t sys_get_le32(const uint8_t src[4])
624{
625 return ((uint32_t)sys_get_le16(&src[2]) << 16) | sys_get_le16(&src[0]);
626}
627
638static inline uint64_t sys_get_le40(const uint8_t src[5])
639{
640 return ((uint64_t)sys_get_le32(&src[1]) << 8) | src[0];
641}
642
653static inline uint64_t sys_get_le48(const uint8_t src[6])
654{
655 return ((uint64_t)sys_get_le32(&src[2]) << 16) | sys_get_le16(&src[0]);
656}
657
668static inline uint64_t sys_get_le64(const uint8_t src[8])
669{
670 return ((uint64_t)sys_get_le32(&src[4]) << 32) | sys_get_le32(&src[0]);
671}
672
686static inline void sys_memcpy_swap(void *dst, const void *src, size_t length)
687{
688 uint8_t *pdst = (uint8_t *)dst;
689 const uint8_t *psrc = (const uint8_t *)src;
690
691 __ASSERT(((psrc < pdst && (psrc + length) <= pdst) ||
692 (psrc > pdst && (pdst + length) <= psrc)),
693 "Source and destination buffers must not overlap");
694
695 psrc += length - 1;
696
697 for (; length > 0; length--) {
698 *pdst++ = *psrc--;
699 }
700}
701
712static inline void sys_mem_swap(void *buf, size_t length)
713{
714 size_t i;
715
716 for (i = 0; i < (length/2); i++) {
717 uint8_t tmp = ((uint8_t *)buf)[i];
718
719 ((uint8_t *)buf)[i] = ((uint8_t *)buf)[length - 1 - i];
720 ((uint8_t *)buf)[length - 1 - i] = tmp;
721 }
722}
723
730static inline void sys_le_to_cpu(void *buf, size_t length)
731{
732 if (IS_ENABLED(CONFIG_BIG_ENDIAN)) {
733 sys_mem_swap(buf, length);
734 }
735}
736
743static inline void sys_cpu_to_le(void *buf, size_t length)
744{
745 if (IS_ENABLED(CONFIG_BIG_ENDIAN)) {
746 sys_mem_swap(buf, length);
747 }
748}
749
756static inline void sys_be_to_cpu(void *buf, size_t length)
757{
758 if (IS_ENABLED(CONFIG_LITTLE_ENDIAN)) {
759 sys_mem_swap(buf, length);
760 }
761}
762
769static inline void sys_cpu_to_be(void *buf, size_t length)
770{
771 if (IS_ENABLED(CONFIG_LITTLE_ENDIAN)) {
772 sys_mem_swap(buf, length);
773 }
774}
775
786static inline void sys_put_le(void *dst, const void *src, size_t length)
787{
788 if (IS_ENABLED(CONFIG_LITTLE_ENDIAN)) {
789 (void)memcpy(dst, src, length);
790 } else {
791 sys_memcpy_swap(dst, src, length);
792 }
793}
794
805static inline void sys_put_be(void *dst, const void *src, size_t length)
806{
807 if (IS_ENABLED(CONFIG_LITTLE_ENDIAN)) {
808 sys_memcpy_swap(dst, src, length);
809 } else {
810 (void)memcpy(dst, src, length);
811 }
812}
813
824static inline void sys_get_le(void *dst, const void *src, size_t length)
825{
826 if (IS_ENABLED(CONFIG_LITTLE_ENDIAN)) {
827 (void)memcpy(dst, src, length);
828 } else {
829 sys_memcpy_swap(dst, src, length);
830 }
831}
832
843static inline void sys_get_be(void *dst, const void *src, size_t length)
844{
845 if (IS_ENABLED(CONFIG_LITTLE_ENDIAN)) {
846 sys_memcpy_swap(dst, src, length);
847 } else {
848 (void)memcpy(dst, src, length);
849 }
850}
851
852#endif /* ZEPHYR_INCLUDE_SYS_BYTEORDER_H_ */
#define IS_ENABLED(config_macro)
Check for macro definition in compiler-visible expressions.
Definition util_macro.h:148
__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
void * memcpy(void *ZRESTRICT d, const void *ZRESTRICT s, size_t n)
static void sys_memcpy_swap(void *dst, const void *src, size_t length)
Swap one buffer content into another.
Definition byteorder.h:686
static void sys_get_be(void *dst, const void *src, size_t length)
Get a buffer stored in big-endian format.
Definition byteorder.h:843
static uint64_t sys_get_le40(const uint8_t src[5])
Get a 40-bit integer stored in little-endian format.
Definition byteorder.h:638
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:427
static void sys_cpu_to_le(void *buf, size_t length)
Convert buffer from host endianness to little-endian.
Definition byteorder.h:743
static void sys_le_to_cpu(void *buf, size_t length)
Convert buffer from little-endian to host endianness.
Definition byteorder.h:730
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:353
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:397
static void sys_cpu_to_be(void *buf, size_t length)
Convert buffer from host endianness to big-endian.
Definition byteorder.h:769
static uint32_t sys_get_be32(const uint8_t src[4])
Get a 32-bit integer stored in big-endian format.
Definition byteorder.h:533
static void sys_be_to_cpu(void *buf, size_t length)
Convert buffer from big-endian to host endianness.
Definition byteorder.h:756
static uint16_t sys_get_le16(const uint8_t src[2])
Get a 16-bit integer stored in little-endian format.
Definition byteorder.h:593
static uint64_t sys_get_le48(const uint8_t src[6])
Get a 48-bit integer stored in little-endian format.
Definition byteorder.h:653
static uint64_t sys_get_le64(const uint8_t src[8])
Get a 64-bit integer stored in little-endian format.
Definition byteorder.h:668
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:323
static void sys_put_le(void *dst, const void *src, size_t length)
Put a buffer as little-endian to arbitrary location.
Definition byteorder.h:786
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:338
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:487
static uint64_t sys_get_be40(const uint8_t src[5])
Get a 40-bit integer stored in big-endian format.
Definition byteorder.h:548
static uint16_t sys_get_be16(const uint8_t src[2])
Get a 16-bit integer stored in big-endian format.
Definition byteorder.h:503
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:472
static uint32_t sys_get_le32(const uint8_t src[4])
Get a 32-bit integer stored in little-endian format.
Definition byteorder.h:623
static uint32_t sys_get_le24(const uint8_t src[3])
Get a 24-bit integer stored in little-endian format.
Definition byteorder.h:608
static void sys_put_le40(uint64_t val, uint8_t dst[5])
Put a 40-bit integer as little-endian to arbitrary location.
Definition byteorder.h:457
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:382
static uint32_t sys_get_be24(const uint8_t src[3])
Get a 24-bit integer stored in big-endian format.
Definition byteorder.h:518
static uint64_t sys_get_be48(const uint8_t src[6])
Get a 48-bit integer stored in big-endian format.
Definition byteorder.h:563
static uint64_t sys_get_be64(const uint8_t src[8])
Get a 64-bit integer stored in big-endian format.
Definition byteorder.h:578
static void sys_put_be40(uint64_t val, uint8_t dst[5])
Put a 40-bit integer as big-endian to arbitrary location.
Definition byteorder.h:367
static void sys_mem_swap(void *buf, size_t length)
Swap buffer content.
Definition byteorder.h:712
static void sys_get_le(void *dst, const void *src, size_t length)
Get a buffer stored in little-endian format.
Definition byteorder.h:824
static void sys_put_be(void *dst, const void *src, size_t length)
Put a buffer as big-endian to arbitrary location.
Definition byteorder.h:805
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:412
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:442
Macros to abstract toolchain specific capabilities.
Macro utilities.