#ifndef WIFI_UTIL_H_ #define WIFI_UTIL_H_ #include #include #include #include #include /* Some of these macros are derived from the Linux Kernel sources. */ #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #undef offsetof #define offsetof(type, member) ((size_t)&((type *)0)->member) #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) > (b) ? (a) : (b)) #define abs(x) ({ \ __typeof__(x) __x = (x); \ (__x < 0) ? -__x : __x; \ }) #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) /* Memory barrier. * The CPU doesn't have runtime reordering, so we just * need a compiler memory clobber. */ #define mb() __asm__ __volatile__("" : : : "memory") /* Convert something indirectly to a string */ #define __stringify(x) #x #define stringify(x) __stringify(x) /* Progmem pointer annotation. */ #define PROGPTR /* progmem pointer */ /* Assertions */ void panic(const char PROGPTR *msg) __attribute__((noreturn)); #define BUILD_BUG_ON(x) ((void)sizeof(char[1 - 2 * !!(x)])) #define BUG_ON(x) \ do { \ if (unlikely(x)) \ panic(PSTR(__FILE__ \ stringify(__LINE__))); \ } while (0) void reboot(void) __attribute__((noreturn)); void infinite_sleep(void) __attribute__((noreturn)); void wdt_enable_irq_mode(uint8_t timeout); typedef _Bool bool; /* Endianess */ typedef uint16_t le16_t; typedef uint32_t le32_t; /* The compiler already uses little endian order for multibyte * values in memory. */ static inline uint16_t le16_to_cpu(le16_t x) { return (uint16_t)x; } static inline le16_t cpu_to_le16(uint16_t x) { return (le16_t)x; } static inline uint32_t le32_to_cpu(le32_t x) { return (uint32_t)x; } static inline le32_t cpu_to_le32(uint32_t x) { return (le32_t)x; } static inline void irq_disable(void) { cli(); mb(); } static inline void irq_enable(void) { mb(); sei(); } static inline uint8_t irq_disable_save(void) { uint8_t sreg = SREG; cli(); mb(); return sreg; } static inline void irq_restore(uint8_t sreg_flags) { mb(); SREG = sreg_flags; } #define COMPILE_YEAR ((((__DATE__[7] - '0') * 10 + \ (__DATE__[8] - '0')) * 10 + \ (__DATE__[9] - '0')) * 10 + \ (__DATE__[10] - '0')) #define COMPILE_MONTH ((__DATE__[2] == 'n' ? (__DATE__[1] == 'a' ? 0 : 5) \ : __DATE__[2] == 'b' ? 1 \ : __DATE__[2] == 'r' ? (__DATE__[0] == 'M' ? 2 : 3) \ : __DATE__[2] == 'y' ? 4 \ : __DATE__[2] == 'l' ? 6 \ : __DATE__[2] == 'g' ? 7 \ : __DATE__[2] == 'p' ? 8 \ : __DATE__[2] == 't' ? 9 \ : __DATE__[2] == 'v' ? 10 : 11) + 1) #define COMPILE_DAY ((__DATE__[4] == ' ' ? 0 : __DATE__[4] - '0') * 10 + \ (__DATE__[5] - '0')) #endif /* WIFI_UTIL_H_ */