123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- /*
- * util.h
- *
- * Utility definitions.
- *
- * Written & released by Keir Fraser <keir.xen@gmail.com>
- *
- * This is free and unencumbered software released into the public domain.
- * See the file COPYING for more details, or visit <http://unlicense.org>.
- */
- #ifndef NDEBUG
- #define ASSERT(p) do { if (!(p)) illegal(); } while (0)
- #else
- #define ASSERT(p) do { if (0 && (p)) {} } while (0)
- #endif
- typedef char bool_t;
- #define TRUE 1
- #define FALSE 0
- #ifndef offsetof
- #define offsetof(a,b) __builtin_offsetof(a,b)
- #endif
- #define container_of(ptr, type, member) ({ \
- typeof( ((type *)0)->member ) *__mptr = (ptr); \
- (type *)( (char *)__mptr - offsetof(type,member) );})
- #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
- #define min(x,y) ({ \
- const typeof(x) _x = (x); \
- const typeof(y) _y = (y); \
- (void) (&_x == &_y); \
- _x < _y ? _x : _y; })
- #define max(x,y) ({ \
- const typeof(x) _x = (x); \
- const typeof(y) _y = (y); \
- (void) (&_x == &_y); \
- _x > _y ? _x : _y; })
- #define min_t(type,x,y) \
- ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })
- #define max_t(type,x,y) \
- ({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })
- /* Fast memset/memcpy: Pointers must be word-aligned, count must be a non-zero
- * multiple of 32 bytes. */
- void memset_fast(void *s, int c, size_t n);
- void memcpy_fast(void *dest, const void *src, size_t n);
- void *memset(void *s, int c, size_t n);
- void *memcpy(void *dest, const void *src, size_t n);
- void *memmove(void *dest, const void *src, size_t n);
- int memcmp(const void *s1, const void *s2, size_t n);
- size_t strlen(const char *s);
- size_t strnlen(const char *s, size_t maxlen);
- int strcmp(const char *s1, const char *s2);
- int strncmp(const char *s1, const char *s2, size_t n);
- int vsnprintf(char *str, size_t size, const char *format, va_list ap)
- __attribute__ ((format (printf, 3, 0)));
- int snprintf(char *str, size_t size, const char *format, ...)
- __attribute__ ((format (printf, 3, 4)));
- #define le16toh(x) (x)
- #define le32toh(x) (x)
- #define htole16(x) (x)
- #define htole32(x) (x)
- #define be16toh(x) _rev16(x)
- #define be32toh(x) _rev32(x)
- #define htobe16(x) _rev16(x)
- #define htobe32(x) _rev32(x)
- uint32_t udiv64(uint64_t dividend, uint32_t divisor);
- /* Board-specific callouts */
- void board_init(void);
- void act_led(bool_t on);
- #ifndef NDEBUG
- /* Serial console control */
- void console_init(void);
- void console_crash_on_input(void);
- /* Serial console output */
- int vprintk(const char *format, va_list ap)
- __attribute__ ((format (printf, 1, 0)));
- int printk(const char *format, ...)
- __attribute__ ((format (printf, 1, 2)));
- #else /* NDEBUG */
- #define console_init() ((void)0)
- #define console_crash_on_input() ((void)0)
- static inline int vprintk(const char *format, va_list ap) { return 0; }
- static inline int printk(const char *format, ...) { return 0; }
- #endif
- /* Floppy */
- void floppy_init(void);
- void floppy_process(void);
- /* Test mode */
- uint8_t testmode_init(void);
- void testmode_process(void);
- /* CRC-CCITT */
- uint16_t crc16_ccitt(const void *buf, size_t len, uint16_t crc);
- /* Build info. */
- extern const uint8_t fw_major, fw_minor;
- /* Bootloader mode flag. */
- extern volatile uint32_t _reset_flag;
- /* Text/data/BSS address ranges. */
- extern char _stext[], _etext[];
- extern char _sdat[], _edat[], _ldat[];
- extern char _sbss[], _ebss[];
- /* Stacks. */
- extern uint32_t _thread_stacktop[], _thread_stackbottom[];
- extern uint32_t _irq_stacktop[], _irq_stackbottom[];
- /* Default exception handler. */
- void EXC_unused(void);
- /* IRQ priorities, 0 (highest) to 15 (lowest). */
- #define RESET_IRQ_PRI 0
- #define INDEX_IRQ_PRI 2
- #define TIMER_IRQ_PRI 4
- #define USB_IRQ_PRI 6
- /*
- * Local variables:
- * mode: C
- * c-file-style: "Linux"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
|