/* * (C) Copyright 2014 Leo C. * * SPDX-License-Identifier: GPL-2.0 */ #ifndef COMMON_H #define COMMON_H #include #include #ifdef __AVR__ #include #include #include #define udelay(n) _delay_us(n) struct bits { uint8_t b0:1; uint8_t b1:1; uint8_t b2:1; uint8_t b3:1; uint8_t b4:1; uint8_t b5:1; uint8_t b6:1; uint8_t b7:1; } __attribute__((__packed__)); #define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin) //TODO: // Known to work: 4.8.4, 4.9.1 // Known to fail: 4.8.3, 4.9.0 #define GCC_BUG_61443 1 #else // TODO: stm32 #endif /* __AVR__ */ #ifdef __FLASH #define FLASH __flash #define MEMX __memx #else #define FLASH #define MEMX #endif #define stringify(s) tostring(s) #define tostring(s) #s #define FSTR(X) ((const FLASH char[]) { X } ) #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #define MIN(a,b) ({ typeof (a) _a = (a); \ typeof (b) _b = (b); \ _a < _b ? _a : _b; }) #define MAX(a,b) ({ typeof (a) _a = (a); \ typeof (b) _b = (b); \ _a > _b ? _a : _b; }) #ifdef __AVR__ #define Stat GPIOR0 #else extern volatile uint_least8_t Stat; #endif /* __AVR__ */ #define S_10MS_TO (1<<0) #define S_MSG_PENDING (1<<1) #define S_CON_PENDING (1<<2) static inline void my_puts(const char *s) { fputs(s, stdout); } static inline void my_puts_P(const char *s) { #ifdef __AVR__ fputs_P(s, stdout); #else fputs(s, stdout); #endif /* __AVR__ */ } #endif /* COMMON_H */