Zephyr API Documentation  3.7.0
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 <zephyr/sys/__assert.h>
17#include <zephyr/toolchain.h>
18
19#define BSWAP_16(x) ((uint16_t) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
20#define BSWAP_24(x) ((uint32_t) ((((x) >> 16) & 0xff) | \
21 (((x)) & 0xff00) | \
22 (((x) & 0xff) << 16)))
23#define BSWAP_32(x) ((uint32_t) ((((x) >> 24) & 0xff) | \
24 (((x) >> 8) & 0xff00) | \
25 (((x) & 0xff00) << 8) | \
26 (((x) & 0xff) << 24)))
27#define BSWAP_40(x) ((uint64_t) ((((x) >> 32) & 0xff) | \
28 (((x) >> 16) & 0xff00) | \
29 (((x)) & 0xff0000) | \
30 (((x) & 0xff00) << 16) | \
31 (((x) & 0xff) << 32)))
32#define BSWAP_48(x) ((uint64_t) ((((x) >> 40) & 0xff) | \
33 (((x) >> 24) & 0xff00) | \
34 (((x) >> 8) & 0xff0000) | \
35 (((x) & 0xff0000) << 8) | \
36 (((x) & 0xff00) << 24) | \
37 (((x) & 0xff) << 40)))
38#define BSWAP_64(x) ((uint64_t) ((((x) >> 56) & 0xff) | \
39 (((x) >> 40) & 0xff00) | \
40 (((x) >> 24) & 0xff0000) | \
41 (((x) >> 8) & 0xff000000) | \
42 (((x) & 0xff000000) << 8) | \
43 (((x) & 0xff0000) << 24) | \
44 (((x) & 0xff00) << 40) | \
45 (((x) & 0xff) << 56)))
46
218#ifdef CONFIG_LITTLE_ENDIAN
219#define sys_le16_to_cpu(val) (val)
220#define sys_cpu_to_le16(val) (val)
221#define sys_le24_to_cpu(val) (val)
222#define sys_cpu_to_le24(val) (val)
223#define sys_le32_to_cpu(val) (val)
224#define sys_cpu_to_le32(val) (val)
225#define sys_le40_to_cpu(val) (val)
226#define sys_cpu_to_le40(val) (val)
227#define sys_le48_to_cpu(val) (val)
228#define sys_cpu_to_le48(val) (val)
229#define sys_le64_to_cpu(val) (val)
230#define sys_cpu_to_le64(val) (val)
231#define sys_be16_to_cpu(val) BSWAP_16(val)
232#define sys_cpu_to_be16(val) BSWAP_16(val)
233#define sys_be24_to_cpu(val) BSWAP_24(val)
234#define sys_cpu_to_be24(val) BSWAP_24(val)
235#define sys_be32_to_cpu(val) BSWAP_32(val)
236#define sys_cpu_to_be32(val) BSWAP_32(val)
237#define sys_be40_to_cpu(val) BSWAP_40(val)
238#define sys_cpu_to_be40(val) BSWAP_40(val)
239#define sys_be48_to_cpu(val) BSWAP_48(val)
240#define sys_cpu_to_be48(val) BSWAP_48(val)
241#define sys_be64_to_cpu(val) BSWAP_64(val)
242#define sys_cpu_to_be64(val) BSWAP_64(val)
243
244#define sys_uint16_to_array(val) { \
245 ((val) & 0xff), \
246 (((val) >> 8) & 0xff)}
247
248#define sys_uint32_to_array(val) { \
249 ((val) & 0xff), \
250 (((val) >> 8) & 0xff), \
251 (((val) >> 16) & 0xff), \
252 (((val) >> 24) & 0xff)}
253
254#define sys_uint64_to_array(val) { \
255 ((val) & 0xff), \
256 (((val) >> 8) & 0xff), \
257 (((val) >> 16) & 0xff), \
258 (((val) >> 24) & 0xff), \
259 (((val) >> 32) & 0xff), \
260 (((val) >> 40) & 0xff), \
261 (((val) >> 48) & 0xff), \
262 (((val) >> 56) & 0xff)}
263
264#else
265#define sys_le16_to_cpu(val) BSWAP_16(val)
266#define sys_cpu_to_le16(val) BSWAP_16(val)
267#define sys_le24_to_cpu(val) BSWAP_24(val)
268#define sys_cpu_to_le24(val) BSWAP_24(val)
269#define sys_le32_to_cpu(val) BSWAP_32(val)
270#define sys_cpu_to_le32(val) BSWAP_32(val)
271#define sys_le40_to_cpu(val) BSWAP_40(val)
272#define sys_cpu_to_le40(val) BSWAP_40(val)
273#define sys_le48_to_cpu(val) BSWAP_48(val)
274#define sys_cpu_to_le48(val) BSWAP_48(val)
275#define sys_le64_to_cpu(val) BSWAP_64(val)
276#define sys_cpu_to_le64(val) BSWAP_64(val)
277#define sys_be16_to_cpu(val) (val)
278#define sys_cpu_to_be16(val) (val)
279#define sys_be24_to_cpu(val) (val)
280#define sys_cpu_to_be24(val) (val)
281#define sys_be32_to_cpu(val) (val)
282#define sys_cpu_to_be32(val) (val)
283#define sys_be40_to_cpu(val) (val)
284#define sys_cpu_to_be40(val) (val)
285#define sys_be48_to_cpu(val) (val)
286#define sys_cpu_to_be48(val) (val)
287#define sys_be64_to_cpu(val) (val)
288#define sys_cpu_to_be64(val) (val)
289
290#define sys_uint16_to_array(val) { \
291 (((val) >> 8) & 0xff), \
292 ((val) & 0xff)}
293
294#define sys_uint32_to_array(val) { \
295 (((val) >> 24) & 0xff), \
296 (((val) >> 16) & 0xff), \
297 (((val) >> 8) & 0xff), \
298 ((val) & 0xff)}
299
300#define sys_uint64_to_array(val) { \
301 (((val) >> 56) & 0xff), \
302 (((val) >> 48) & 0xff), \
303 (((val) >> 40) & 0xff), \
304 (((val) >> 32) & 0xff), \
305 (((val) >> 24) & 0xff), \
306 (((val) >> 16) & 0xff), \
307 (((val) >> 8) & 0xff), \
308 ((val) & 0xff)}
309
310#endif
311
321static inline void sys_put_be16(uint16_t val, uint8_t dst[2])
322{
323 dst[0] = val >> 8;
324 dst[1] = val;
325}
326
336static inline void sys_put_be24(uint32_t val, uint8_t dst[3])
337{
338 dst[0] = val >> 16;
339 sys_put_be16(val, &dst[1]);
340}
341
351static inline void sys_put_be32(uint32_t val, uint8_t dst[4])
352{
353 sys_put_be16(val >> 16, dst);
354 sys_put_be16(val, &dst[2]);
355}
365static inline void sys_put_be40(uint64_t val, uint8_t dst[5])
366{
367 dst[0] = val >> 32;
368 sys_put_be32(val, &dst[1]);
369}
370
380static inline void sys_put_be48(uint64_t val, uint8_t dst[6])
381{
382 sys_put_be16(val >> 32, dst);
383 sys_put_be32(val, &dst[2]);
384}
385
395static inline void sys_put_be64(uint64_t val, uint8_t dst[8])
396{
397 sys_put_be32(val >> 32, dst);
398 sys_put_be32(val, &dst[4]);
399}
400
410static inline void sys_put_le16(uint16_t val, uint8_t dst[2])
411{
412 dst[0] = val;
413 dst[1] = val >> 8;
414}
415
425static inline void sys_put_le24(uint32_t val, uint8_t dst[3])
426{
427 sys_put_le16(val, dst);
428 dst[2] = val >> 16;
429}
430
440static inline void sys_put_le32(uint32_t val, uint8_t dst[4])
441{
442 sys_put_le16(val, dst);
443 sys_put_le16(val >> 16, &dst[2]);
444}
445
455static inline void sys_put_le40(uint64_t val, uint8_t dst[5])
456{
457 sys_put_le32(val, dst);
458 dst[4] = val >> 32;
459}
460
470static inline void sys_put_le48(uint64_t val, uint8_t dst[6])
471{
472 sys_put_le32(val, dst);
473 sys_put_le16(val >> 32, &dst[4]);
474}
475
485static inline void sys_put_le64(uint64_t val, uint8_t dst[8])
486{
487 sys_put_le32(val, dst);
488 sys_put_le32(val >> 32, &dst[4]);
489}
490
501static inline uint16_t sys_get_be16(const uint8_t src[2])
502{
503 return ((uint16_t)src[0] << 8) | src[1];
504}
505
516static inline uint32_t sys_get_be24(const uint8_t src[3])
517{
518 return ((uint32_t)src[0] << 16) | sys_get_be16(&src[1]);
519}
520
531static inline uint32_t sys_get_be32(const uint8_t src[4])
532{
533 return ((uint32_t)sys_get_be16(&src[0]) << 16) | sys_get_be16(&src[2]);
534}
535
546static inline uint64_t sys_get_be40(const uint8_t src[5])
547{
548 return ((uint64_t)sys_get_be32(&src[0]) << 8) | src[4];
549}
550
561static inline uint64_t sys_get_be48(const uint8_t src[6])
562{
563 return ((uint64_t)sys_get_be32(&src[0]) << 16) | sys_get_be16(&src[4]);
564}
565
576static inline uint64_t sys_get_be64(const uint8_t src[8])
577{
578 return ((uint64_t)sys_get_be32(&src[0]) << 32) | sys_get_be32(&src[4]);
579}
580
591static inline uint16_t sys_get_le16(const uint8_t src[2])
592{
593 return ((uint16_t)src[1] << 8) | src[0];
594}
595
606static inline uint32_t sys_get_le24(const uint8_t src[3])
607{
608 return ((uint32_t)src[2] << 16) | sys_get_le16(&src[0]);
609}
610
621static inline uint32_t sys_get_le32(const uint8_t src[4])
622{
623 return ((uint32_t)sys_get_le16(&src[2]) << 16) | sys_get_le16(&src[0]);
624}
625
636static inline uint64_t sys_get_le40(const uint8_t src[5])
637{
638 return ((uint64_t)sys_get_le32(&src[1]) << 8) | src[0];
639}
640
651static inline uint64_t sys_get_le48(const uint8_t src[6])
652{
653 return ((uint64_t)sys_get_le32(&src[2]) << 16) | sys_get_le16(&src[0]);
654}
655
666static inline uint64_t sys_get_le64(const uint8_t src[8])
667{
668 return ((uint64_t)sys_get_le32(&src[4]) << 32) | sys_get_le32(&src[0]);
669}
670
684static inline void sys_memcpy_swap(void *dst, const void *src, size_t length)
685{
686 uint8_t *pdst = (uint8_t *)dst;
687 const uint8_t *psrc = (const uint8_t *)src;
688
689 __ASSERT(((psrc < pdst && (psrc + length) <= pdst) ||
690 (psrc > pdst && (pdst + length) <= psrc)),
691 "Source and destination buffers must not overlap");
692
693 psrc += length - 1;
694
695 for (; length > 0; length--) {
696 *pdst++ = *psrc--;
697 }
698}
699
710static inline void sys_mem_swap(void *buf, size_t length)
711{
712 size_t i;
713
714 for (i = 0; i < (length/2); i++) {
715 uint8_t tmp = ((uint8_t *)buf)[i];
716
717 ((uint8_t *)buf)[i] = ((uint8_t *)buf)[length - 1 - i];
718 ((uint8_t *)buf)[length - 1 - i] = tmp;
719 }
720}
721
722#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:684
static uint64_t sys_get_le40(const uint8_t src[5])
Get a 40-bit integer stored in little-endian format.
Definition: byteorder.h:636
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:425
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:351
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:395
static uint32_t sys_get_be32(const uint8_t src[4])
Get a 32-bit integer stored in big-endian format.
Definition: byteorder.h:531
static uint16_t sys_get_le16(const uint8_t src[2])
Get a 16-bit integer stored in little-endian format.
Definition: byteorder.h:591
static uint64_t sys_get_le48(const uint8_t src[6])
Get a 48-bit integer stored in little-endian format.
Definition: byteorder.h:651
static uint64_t sys_get_le64(const uint8_t src[8])
Get a 64-bit integer stored in little-endian format.
Definition: byteorder.h:666
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:321
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:336
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:485
static uint64_t sys_get_be40(const uint8_t src[5])
Get a 40-bit integer stored in big-endian format.
Definition: byteorder.h:546
static uint16_t sys_get_be16(const uint8_t src[2])
Get a 16-bit integer stored in big-endian format.
Definition: byteorder.h:501
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:470
static uint32_t sys_get_le32(const uint8_t src[4])
Get a 32-bit integer stored in little-endian format.
Definition: byteorder.h:621
static uint32_t sys_get_le24(const uint8_t src[3])
Get a 24-bit integer stored in little-endian format.
Definition: byteorder.h:606
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:455
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:380
static uint32_t sys_get_be24(const uint8_t src[3])
Get a 24-bit integer stored in big-endian format.
Definition: byteorder.h:516
static uint64_t sys_get_be48(const uint8_t src[6])
Get a 48-bit integer stored in big-endian format.
Definition: byteorder.h:561
static uint64_t sys_get_be64(const uint8_t src[8])
Get a 64-bit integer stored in big-endian format.
Definition: byteorder.h:576
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:365
static void sys_mem_swap(void *buf, size_t length)
Swap buffer content.
Definition: byteorder.h:710
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:410
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:440
Macros to abstract toolchain specific capabilities.