Very big update according to API documented for LPC122x and LPC82x micro-controllers
[lpc11u3x] / include / lib / utils.h
1 /****************************************************************************
2  *  lib/utils.h
3  *
4  * Copyright 2014 Nathael Pajani <nathael.pajani@ed3l.fr>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  *
19  *************************************************************************** */
21 #ifndef LIB_UTILS_H
22 #define LIB_UTILS_H
24 /***************************************************************************** */
25 /* Library routines                                                            */
26 /***************************************************************************** */
28 #include "lib/stdint.h"
29 #include "core/lpc_core.h"
32 /***************************************************************************** */
33 /* Bit twidling hacks.
34  * http://graphics.stanford.edu/~seander/bithacks.html
35  */
37 /* Counting consecutive trailing or leading zero bits (or finding bit indices)
38  * The ARM Cortex M0 core does not have the __builtin_clz() and __builtin_ctz()
39  * instructions.
40  */
42 /* Count leading zeroes
43  * The following function is an effitient way to implement __builtin_clz().
44  */
45 uint8_t clz(uint32_t x);
47 /* Count traling zeroes
48  * The following function is an effitient way to implement __builtin_ctz().
49  */
50 uint8_t ctz(uint32_t x);
52 /* Count bits set
53  */
54 uint8_t bits_set(uint32_t x);
58 /* Network to host and host to network.
59  * LPC11u3x is a little endian platform, we need to change endianness (reverse byte order)
60  */
61 static inline uint32_t ntohl(uint32_t val) __attribute__ ((alias ("byte_swap_32")));
62 static inline uint32_t htonl(uint32_t val) __attribute__ ((alias ("byte_swap_32")));
63 /* Short versions */
64 static inline uint32_t ntohs(uint32_t val) __attribute__ ((alias ("byte_swap_16")));
65 static inline uint32_t htons(uint32_t val) __attribute__ ((alias ("byte_swap_16")));
68 /* MIN and MAX */
69 #define MIN(a, b)  (((a) < (b)) ? (a) : (b))
70 #define MAX(a, b)  (((a) > (b)) ? (a) : (b))
73 #endif /* LIB_UTILS_H */