Zephyr API Documentation  2.7.0-rc2
A Scalable Open Source RTOS
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 <sys/__assert.h>
17#include <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
171#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
172#define sys_le16_to_cpu(val) (val)
173#define sys_cpu_to_le16(val) (val)
174#define sys_le24_to_cpu(val) (val)
175#define sys_cpu_to_le24(val) (val)
176#define sys_le32_to_cpu(val) (val)
177#define sys_cpu_to_le32(val) (val)
178#define sys_le48_to_cpu(val) (val)
179#define sys_cpu_to_le48(val) (val)
180#define sys_le64_to_cpu(val) (val)
181#define sys_cpu_to_le64(val) (val)
182#define sys_be16_to_cpu(val) __bswap_16(val)
183#define sys_cpu_to_be16(val) __bswap_16(val)
184#define sys_be24_to_cpu(val) __bswap_24(val)
185#define sys_cpu_to_be24(val) __bswap_24(val)
186#define sys_be32_to_cpu(val) __bswap_32(val)
187#define sys_cpu_to_be32(val) __bswap_32(val)
188#define sys_be48_to_cpu(val) __bswap_48(val)
189#define sys_cpu_to_be48(val) __bswap_48(val)
190#define sys_be64_to_cpu(val) __bswap_64(val)
191#define sys_cpu_to_be64(val) __bswap_64(val)
192#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
193#define sys_le16_to_cpu(val) __bswap_16(val)
194#define sys_cpu_to_le16(val) __bswap_16(val)
195#define sys_le24_to_cpu(val) __bswap_24(val)
196#define sys_cpu_to_le24(val) __bswap_24(val)
197#define sys_le32_to_cpu(val) __bswap_32(val)
198#define sys_cpu_to_le32(val) __bswap_32(val)
199#define sys_le48_to_cpu(val) __bswap_48(val)
200#define sys_cpu_to_le48(val) __bswap_48(val)
201#define sys_le64_to_cpu(val) __bswap_64(val)
202#define sys_cpu_to_le64(val) __bswap_64(val)
203#define sys_be16_to_cpu(val) (val)
204#define sys_cpu_to_be16(val) (val)
205#define sys_be24_to_cpu(val) (val)
206#define sys_cpu_to_be24(val) (val)
207#define sys_be32_to_cpu(val) (val)
208#define sys_cpu_to_be32(val) (val)
209#define sys_be48_to_cpu(val) (val)
210#define sys_cpu_to_be48(val) (val)
211#define sys_be64_to_cpu(val) (val)
212#define sys_cpu_to_be64(val) (val)
213#else
214#error "Unknown byte order"
215#endif
216
226static inline void sys_put_be16(uint16_t val, uint8_t dst[2])
227{
228 dst[0] = val >> 8;
229 dst[1] = val;
230}
231
241static inline void sys_put_be24(uint32_t val, uint8_t dst[3])
242{
243 dst[0] = val >> 16;
244 sys_put_be16(val, &dst[1]);
245}
246
256static inline void sys_put_be32(uint32_t val, uint8_t dst[4])
257{
258 sys_put_be16(val >> 16, dst);
259 sys_put_be16(val, &dst[2]);
260}
261
271static inline void sys_put_be48(uint64_t val, uint8_t dst[6])
272{
273 sys_put_be16(val >> 32, dst);
274 sys_put_be32(val, &dst[2]);
275}
276
286static inline void sys_put_be64(uint64_t val, uint8_t dst[8])
287{
288 sys_put_be32(val >> 32, dst);
289 sys_put_be32(val, &dst[4]);
290}
291
301static inline void sys_put_le16(uint16_t val, uint8_t dst[2])
302{
303 dst[0] = val;
304 dst[1] = val >> 8;
305}
306
316static inline void sys_put_le24(uint32_t val, uint8_t dst[3])
317{
318 sys_put_le16(val, dst);
319 dst[2] = val >> 16;
320}
321
331static inline void sys_put_le32(uint32_t val, uint8_t dst[4])
332{
333 sys_put_le16(val, dst);
334 sys_put_le16(val >> 16, &dst[2]);
335}
336
346static inline void sys_put_le48(uint64_t val, uint8_t dst[6])
347{
348 sys_put_le32(val, dst);
349 sys_put_le16(val >> 32, &dst[4]);
350}
351
361static inline void sys_put_le64(uint64_t val, uint8_t dst[8])
362{
363 sys_put_le32(val, dst);
364 sys_put_le32(val >> 32, &dst[4]);
365}
366
377static inline uint16_t sys_get_be16(const uint8_t src[2])
378{
379 return ((uint16_t)src[0] << 8) | src[1];
380}
381
392static inline uint32_t sys_get_be24(const uint8_t src[3])
393{
394 return ((uint32_t)src[0] << 16) | sys_get_be16(&src[1]);
395}
396
407static inline uint32_t sys_get_be32(const uint8_t src[4])
408{
409 return ((uint32_t)sys_get_be16(&src[0]) << 16) | sys_get_be16(&src[2]);
410}
411
422static inline uint64_t sys_get_be48(const uint8_t src[6])
423{
424 return ((uint64_t)sys_get_be32(&src[0]) << 16) | sys_get_be16(&src[4]);
425}
426
437static inline uint64_t sys_get_be64(const uint8_t src[8])
438{
439 return ((uint64_t)sys_get_be32(&src[0]) << 32) | sys_get_be32(&src[4]);
440}
441
452static inline uint16_t sys_get_le16(const uint8_t src[2])
453{
454 return ((uint16_t)src[1] << 8) | src[0];
455}
456
467static inline uint32_t sys_get_le24(const uint8_t src[3])
468{
469 return ((uint32_t)src[2] << 16) | sys_get_le16(&src[0]);
470}
471
482static inline uint32_t sys_get_le32(const uint8_t src[4])
483{
484 return ((uint32_t)sys_get_le16(&src[2]) << 16) | sys_get_le16(&src[0]);
485}
486
497static inline uint64_t sys_get_le48(const uint8_t src[6])
498{
499 return ((uint64_t)sys_get_le32(&src[2]) << 16) | sys_get_le16(&src[0]);
500}
501
512static inline uint64_t sys_get_le64(const uint8_t src[8])
513{
514 return ((uint64_t)sys_get_le32(&src[4]) << 32) | sys_get_le32(&src[0]);
515}
516
530static inline void sys_memcpy_swap(void *dst, const void *src, size_t length)
531{
532 uint8_t *pdst = (uint8_t *)dst;
533 const uint8_t *psrc = (const uint8_t *)src;
534
535 __ASSERT(((psrc < pdst && (psrc + length) <= pdst) ||
536 (psrc > pdst && (pdst + length) <= psrc)),
537 "Source and destination buffers must not overlap");
538
539 psrc += length - 1;
540
541 for (; length > 0; length--) {
542 *pdst++ = *psrc--;
543 }
544}
545
556static inline void sys_mem_swap(void *buf, size_t length)
557{
558 size_t i;
559
560 for (i = 0; i < (length/2); i++) {
561 uint8_t tmp = ((uint8_t *)buf)[i];
562
563 ((uint8_t *)buf)[i] = ((uint8_t *)buf)[length - 1 - i];
564 ((uint8_t *)buf)[length - 1 - i] = tmp;
565 }
566}
567
568#endif /* ZEPHYR_INCLUDE_SYS_BYTEORDER_H_ */
static void sys_memcpy_swap(void *dst, const void *src, size_t length)
Swap one buffer content into another.
Definition: byteorder.h:530
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:316
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:256
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:286
static uint32_t sys_get_be32(const uint8_t src[4])
Get a 32-bit integer stored in big-endian format.
Definition: byteorder.h:407
static uint16_t sys_get_le16(const uint8_t src[2])
Get a 16-bit integer stored in little-endian format.
Definition: byteorder.h:452
static uint64_t sys_get_le48(const uint8_t src[6])
Get a 48-bit integer stored in little-endian format.
Definition: byteorder.h:497
static uint64_t sys_get_le64(const uint8_t src[8])
Get a 64-bit integer stored in little-endian format.
Definition: byteorder.h:512
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:226
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:241
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:361
static uint16_t sys_get_be16(const uint8_t src[2])
Get a 16-bit integer stored in big-endian format.
Definition: byteorder.h:377
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:346
static uint32_t sys_get_le32(const uint8_t src[4])
Get a 32-bit integer stored in little-endian format.
Definition: byteorder.h:482
static uint32_t sys_get_le24(const uint8_t src[3])
Get a 24-bit integer stored in big-endian format.
Definition: byteorder.h:467
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:271
static uint32_t sys_get_be24(const uint8_t src[3])
Get a 24-bit integer stored in big-endian format.
Definition: byteorder.h:392
static uint64_t sys_get_be48(const uint8_t src[6])
Get a 48-bit integer stored in big-endian format.
Definition: byteorder.h:422
static uint64_t sys_get_be64(const uint8_t src[8])
Get a 64-bit integer stored in big-endian format.
Definition: byteorder.h:437
static void sys_mem_swap(void *buf, size_t length)
Swap buffer content.
Definition: byteorder.h:556
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:301
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:331
__UINT32_TYPE__ uint32_t
Definition: stdint.h:60
__UINT64_TYPE__ uint64_t
Definition: stdint.h:61
__UINT8_TYPE__ uint8_t
Definition: stdint.h:58
__UINT16_TYPE__ uint16_t
Definition: stdint.h:59
Macros to abstract toolchain specific capabilities.