]> mj.ucw.cz Git - home-hw.git/blob - lib/util.h
Library: Comments
[home-hw.git] / lib / util.h
1 /*
2  *      General Utility Library for STM32
3  *
4  *      (c) 2018--2019 Martin Mareš <mj@ucw.cz>
5  */
6
7 #include <stdbool.h>
8 #include <stddef.h>
9 #include <stdint.h>
10
11 #include "config.h"
12
13 // Types
14
15 typedef unsigned int uint;
16 typedef uint8_t byte;
17 typedef uint16_t u16;
18 typedef int16_t s16;
19 typedef uint32_t u32;
20 typedef int32_t s32;
21
22 // Macros
23
24 #define MIN(x,y) ((x) < (y) ? (x) : (y))
25 #define MAX(x,y) ((x) > (y) ? (x) : (y))
26
27 #define UNUSED __attribute__((unused))
28
29 // Unaligned access to data
30
31 static inline uint get_u16_le(byte *p)
32 {
33         return (p[1] << 8) | p[0];
34 }
35
36 static inline uint get_u16_be(byte *p)
37 {
38         return (p[0] << 8) | p[1];
39 }
40
41 static inline uint get_u32_le(byte *p)
42 {
43         return (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0];
44 }
45
46 static inline uint get_u32_be(byte *p)
47 {
48         return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
49 }
50
51 static inline void put_u16_le(byte *p, u16 x)
52 {
53         p[0] = x;
54         p[1] = x >> 8;
55 }
56
57 static inline void put_u16_be(byte *p, u16 x)
58 {
59         p[0] = x >> 8;
60         p[1] = x;
61 }
62
63 static inline void put_u32_be(byte *p, u32 x)
64 {
65         p[0] = x >> 24;
66         p[1] = (x >> 16) & 0xff;
67         p[2] = (x >> 8) & 0xff;
68         p[3] = x & 0xff;
69 }
70
71 static inline void put_u32_le(byte *p, u32 x)
72 {
73         p[3] = x >> 24;
74         p[2] = (x >> 16) & 0xff;
75         p[1] = (x >> 8) & 0xff;
76         p[0] = x & 0xff;
77 }
78
79 // debug.c
80
81 void debug_printf(const char *fmt, ...);
82 void debug_puts(const char *s);
83 void debug_putc(int c);