diff --git a/.gitignore b/.gitignore index f8f72f54b..a67ff3f50 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,8 @@ *.elf *.zip *.d +*.o +*.e *.ihex *.pyc *~ @@ -30,6 +32,7 @@ COOJA.testlog *.nrf52dk *.openmote-cc2538 *.sky +*.firmware *.srf06-cc26xx *.zoul diff --git a/Makefile.include b/Makefile.include index a37c5ad6a..dd24fcacb 100644 --- a/Makefile.include +++ b/Makefile.include @@ -10,6 +10,8 @@ WERROR ?= 1 include $(CONTIKI)/Makefile.identify-target +CONTIKI_NG_TARGET_LIB = contiki-ng-$(TARGET).a + ifeq ($(DEFINES),) -include Makefile.$(TARGET).defines ifneq ($(DEFINES),) @@ -263,7 +265,8 @@ CFLAGS += ${addprefix -I,$(SOURCEDIRS) $(CONTIKI)} ### Check for a git repo and pass version if found ### git.exe in Windows cmd shells may require no stderr redirection ifndef RELSTR -RELSTR:=${shell git --git-dir ${CONTIKI}/.git describe --tags --always --dirty} +RELSTR:=${shell git --git-dir ${CONTIKI}/.git --work-tree ${CONTIKI} describe \ + --tags --always --dirty} endif ifneq ($(RELSTR),) @@ -288,15 +291,23 @@ sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ rm -f $(@:.o=.$$$$) endef -clean: - -rm -f *~ *core core *.srec \ - *.lst *.map *.o \ - *.cprg *.bin *.data contiki*.a *.firmware core-labels.S *.ihex *.ini \ - rm -rf $(CLEAN) - -rm -rf $(OBJECTDIR) +### Harmonize filename of a .map file, if the platform's build system wants +### to create one +CONTIKI_NG_PROJECT_MAP = $(addsuffix -$(TARGET).map, $(basename $@)) -distclean: clean - -rm -f ${addsuffix .$(TARGET),$(CONTIKI_PROJECT)} +.PHONY: clean distclean usage help targets boards savetarget savedefines viewconf + +clean: + -rm -f *.d *.e *.o $(CONTIKI_NG_TARGET_LIB) $(CLEAN) + -rm -rf $(OBJECTDIR) + -rm -f $(addsuffix -$(TARGET).map, $(CONTIKI_PROJECT)) + -rm -f $(addsuffix .$(TARGET), $(CONTIKI_PROJECT)) + +distclean: + @for TARG in `ls $(CONTIKI)/arch/platform $(TARGETDIRS)`; do \ + echo make $$TARG clean; \ + make TARGET=$$TARG clean; \ + done -include $(CONTIKI)/arch/platform/$(TARGET)/Makefile.customrules-$(TARGET) @@ -351,7 +362,7 @@ ifndef AROPTS endif ifndef CUSTOM_RULE_ALLOBJS_TO_TARGETLIB -contiki-$(TARGET).a: $(CONTIKI_OBJECTFILES) +$(CONTIKI_NG_TARGET_LIB): $(CONTIKI_OBJECTFILES) $(TRACE_AR) $(Q)$(AR) $(AROPTS) $@ $^ endif @@ -361,7 +372,7 @@ ifndef LD endif ifndef CUSTOM_RULE_LINK -%.$(TARGET): %.o $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a +%.$(TARGET): %.o $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) $(CONTIKI_NG_TARGET_LIB) $(TRACE_LD) $(Q)$(LD) $(LDFLAGS) $(TARGET_STARTFILES) ${filter-out %.a,$^} \ ${filter %.a,$^} $(TARGET_LIBFILES) -o $@ @@ -374,7 +385,25 @@ endif $(NM) -S -td --size-sort $< | grep -i " [t] " | cut -d' ' -f2,4 usage: - @echo "make MAKETARGETS... [TARGET=(TARGET)] [BOARD=(BOARD)] [savetarget] [targets]" + @echo "Usage:" + @echo " make [TARGET=(TARGET)] [BOARD=(BOARD)] [DEFINES=(DEFINES)] [target]" + @echo "" + @echo "Typical usage:" + @echo " make [TARGET=(TARGET)] [BOARD=(BOARD)] [all]" + @echo "" + @echo " Will build Contiki-NG firmware(s) from the current example dir" + @echo " for platform TARGET, board BOARD." + @echo "" + @echo "Miscellaneous targets:" + @echo " targets Prints list of supported platforms" + @echo " boards Prints a list of supported boards for TARGET" + @echo " savegtarget Saves TARGET and BOARD for future invocations of make" + @echo " savedefines Saves DEFINES for future invocations of make" + @echo " clean Removes all compiled files for TARGET" + @echo " distclean Removes all compiled files for all TARGETs" + @echo " viewconf Prints Contiki-NG build configuration for TARGET" + +help: usage targets: @ls $(CONTIKI)/arch/platform $(TARGETDIRS) diff --git a/arch/cpu/arm/Makefile.arm b/arch/cpu/arm/Makefile.arm index ba93b82a0..0b2662423 100644 --- a/arch/cpu/arm/Makefile.arm +++ b/arch/cpu/arm/Makefile.arm @@ -31,7 +31,7 @@ CONTIKI_ARM_DIRS += . common/dbg-io CONTIKI_CPU_DIRS += $(addprefix ../arm/, $(CONTIKI_ARM_DIRS)) ### CPU-dependent cleanup files -CLEAN += *.d *.elf *.hex +CLEAN += *.elf *.bin *.lst *.hex *.i16hex ### Don't treat the following files as intermediate .PRECIOUS: %.elf %.hex %.bin diff --git a/arch/cpu/arm/arm-def.h b/arch/cpu/arm/arm-def.h index 2cd31604c..92b19048d 100644 --- a/arch/cpu/arm/arm-def.h +++ b/arch/cpu/arm/arm-def.h @@ -60,6 +60,25 @@ typedef uint32_t uip_stats_t; typedef uint32_t rtimer_clock_t; #define RTIMER_CLOCK_DIFF(a, b) ((int32_t)((a) - (b))) /** @} */ + +/* + * The stdio.h that ships with the arm-gcc toolchain does this: + * + * int _EXFUN(putchar, (int)); + * [...] + * #define putchar(x) putc(x, stdout) + * + * This causes us a lot of trouble: For platforms using this toolchain, every + * time we use putchar we need to first #undef putchar. What we do here is to + * #undef putchar across the board. The resulting code will cause the linker + * to search for a symbol named putchar and this allows us to use the + * implementation under os/lib/dbg-io. + * + * This will fail if stdio.h is included before contiki.h, but it is common + * practice to include contiki.h first + */ +#include +#undef putchar /*---------------------------------------------------------------------------*/ #endif /* ARM_DEF_ */ /*---------------------------------------------------------------------------*/ diff --git a/arch/cpu/arm/common/SD-card/cfs-sdcard.c b/arch/cpu/arm/common/SD-card/cfs-sdcard.c index 9be29fd2e..4c44e3e6b 100644 --- a/arch/cpu/arm/common/SD-card/cfs-sdcard.c +++ b/arch/cpu/arm/common/SD-card/cfs-sdcard.c @@ -1,7 +1,6 @@ #include #include #include -#include #include diff --git a/arch/cpu/arm/common/dbg-io/dbg-printf.c b/arch/cpu/arm/common/dbg-io/dbg-printf.c deleted file mode 100644 index 9bd09c1ac..000000000 --- a/arch/cpu/arm/common/dbg-io/dbg-printf.c +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include -#include -#include - -static StrFormatResult -write_str(void *user_data, const char *data, unsigned int len) -{ - if (len > 0) dbg_send_bytes((unsigned char*)data, len); - return STRFORMAT_OK; -} - - -static StrFormatContext ctxt = - { - write_str, - NULL - }; -int -printf(const char *fmt, ...) -{ - int res; - va_list ap; - va_start(ap, fmt); - res = format_str_v(&ctxt, fmt, ap); - va_end(ap); - return res; -} - - diff --git a/arch/cpu/arm/common/dbg-io/dbg-putchar.c b/arch/cpu/arm/common/dbg-io/dbg-putchar.c deleted file mode 100644 index 54f3db53f..000000000 --- a/arch/cpu/arm/common/dbg-io/dbg-putchar.c +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include -#include - -#undef putchar -#undef putc - -int -putchar(int c) -{ - dbg_putchar(c); - return c; -} - -int -putc(int c, FILE *f) -{ - dbg_putchar(c); - return c; -} - -int -__sp(struct _reent *_ptr, int c, FILE *_p) { - dbg_putchar(c); - return c; -} diff --git a/arch/cpu/arm/common/dbg-io/dbg-puts.c b/arch/cpu/arm/common/dbg-io/dbg-puts.c deleted file mode 100644 index fa90d1022..000000000 --- a/arch/cpu/arm/common/dbg-io/dbg-puts.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include -#include - -int -puts(const char *str) -{ - dbg_send_bytes((unsigned char*)str, strlen(str)); - dbg_putchar('\n'); - return 0; -} diff --git a/arch/cpu/arm/common/dbg-io/dbg-snprintf.c b/arch/cpu/arm/common/dbg-io/dbg-snprintf.c deleted file mode 100644 index 230d6891a..000000000 --- a/arch/cpu/arm/common/dbg-io/dbg-snprintf.c +++ /dev/null @@ -1,48 +0,0 @@ -#include -#include -#include - -struct FmtBuffer -{ - char *pos; - size_t left; -}; - -static StrFormatResult -buffer_str(void *user_data, const char *data, unsigned int len) -{ - struct FmtBuffer *buffer = (struct FmtBuffer*)user_data; - if (len >= buffer->left) { - len = buffer->left; - len--; - } - - memcpy(buffer->pos, data, len); - buffer->pos += len; - buffer->left -= len; - return STRFORMAT_OK; -} - -int snprintf(char *str, size_t size, const char *format, ...) -{ - int res; - va_list ap; - va_start(ap, format); - res = vsnprintf(str, size, format, ap); - va_end(ap); - return res; -} - -int vsnprintf(char *str, size_t size, const char *format, va_list ap) -{ - struct FmtBuffer buffer; - StrFormatContext ctxt; - int res; - ctxt.write_str = buffer_str; - ctxt.user_data = &buffer; - buffer.pos = str; - buffer.left = size; - res = format_str_v(&ctxt, format, ap); - *buffer.pos = '\0'; - return res; -} diff --git a/arch/cpu/arm/common/dbg-io/dbg-sprintf.c b/arch/cpu/arm/common/dbg-io/dbg-sprintf.c deleted file mode 100644 index 8124fc363..000000000 --- a/arch/cpu/arm/common/dbg-io/dbg-sprintf.c +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include -#include - -static StrFormatResult -buffer_str(void *user_data, const char *data, unsigned int len) -{ - memcpy(*(char**)user_data, data, len); - (*(char**)user_data) += len; - return STRFORMAT_OK; -} - -int -sprintf(char *str, const char *format, ...) -{ - StrFormatContext ctxt; - int res; - va_list ap; - va_start(ap, format); - ctxt.write_str = buffer_str; - ctxt.user_data = &str; - res = format_str_v(&ctxt, format, ap); - *str = '\0'; - va_end(ap); - return res; -} diff --git a/arch/cpu/arm/common/dbg-io/strformat.c b/arch/cpu/arm/common/dbg-io/strformat.c deleted file mode 100644 index 13b91a563..000000000 --- a/arch/cpu/arm/common/dbg-io/strformat.c +++ /dev/null @@ -1,617 +0,0 @@ -#include - -#define HAVE_DOUBLE - -#define HAVE_LONGLONG -#ifndef LARGEST_SIGNED -#ifdef HAVE_LONGLONG -#define LARGEST_SIGNED long long int -#else -#define LARGEST_UNSIGNED long int -#endif -#endif - -#ifndef LARGEST_UNSIGNED -#ifdef HAVE_LONGLONG -#define LARGEST_UNSIGNED unsigned long long int -#else -#define LARGEST_UNSIGNED unsigned long int -#endif -#endif - -#ifndef POINTER_INT -#define POINTER_INT unsigned long -#endif - -typedef unsigned int FormatFlags; - -#define MAKE_MASK(shift,size) (((1 << size) - 1) << (shift)) - -#define JUSTIFY_SHIFT 0 -#define JUSTIFY_SIZE 1 -#define JUSTIFY_RIGHT 0x0000 -#define JUSTIFY_LEFT 0x0001 -#define JUSTIFY_MASK MAKE_MASK(JUSTIFY_SHIFT,JUSTIFY_SIZE) - - -/* How a positive number is prefixed */ -#define POSITIVE_SHIFT (JUSTIFY_SHIFT + JUSTIFY_SIZE) -#define POSITIVE_NONE (0x0000 << POSITIVE_SHIFT) -#define POSITIVE_SPACE (0x0001 << POSITIVE_SHIFT) -#define POSITIVE_PLUS (0x0003 << POSITIVE_SHIFT) -#define POSITIVE_MASK MAKE_MASK(POSITIVE_SHIFT, POSITIVE_SIZE) - -#define POSITIVE_SIZE 2 - -#define ALTERNATE_FORM_SHIFT (POSITIVE_SHIFT + POSITIVE_SIZE) -#define ALTERNATE_FORM_SIZE 1 -#define ALTERNATE_FORM (0x0001 << ALTERNATE_FORM_SHIFT) - - -#define PAD_SHIFT (ALTERNATE_FORM_SHIFT + ALTERNATE_FORM_SIZE) -#define PAD_SIZE 1 -#define PAD_SPACE (0x0000 << PAD_SHIFT) -#define PAD_ZERO (0x0001 << PAD_SHIFT) - -#define SIZE_SHIFT (PAD_SHIFT + PAD_SIZE) -#define SIZE_SIZE 3 -#define SIZE_CHAR (0x0001 << SIZE_SHIFT) -#define SIZE_SHORT (0x0002 << SIZE_SHIFT) -#define SIZE_INT (0x0000 << SIZE_SHIFT) -#define SIZE_LONG (0x0003 << SIZE_SHIFT) -#define SIZE_LONGLONG (0x0004 << SIZE_SHIFT) -#define SIZE_MASK MAKE_MASK(SIZE_SHIFT,SIZE_SIZE) - -#define CONV_SHIFT (SIZE_SHIFT + SIZE_SIZE) -#define CONV_SIZE 3 -#define CONV_INTEGER (0x0001 << CONV_SHIFT) -#define CONV_FLOAT (0x0002 << CONV_SHIFT) -#define CONV_POINTER (0x0003 << CONV_SHIFT) -#define CONV_STRING (0x0004 << CONV_SHIFT) -#define CONV_CHAR (0x0005 << CONV_SHIFT) -#define CONV_PERCENT (0x0006 << CONV_SHIFT) -#define CONV_WRITTEN (0x0007 << CONV_SHIFT) -#define CONV_MASK MAKE_MASK(CONV_SHIFT, CONV_SIZE) - -#define RADIX_SHIFT (CONV_SHIFT + CONV_SIZE) -#define RADIX_SIZE 2 -#define RADIX_DECIMAL (0x0001 << RADIX_SHIFT) -#define RADIX_OCTAL (0x0002 << RADIX_SHIFT) -#define RADIX_HEX (0x0003 << RADIX_SHIFT) -#define RADIX_MASK MAKE_MASK(RADIX_SHIFT,RADIX_SIZE) - -#define SIGNED_SHIFT (RADIX_SHIFT + RADIX_SIZE) -#define SIGNED_SIZE 1 -#define SIGNED_NO (0x0000 << SIGNED_SHIFT) -#define SIGNED_YES (0x0001 << SIGNED_SHIFT) -#define SIGNED_MASK MAKE_MASK(SIGNED_SHIFT,SIGNED_SIZE) - -#define CAPS_SHIFT (SIGNED_SHIFT + SIGNED_SIZE) -#define CAPS_SIZE 1 -#define CAPS_NO (0x0000 << CAPS_SHIFT) -#define CAPS_YES (0x0001 << CAPS_SHIFT) -#define CAPS_MASK MAKE_MASK(CAPS_SHIFT,CAPS_SIZE) - -#define FLOAT_SHIFT (CAPS_SHIFT + CAPS_SIZE) -#define FLOAT_SIZE 2 -#define FLOAT_NORMAL (0x0000 << FLOAT_SHIFT) -#define FLOAT_EXPONENT (0x0001 << FLOAT_SHIFT) -#define FLOAT_DEPENDANT (0x0002 << FLOAT_SHIFT) -#define FLOAT_HEX (0x0003 << FLOAT_SHIFT) -#define FLOAT_MASK MAKE_MASK(FLOAT_SHIFT, FLOAT_SIZE) - -static FormatFlags -parse_flags(const char **posp) -{ - FormatFlags flags = 0; - const char *pos = *posp; - while (1) { - switch(*pos) { - case '-': - flags |= JUSTIFY_LEFT; - break; - case '+': - flags |= POSITIVE_PLUS; - break; - case ' ': - flags |= POSITIVE_SPACE; - break; - case '#': - flags |= ALTERNATE_FORM; - break; - case '0': - flags |= PAD_ZERO; - break; - default: - *posp = pos; - return flags; - } - pos++; - } - -} - -static unsigned int -parse_uint(const char **posp) -{ - unsigned v = 0; - const char *pos = *posp; - char ch; - while((ch = *pos) >= '0' && ch <= '9') { - v = v * 10 + (ch - '0'); - pos++; - } - *posp = pos; - return v; -} - -#define MAXCHARS_HEX ((sizeof(LARGEST_UNSIGNED) * 8) / 4 ) - -/* Largest number of characters needed for converting an unsigned integer. - */ -#define MAXCHARS ((sizeof(LARGEST_UNSIGNED) * 8 + 2) / 3 ) - -static unsigned int -output_uint_decimal(char **posp, LARGEST_UNSIGNED v) -{ - unsigned int len; - char *pos = *posp; - while (v > 0) { - *--pos = (v % 10) + '0'; - v /= 10; - } - len = *posp - pos; - *posp = pos; - return len; -} - -static unsigned int -output_uint_hex(char **posp, LARGEST_UNSIGNED v, unsigned int flags) -{ - unsigned int len; - const char *hex = (flags & CAPS_YES) ?"0123456789ABCDEF":"0123456789abcdef"; - char *pos = *posp; - while (v > 0) { - *--pos = hex[(v % 16)]; - v /= 16; - } - len = *posp - pos; - *posp = pos; - return len; -} - -static unsigned int -output_uint_octal(char **posp, LARGEST_UNSIGNED v) -{ - unsigned int len; - char *pos = *posp; - while (v > 0) { - *--pos = (v % 8) + '0'; - v /= 8; - } - len = *posp - pos; - *posp = pos; - return len; -} - -static StrFormatResult -fill_space(const StrFormatContext *ctxt, unsigned int len) -{ - StrFormatResult res; - static const char buffer[16] = " "; - while(len > 16) { - res = ctxt->write_str(ctxt->user_data, buffer, 16); - if (res != STRFORMAT_OK) return res; - len -= 16; - } - if (len == 0) return STRFORMAT_OK; - return ctxt->write_str(ctxt->user_data, buffer, len); -} - -static StrFormatResult -fill_zero(const StrFormatContext *ctxt, unsigned int len) -{ - StrFormatResult res; - static const char buffer[16] = "0000000000000000"; - while(len > 16) { - res = ctxt->write_str(ctxt->user_data, buffer, 16); - if (res != STRFORMAT_OK) return res; - len -= 16; - } - if (len == 0) return STRFORMAT_OK; - return ctxt->write_str(ctxt->user_data, buffer, len); -} - -#define CHECKCB(res) {if ((res) != STRFORMAT_OK) {va_end(ap); return -1;}} - -int -format_str(const StrFormatContext *ctxt, const char *format, ...) -{ - int ret; - va_list ap; - va_start(ap, format); - ret = format_str_v(ctxt, format, ap); - va_end(ap); - return ret; -} - -int -format_str_v(const StrFormatContext *ctxt, const char *format, va_list ap) -{ - unsigned int written = 0; - const char *pos = format; - while(*pos != '\0') { - FormatFlags flags; - unsigned int minwidth = 0; - int precision = -1; /* Negative means no precision */ - char ch; - const char *start = pos; - while( (ch = *pos) != '\0' && ch != '%') pos++; - if (pos != start) { - CHECKCB(ctxt->write_str(ctxt->user_data, start, pos - start)); - written += pos - start; - } - if (*pos == '\0') { - va_end(ap); - return written; - } - pos++; - if (*pos == '\0') { - va_end(ap); - return written; - } - flags = parse_flags(&pos); - - /* parse width */ - if (*pos >= '1' && *pos <= '9') { - minwidth = parse_uint(&pos); - } else if (*pos == '*') { - int w = va_arg(ap,int); - if (w < 0) { - flags |= JUSTIFY_LEFT; - minwidth = w; - } else { - minwidth = w; - } - pos ++; - } - - /* parse precision */ - if (*pos == '.') { - pos++; - if (*pos >= '0' && *pos <= '9') { - precision = parse_uint(&pos); - } else if (*pos == '*') { - pos++; - precision = va_arg(ap,int); - } - } - if (*pos == 'l') { - pos++; - if (*pos == 'l') { - flags |= SIZE_LONGLONG; - pos++; - } else { - flags |= SIZE_LONG; - } - } else if (*pos == 'h') { - pos++; - if (*pos == 'h') { - flags |= SIZE_CHAR; - pos++; - } else { - flags |= SIZE_SHORT; - } - } - - /* parse conversion specifier */ - switch(*pos) { - case 'd': - case 'i': - flags |= CONV_INTEGER | RADIX_DECIMAL | SIGNED_YES; - break; - case 'u': - flags |= CONV_INTEGER | RADIX_DECIMAL | SIGNED_NO; - break; - case 'o': - flags |= CONV_INTEGER | RADIX_OCTAL | SIGNED_NO; - break; - case 'x': - flags |= CONV_INTEGER | RADIX_HEX | SIGNED_NO; - break; - case 'X': - flags |= CONV_INTEGER | RADIX_HEX | SIGNED_NO | CAPS_YES; - break; -#ifdef HAVE_DOUBLE - case 'f': - flags |= CONV_FLOAT | FLOAT_NORMAL; - break; - case 'F': - flags |= CONV_FLOAT | FLOAT_NORMAL | CAPS_YES; - break; - case 'e': - flags |= CONV_FLOAT | FLOAT_EXPONENT; - break; - case 'E': - flags |= CONV_FLOAT | FLOAT_EXPONENT | CAPS_YES; - break; - case 'g': - flags |= CONV_FLOAT | FLOAT_DEPENDANT; - break; - case 'G': - flags |= CONV_FLOAT | FLOAT_DEPENDANT | CAPS_YES; - break; - case 'a': - flags |= CONV_FLOAT | FLOAT_HEX; - break; - case 'A': - flags |= CONV_FLOAT | FLOAT_HEX | CAPS_YES; - break; -#endif - case 'c': - flags |= CONV_CHAR; - break; - case 's': - flags |= CONV_STRING; - break; - case 'p': - flags |= CONV_POINTER; - break; - case 'n': - flags |= CONV_WRITTEN; - break; - case '%': - flags |= CONV_PERCENT; - break; - case '\0': - va_end(ap); - return written; - } - pos++; - switch(flags & CONV_MASK) { - case CONV_PERCENT: - CHECKCB(ctxt->write_str(ctxt->user_data, "%", 1)); - written++; - break; - case CONV_INTEGER: - { - /* unsigned integers */ - char *prefix = 0; /* sign, "0x" or "0X" */ - unsigned int prefix_len = 0; - char buffer[MAXCHARS]; - char *conv_pos = buffer + MAXCHARS; - unsigned int conv_len = 0; - unsigned int width = 0; - unsigned int precision_fill; - unsigned int field_fill; - LARGEST_UNSIGNED uvalue = 0; - int negative = 0; - - if (precision < 0) precision = 1; - else flags &= ~PAD_ZERO; - - if (flags & SIGNED_YES) { - /* signed integers */ - LARGEST_SIGNED value = 0; - switch(flags & SIZE_MASK) { - case SIZE_CHAR: - value = (signed char)va_arg(ap, int); - break; - case SIZE_SHORT: - value = (short)va_arg(ap, int); - break; - case SIZE_INT: - value = va_arg(ap, int); - break; -#ifndef HAVE_LONGLONG - case SIZE_LONGLONG: /* Treat long long the same as long */ -#endif - case SIZE_LONG: - value = va_arg(ap, long); - break; -#ifdef HAVE_LONGLONG - case SIZE_LONGLONG: - value = va_arg(ap, long long); - break; -#endif - } - if (value < 0) { - uvalue = -value; - negative = 1; - } else { - uvalue = value; - } - } else { - - switch(flags & SIZE_MASK) { - case SIZE_CHAR: - uvalue = (unsigned char)va_arg(ap,unsigned int); - break; - case SIZE_SHORT: - uvalue = (unsigned short)va_arg(ap,unsigned int); - break; - case SIZE_INT: - uvalue = va_arg(ap,unsigned int); - break; -#ifndef HAVE_LONGLONG - case SIZE_LONGLONG: /* Treat long long the same as long */ -#endif - case SIZE_LONG: - uvalue = va_arg(ap,unsigned long); - break; -#ifdef HAVE_LONGLONG - case SIZE_LONGLONG: - uvalue = va_arg(ap,unsigned long long); - break; -#endif - } - } - - switch(flags & (RADIX_MASK)) { - case RADIX_DECIMAL: - conv_len = output_uint_decimal(&conv_pos,uvalue); - break; - case RADIX_OCTAL: - conv_len = output_uint_octal(&conv_pos,uvalue); - break; - case RADIX_HEX: - conv_len = output_uint_hex(&conv_pos,uvalue, flags); - break; - } - - width += conv_len; - precision_fill = (precision > conv_len) ? precision - conv_len : 0; - if ((flags & (RADIX_MASK | ALTERNATE_FORM)) - == (RADIX_OCTAL | ALTERNATE_FORM)) { - if (precision_fill < 1) precision_fill = 1; - } - - width += precision_fill; - - if ((flags & (RADIX_MASK | ALTERNATE_FORM)) - == (RADIX_HEX | ALTERNATE_FORM) && uvalue != 0) { - prefix_len = 2; - if (flags & CAPS_YES) { - prefix = "0X"; - } else { - prefix = "0x"; - } - } - - if (flags & SIGNED_YES) { - if (negative) { - prefix = "-"; - prefix_len = 1; - } else { - switch(flags & POSITIVE_MASK) { - case POSITIVE_SPACE: - prefix = " "; - prefix_len = 1; - break; - case POSITIVE_PLUS: - prefix = "+"; - prefix_len = 1; - break; - } - } - } - - width += prefix_len; - - field_fill = (minwidth > width) ? minwidth - width : 0; - - if ((flags & JUSTIFY_MASK) == JUSTIFY_RIGHT) { - if (flags & PAD_ZERO) { - precision_fill += field_fill; - field_fill = 0; /* Do not double count padding */ - } else { - CHECKCB(fill_space(ctxt,field_fill)); - } - } - - if (prefix_len > 0) - CHECKCB(ctxt->write_str(ctxt->user_data, prefix, prefix_len)); - written += prefix_len; - - CHECKCB(fill_zero(ctxt,precision_fill)); - written += precision_fill; - - CHECKCB(ctxt->write_str(ctxt->user_data, conv_pos,conv_len)); - written += conv_len; - - if ((flags & JUSTIFY_MASK) == JUSTIFY_LEFT) { - CHECKCB(fill_space(ctxt,field_fill)); - } - written += field_fill; - } - break; - case CONV_STRING: - { - unsigned int field_fill; - unsigned int len; - char *str = va_arg(ap,char *); - if (str) { - char *pos = str; - while(*pos != '\0') pos++; - len = pos - str; - } else { - str = "(null)"; - len = 6; - } - if (precision >= 0 && precision < len) len = precision; - field_fill = (minwidth > len) ? minwidth - len : 0; - if ((flags & JUSTIFY_MASK) == JUSTIFY_RIGHT) { - CHECKCB(fill_space(ctxt,field_fill)); - } - CHECKCB(ctxt->write_str(ctxt->user_data, str,len)); - written += len; - if ((flags & JUSTIFY_MASK) == JUSTIFY_LEFT) { - CHECKCB(fill_space(ctxt,field_fill)); - } - written += field_fill; - } - break; - case CONV_POINTER: - { - LARGEST_UNSIGNED uvalue = - (LARGEST_UNSIGNED)(POINTER_INT)va_arg(ap,void *); - char buffer[MAXCHARS_HEX + 3]; - char *conv_pos = buffer + MAXCHARS_HEX+3; - unsigned int conv_len; - unsigned int field_fill; - - conv_len = output_uint_hex(&conv_pos,uvalue,flags); - if (conv_len == 0) { - *--conv_pos = '0'; - conv_len++; - } - *--conv_pos = 'x'; - *--conv_pos = '0'; - *--conv_pos = '#'; - conv_len += 3; - - field_fill = (minwidth > conv_len) ? minwidth - conv_len : 0; - - if ((flags & JUSTIFY_MASK) == JUSTIFY_RIGHT) { - CHECKCB(fill_space(ctxt,field_fill)); - } - - CHECKCB(ctxt->write_str(ctxt->user_data, conv_pos,conv_len)); - written += conv_len; - - if ((flags & JUSTIFY_MASK) == JUSTIFY_LEFT) { - CHECKCB(fill_space(ctxt,field_fill)); - } - written += field_fill; - } - break; - case CONV_CHAR: - { - char ch = va_arg(ap,int); - unsigned int field_fill = (minwidth > 1) ? minwidth - 1 : 0; - if ((flags & JUSTIFY_MASK) == JUSTIFY_RIGHT) { - CHECKCB(fill_space(ctxt,field_fill)); - written += field_fill; - } - - CHECKCB(ctxt->write_str(ctxt->user_data, &ch, 1)); - written++; - - if ((flags & JUSTIFY_MASK) == JUSTIFY_LEFT) { - CHECKCB(fill_space(ctxt,field_fill)); - } - written+= field_fill; - } - break; - case CONV_WRITTEN: - { - int *p = va_arg(ap,int*); - *p = written; - } - break; - - } - } - - return written; -} diff --git a/arch/cpu/arm/common/dbg-io/strformat.h b/arch/cpu/arm/common/dbg-io/strformat.h deleted file mode 100644 index c32eed670..000000000 --- a/arch/cpu/arm/common/dbg-io/strformat.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef STRFORMAT_H_ -#define STRFORMAT_H_ - -#include - -#define STRFORMAT_OK 0 -#define STRFORMAT_FAILED 1 -typedef unsigned int StrFormatResult; - -/* The data argument may only be considered valid during the function call */ -typedef StrFormatResult (*StrFormatWrite)(void *user_data, const char *data, unsigned int len); - -typedef struct _StrFormatContext -{ - StrFormatWrite write_str; - void *user_data; -} StrFormatContext; - -int format_str(const StrFormatContext *ctxt, const char *format, ...) - __attribute__ ((__format__ (__printf__, 2,3))); - -int -format_str_v(const StrFormatContext *ctxt, const char *format, va_list ap); - -#endif /* STRFORMAT_H_ */ diff --git a/arch/cpu/arm/cortex-m/cm3/Makefile.cm3 b/arch/cpu/arm/cortex-m/cm3/Makefile.cm3 index f5547fea0..f5e8d2a3c 100644 --- a/arch/cpu/arm/cortex-m/cm3/Makefile.cm3 +++ b/arch/cpu/arm/cortex-m/cm3/Makefile.cm3 @@ -5,7 +5,7 @@ CFLAGS += -mcpu=cortex-m3 LDFLAGS += -mcpu=cortex-m3 -nostartfiles LDFLAGS += -T $(LDSCRIPT) LDFLAGS += -Wl,--gc-sections,--sort-section=alignment -LDFLAGS += -Wl,-Map=$(@:.elf=-$(TARGET).map),--cref,--no-warn-mismatch +LDFLAGS += -Wl,-Map=$(CONTIKI_NG_PROJECT_MAP),--cref,--no-warn-mismatch OBJCOPY_FLAGS += --gap-fill 0xff diff --git a/arch/cpu/arm/cortex-m/cm4/Makefile.cm4 b/arch/cpu/arm/cortex-m/cm4/Makefile.cm4 index 78367b0eb..1f3cdd00b 100644 --- a/arch/cpu/arm/cortex-m/cm4/Makefile.cm4 +++ b/arch/cpu/arm/cortex-m/cm4/Makefile.cm4 @@ -6,7 +6,7 @@ LDFLAGS += -mcpu=cortex-m4 ### Compilation rules CUSTOM_RULE_LINK=1 -%.elf: $(TARGET_STARTFILES) %.o $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a $(TARGET_LIBS) +%.elf: $(TARGET_STARTFILES) %.o $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) $(CONTIKI_NG_TARGET_LIB) $(TARGET_LIBS) $(TRACE_LD) $(Q)$(CC) $(LDFLAGS) ${filter %.o %.a,$^} -o $@ diff --git a/arch/cpu/cc2538/Makefile.cc2538 b/arch/cpu/cc2538/Makefile.cc2538 index f6e76f571..891215093 100644 --- a/arch/cpu/cc2538/Makefile.cc2538 +++ b/arch/cpu/cc2538/Makefile.cc2538 @@ -15,7 +15,8 @@ CONTIKI_CPU_DIRS = . dev usb usb/common usb/common/cdc-acm ### CPU-dependent source files CONTIKI_CPU_SOURCEFILES += soc.c clock.c rtimer-arch.c uart.c watchdog.c -CONTIKI_CPU_SOURCEFILES += nvic.c sys-ctrl.c gpio.c ioc.c spi.c adc.c +CONTIKI_CPU_SOURCEFILES += nvic.c sys-ctrl.c gpio.c ioc.c spi-legacy.c adc.c +CONTIKI_CPU_SOURCEFILES += spi-arch.c CONTIKI_CPU_SOURCEFILES += crypto.c aes.c ecb.c cbc.c ctr.c cbc-mac.c gcm.c CONTIKI_CPU_SOURCEFILES += ccm.c sha256.c gpio-hal-arch.c CONTIKI_CPU_SOURCEFILES += cc2538-aes-128.c cc2538-ccm-star.c @@ -27,14 +28,13 @@ CONTIKI_CPU_SOURCEFILES += slip-arch.c slip.c CONTIKI_CPU_SOURCEFILES += i2c.c cc2538-temp-sensor.c vdd3-sensor.c CONTIKI_CPU_SOURCEFILES += cfs-coffee.c cfs-coffee-arch.c pwm.c -DEBUG_IO_SOURCEFILES += dbg-printf.c dbg-snprintf.c dbg-sprintf.c strformat.c +MODULES += os/lib/dbg-io USB_SOURCEFILES += usb-core.c cdc-acm.c usb-arch.c usb-serial.c cdc-acm-descriptors.c CPU_START_SOURCEFILES = startup-gcc.c -CONTIKI_SOURCEFILES += $(CONTIKI_CPU_SOURCEFILES) $(DEBUG_IO_SOURCEFILES) -CONTIKI_SOURCEFILES += $(USB_SOURCEFILES) +CONTIKI_SOURCEFILES += $(CONTIKI_CPU_SOURCEFILES) $(USB_SOURCEFILES) ### Always re-build ieee-addr.o in case the command line passes a new NODEID FORCE: diff --git a/arch/cpu/cc2538/cc2538-def.h b/arch/cpu/cc2538/cc2538-def.h index 32aed6111..e4c7451a6 100644 --- a/arch/cpu/cc2538/cc2538-def.h +++ b/arch/cpu/cc2538/cc2538-def.h @@ -58,6 +58,8 @@ #define TSCH_CONF_HW_FRAME_FILTERING 0 #endif /* MAC_CONF_WITH_TSCH */ /*---------------------------------------------------------------------------*/ +#define SPI_CONF_CONTROLLER_COUNT 2 +/*---------------------------------------------------------------------------*/ /* Path to CMSIS header */ #define CMSIS_CONF_HEADER_PATH "cc2538_cm3.h" diff --git a/arch/cpu/cc2538/dbg.c b/arch/cpu/cc2538/dbg.c index b97936feb..7b33bc471 100644 --- a/arch/cpu/cc2538/dbg.c +++ b/arch/cpu/cc2538/dbg.c @@ -28,16 +28,9 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ -/** \addtogroup cc2538-char-io - * @{ */ -/** - * \file - * Implementation of arch-specific functions required by the dbg_io API in - * cpu/arm/common/dbg-io - */ +/*---------------------------------------------------------------------------*/ #include "contiki.h" -#include "dbg.h" #include "dev/uart.h" #include "usb/usb-serial.h" @@ -55,13 +48,10 @@ #define flush() #endif /*---------------------------------------------------------------------------*/ -#undef putchar -#undef puts - #define SLIP_END 0300 /*---------------------------------------------------------------------------*/ int -putchar(int c) +dbg_putchar(int c) { #if DBG_CONF_SLIP_MUX static char debug_frame = 0; @@ -80,7 +70,7 @@ putchar(int c) write_byte(SLIP_END); debug_frame = 0; #endif - dbg_flush(); + flush(); } return c; } @@ -100,18 +90,3 @@ dbg_send_bytes(const unsigned char *s, unsigned int len) return i; } /*---------------------------------------------------------------------------*/ -int -puts(const char *s) -{ - unsigned int i = 0; - - while(s && *s != 0) { - putchar(*s++); - i++; - } - putchar('\n'); - return i; -} -/*---------------------------------------------------------------------------*/ - -/** @} */ diff --git a/arch/cpu/cc2538/dbg.h b/arch/cpu/cc2538/dbg.h deleted file mode 100644 index d5ab51f9d..000000000 --- a/arch/cpu/cc2538/dbg.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/ - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/** - * \addtogroup cc2538 - * @{ - * - * \defgroup cc2538-char-io cc2538 Character I/O - * - * CPU-specific functions for debugging and SLIP I/O - * - * On the cc2538, character I/O can be directed over USB or UART. This is - * controlled by a series of configuration directives: - * - SLIP_ARCH_CONF_USB: Controls the operation of slip-arch. - * - DBG_CONF_USB: Controls all debugging output - * - * Defaults for those defines are set in contiki-conf.h - * @{ - * - * \file - * Header file for the cc2538 Debug I/O module - */ -#ifndef DBG_H_ -#define DBG_H_ - -#include "contiki.h" - -#include "usb/usb-serial.h" -/** - * \brief Print a stream of bytes - * \param seq A pointer to the stream - * \param len The number of bytes to print - * \return The number of printed bytes - * - * This function is an arch-specific implementation required by the dbg-io - * API in cpu/arm/common/dbg-io. It prints a stream of bytes over the - * peripheral used by the platform. - */ -unsigned int dbg_send_bytes(const unsigned char *seq, unsigned int len); - -/** - * \brief Flushes character output - * - * When debugging is sent over USB, this functions causes the USB - * driver to immediately TX the content of output buffers. When - * debugging is over UART, this function does nothing. - * - * There is nothing stopping you from using this macro in your code but - * normally, you won't have to. - */ -#if DBG_CONF_USB -#define dbg_flush() usb_serial_flush() -#else -#define dbg_flush() -#endif - -#endif /* DBG_H_ */ - -/** - * @} - * @} - */ diff --git a/arch/cpu/cc2538/dev/gpio-hal-arch.h b/arch/cpu/cc2538/dev/gpio-hal-arch.h index 0b282c738..25abb3eb4 100644 --- a/arch/cpu/cc2538/dev/gpio-hal-arch.h +++ b/arch/cpu/cc2538/dev/gpio-hal-arch.h @@ -53,6 +53,7 @@ #include /*---------------------------------------------------------------------------*/ #define PIN_TO_PORT(pin) (pin >> 3) +#define PIN_TO_NUM(pin) (pin % 8) #define PIN_TO_PORT_BASE(pin) GPIO_PORT_TO_BASE(PIN_TO_PORT(pin)) /*---------------------------------------------------------------------------*/ #define gpio_hal_arch_interrupt_enable(p) do { \ diff --git a/arch/cpu/cc2538/spi-arch.h b/arch/cpu/cc2538/dev/spi-arch-legacy.h similarity index 97% rename from arch/cpu/cc2538/spi-arch.h rename to arch/cpu/cc2538/dev/spi-arch-legacy.h index 8cbb87a8f..de7a765bb 100644 --- a/arch/cpu/cc2538/spi-arch.h +++ b/arch/cpu/cc2538/dev/spi-arch-legacy.h @@ -78,8 +78,8 @@ * - SPI1_RX_PORT * - SPI1_RX_PIN */ -#ifndef SPI_ARCH_H_ -#define SPI_ARCH_H_ +#ifndef SPI_ARCH_LEGACY_H_ +#define SPI_ARCH_LEGACY_H_ #include "contiki.h" @@ -138,7 +138,7 @@ #define SPI_WAITFOREOTx() SPIX_WAITFOREOTx(SPI_DEFAULT_INSTANCE) #define SPI_WAITFOREORx() SPIX_WAITFOREORx(SPI_DEFAULT_INSTANCE) #ifdef SPI_FLUSH -#error You must include spi-arch.h before spi.h for the CC2538 +#error You must include spi-arch-legacy.h before spi-legacy.h for the CC2538 #else #define SPI_FLUSH() SPIX_FLUSH(SPI_DEFAULT_INSTANCE) #endif @@ -215,7 +215,7 @@ void spix_cs_init(uint8_t port, uint8_t pin); /** @} */ -#endif /* SPI_ARCH_H_ */ +#endif /* SPI_ARCH_LEGACY_H_ */ /** * @} diff --git a/arch/cpu/cc2538/dev/spi-arch.c b/arch/cpu/cc2538/dev/spi-arch.c new file mode 100644 index 000000000..c876e4ed7 --- /dev/null +++ b/arch/cpu/cc2538/dev/spi-arch.c @@ -0,0 +1,355 @@ +/* + * Copyright (c) 2016-2017, Yanzi Networks. + * Copyright (c) 2018, University of Bristol. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include "contiki.h" +#include "reg.h" +#include "dev/spi.h" +#include "gpio-hal-arch.h" +#include "sys/cc.h" +#include "ioc.h" +#include "sys-ctrl.h" +#include "ssi.h" +#include "gpio.h" +#include "sys/log.h" +#include "sys/mutex.h" +/*---------------------------------------------------------------------------*/ +/* Log configuration */ +#define LOG_MODULE "spi-hal-arch" +#define LOG_LEVEL LOG_LEVEL_NONE +/*---------------------------------------------------------------------------*/ +/* Default values for the clock rate divider */ +#ifdef SPI_ARCH_CONF_SPI0_CPRS_CPSDVSR +#define SPI_ARCH_SPI0_CPRS_CPSDVSR SPI_ARCH_CONF_SPI0_CPRS_CPSDVSR +#else +#define SPI_ARCH_SPI0_CPRS_CPSDVSR 2 +#endif + +#ifdef SPI_ARCH_CONF_SPI1_CPRS_CPSDVSR +#define SPI_ARCH_SPI1_CPRS_CPSDVSR SPI_ARCH_CONF_SPI1_CPRS_CPSDVSR +#else +#define SPI_ARCH_SPI1_CPRS_CPSDVSR 2 +#endif + +#if (SPI_ARCH_SPI0_CPRS_CPSDVSR & 1) == 1 || \ + SPI_ARCH_SPI0_CPRS_CPSDVSR < 2 || \ + SPI_ARCH_SPI0_CPRS_CPSDVSR > 254 +#error SPI_ARCH_SPI0_CPRS_CPSDVSR must be an even number between 2 and 254 +#endif + +#if (SPI_ARCH_SPI1_CPRS_CPSDVSR & 1) == 1 || \ + SPI_ARCH_SPI1_CPRS_CPSDVSR < 2 || \ + SPI_ARCH_SPI1_CPRS_CPSDVSR > 254 +#error SPI_ARCH_SPI1_CPRS_CPSDVSR must be an even number between 2 and 254 +#endif +/*---------------------------------------------------------------------------*/ +/* CS set and clear macros */ +#define SPIX_CS_CLR(port, pin) GPIO_CLR_PIN(GPIO_PORT_TO_BASE(port), GPIO_PIN_MASK(pin)) +#define SPIX_CS_SET(port, pin) GPIO_SET_PIN(GPIO_PORT_TO_BASE(port), GPIO_PIN_MASK(pin)) +/*---------------------------------------------------------------------------*/ +/* + * Clock source from which the baud clock is determined for the SSI, according + * to SSI_CC.CS. + */ +#define SSI_SYS_CLOCK SYS_CTRL_SYS_CLOCK +/*---------------------------------------------------------------------------*/ +typedef struct { + uint32_t base; + uint32_t ioc_ssirxd_ssi; + uint32_t ioc_pxx_sel_ssi_clkout; + uint32_t ioc_pxx_sel_ssi_txd; + uint8_t ssi_cprs_cpsdvsr; +} spi_regs_t; +/*---------------------------------------------------------------------------*/ +static const spi_regs_t spi_regs[SSI_INSTANCE_COUNT] = { + { + .base = SSI0_BASE, + .ioc_ssirxd_ssi = IOC_SSIRXD_SSI0, + .ioc_pxx_sel_ssi_clkout = IOC_PXX_SEL_SSI0_CLKOUT, + .ioc_pxx_sel_ssi_txd = IOC_PXX_SEL_SSI0_TXD, + .ssi_cprs_cpsdvsr = SPI_ARCH_SPI0_CPRS_CPSDVSR, + }, { + .base = SSI1_BASE, + .ioc_ssirxd_ssi = IOC_SSIRXD_SSI1, + .ioc_pxx_sel_ssi_clkout = IOC_PXX_SEL_SSI1_CLKOUT, + .ioc_pxx_sel_ssi_txd = IOC_PXX_SEL_SSI1_TXD, + .ssi_cprs_cpsdvsr = SPI_ARCH_SPI1_CPRS_CPSDVSR, + } +}; + +typedef struct spi_locks_s { + mutex_t lock; + spi_device_t *owner; +} spi_locks_t; + +/* One lock per SPI controller */ +spi_locks_t board_spi_locks_spi[SPI_CONTROLLER_COUNT] = { { MUTEX_STATUS_UNLOCKED, NULL } }; + +/*---------------------------------------------------------------------------*/ +static void +spix_wait_tx_ready(spi_device_t *dev) +{ + /* Infinite loop until SR_TNF - Transmit FIFO Not Full */ + while(!(REG(spi_regs[dev->spi_controller].base + SSI_SR) & SSI_SR_TNF)); +} +/*---------------------------------------------------------------------------*/ +static int +spix_read_buf(spi_device_t *dev) +{ + return REG(spi_regs[dev->spi_controller].base + SSI_DR); +} +/*---------------------------------------------------------------------------*/ +static void +spix_write_buf(spi_device_t *dev, int data) +{ + REG(spi_regs[dev->spi_controller].base + SSI_DR) = data; +} +/*---------------------------------------------------------------------------*/ +static void +spix_wait_eotx(spi_device_t *dev) +{ + /* wait until not busy */ + while(REG(spi_regs[dev->spi_controller].base + SSI_SR) & SSI_SR_BSY); +} +/*---------------------------------------------------------------------------*/ +static void +spix_wait_eorx(spi_device_t *dev) +{ + /* wait as long as receive is empty */ + while(!(REG(spi_regs[dev->spi_controller].base + SSI_SR) & SSI_SR_RNE)); +} +/*---------------------------------------------------------------------------*/ +bool +spi_arch_has_lock(spi_device_t *dev) +{ + if(board_spi_locks_spi[dev->spi_controller].owner == dev) { + return true; + } + + return false; +} +/*---------------------------------------------------------------------------*/ +bool +spi_arch_is_bus_locked(spi_device_t *dev) +{ + if(board_spi_locks_spi[dev->spi_controller].lock == MUTEX_STATUS_LOCKED) { + return true; + } + + return false; +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_arch_lock_and_open(spi_device_t *dev) +{ + const spi_regs_t *regs; + uint32_t scr; + uint64_t div; + + uint32_t cs_port = PIN_TO_PORT(dev->pin_spi_cs); + uint32_t cs_pin = PIN_TO_NUM(dev->pin_spi_cs); + + uint32_t clk_port = PIN_TO_PORT(dev->pin_spi_sck); + uint32_t clk_pin = PIN_TO_NUM(dev->pin_spi_sck); + + uint32_t miso_port = PIN_TO_PORT(dev->pin_spi_miso); + uint32_t miso_pin = PIN_TO_NUM(dev->pin_spi_miso); + + uint32_t mosi_port = PIN_TO_PORT(dev->pin_spi_mosi); + uint32_t mosi_pin = PIN_TO_NUM(dev->pin_spi_mosi); + + uint32_t mode = 0; + + /* lock the SPI bus */ + if(mutex_try_lock(&board_spi_locks_spi[dev->spi_controller].lock) == false) { + return SPI_DEV_STATUS_BUS_LOCKED; + } + + board_spi_locks_spi[dev->spi_controller].owner = dev; + + /* Set SPI phase */ + if(dev->spi_pha != 0) { + mode = mode | SSI_CR0_SPH; + } + + /* Set SPI polarity */ + if(dev->spi_pol != 0) { + mode = mode | SSI_CR0_SPO; + } + + /* CS pin configuration */ + GPIO_SOFTWARE_CONTROL(GPIO_PORT_TO_BASE(cs_port), + GPIO_PIN_MASK(cs_pin)); + ioc_set_over(cs_port, cs_pin, IOC_OVERRIDE_DIS); + GPIO_SET_OUTPUT(GPIO_PORT_TO_BASE(cs_port), GPIO_PIN_MASK(cs_pin)); + GPIO_SET_PIN(GPIO_PORT_TO_BASE(cs_port), GPIO_PIN_MASK(cs_pin)); + + regs = &spi_regs[dev->spi_controller]; + + /* SSI Enable */ + REG(SYS_CTRL_RCGCSSI) |= (1 << dev->spi_controller); + + /* Start by disabling the peripheral before configuring it */ + REG(regs->base + SSI_CR1) = 0; + + /* Set the system clock as the SSI clock */ + REG(regs->base + SSI_CC) = 0; + + /* Set the mux correctly to connect the SSI pins to the correct GPIO pins */ + ioc_set_sel(clk_port, clk_pin, regs->ioc_pxx_sel_ssi_clkout); + ioc_set_sel(mosi_port, mosi_pin, regs->ioc_pxx_sel_ssi_txd); + REG(regs->ioc_ssirxd_ssi) = dev->pin_spi_miso; + + /* Put all the SSI gpios into peripheral mode */ + GPIO_PERIPHERAL_CONTROL(GPIO_PORT_TO_BASE(clk_port), + GPIO_PIN_MASK(clk_pin)); + GPIO_PERIPHERAL_CONTROL(GPIO_PORT_TO_BASE(mosi_port), + GPIO_PIN_MASK(mosi_pin)); + GPIO_PERIPHERAL_CONTROL(GPIO_PORT_TO_BASE(miso_port), + GPIO_PIN_MASK(miso_pin)); + + /* Disable any pull ups or the like */ + ioc_set_over(clk_port, clk_pin, IOC_OVERRIDE_DIS); + ioc_set_over(mosi_port, mosi_pin, IOC_OVERRIDE_DIS); + ioc_set_over(miso_port, miso_pin, IOC_OVERRIDE_DIS); + + /* Configure the clock */ + REG(regs->base + SSI_CPSR) = regs->ssi_cprs_cpsdvsr; + + /* Configure the mode */ + REG(regs->base + SSI_CR0) = mode | (0x07); + + /* Configure the SSI serial clock rate */ + if(!dev->spi_bit_rate) { + scr = 255; + } else { + div = (uint64_t)regs->ssi_cprs_cpsdvsr * dev->spi_bit_rate; + scr = (SSI_SYS_CLOCK + div - 1) / div; + scr = MIN(MAX(scr, 1), 256) - 1; + } + REG(regs->base + SSI_CR0) = (REG(regs->base + SSI_CR0) & ~SSI_CR0_SCR_M) | + scr << SSI_CR0_SCR_S; + + /* Enable the SSI */ + REG(regs->base + SSI_CR1) |= SSI_CR1_SSE; + + return SPI_DEV_STATUS_OK; +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_arch_close_and_unlock(spi_device_t *dev) +{ + if(!spi_arch_has_lock(dev)) { + return SPI_DEV_STATUS_BUS_NOT_OWNED; + } + + /* Disable SSI */ + REG(SYS_CTRL_RCGCSSI) &= ~(1 << dev->spi_controller); + + /* Unlock the SPI bus */ + board_spi_locks_spi[dev->spi_controller].owner = NULL; + mutex_unlock(&board_spi_locks_spi[dev->spi_controller].lock); + + return SPI_DEV_STATUS_OK; +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_arch_select(spi_device_t *dev) +{ + + if(!spi_arch_has_lock(dev)) { + return SPI_DEV_STATUS_BUS_NOT_OWNED; + } + + SPIX_CS_CLR(PIN_TO_PORT(dev->pin_spi_cs), PIN_TO_NUM(dev->pin_spi_cs)); + + return SPI_DEV_STATUS_OK; +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_arch_deselect(spi_device_t *dev) +{ + SPIX_CS_SET(PIN_TO_PORT(dev->pin_spi_cs), PIN_TO_NUM(dev->pin_spi_cs)); + + return SPI_DEV_STATUS_OK; +} +/*---------------------------------------------------------------------------*/ +/* Assumes that checking dev and bus is not NULL before calling this */ +spi_status_t +spi_arch_transfer(spi_device_t *dev, + const uint8_t *write_buf, int wlen, + uint8_t *inbuf, int rlen, int ignore_len) +{ + int i; + int totlen; + uint8_t c; + + if(!spi_arch_has_lock(dev)) { + return SPI_DEV_STATUS_BUS_NOT_OWNED; + } + + LOG_DBG("SPI: transfer (r:%d,w:%d) ", rlen, wlen); + + if(write_buf == NULL && wlen > 0) { + return SPI_DEV_STATUS_EINVAL; + } + if(inbuf == NULL && rlen > 0) { + return SPI_DEV_STATUS_EINVAL; + } + + totlen = MAX(rlen + ignore_len, wlen); + + if(totlen == 0) { + /* Nothing to do */ + return SPI_DEV_STATUS_OK; + } + + LOG_DBG_("%c%c%c: %u ", rlen > 0 ? 'R' : '-', wlen > 0 ? 'W' : '-', + ignore_len > 0 ? 'S' : '-', totlen); + + for(i = 0; i < totlen; i++) { + spix_wait_tx_ready(dev); + c = i < wlen ? write_buf[i] : 0; + spix_write_buf(dev, c); + LOG_DBG_("%c%02x->", i < rlen ? ' ' : '#', c); + spix_wait_eotx(dev); + spix_wait_eorx(dev); + c = spix_read_buf(dev); + if(i < rlen) { + inbuf[i] = c; + } + LOG_DBG_("%02x", c); + } + LOG_DBG_("\n"); + + return SPI_DEV_STATUS_OK; +} +/*---------------------------------------------------------------------------*/ diff --git a/arch/cpu/cc2538/dev/spi.c b/arch/cpu/cc2538/dev/spi-legacy.c similarity index 99% rename from arch/cpu/cc2538/dev/spi.c rename to arch/cpu/cc2538/dev/spi-legacy.c index a0ced2dad..0070df6ef 100644 --- a/arch/cpu/cc2538/dev/spi.c +++ b/arch/cpu/cc2538/dev/spi-legacy.c @@ -39,11 +39,11 @@ */ #include "contiki.h" #include "reg.h" -#include "spi-arch.h" +#include "dev/spi-arch-legacy.h" #include "sys/cc.h" #include "dev/ioc.h" #include "dev/sys-ctrl.h" -#include "dev/spi.h" +#include "dev/spi-legacy.h" #include "dev/ssi.h" #include "dev/gpio.h" /*---------------------------------------------------------------------------*/ diff --git a/arch/cpu/cc2538/slip-arch.c b/arch/cpu/cc2538/slip-arch.c index 58aec9f84..dee023a4f 100644 --- a/arch/cpu/cc2538/slip-arch.c +++ b/arch/cpu/cc2538/slip-arch.c @@ -28,21 +28,12 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ -/** - * \addtogroup cc2538-char-io - * @{ - * - * \file - * Arch-specific SLIP functions for the cc2538 - * - * SLIP can be configured to operate over UART or over USB-Serial, depending - * on the value of SLIP_ARCH_CONF_USB - */ +/*---------------------------------------------------------------------------*/ #include "contiki.h" #include "dev/slip.h" #include "dev/uart.h" #include "usb/usb-serial.h" - +/*---------------------------------------------------------------------------*/ #ifndef SLIP_ARCH_CONF_USB #define SLIP_ARCH_CONF_USB 0 #endif @@ -59,10 +50,6 @@ #define SLIP_END 0300 /*---------------------------------------------------------------------------*/ -/** - * \brief Write a byte over SLIP - * \param c the byte - */ void slip_arch_writeb(unsigned char c) { @@ -72,14 +59,9 @@ slip_arch_writeb(unsigned char c) } } /*---------------------------------------------------------------------------*/ -/** - * \brief Initialise the arch-specific SLIP driver - */ void slip_arch_init() { set_input(slip_input_byte); } /*---------------------------------------------------------------------------*/ - -/** @} */ diff --git a/arch/cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx b/arch/cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx index 979d7f5e4..e72954c17 100644 --- a/arch/cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx +++ b/arch/cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx @@ -30,16 +30,17 @@ CONTIKI_CPU_DIRS += . dev rf-core rf-core/api rf-core/ble-hal $(TI_XXWARE_STARTU ### CPU-dependent source files CONTIKI_CPU_SOURCEFILES += clock.c rtimer-arch.c soc-rtc.c uart.c CONTIKI_CPU_SOURCEFILES += contiki-watchdog.c aux-ctrl.c -CONTIKI_CPU_SOURCEFILES += putchar.c ieee-addr.c batmon-sensor.c adc-sensor.c +CONTIKI_CPU_SOURCEFILES += dbg.c ieee-addr.c batmon-sensor.c adc-sensor.c CONTIKI_CPU_SOURCEFILES += slip-arch.c slip.c cc26xx-uart.c lpm.c CONTIKI_CPU_SOURCEFILES += gpio-interrupt.c gpio-hal-arch.c oscillators.c CONTIKI_CPU_SOURCEFILES += rf-core.c rf-ble.c ieee-mode.c CONTIKI_CPU_SOURCEFILES += ble-cc2650.c ble-hal-cc26xx.c ble-addr.c rf-ble-cmd.c CONTIKI_CPU_SOURCEFILES += random.c soc-trng.c int-master.c +CONTIKI_CPU_SOURCEFILES += spi-arch.c -DEBUG_IO_SOURCEFILES += dbg-printf.c dbg-snprintf.c dbg-sprintf.c strformat.c +MODULES += os/lib/dbg-io -CONTIKI_SOURCEFILES += $(CONTIKI_CPU_SOURCEFILES) $(DEBUG_IO_SOURCEFILES) +CONTIKI_SOURCEFILES += $(CONTIKI_CPU_SOURCEFILES) CPU_START_SOURCEFILES += fault-handlers.c $(TI_XXWARE_STARTUP_SRCS) diff --git a/arch/cpu/cc26xx-cc13xx/cc13xx-cc26xx-def.h b/arch/cpu/cc26xx-cc13xx/cc13xx-cc26xx-def.h index 7b914ac1e..15db03448 100644 --- a/arch/cpu/cc26xx-cc13xx/cc13xx-cc26xx-def.h +++ b/arch/cpu/cc26xx-cc13xx/cc13xx-cc26xx-def.h @@ -104,5 +104,7 @@ /*---------------------------------------------------------------------------*/ #define GPIO_HAL_CONF_ARCH_SW_TOGGLE 0 /*---------------------------------------------------------------------------*/ +#define SPI_CONF_CONTROLLER_COUNT 2 +/*---------------------------------------------------------------------------*/ #endif /* CC13XX_CC26XX_DEF_H_ */ /*---------------------------------------------------------------------------*/ diff --git a/arch/cpu/cc26xx-cc13xx/putchar.c b/arch/cpu/cc26xx-cc13xx/dbg.c similarity index 84% rename from arch/cpu/cc26xx-cc13xx/putchar.c rename to arch/cpu/cc26xx-cc13xx/dbg.c index 7cbd1901a..bf03aade4 100644 --- a/arch/cpu/cc26xx-cc13xx/putchar.c +++ b/arch/cpu/cc26xx-cc13xx/dbg.c @@ -34,33 +34,12 @@ #include /*---------------------------------------------------------------------------*/ int -putchar(int c) +dbg_putchar(int c) { cc26xx_uart_write_byte(c); return c; } /*---------------------------------------------------------------------------*/ -int -puts(const char *str) -{ - int i; - if(str == NULL) { - return 0; - } - for(i = 0; i < strlen(str); i++) { - cc26xx_uart_write_byte(str[i]); - } - cc26xx_uart_write_byte('\n'); - - /* - * Wait for the line to go out. This is to prevent garbage when used between - * UART on/off cycles - */ - while(cc26xx_uart_busy() == UART_BUSY); - - return i; -} -/*---------------------------------------------------------------------------*/ unsigned int dbg_send_bytes(const unsigned char *s, unsigned int len) { diff --git a/arch/cpu/cc26xx-cc13xx/dev/spi-arch.c b/arch/cpu/cc26xx-cc13xx/dev/spi-arch.c new file mode 100644 index 000000000..d274a1d52 --- /dev/null +++ b/arch/cpu/cc26xx-cc13xx/dev/spi-arch.c @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2017, University of Bristol - http://www.bristol.ac.uk/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "contiki.h" +#include "ti-lib.h" +#include "dev/spi.h" +#include "sys/mutex.h" + +#include +#include + +typedef struct spi_locks_s { + mutex_t lock; + spi_device_t *owner; +} spi_locks_t; + +/* One lock per SPI controller */ +spi_locks_t board_spi_locks_spi[SPI_CONTROLLER_COUNT] = { { MUTEX_STATUS_UNLOCKED, NULL } }; + +/*---------------------------------------------------------------------------*/ +/* Arch-specific properties of each SPI controller */ +typedef struct board_spi_controller_s { + uint32_t ssi_base; + uint32_t power_domain; + uint32_t prcm_periph; + uint32_t ssi_clkgr_clk_en; +} board_spi_controller_t; + +static const board_spi_controller_t spi_controller[SPI_CONTROLLER_COUNT] = { + { + .ssi_base = SSI0_BASE, + .power_domain = PRCM_DOMAIN_SERIAL, + .prcm_periph = PRCM_PERIPH_SSI0, + .ssi_clkgr_clk_en = PRCM_SSICLKGR_CLK_EN_SSI0 + }, + { + .ssi_base = SSI1_BASE, + .power_domain = PRCM_DOMAIN_PERIPH, + .prcm_periph = PRCM_PERIPH_SSI1, + .ssi_clkgr_clk_en = PRCM_SSICLKGR_CLK_EN_SSI1 + } +}; +/*---------------------------------------------------------------------------*/ +bool +spi_arch_has_lock(spi_device_t *dev) +{ + if(board_spi_locks_spi[dev->spi_controller].owner == dev) { + return true; + } + + return false; +} +/*---------------------------------------------------------------------------*/ +bool +spi_arch_is_bus_locked(spi_device_t *dev) +{ + if(board_spi_locks_spi[dev->spi_controller].lock == MUTEX_STATUS_LOCKED) { + return true; + } + + return false; +} +/*---------------------------------------------------------------------------*/ +static uint32_t +get_mode(spi_device_t *dev) +{ + /* Select the correct SPI mode */ + if(dev->spi_pha == 0 && dev->spi_pol == 0) { + return SSI_FRF_MOTO_MODE_0; + } else if(dev->spi_pha != 0 && dev->spi_pol == 0) { + return SSI_FRF_MOTO_MODE_1; + } else if(dev->spi_pha == 0 && dev->spi_pol != 0) { + return SSI_FRF_MOTO_MODE_2; + } else { + return SSI_FRF_MOTO_MODE_3; + } +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_arch_lock_and_open(spi_device_t *dev) +{ + uint32_t c; + + /* Lock the SPI bus */ + if(mutex_try_lock(&board_spi_locks_spi[dev->spi_controller].lock) == false) { + return SPI_DEV_STATUS_BUS_LOCKED; + } + + board_spi_locks_spi[dev->spi_controller].owner = dev; + + /* CS pin configuration */ + ti_lib_ioc_pin_type_gpio_output(dev->pin_spi_cs); + + /* First, make sure the SERIAL PD is on */ + ti_lib_prcm_power_domain_on(spi_controller[dev->spi_controller].power_domain); + while((ti_lib_prcm_power_domain_status(spi_controller[dev->spi_controller].power_domain) + != PRCM_DOMAIN_POWER_ON)) ; + + /* Enable clock in active mode */ + ti_lib_rom_prcm_peripheral_run_enable(spi_controller[dev->spi_controller].prcm_periph); + ti_lib_prcm_load_set(); + while(!ti_lib_prcm_load_get()) ; + + /* SPI configuration */ + ti_lib_ssi_int_disable(spi_controller[dev->spi_controller].ssi_base, SSI_RXOR | SSI_RXFF | SSI_RXTO | SSI_TXFF); + ti_lib_ssi_int_clear(spi_controller[dev->spi_controller].ssi_base, SSI_RXOR | SSI_RXTO); + ti_lib_rom_ssi_config_set_exp_clk(spi_controller[dev->spi_controller].ssi_base, ti_lib_sys_ctrl_clock_get(), + get_mode(dev), SSI_MODE_MASTER, dev->spi_bit_rate, 8); + ti_lib_rom_ioc_pin_type_ssi_master(spi_controller[dev->spi_controller].ssi_base, dev->pin_spi_miso, + dev->pin_spi_mosi, IOID_UNUSED, dev->pin_spi_sck); + + ti_lib_ssi_enable(spi_controller[dev->spi_controller].ssi_base); + + /* Get rid of residual data from SSI port */ + while(ti_lib_ssi_data_get_non_blocking(spi_controller[dev->spi_controller].ssi_base, &c)) ; + + return SPI_DEV_STATUS_OK; +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_arch_close_and_unlock(spi_device_t *dev) +{ + if(!spi_arch_has_lock(dev)) { + return SPI_DEV_STATUS_BUS_NOT_OWNED; + } + + /* Power down SSI */ + ti_lib_rom_prcm_peripheral_run_disable(spi_controller[dev->spi_controller].prcm_periph); + ti_lib_prcm_load_set(); + while(!ti_lib_prcm_load_get()) ; + + /* Restore pins to a low-consumption state */ + ti_lib_ioc_pin_type_gpio_input(dev->pin_spi_miso); + ti_lib_ioc_io_port_pull_set(dev->pin_spi_miso, IOC_IOPULL_DOWN); + + ti_lib_ioc_pin_type_gpio_input(dev->pin_spi_mosi); + ti_lib_ioc_io_port_pull_set(dev->pin_spi_mosi, IOC_IOPULL_DOWN); + + ti_lib_ioc_pin_type_gpio_input(dev->pin_spi_sck); + ti_lib_ioc_io_port_pull_set(dev->pin_spi_sck, IOC_IOPULL_DOWN); + + /* Unlock the SPI bus */ + board_spi_locks_spi[dev->spi_controller].owner = NULL; + mutex_unlock(&board_spi_locks_spi[dev->spi_controller].lock); + + return SPI_DEV_STATUS_OK; +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_arch_transfer(spi_device_t *dev, + const uint8_t *write_buf, int wlen, + uint8_t *inbuf, int rlen, int ignore_len) +{ + int i; + int totlen; + uint32_t c; + + if(!spi_arch_has_lock(dev)) { + return SPI_DEV_STATUS_BUS_NOT_OWNED; + } + + if(ti_lib_prcm_power_domain_status(spi_controller[dev->spi_controller].power_domain) + != PRCM_DOMAIN_POWER_ON) { + return SPI_DEV_STATUS_CLOSED; + } + + /* Then check the 'run mode' clock gate */ + if(!(HWREG(PRCM_BASE + PRCM_O_SSICLKGR) & spi_controller[dev->spi_controller].ssi_clkgr_clk_en)) { + return SPI_DEV_STATUS_CLOSED; + } + + totlen = MAX(rlen + ignore_len, wlen); + + if(totlen == 0) { + /* Nothing to do */ + return SPI_DEV_STATUS_OK; + } + + for(i = 0; i < totlen; i++) { + c = i < wlen ? write_buf[i] : 0; + ti_lib_ssi_data_put(spi_controller[dev->spi_controller].ssi_base, (uint8_t)c); + ti_lib_rom_ssi_data_get(spi_controller[dev->spi_controller].ssi_base, &c); + if(i < rlen) { + inbuf[i] = (uint8_t)c; + } + } + + while(ti_lib_rom_ssi_data_get_non_blocking(spi_controller[dev->spi_controller].ssi_base, &c)) ; + + return SPI_DEV_STATUS_OK; +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_arch_select(spi_device_t *dev) +{ + + if(!spi_arch_has_lock(dev)) { + return SPI_DEV_STATUS_BUS_NOT_OWNED; + } + + ti_lib_gpio_clear_dio(dev->pin_spi_cs); + + return SPI_DEV_STATUS_OK; +} +spi_status_t +spi_arch_deselect(spi_device_t *dev) +{ + ti_lib_gpio_set_dio(dev->pin_spi_cs); + + return SPI_DEV_STATUS_OK; +} diff --git a/arch/cpu/cc26xx-cc13xx/slip-arch.c b/arch/cpu/cc26xx-cc13xx/slip-arch.c index 6c6914363..f4141e11d 100644 --- a/arch/cpu/cc26xx-cc13xx/slip-arch.c +++ b/arch/cpu/cc26xx-cc13xx/slip-arch.c @@ -29,31 +29,16 @@ * OF THE POSSIBILITY OF SUCH DAMAGE. */ /*---------------------------------------------------------------------------*/ -/** - * \addtogroup cc26xx-char-io - * @{ - * - * \file - * Arch-specific SLIP functions for the CC13xx/CC26xx - */ -/*---------------------------------------------------------------------------*/ #include "contiki.h" #include "dev/cc26xx-uart.h" #include "dev/slip.h" /*---------------------------------------------------------------------------*/ -/** - * \brief Write a byte over SLIP - * \param c the byte - */ void slip_arch_writeb(unsigned char c) { cc26xx_uart_write_byte(c); } /*---------------------------------------------------------------------------*/ -/** - * \brief Initialise the arch-specific SLIP driver - */ void slip_arch_init() { @@ -64,5 +49,3 @@ slip_arch_init() cc26xx_uart_set_input(slip_input_byte); } /*---------------------------------------------------------------------------*/ - -/** @} */ diff --git a/arch/cpu/msp430/Makefile.msp430 b/arch/cpu/msp430/Makefile.msp430 index ec8c33664..841e11285 100644 --- a/arch/cpu/msp430/Makefile.msp430 +++ b/arch/cpu/msp430/Makefile.msp430 @@ -75,7 +75,7 @@ CFLAGSNO = --dlib_config "$(IAR_PATH)/LIB/DLIB/dl430xlfn.h" $(CFLAGSWERROR) # CFLAGSNO = --dlib_config $(IAR_PATH)/LIB/DLIB/dl430xlfn.h -Ohz --multiplier=32 --multiplier_location=4C0 --hw_workaround=CPU40 --core=430X $(CFLAGSWERROR) --data_model large --double=32 endif -LDFLAGSNO += -B -l contiki-$(TARGET).map -s __program_start +LDFLAGSNO += -B -l $(CONTIKI_NG_PROJECT_MAP) -s __program_start # Stack and heap size in hex ifndef IAR_STACK_SIZE IAR_STACK_SIZE=300 @@ -165,7 +165,7 @@ ifndef CFLAGSNO CFLAGSNO = -Wall -mmcu=$(CC_MCU) $(CFLAGSWERROR) endif CFLAGS += -Os -fno-strict-aliasing -LDFLAGS += -mmcu=$(CC_MCU) -Wl,-Map=contiki-$(TARGET).map +LDFLAGS += -mmcu=$(CC_MCU) -Wl,-Map=$(CONTIKI_NG_PROJECT_MAP) ### These flags can reduce the code size and RAM usage with up to 10% SMALL ?= 1 @@ -184,6 +184,9 @@ CFLAGS += $(CFLAGSNO) PROJECT_OBJECTFILES += ${addprefix $(OBJECTDIR)/,$(CONTIKI_TARGET_MAIN:.c=.o)} +### CPU-dependent cleanup files +CLEAN += *.firmware *.ihex + ### Compilation rules %-stripped.o: %.c @@ -197,7 +200,7 @@ PROJECT_OBJECTFILES += ${addprefix $(OBJECTDIR)/,$(CONTIKI_TARGET_MAIN:.c=.o)} mv $< $@ ifdef IAR -%.ihex: %.o $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a +%.ihex: %.o $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) $(CONTIKI_NG_TARGET_LIB) $(LD) $(LDFLAGSNO) -Fintel-extended $(TARGET_STARTFILES) ${filter-out %.a,$^} ${filter %.a,$^} $(TARGET_LIBFILES) -o $@ else %.ihex: %.$(TARGET) @@ -220,8 +223,8 @@ $(COOJA_PATH)/mspsim/mspsim.jar: $(COOJA_PATH)/mspsim/build.xml %.mspsim: %.${TARGET} ${COOJA_PATH}/mspsim/mspsim.jar java -jar ${COOJA_PATH}/mspsim/mspsim.jar -platform=${TARGET} $< -mspsim-maptable: contiki-${TARGET}.map - java -classpath ${COOJA_PATH}/mspsim/mspsim.jar se.sics.mspsim.util.MapTable $< +%.mspsim-maptable: %.$(TARGET) + java -classpath ${COOJA_PATH}/mspsim/mspsim.jar se.sics.mspsim.util.MapTable $(CONTIKI_NG_PROJECT_MAP) core-labels.o: core.${TARGET} ${CONTIKI}/tools/msp430-make-labels core.${TARGET} > core-labels.S diff --git a/arch/cpu/msp430/cc2420-arch-sfd.c b/arch/cpu/msp430/cc2420-arch-sfd.c index 6ab9a1365..d1db81ce0 100644 --- a/arch/cpu/msp430/cc2420-arch-sfd.c +++ b/arch/cpu/msp430/cc2420-arch-sfd.c @@ -29,7 +29,7 @@ */ #include "contiki.h" -#include "dev/spi.h" +#include "dev/spi-legacy.h" #include "cc2420.h" #include "isr_compat.h" diff --git a/arch/cpu/msp430/cc2420-arch.c b/arch/cpu/msp430/cc2420-arch.c index 8a6f0234d..c35ce949f 100644 --- a/arch/cpu/msp430/cc2420-arch.c +++ b/arch/cpu/msp430/cc2420-arch.c @@ -31,7 +31,7 @@ #include "contiki.h" #include "contiki-net.h" -#include "dev/spi.h" +#include "dev/spi-legacy.h" #include "cc2420.h" #include "isr_compat.h" diff --git a/arch/cpu/msp430/cc2520-arch-sfd.c b/arch/cpu/msp430/cc2520-arch-sfd.c index e2671ca58..dc0561f94 100644 --- a/arch/cpu/msp430/cc2520-arch-sfd.c +++ b/arch/cpu/msp430/cc2520-arch-sfd.c @@ -28,7 +28,7 @@ */ #include "contiki.h" -#include "dev/spi.h" +#include "dev/spi-legacy.h" #include "dev/cc2520/cc2520.h" #include "isr_compat.h" diff --git a/arch/cpu/msp430/cc2520-arch.c b/arch/cpu/msp430/cc2520-arch.c index 855f8bc7e..e63735271 100644 --- a/arch/cpu/msp430/cc2520-arch.c +++ b/arch/cpu/msp430/cc2520-arch.c @@ -30,7 +30,7 @@ #include "contiki.h" #include "contiki-net.h" -#include "dev/spi.h" +#include "dev/spi-legacy.h" #include "dev/cc2520/cc2520.h" #include "isr_compat.h" diff --git a/arch/cpu/msp430/f1xxx/spi.c b/arch/cpu/msp430/f1xxx/spi-legacy.c similarity index 100% rename from arch/cpu/msp430/f1xxx/spi.c rename to arch/cpu/msp430/f1xxx/spi-legacy.c diff --git a/arch/cpu/msp430/f2xxx/spi.c b/arch/cpu/msp430/f2xxx/spi-legacy.c similarity index 100% rename from arch/cpu/msp430/f2xxx/spi.c rename to arch/cpu/msp430/f2xxx/spi-legacy.c diff --git a/arch/cpu/msp430/f5xxx/spi.c b/arch/cpu/msp430/f5xxx/spi-legacy.c similarity index 100% rename from arch/cpu/msp430/f5xxx/spi.c rename to arch/cpu/msp430/f5xxx/spi-legacy.c diff --git a/arch/cpu/native/Makefile.native b/arch/cpu/native/Makefile.native index 90a784e34..146af3e72 100644 --- a/arch/cpu/native/Makefile.native +++ b/arch/cpu/native/Makefile.native @@ -20,12 +20,12 @@ CFLAGSNO = -Wall -g -I/usr/local/include $(CFLAGSWERROR) CFLAGS += $(CFLAGSNO) ifeq ($(HOST_OS),Darwin) -AROPTS = -r -LDFLAGS += -Wl,-flat_namespace +AROPTS = -rc +LDFLAGS += -Wl,-flat_namespace,-map,$(CONTIKI_NG_PROJECT_MAP) CFLAGS += -DHAVE_SNPRINTF=1 -U__ASSERT_USE_STDERR else ifeq ($(HOST_OS),Linux) -LDFLAGS += -Wl,-Map=contiki-$(TARGET).map,-export-dynamic +LDFLAGS += -Wl,-Map=$(CONTIKI_NG_PROJECT_MAP),-export-dynamic endif endif diff --git a/arch/cpu/nrf52832/Makefile.nrf52832 b/arch/cpu/nrf52832/Makefile.nrf52832 index c2bdbbf81..3765484d8 100644 --- a/arch/cpu/nrf52832/Makefile.nrf52832 +++ b/arch/cpu/nrf52832/Makefile.nrf52832 @@ -54,7 +54,7 @@ remduplicates = $(strip $(if $1,$(firstword $1) $(call remduplicates,$(filter-ou CONTIKI_CPU_DIRS += . dev ble #compat ### CPU-dependent source files -CONTIKI_CPU_SOURCEFILES += clock.c rtimer-arch.c uart0.c putchar.c watchdog.c +CONTIKI_CPU_SOURCEFILES += clock.c rtimer-arch.c uart0.c dbg.c watchdog.c CONTIKI_CPU_SOURCEFILES += int-master.c ifneq ($(NRF52_WITHOUT_SOFTDEVICE),1) @@ -139,7 +139,7 @@ CFLAGS += -ggdb CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 # keep every function in separate section. This will allow linker to dump unused functions -LDFLAGS += -Xlinker -Map=$(@:.elf=-$(TARGET).map) +LDFLAGS += -Xlinker -Map=$(CONTIKI_NG_PROJECT_MAP) LDFLAGS += -mabi=aapcs -L $(TEMPLATE_PATH) -T$(LINKER_SCRIPT) LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 # let linker to dump unused sections @@ -182,7 +182,7 @@ nrf52832.a: $(OBJECTS) # Assemble files $(OBJECT_DIRECTORY)/%.o: %.s - @echo Compiling file: $(notdir $<) + $(TRACE_CC) $(Q)$(CC) $(ASMFLAGS) $(addprefix -I$(NRF52_SDK_ROOT)/, $(INC_PATHS)) -c -o $@ $< %.jlink: diff --git a/arch/platform/nrf52dk/dbg-io/dbg.c b/arch/cpu/nrf52832/dbg.c similarity index 94% rename from arch/platform/nrf52dk/dbg-io/dbg.c rename to arch/cpu/nrf52832/dbg.c index db9bb63c0..8f7be5cfc 100644 --- a/arch/platform/nrf52dk/dbg-io/dbg.c +++ b/arch/cpu/nrf52832/dbg.c @@ -27,16 +27,12 @@ * SUCH DAMAGE. * */ - /** - * \addtogroup nrf52dk - * @{ - * - * \addtogroup nrf52dk-dbg-io Debug IO over UART + * \addtogroup nrf52832 * @{ * * \file - * Function implementations for debug io module. + * Hardware specific implementation of putchar() and puts() functions. * \author * Wojciech Bober * diff --git a/arch/cpu/nrf52832/putchar.c b/arch/cpu/nrf52832/putchar.c deleted file mode 100644 index c4163ba3d..000000000 --- a/arch/cpu/nrf52832/putchar.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2015, Nordic Semiconductor - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ -/** - * \addtogroup nrf52832 - * @{ - * - * \file - * Hardware specific implementation of putchar() and puts() functions. - * \author - * Wojciech Bober - * - */ -/*---------------------------------------------------------------------------*/ -#include -#include "dev/uart0.h" -/*---------------------------------------------------------------------------*/ -int -putchar(int c) -{ - uart0_writeb(c); - return c; -} -/*---------------------------------------------------------------------------*/ -int -puts(const char *str) -{ - int i; - - if (str == NULL) { - return 0; - } - - for (i = 0; i < strlen(str); i++) { - uart0_writeb(str[i]); - } - - uart0_writeb('\n'); - return i; -} -/*---------------------------------------------------------------------------*/ -/** - * @} - */ diff --git a/arch/dev/cc2420/cc2420.c b/arch/dev/cc2420/cc2420.c index 00ec64675..9310ec9e4 100644 --- a/arch/dev/cc2420/cc2420.c +++ b/arch/dev/cc2420/cc2420.c @@ -39,7 +39,7 @@ #include "sys/energest.h" #include "dev/leds.h" -#include "dev/spi.h" +#include "dev/spi-legacy.h" #include "cc2420.h" #include "cc2420_const.h" diff --git a/arch/dev/cc2420/cc2420.h b/arch/dev/cc2420/cc2420.h index 74b641ad6..a030632a6 100644 --- a/arch/dev/cc2420/cc2420.h +++ b/arch/dev/cc2420/cc2420.h @@ -43,7 +43,7 @@ #define CC2420_H_ #include "contiki.h" -#include "dev/spi.h" +#include "dev/spi-legacy.h" #include "dev/radio.h" #include "cc2420_const.h" #include "lib/aes-128.h" diff --git a/arch/dev/ext-flash/README.md b/arch/dev/ext-flash/README.md new file mode 100644 index 000000000..a16fb9c49 --- /dev/null +++ b/arch/dev/ext-flash/README.md @@ -0,0 +1,11 @@ +# Ext-flash Driver + +This is a generic driver for external SPI flash memories. It has been tested with the following parts: +- Winbond W25X20CL +- Winbond W25X40CL +- Macronix MX25R8035F +- Macronix MX25R1635F +- Macronix MX25R6435F +- Macronix MX25U6435F + +These parts have identical instruction sets; only the manufacturer and device ID differ, which must be specified in `board.h`. \ No newline at end of file diff --git a/arch/platform/srf06-cc26xx/common/ext-flash.c b/arch/dev/ext-flash/ext-flash.c similarity index 55% rename from arch/platform/srf06-cc26xx/common/ext-flash.c rename to arch/dev/ext-flash/ext-flash.c index 5631297ac..547ec062c 100644 --- a/arch/platform/srf06-cc26xx/common/ext-flash.c +++ b/arch/dev/ext-flash/ext-flash.c @@ -38,12 +38,34 @@ /*---------------------------------------------------------------------------*/ #include "contiki.h" #include "ext-flash.h" -#include "ti-lib.h" -#include "board-spi.h" +#include "dev/spi.h" +#include "gpio-hal.h" +#include "sys/log.h" #include #include /*---------------------------------------------------------------------------*/ +#ifndef EXT_FLASH_SPI_CONTROLLER + +#define EXT_FLASH_SPI_CONTROLLER 0xFF /* No controller */ + +#define EXT_FLASH_SPI_PIN_SCK GPIO_HAL_PIN_UNKNOWN +#define EXT_FLASH_SPI_PIN_MOSI GPIO_HAL_PIN_UNKNOWN +#define EXT_FLASH_SPI_PIN_MISO GPIO_HAL_PIN_UNKNOWN +#define EXT_FLASH_SPI_PIN_CS GPIO_HAL_PIN_UNKNOWN + +#define EXT_FLASH_DEVICE_ID 0xFF +#define EXT_FLASH_MID 0xFF + +#define EXT_FLASH_PROGRAM_PAGE_SIZE 256 +#define EXT_FLASH_ERASE_SECTOR_SIZE 4096 + +#endif /* EXT_FLASH_SPI_CONTROLLER */ +/*---------------------------------------------------------------------------*/ +/* Log configuration */ +#define LOG_MODULE "ext-flash" +#define LOG_LEVEL LOG_LEVEL_NONE +/*---------------------------------------------------------------------------*/ /* Instruction codes */ #define BLS_CODE_PROGRAM 0x02 /**< Page Program */ @@ -72,38 +94,51 @@ #define BLS_STATUS_BIT_BUSY 0x01 /**< Busy bit of the status register */ /*---------------------------------------------------------------------------*/ -/* Part specific constants */ -#define BLS_DEVICE_ID_W25X20CL 0x11 -#define BLS_DEVICE_ID_W25X40CL 0x12 -#define BLS_DEVICE_ID_MX25R8035F 0x14 -#define BLS_DEVICE_ID_MX25R1635F 0x15 - -#define BLS_WINBOND_MID 0xEF -#define BLS_MACRONIX_MID 0xC2 - -#define BLS_PROGRAM_PAGE_SIZE 256 -#define BLS_ERASE_SECTOR_SIZE 4096 -/*---------------------------------------------------------------------------*/ +#define VERIFY_PART_LOCKED -2 #define VERIFY_PART_ERROR -1 #define VERIFY_PART_POWERED_DOWN 0 #define VERIFY_PART_OK 1 /*---------------------------------------------------------------------------*/ +static spi_device_t flash_spi_configuration_default = { + .spi_controller = EXT_FLASH_SPI_CONTROLLER, + .pin_spi_sck = EXT_FLASH_SPI_PIN_SCK, + .pin_spi_miso = EXT_FLASH_SPI_PIN_MISO, + .pin_spi_mosi = EXT_FLASH_SPI_PIN_MOSI, + .pin_spi_cs = EXT_FLASH_SPI_PIN_CS, + .spi_bit_rate = 4000000, + .spi_pha = 0, + .spi_pol = 0 +}; +/*---------------------------------------------------------------------------*/ +/** + * Get spi configuration, return default configuration if NULL + */ +static spi_device_t* +get_spi_conf(spi_device_t *conf) { + if(conf == NULL) { + return &flash_spi_configuration_default; + } + return conf; +}/*---------------------------------------------------------------------------*/ /** * Clear external flash CSN line */ -static void -select_on_bus(void) +static bool +select_on_bus(spi_device_t *flash_spi_configuration) { - ti_lib_gpio_clear_dio(BOARD_IOID_FLASH_CS); + if(spi_select(flash_spi_configuration) == SPI_DEV_STATUS_OK) { + return true; + } + return false; } /*---------------------------------------------------------------------------*/ /** * Set external flash CSN line */ static void -deselect(void) +deselect(spi_device_t *flash_spi_configuration) { - ti_lib_gpio_set_dio(BOARD_IOID_FLASH_CS); + spi_deselect(flash_spi_configuration); } /*---------------------------------------------------------------------------*/ /** @@ -111,20 +146,19 @@ deselect(void) * \return True when successful. */ static bool -wait_ready(void) +wait_ready(spi_device_t *flash_spi_configuration) { bool ret; const uint8_t wbuf[1] = { BLS_CODE_READ_STATUS }; - select_on_bus(); + if(select_on_bus(flash_spi_configuration) == false) { + return false; + } - /* Throw away all garbages */ - board_spi_flush(); + ret = spi_write(flash_spi_configuration, wbuf, sizeof(wbuf)); - ret = board_spi_write(wbuf, sizeof(wbuf)); - - if(ret == false) { - deselect(); + if(ret != SPI_DEV_STATUS_OK) { + deselect(flash_spi_configuration); return false; } @@ -135,19 +169,20 @@ wait_ready(void) * Thread could have yielded while waiting for flash * erase/program to complete. */ - ret = board_spi_read(&buf, sizeof(buf)); + ret = spi_read(flash_spi_configuration, &buf, sizeof(buf)); - if(ret == false) { + if(ret != SPI_DEV_STATUS_OK) { /* Error */ - deselect(); + deselect(flash_spi_configuration); return false; } + if(!(buf & BLS_STATUS_BIT_BUSY)) { /* Now ready */ break; } } - deselect(); + deselect(flash_spi_configuration); return true; } /*---------------------------------------------------------------------------*/ @@ -159,32 +194,30 @@ wait_ready(void) * was powered down */ static uint8_t -verify_part(void) +verify_part(spi_device_t *flash_spi_configuration) { const uint8_t wbuf[] = { BLS_CODE_MDID, 0xFF, 0xFF, 0x00 }; uint8_t rbuf[2] = { 0, 0 }; bool ret; - select_on_bus(); + if(select_on_bus(flash_spi_configuration) == false) { + return VERIFY_PART_LOCKED; + } - ret = board_spi_write(wbuf, sizeof(wbuf)); - - if(ret == false) { - deselect(); + if(spi_write(flash_spi_configuration, wbuf, sizeof(wbuf)) != SPI_DEV_STATUS_OK) { + deselect(flash_spi_configuration); return VERIFY_PART_ERROR; } - ret = board_spi_read(rbuf, sizeof(rbuf)); - deselect(); - - if(ret == false) { + ret = spi_read(flash_spi_configuration, rbuf, sizeof(rbuf)); + deselect(flash_spi_configuration); + if(ret != SPI_DEV_STATUS_OK) { return VERIFY_PART_ERROR; } - if((rbuf[0] != BLS_WINBOND_MID && rbuf[0] != BLS_MACRONIX_MID) || - (rbuf[1] != BLS_DEVICE_ID_W25X20CL && rbuf[1] != BLS_DEVICE_ID_W25X40CL - && rbuf[1] != BLS_DEVICE_ID_MX25R8035F - && rbuf[1] != BLS_DEVICE_ID_MX25R1635F)) { + LOG_DBG("Verify: %02x %02x\n", rbuf[0], rbuf[1]); + + if(rbuf[0] != EXT_FLASH_MID || rbuf[1] != EXT_FLASH_DEVICE_ID) { return VERIFY_PART_POWERED_DOWN; } return VERIFY_PART_OK; @@ -194,34 +227,41 @@ verify_part(void) * \brief Put the device in power save mode. No access to data; only * the status register is accessible. */ -static void -power_down(void) +static bool +power_down(spi_device_t *flash_spi_configuration) { uint8_t cmd; uint8_t i; /* First, wait for the device to be ready */ - if(wait_ready() == false) { + if(wait_ready(flash_spi_configuration) == false) { /* Entering here will leave the device in standby instead of powerdown */ - return; + return false; } cmd = BLS_CODE_PD; - select_on_bus(); - board_spi_write(&cmd, sizeof(cmd)); - deselect(); + if(select_on_bus(flash_spi_configuration) == false) { + return false; + } + + if(spi_write_byte(flash_spi_configuration, cmd) != SPI_DEV_STATUS_OK) { + deselect(flash_spi_configuration); + return false; + } + deselect(flash_spi_configuration); i = 0; while(i < 10) { - if(verify_part() == VERIFY_PART_POWERED_DOWN) { + if(verify_part(flash_spi_configuration) == VERIFY_PART_POWERED_DOWN) { /* Device is powered down */ - return; + return true; } i++; } /* Should not be required */ - deselect(); + deselect(flash_spi_configuration); + return false; } /*---------------------------------------------------------------------------*/ /** @@ -229,20 +269,23 @@ power_down(void) * \return True if the command was written successfully */ static bool -power_standby(void) +power_standby(spi_device_t *flash_spi_configuration) { uint8_t cmd; bool success; cmd = BLS_CODE_RPD; - select_on_bus(); - success = board_spi_write(&cmd, sizeof(cmd)); - - if(success) { - success = wait_ready() == true ? true : false; + if(select_on_bus(flash_spi_configuration) == false) { + return false; } - deselect(); + success = (spi_write(flash_spi_configuration, &cmd, sizeof(cmd)) == SPI_DEV_STATUS_OK); + + if(success) { + success = wait_ready(flash_spi_configuration) == true ? true : false; + } + + deselect(flash_spi_configuration); return success; } @@ -252,14 +295,17 @@ power_standby(void) * \return True when successful. */ static bool -write_enable(void) +write_enable(spi_device_t *flash_spi_configuration) { bool ret; const uint8_t wbuf[] = { BLS_CODE_WRITE_ENABLE }; - select_on_bus(); - ret = board_spi_write(wbuf, sizeof(wbuf)); - deselect(); + if(select_on_bus(flash_spi_configuration) == false) { + return false; + } + + ret = (spi_write(flash_spi_configuration, wbuf, sizeof(wbuf)) == SPI_DEV_STATUS_OK); + deselect(flash_spi_configuration); if(ret == false) { return false; @@ -268,39 +314,66 @@ write_enable(void) } /*---------------------------------------------------------------------------*/ bool -ext_flash_open() +ext_flash_open(spi_device_t *conf) { - board_spi_open(4000000, BOARD_IOID_SPI_CLK_FLASH); + spi_device_t *flash_spi_configuration; - /* GPIO pin configuration */ - ti_lib_ioc_pin_type_gpio_output(BOARD_IOID_FLASH_CS); + flash_spi_configuration = get_spi_conf(conf); + /* Check if platform has ext-flash */ + if(flash_spi_configuration->pin_spi_sck == GPIO_HAL_PIN_UNKNOWN) { + return false; + } + + if(spi_acquire(flash_spi_configuration) != SPI_DEV_STATUS_OK) { + return false; + } /* Default output to clear chip select */ - deselect(); + deselect(flash_spi_configuration); /* Put the part is standby mode */ - power_standby(); + power_standby(flash_spi_configuration); - return verify_part() == VERIFY_PART_OK ? true : false; -} -/*---------------------------------------------------------------------------*/ -void -ext_flash_close() -{ - /* Put the part in low power mode */ - power_down(); + if (verify_part(flash_spi_configuration) == VERIFY_PART_OK) { + return true; + } - board_spi_close(); + /* Failed to verify */ + spi_release(flash_spi_configuration); + return false; } /*---------------------------------------------------------------------------*/ bool -ext_flash_read(size_t offset, size_t length, uint8_t *buf) +ext_flash_close(spi_device_t *conf) +{ + bool ret; + spi_device_t *flash_spi_configuration; + + flash_spi_configuration = get_spi_conf(conf); + + /* Put the part in low power mode */ + ret = power_down(flash_spi_configuration); + + /* SPI is released no matter if power_down() succeeds or fails */ + if(spi_release(flash_spi_configuration) != SPI_DEV_STATUS_OK) { + return false; + } + + return ret; +} +/*---------------------------------------------------------------------------*/ +bool +ext_flash_read(spi_device_t *conf, uint32_t offset, uint32_t length, uint8_t *buf) { uint8_t wbuf[4]; + bool ret; + + spi_device_t *flash_spi_configuration; + + flash_spi_configuration = get_spi_conf(conf); /* Wait till previous erase/program operation completes */ - bool ret = wait_ready(); - if(ret == false) { + if(wait_ready(flash_spi_configuration) == false) { return false; } @@ -313,41 +386,44 @@ ext_flash_read(size_t offset, size_t length, uint8_t *buf) wbuf[2] = (offset >> 8) & 0xff; wbuf[3] = offset & 0xff; - select_on_bus(); - - if(board_spi_write(wbuf, sizeof(wbuf)) == false) { - /* failure */ - deselect(); + if(select_on_bus(flash_spi_configuration) == false) { return false; } - ret = board_spi_read(buf, length); + if(spi_write(flash_spi_configuration, wbuf, sizeof(wbuf)) != SPI_DEV_STATUS_OK) { + /* failure */ + deselect(flash_spi_configuration); + return false; + } - deselect(); + ret = (spi_read(flash_spi_configuration, buf, length) == SPI_DEV_STATUS_OK); + + deselect(flash_spi_configuration); return ret; } /*---------------------------------------------------------------------------*/ bool -ext_flash_write(size_t offset, size_t length, const uint8_t *buf) +ext_flash_write(spi_device_t *conf, uint32_t offset, uint32_t length, const uint8_t *buf) { uint8_t wbuf[4]; - bool ret; - size_t ilen; /* interim length per instruction */ + uint32_t ilen; /* interim length per instruction */ + + spi_device_t *flash_spi_configuration; + + flash_spi_configuration = get_spi_conf(conf); while(length > 0) { /* Wait till previous erase/program operation completes */ - ret = wait_ready(); - if(ret == false) { + if(wait_ready(flash_spi_configuration) == false) { return false; } - ret = write_enable(); - if(ret == false) { + if(write_enable(flash_spi_configuration) == false) { return false; } - ilen = BLS_PROGRAM_PAGE_SIZE - (offset % BLS_PROGRAM_PAGE_SIZE); + ilen = EXT_FLASH_PROGRAM_PAGE_SIZE - (offset % EXT_FLASH_PROGRAM_PAGE_SIZE); if(length < ilen) { ilen = length; } @@ -365,28 +441,30 @@ ext_flash_write(size_t offset, size_t length, const uint8_t *buf) * is not imposed here since above instructions * should be enough to delay * as much. */ - select_on_bus(); - - if(board_spi_write(wbuf, sizeof(wbuf)) == false) { - /* failure */ - deselect(); + if(select_on_bus(flash_spi_configuration) == false) { return false; } - if(board_spi_write(buf, ilen) == false) { + if(spi_write(flash_spi_configuration, wbuf, sizeof(wbuf)) != SPI_DEV_STATUS_OK) { /* failure */ - deselect(); + deselect(flash_spi_configuration); + return false; + } + + if(spi_write(flash_spi_configuration, buf, ilen) != SPI_DEV_STATUS_OK) { + /* failure */ + deselect(flash_spi_configuration); return false; } buf += ilen; - deselect(); + deselect(flash_spi_configuration); } return true; } /*---------------------------------------------------------------------------*/ bool -ext_flash_erase(size_t offset, size_t length) +ext_flash_erase(spi_device_t *conf, uint32_t offset, uint32_t length) { /* * Note that Block erase might be more efficient when the floor map @@ -394,24 +472,25 @@ ext_flash_erase(size_t offset, size_t length) * sector erase is used blindly. */ uint8_t wbuf[4]; - bool ret; - size_t i, numsectors; - size_t endoffset = offset + length - 1; + uint32_t i, numsectors; + uint32_t endoffset = offset + length - 1; + + spi_device_t *flash_spi_configuration; - offset = (offset / BLS_ERASE_SECTOR_SIZE) * BLS_ERASE_SECTOR_SIZE; - numsectors = (endoffset - offset + BLS_ERASE_SECTOR_SIZE - 1) / BLS_ERASE_SECTOR_SIZE; + flash_spi_configuration = get_spi_conf(conf); + + offset = (offset / EXT_FLASH_ERASE_SECTOR_SIZE) * EXT_FLASH_ERASE_SECTOR_SIZE; + numsectors = (endoffset - offset + EXT_FLASH_ERASE_SECTOR_SIZE - 1) / EXT_FLASH_ERASE_SECTOR_SIZE; wbuf[0] = BLS_CODE_SECTOR_ERASE; for(i = 0; i < numsectors; i++) { /* Wait till previous erase/program operation completes */ - ret = wait_ready(); - if(ret == false) { + if(wait_ready(flash_spi_configuration) == false) { return false; } - ret = write_enable(); - if(ret == false) { + if(write_enable(flash_spi_configuration) == false) { return false; } @@ -419,37 +498,37 @@ ext_flash_erase(size_t offset, size_t length) wbuf[2] = (offset >> 8) & 0xff; wbuf[3] = offset & 0xff; - select_on_bus(); - - if(board_spi_write(wbuf, sizeof(wbuf)) == false) { - /* failure */ - deselect(); + if(select_on_bus(flash_spi_configuration) == false) { return false; } - deselect(); - offset += BLS_ERASE_SECTOR_SIZE; + if(spi_write(flash_spi_configuration, wbuf, sizeof(wbuf)) != SPI_DEV_STATUS_OK) { + /* failure */ + deselect(flash_spi_configuration); + return false; + } + deselect(flash_spi_configuration); + + offset += EXT_FLASH_ERASE_SECTOR_SIZE; } return true; } /*---------------------------------------------------------------------------*/ bool -ext_flash_test(void) +ext_flash_init(spi_device_t *conf) { - bool ret; + if(ext_flash_open(conf) == false) { + return false; + } - ret = ext_flash_open(); - ext_flash_close(); + if(ext_flash_close(conf) == false) { + return false; + } - return ret; -} -/*---------------------------------------------------------------------------*/ -void -ext_flash_init() -{ - ext_flash_open(); - ext_flash_close(); + LOG_INFO("Flash init successful\n"); + + return true; } /*---------------------------------------------------------------------------*/ /** @} */ diff --git a/arch/platform/srf06-cc26xx/common/ext-flash.h b/arch/dev/ext-flash/ext-flash.h similarity index 82% rename from arch/platform/srf06-cc26xx/common/ext-flash.h rename to arch/dev/ext-flash/ext-flash.h index 5f2717edb..20748a2f0 100644 --- a/arch/platform/srf06-cc26xx/common/ext-flash.h +++ b/arch/dev/ext-flash/ext-flash.h @@ -42,25 +42,30 @@ #ifndef EXT_FLASH_H_ #define EXT_FLASH_H_ /*---------------------------------------------------------------------------*/ +#include "dev/spi.h" #include #include #include /*---------------------------------------------------------------------------*/ /** * \brief Initialize storage driver. + * \param conf SPI bus configuration struct. NULL for default. * \return True when successful. */ -bool ext_flash_open(void); +bool ext_flash_open(spi_device_t *conf); /** * \brief Close the storage driver + * \param conf SPI bus configuration struct. NULL for default. + * \return True when successful. * * This call will put the device in its lower power mode (power down). */ -void ext_flash_close(void); +bool ext_flash_close(spi_device_t *conf); /** * \brief Read storage content + * \param conf SPI bus configuration struct. NULL for default. * \param offset Address to read from * \param length Number of bytes to read * \param buf Buffer where to store the read bytes @@ -68,10 +73,11 @@ void ext_flash_close(void); * * buf must be allocated by the caller */ -bool ext_flash_read(size_t offset, size_t length, uint8_t *buf); +bool ext_flash_read(spi_device_t *conf, uint32_t offset, uint32_t length, uint8_t *buf); /** * \brief Erase storage sectors corresponding to the range. + * \param conf SPI bus configuration struct. NULL for default. * \param offset Address to start erasing * \param length Number of bytes to erase * \return True when successful. @@ -79,26 +85,22 @@ bool ext_flash_read(size_t offset, size_t length, uint8_t *buf); * The erase operation will be sector-wise, therefore a call to this function * will generally start the erase procedure at an address lower than offset */ -bool ext_flash_erase(size_t offset, size_t length); +bool ext_flash_erase(spi_device_t *conf, uint32_t offset, uint32_t length); /** * \brief Write to storage sectors. + * \param conf SPI bus configuration struct. NULL for default. * \param offset Address to write to * \param length Number of bytes to write * \param buf Buffer holding the bytes to be written * * \return True when successful. */ -bool ext_flash_write(size_t offset, size_t length, const uint8_t *buf); - -/** - * \brief Test the flash (power on self-test) - * \return True when successful. - */ -bool ext_flash_test(void); +bool ext_flash_write(spi_device_t *conf, uint32_t offset, uint32_t length, const uint8_t *buf); /** * \brief Initialise the external flash + * \param conf SPI bus configuration struct. NULL for default. * * This function will explicitly put the part in its lowest power mode * (power-down). @@ -106,7 +108,7 @@ bool ext_flash_test(void); * In order to perform any operation, the caller must first wake the device * up by calling ext_flash_open() */ -void ext_flash_init(void); +bool ext_flash_init(spi_device_t *conf); /*---------------------------------------------------------------------------*/ #endif /* EXT_FLASH_H_ */ /*---------------------------------------------------------------------------*/ diff --git a/arch/platform/cc2538dk/Makefile.cc2538dk b/arch/platform/cc2538dk/Makefile.cc2538dk index 2b88479d2..c452ccfaf 100644 --- a/arch/platform/cc2538dk/Makefile.cc2538dk +++ b/arch/platform/cc2538dk/Makefile.cc2538dk @@ -13,8 +13,6 @@ CONTIKI_TARGET_SOURCEFILES += board-buttons.c als-sensor.c CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES) -CLEAN += *.cc2538dk - ### Define the CPU directory CONTIKI_CPU=$(CONTIKI)/arch/cpu/cc2538 include $(CONTIKI_CPU)/Makefile.cc2538 diff --git a/arch/platform/cooja/Makefile.cooja b/arch/platform/cooja/Makefile.cooja index 541ae51f0..d06aa08d5 100644 --- a/arch/platform/cooja/Makefile.cooja +++ b/arch/platform/cooja/Makefile.cooja @@ -64,6 +64,8 @@ CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES) .SUFFIXES: +CLEAN += COOJA.log + ### Define the CPU directory CONTIKI_CPU=$(CONTIKI)/arch/cpu/x86 diff --git a/arch/platform/cooja/sys/cooja-log.c b/arch/platform/cooja/sys/cooja-log.c index 32b064335..c7ffdb9ac 100644 --- a/arch/platform/cooja/sys/cooja-log.c +++ b/arch/platform/cooja/sys/cooja-log.c @@ -35,10 +35,9 @@ #define IMPLEMENT_PRINTF 1 -#if MAX_LOG_LENGTH < 1024 -#undef MAX_LOG_LENGTH -#define MAX_LOG_LENGTH 1024 -#endif /* MAX_LOG_LENGTH < 1024 */ +#ifndef MAX_LOG_LENGTH +#define MAX_LOG_LENGTH 8192 +#endif /* MAX_LOG_LENGTH */ const struct simInterface simlog_interface; diff --git a/arch/platform/jn516x/Makefile.jn516x b/arch/platform/jn516x/Makefile.jn516x index ecdcc2f58..9f7a31adf 100644 --- a/arch/platform/jn516x/Makefile.jn516x +++ b/arch/platform/jn516x/Makefile.jn516x @@ -82,7 +82,7 @@ OBJDUMP:=$(CROSS_COMPILE)-objdump ARCH = jn516x-ccm-star.c exceptions.c rtimer-arch.c rtimer-arch-slow.c \ slip_uart0.c clock.c micromac-radio.c int-master.c \ - node-id.c watchdog.c slip.c sprintf.c + node-id.c watchdog.c slip.c dbg.c # Default uart0 for printf and slip TARGET_WITH_UART0 ?= 1 TARGET_WITH_UART1 ?= 0 @@ -100,9 +100,11 @@ ifeq ($(WITH_UART),1) ARCH += uart-driver.c endif -CONTIKI_TARGET_DIRS = . dev lib +CONTIKI_TARGET_DIRS = . dev CONTIKI_TARGET_MAIN = platform.c +MODULES += os/lib/dbg-io + ifeq ($(JN516x_WITH_DR1175),1) JN516x_WITH_DR1174 = 1 CFLAGS += -DSENSOR_BOARD_DR1175 @@ -140,7 +142,6 @@ ifdef nodemac CFLAGS += -DMACID=$(nodemac) endif -CLEAN += *.jn516x CLEAN += *.jn516x.bin CONTIKI_TARGET_SOURCEFILES += $(ARCH) @@ -234,16 +235,16 @@ ABS_APPLIBS = $(addsuffix _$(JENNIC_CHIP_FAMILY).a,$(addprefix $(COMPONENTS_BASE ifneq ($(wildcard $(SDK_BASE_DIR)/Components/Library/*),) # The SDK is fully installed, proceed to linking and objcopy to ready-to-upload .jn516x.bin file -%.$(TARGET): %.o $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a $(ABS_APPLIBS) +%.$(TARGET): %.o $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) $(CONTIKI_NG_TARGET_LIB) $(ABS_APPLIBS) echo ${filter %.a,$^} $(Q)$(CC) -Wl,--gc-sections $(LDFLAGS) -T$(LINKCMD) -o $@ -Wl,--start-group \ $(patsubst /cygdrive/c/%,c:/%,${filter-out %.a,$^}) \ $(patsubst /cygdrive/c/%,c:/%,${filter %.a,$^}) \ - $(ALLLIBS) -Wl,--end-group -Wl,-Map,contiki-$(TARGET).map + $(ALLLIBS) -Wl,--end-group -Wl,-Map,$(CONTIKI_NG_PROJECT_MAP) $(OBJCOPY) -S -O binary $@ $@.bin else # The SDK does not include libraries, only build objects and libraries, skip linking -%.$(TARGET): %.o $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a +%.$(TARGET): %.o $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) $(CONTIKI_NG_TARGET_LIB) echo Creating empty $@ touch $@ endif diff --git a/arch/platform/nrf52dk/dbg-io/debug-uart.h b/arch/platform/jn516x/dbg.c similarity index 82% rename from arch/platform/nrf52dk/dbg-io/debug-uart.h rename to arch/platform/jn516x/dbg.c index b52d2fb50..ac6cc3888 100644 --- a/arch/platform/nrf52dk/dbg-io/debug-uart.h +++ b/arch/platform/jn516x/dbg.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Nordic Semiconductor + * Copyright (c) 2014, SICS Swedish ICT. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,30 +25,32 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - */ -/** - * \addtogroup nrf52dk - * @{ - * - * \addtogroup nrf52dk-dbg-io Debug IO over UART - * @{ - * - * \file - * A header file to maintain compatibility with DBG I/O. - * \author - * Wojciech Bober - * */ /*---------------------------------------------------------------------------*/ -#ifndef DEBUG_UART_H_ -#define DEBUG_UART_H_ +#include "contiki.h" + +#include +#include "dev/uart0.h" /*---------------------------------------------------------------------------*/ -#include "dbg.h" +int +dbg_putchar(int c) +{ + uart0_writeb(c); + return 1; +} /*---------------------------------------------------------------------------*/ -#endif /* DEBUG_UART_H_ */ +unsigned int +dbg_send_bytes(const unsigned char *s, unsigned int len) +{ + unsigned int i = 0; + + while(s && *s != 0) { + if(i >= len) { + break; + } + uart0_writeb(*s++); + i++; + } + return i; +} /*---------------------------------------------------------------------------*/ -/** - * @} - * @} - */ diff --git a/arch/platform/jn516x/jn516x-def.h b/arch/platform/jn516x/jn516x-def.h index 596d55333..0c76a4332 100644 --- a/arch/platform/jn516x/jn516x-def.h +++ b/arch/platform/jn516x/jn516x-def.h @@ -269,16 +269,6 @@ typedef uint32_t clock_time_t; #endif #define ENABLE_ADVANCED_BAUD_SELECTION (UART_BAUD_RATE > UART_RATE_115200) -/* Set this to zero only if we are using SLIP */ -#ifndef SLIP_BRIDGE_CONF_NO_PUTCHAR -#if defined(UIP_FALLBACK_INTERFACE) || defined(CMD_CONF_OUTPUT) -#define SLIP_BRIDGE_CONF_NO_PUTCHAR 0 -#else -#define SLIP_BRIDGE_CONF_NO_PUTCHAR 1 -#endif -#endif /* SLIP_BRIDGE_CONF_NO_PUTCHAR */ - - /* Extension of LED definitions from leds.h for various JN516x dev boards JN516x Dongle: LEDS_RED Red LED on dongle diff --git a/arch/platform/jn516x/lib/sprintf.c b/arch/platform/jn516x/lib/sprintf.c deleted file mode 100644 index dd2408090..000000000 --- a/arch/platform/jn516x/lib/sprintf.c +++ /dev/null @@ -1,237 +0,0 @@ -/* - File: printf.c - - Copyright (c) 2004,2008 Kustaa Nyholm / SpareTimeLabs - - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list - of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - - Neither the name of the Kustaa Nyholm or SpareTimeLabs nor the names of its - contributors may be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - OF SUCH DAMAGE. - - */ - -/* - * This is BSD code obtained from http://www.sparetimelabs.com/printfrevisited/index.html - * From the web page: - * "The code is GPL and BSD lincensed, download the BSD licensed version from the link - * above or use the GPL licensed code from this page below." - * - * modified by Beshr Al Nahas and Simon Duquennoy - */ - -#include "contiki.h" -#include -#include -#include -#include -#include -#include "dev/uart0.h" - -static char *bf, buf[14], uc, zs; -static unsigned int num; - -static void -out(char c) -{ - *bf++ = c; -} -static void -outDgt(char dgt) -{ - out(dgt + (dgt < 10 ? '0' : (uc ? 'A' : 'a') - 10)); - zs = 1; -} -static void -divOut(unsigned int div) -{ - unsigned char dgt = 0; - while(num >= div) { - num -= div; - dgt++; - } - if(zs || dgt > 0) { - outDgt(dgt); - } -} -int -vsnprintf(char *str, size_t n, const char *fmt, __VALIST va) -{ - char ch, *p, *str_orig = str; - char next_ch; - - while((ch = *fmt++) && str - str_orig < n) { - if(ch != '%') { - *str++ = ch; - } else { - char lz = 0; - char w = 0; - ch = *(fmt++); - if(ch == '0') { - ch = *(fmt++); - lz = 1; - } - if(ch == '-' || (ch >= '0' && ch <= '9')) { - w = 0; - while(ch == '-' || (ch >= '0' && ch <= '9')) { - if(ch != '-') { - w = (((w << 2) + w) << 1) + ch - '0'; - } - ch = *fmt++; - } - } - bf = buf; - p = bf; - zs = 0; -start_format: - next_ch = *fmt; - switch(ch) { - case 0: - goto abort; - case 'l': - if(next_ch == 'x' - || next_ch == 'X' - || next_ch == 'u' - || next_ch == 'd') { - ch = *(fmt++); - goto start_format; - } - case 'u': - case 'd': - num = va_arg(va, unsigned int); - if(ch == 'd' && (int)num < 0) { - num = -(int)num; - out('-'); - } - divOut(1000000000); - divOut(100000000); - divOut(10000000); - divOut(1000000); - divOut(100000); - divOut(10000); - divOut(1000); - divOut(100); - divOut(10); - outDgt(num); - break; - case 'p': - case 'x': - case 'X': - uc = ch == 'X'; - num = va_arg(va, unsigned int); - /* divOut(0x100000000UL); */ - divOut(0x10000000); - divOut(0x1000000); - divOut(0x100000); - divOut(0x10000); - divOut(0x1000); - divOut(0x100); - divOut(0x10); - outDgt(num); - break; - case 'c': - out((char)(va_arg(va, int))); - break; - case 's': - p = va_arg(va, char *); - break; - case '%': - out('%'); - default: - break; - } - *bf = 0; - bf = p; - - while(*bf++ && w > 0) { - w--; - } - while(w-- > 0) { - if(str - str_orig < n) { - *str++ = lz ? '0' : ' '; - } else { - goto abort; - } - } - while((ch = *p++)) { - if(str - str_orig < n) { - *str++ = ch; - } else { - goto abort; - } - } - } - } - -abort: - if(str - str_orig < n) { - *str = '\0'; - } else { - *(--str) = '\0'; - } return str - str_orig; -} -int -sprintf(char *str, const char *fmt, ...) -{ - int m; - __VALIST va; - va_start(va, fmt); - m = vsnprintf(str, 0xffffffff, fmt, va); - va_end(va); - return m; -} -int -snprintf(char *str, size_t n, const char *fmt, ...) -{ - int m; - __VALIST va; - va_start(va, fmt); - m = vsnprintf(str, n, fmt, va); - va_end(va); - return m; -} -int -printf(const char *fmt, ...) -{ - int m, i; - char str[256]; - __VALIST va; - va_start(va, fmt); - m = vsnprintf(str, sizeof(str), fmt, va); - va_end(va); - for(i = 0; i < m; i++) { - putchar(str[i]); - } - return m; -} -int -puts(const char *s) -{ - char c; - while((c = *s++) != '\0') { - putchar(c); - } - putchar('\n'); - return strlen(s); -} diff --git a/arch/platform/jn516x/lib/slip.c b/arch/platform/jn516x/slip.c similarity index 99% rename from arch/platform/jn516x/lib/slip.c rename to arch/platform/jn516x/slip.c index a5ce4c16d..173a14d60 100644 --- a/arch/platform/jn516x/lib/slip.c +++ b/arch/platform/jn516x/slip.c @@ -429,11 +429,3 @@ slip_input_byte(unsigned char c) return error_return_code; } /*---------------------------------------------------------------------------*/ -#if SLIP_BRIDGE_CONF_NO_PUTCHAR -int -putchar(int c) -{ - uart0_writeb(c); - return 1; -} -#endif diff --git a/arch/platform/native/Makefile.native b/arch/platform/native/Makefile.native index bee104a6c..f8fd7286c 100644 --- a/arch/platform/native/Makefile.native +++ b/arch/platform/native/Makefile.native @@ -2,9 +2,6 @@ ifndef CONTIKI $(error CONTIKI not defined! You must specify where CONTIKI resides!) endif -ifeq ($(HOST_OS),Darwin) - AROPTS = rc -endif CONTIKI_TARGET_DIRS = . dev CONTIKI_TARGET_MAIN = ${addprefix $(OBJECTDIR)/,contiki-main.o} @@ -30,8 +27,6 @@ CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES) # Enable nullmac by default MAKE_MAC ?= MAKE_MAC_NULLMAC -CLEAN += *.native - ### Define the CPU directory CONTIKI_CPU=$(CONTIKI)/arch/cpu/native include $(CONTIKI)/arch/cpu/native/Makefile.native diff --git a/arch/platform/native/contiki-conf.h b/arch/platform/native/contiki-conf.h index b8a43a604..ea1383660 100644 --- a/arch/platform/native/contiki-conf.h +++ b/arch/platform/native/contiki-conf.h @@ -58,12 +58,6 @@ int select_set_callback(int fd, const struct select_callback *callback); #define EEPROM_CONF_SIZE 1024 #endif -/* These names are deprecated, use C99 names. */ -typedef uint8_t u8_t; -typedef uint16_t u16_t; -typedef uint32_t u32_t; -typedef int32_t s32_t; - typedef unsigned int uip_stats_t; #define LEDS_CONF_LEGACY_API 1 diff --git a/arch/platform/nrf52dk/Makefile.nrf52dk b/arch/platform/nrf52dk/Makefile.nrf52dk index 6187fc532..7e931880a 100644 --- a/arch/platform/nrf52dk/Makefile.nrf52dk +++ b/arch/platform/nrf52dk/Makefile.nrf52dk @@ -13,14 +13,10 @@ ifeq ($(NRF52_USE_RTT),1) CONTIKI_TARGET_DIRS += rtt CONTIKI_SOURCEFILES += rtt-printf.c segger-rtt.c segger-rtt-printf.c else -CONTIKI_TARGET_DIRS += dbg-io CONTIKI_SOURCEFILES += dbg.c -CONTIKI_CPU_DIRS += ../arm/common/dbg-io -CONTIKI_CPU_SOURCEFILES += dbg-printf.c dbg-putchar.c dbg-snprintf.c dbg-sprintf.c strformat.c +MODULES += os/lib/dbg-io endif -CLEAN += *.nrf52dk - ### Unless the example dictates otherwise, build with code size optimisations switched off SMALL ?= 0 diff --git a/arch/platform/nrf52dk/dbg-io/dbg.h b/arch/platform/nrf52dk/dbg-io/dbg.h deleted file mode 100644 index 5d9568270..000000000 --- a/arch/platform/nrf52dk/dbg-io/dbg.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2015, Nordic Semiconductor - * All rights reserved. - * -3 * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ -/** - * \addtogroup nrf52dk - * @{ - * - * \addtogroup nrf52dk-dbg-io Debug IO over UART - * @{ - * - * \file - * Header file for the debug module. - * \author - * Wojciech Bober - * - */ -#ifndef DBG_H_ -#define DBG_H_ -/*---------------------------------------------------------------------------*/ -#include "contiki.h" -/*---------------------------------------------------------------------------*/ -/** - * \brief Print a stream of bytes - * \param seq A pointer to the stream - * \param len The number of bytes to print - * \return The number of printed bytes - */ -unsigned int dbg_send_bytes(const unsigned char *seq, unsigned int len); -/** - * \brief Print a character to debug output - * \param c Character to print - * \return Printed character - */ -int dbg_putchar(int c); -/*---------------------------------------------------------------------------*/ -#endif /* DBG_H_ */ -/*---------------------------------------------------------------------------*/ -/** - * @} - * @} - */ diff --git a/arch/platform/openmote-cc2538/Makefile.openmote-cc2538 b/arch/platform/openmote-cc2538/Makefile.openmote-cc2538 index 14aa46f78..d3863fdbc 100644 --- a/arch/platform/openmote-cc2538/Makefile.openmote-cc2538 +++ b/arch/platform/openmote-cc2538/Makefile.openmote-cc2538 @@ -20,8 +20,6 @@ CONTIKI_TARGET_SOURCEFILES += antenna.c adxl346.c max44009.c sht21.c tps62730.c CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES) -CLEAN += *.openmote-cc2538 - ### Define the CPU directory CONTIKI_CPU=$(CONTIKI)/arch/cpu/cc2538 include $(CONTIKI_CPU)/Makefile.cc2538 diff --git a/arch/platform/sky/Makefile.common b/arch/platform/sky/Makefile.common index 1dea28846..081ffaa9f 100644 --- a/arch/platform/sky/Makefile.common +++ b/arch/platform/sky/Makefile.common @@ -1,6 +1,6 @@ # $Id: Makefile.common,v 1.3 2010/08/24 16:24:11 joxe Exp $ -ARCH=spi.c ds2411.c xmem.c i2c.c node-id.c sensors.c cfs-coffee.c \ +ARCH=spi-legacy.c ds2411.c xmem.c i2c.c node-id.c sensors.c cfs-coffee.c \ cc2420.c cc2420-arch.c cc2420-arch-sfd.c \ sky-sensors.c uip-ipchksum.c \ uart1.c slip_uart1.c uart1-putchar.c platform.c diff --git a/arch/platform/sky/Makefile.sky b/arch/platform/sky/Makefile.sky index 9467603a4..0398486b0 100644 --- a/arch/platform/sky/Makefile.sky +++ b/arch/platform/sky/Makefile.sky @@ -4,8 +4,6 @@ CONTIKI_TARGET_SOURCEFILES += contiki-sky-platform.c \ sht11.c sht11-sensor.c light-sensor.c battery-sensor.c \ button-sensor.c -CLEAN += *.sky - include $(CONTIKI)/arch/platform/sky/Makefile.common MODULES += arch/dev/cc2420 arch/dev/sht11 arch/dev/ds2411 os/storage/cfs diff --git a/arch/platform/sky/dev/i2c.c b/arch/platform/sky/dev/i2c.c index b9d10a9c7..1acbe897a 100644 --- a/arch/platform/sky/dev/i2c.c +++ b/arch/platform/sky/dev/i2c.c @@ -41,7 +41,7 @@ #include #include -#include +#include "dev/spi-legacy.h" #include #include "dev/i2c.h" diff --git a/arch/platform/sky/dev/xmem.c b/arch/platform/sky/dev/xmem.c index 21814ad04..4ff525bb8 100644 --- a/arch/platform/sky/dev/xmem.c +++ b/arch/platform/sky/dev/xmem.c @@ -43,7 +43,7 @@ #include #include -#include "dev/spi.h" +#include "dev/spi-legacy.h" #include "dev/xmem.h" #include "dev/watchdog.h" diff --git a/arch/platform/srf06-cc26xx/Makefile.srf06-cc26xx b/arch/platform/srf06-cc26xx/Makefile.srf06-cc26xx index 7bead9fff..db4209adc 100644 --- a/arch/platform/srf06-cc26xx/Makefile.srf06-cc26xx +++ b/arch/platform/srf06-cc26xx/Makefile.srf06-cc26xx @@ -19,8 +19,6 @@ CONTIKI_TARGET_SOURCEFILES += $(BOARD_SOURCEFILES) CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES) -CLEAN += *.srf06-cc26xx - ### Unless the example dictates otherwise, build without code size optimisations SMALL ?= 0 diff --git a/arch/platform/srf06-cc26xx/common/board-spi.c b/arch/platform/srf06-cc26xx/common/board-spi.c deleted file mode 100644 index fb9fecd63..000000000 --- a/arch/platform/srf06-cc26xx/common/board-spi.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (c) 2014, Texas Instruments Incorporated - http://www.ti.com/ - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/*---------------------------------------------------------------------------*/ -/** - * \addtogroup sensortag-cc26xx-spi - * @{ - * - * \file - * Board-specific SPI driver common to the Sensortag and LaunchPad - */ -/*---------------------------------------------------------------------------*/ -#include "contiki.h" -#include "ti-lib.h" -#include "board-spi.h" -#include "board.h" - -#include -/*---------------------------------------------------------------------------*/ -static bool -accessible(void) -{ - /* First, check the PD */ - if(ti_lib_prcm_power_domain_status(PRCM_DOMAIN_SERIAL) - != PRCM_DOMAIN_POWER_ON) { - return false; - } - - /* Then check the 'run mode' clock gate */ - if(!(HWREG(PRCM_BASE + PRCM_O_SSICLKGR) & PRCM_SSICLKGR_CLK_EN_SSI0)) { - return false; - } - - return true; -} -/*---------------------------------------------------------------------------*/ -bool -board_spi_write(const uint8_t *buf, size_t len) -{ - if(accessible() == false) { - return false; - } - - while(len > 0) { - uint32_t ul; - - ti_lib_ssi_data_put(SSI0_BASE, *buf); - ti_lib_rom_ssi_data_get(SSI0_BASE, &ul); - len--; - buf++; - } - - return true; -} -/*---------------------------------------------------------------------------*/ -bool -board_spi_read(uint8_t *buf, size_t len) -{ - if(accessible() == false) { - return false; - } - - while(len > 0) { - uint32_t ul; - - if(!ti_lib_rom_ssi_data_put_non_blocking(SSI0_BASE, 0)) { - /* Error */ - return false; - } - ti_lib_rom_ssi_data_get(SSI0_BASE, &ul); - *buf = (uint8_t)ul; - len--; - buf++; - } - return true; -} -/*---------------------------------------------------------------------------*/ -void -board_spi_flush() -{ - if(accessible() == false) { - return; - } - - uint32_t ul; - while(ti_lib_rom_ssi_data_get_non_blocking(SSI0_BASE, &ul)); -} -/*---------------------------------------------------------------------------*/ -void -board_spi_open(uint32_t bit_rate, uint32_t clk_pin) -{ - uint32_t buf; - - /* First, make sure the SERIAL PD is on */ - ti_lib_prcm_power_domain_on(PRCM_DOMAIN_SERIAL); - while((ti_lib_prcm_power_domain_status(PRCM_DOMAIN_SERIAL) - != PRCM_DOMAIN_POWER_ON)); - - /* Enable clock in active mode */ - ti_lib_rom_prcm_peripheral_run_enable(PRCM_PERIPH_SSI0); - ti_lib_prcm_load_set(); - while(!ti_lib_prcm_load_get()); - - /* SPI configuration */ - ti_lib_ssi_int_disable(SSI0_BASE, SSI_RXOR | SSI_RXFF | SSI_RXTO | SSI_TXFF); - ti_lib_ssi_int_clear(SSI0_BASE, SSI_RXOR | SSI_RXTO); - ti_lib_rom_ssi_config_set_exp_clk(SSI0_BASE, ti_lib_sys_ctrl_clock_get(), - SSI_FRF_MOTO_MODE_0, - SSI_MODE_MASTER, bit_rate, 8); - ti_lib_rom_ioc_pin_type_ssi_master(SSI0_BASE, BOARD_IOID_SPI_MISO, - BOARD_IOID_SPI_MOSI, IOID_UNUSED, clk_pin); - ti_lib_ssi_enable(SSI0_BASE); - - /* Get rid of residual data from SSI port */ - while(ti_lib_ssi_data_get_non_blocking(SSI0_BASE, &buf)); -} -/*---------------------------------------------------------------------------*/ -void -board_spi_close() -{ - /* Power down SSI0 */ - ti_lib_rom_prcm_peripheral_run_disable(PRCM_PERIPH_SSI0); - ti_lib_prcm_load_set(); - while(!ti_lib_prcm_load_get()); - - /* Restore pins to a low-consumption state */ - ti_lib_ioc_pin_type_gpio_input(BOARD_IOID_SPI_MISO); - ti_lib_ioc_io_port_pull_set(BOARD_IOID_SPI_MISO, IOC_IOPULL_DOWN); - - ti_lib_ioc_pin_type_gpio_input(BOARD_IOID_SPI_MOSI); - ti_lib_ioc_io_port_pull_set(BOARD_IOID_SPI_MOSI, IOC_IOPULL_DOWN); - - ti_lib_ioc_pin_type_gpio_input(BOARD_IOID_SPI_CLK_FLASH); - ti_lib_ioc_io_port_pull_set(BOARD_IOID_SPI_CLK_FLASH, IOC_IOPULL_DOWN); -} -/*---------------------------------------------------------------------------*/ -/** @} */ diff --git a/arch/platform/srf06-cc26xx/common/board-spi.h b/arch/platform/srf06-cc26xx/common/board-spi.h deleted file mode 100644 index 3699db120..000000000 --- a/arch/platform/srf06-cc26xx/common/board-spi.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2014, Texas Instruments Incorporated - http://www.ti.com/ - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/*---------------------------------------------------------------------------*/ -/** - * \addtogroup cc26xx-srf-tag - * @{ - * - * \defgroup common-cc26xx-peripherals CC13xx/CC26xx peripheral driver pool - * - * Drivers for peripherals present on more than one CC13xx/CC26xx board. For - * example, the same external flash driver is used for both the part found on - * the Sensortag as well as the part on the LaunchPad. - * - * @{ - * - * \defgroup sensortag-cc26xx-spi SensorTag/LaunchPad SPI functions - * @{ - * - * \file - * Header file for the Sensortag/LaunchPad SPI Driver - */ -/*---------------------------------------------------------------------------*/ -#ifndef BOARD_SPI_H_ -#define BOARD_SPI_H_ -/*---------------------------------------------------------------------------*/ -#include -#include -#include -/*---------------------------------------------------------------------------*/ -/** - * \brief Initialize the SPI interface - * \param bit_rate The bit rate to use - * \param clk_pin The IOID for the clock pin. This can be IOID_0 etc - * \return none - * - * This function will make sure the peripheral is powered, clocked and - * initialised. A chain of calls to board_spi_read(), board_spi_write() and - * board_spi_flush() must be preceded by a call to this function. It is - * recommended to call board_spi_close() after such chain of calls. - */ -void board_spi_open(uint32_t bit_rate, uint32_t clk_pin); - -/** - * \brief Close the SPI interface - * \return True when successful. - * - * This function will stop clocks to the SSI module and will set MISO, MOSI - * and CLK to a low leakage state. It is recommended to call this function - * after a chain of calls to board_spi_read() and board_spi_write() - */ -void board_spi_close(void); - -/** - * \brief Clear data from the SPI interface - * \return none - */ -void board_spi_flush(void); - -/** - * \brief Read from an SPI device - * \param buf The buffer to store data - * \param length The number of bytes to read - * \return True when successful. - * - * Calls to this function must be preceded by a call to board_spi_open(). It is - * recommended to call board_spi_close() at the end of an operation. - */ -bool board_spi_read(uint8_t *buf, size_t length); - -/** - * \brief Write to an SPI device - * \param buf The buffer with the data to write - * \param length The number of bytes to write - * \return True when successful. - * - * Calls to this function must be preceded by a call to board_spi_open(). It is - * recommended to call board_spi_close() at the end of an operation. - */ -bool board_spi_write(const uint8_t *buf, size_t length); -/*---------------------------------------------------------------------------*/ -#endif /* BOARD_SPI_H_ */ -/*---------------------------------------------------------------------------*/ -/** - * @} - * @} - * @} - */ diff --git a/arch/platform/srf06-cc26xx/common/xmem.c b/arch/platform/srf06-cc26xx/common/xmem.c index 5a79be6c1..116991c66 100644 --- a/arch/platform/srf06-cc26xx/common/xmem.c +++ b/arch/platform/srf06-cc26xx/common/xmem.c @@ -60,7 +60,7 @@ void xmem_init(void) { - ext_flash_open(); + ext_flash_open(NULL); } @@ -71,21 +71,21 @@ xmem_pread(void *_p, int size, unsigned long addr) uint8_t x; int i; - rv = ext_flash_open(); + rv = ext_flash_open(NULL); if(!rv) { PRINTF("Could not open flash to save config\n"); - ext_flash_close(); + ext_flash_close(NULL); return -1; } - rv = ext_flash_read(addr, size, _p); + rv = ext_flash_read(NULL, addr, size, _p); for (i = 0; i < size; i++){ x = ~*((uint8_t *)_p + i); *((uint8_t *)_p+i) = x; } - ext_flash_close(); + ext_flash_close(NULL); if(rv) return size; @@ -104,11 +104,11 @@ xmem_pwrite(const void *_buf, int size, unsigned long addr) uint8_t tmp_buf[XMEM_BUFF_LENGHT]; - rv = ext_flash_open(); + rv = ext_flash_open(NULL); if(!rv) { PRINTF("Could not open flash to save config!\n"); - ext_flash_close(); + ext_flash_close(NULL); return -1; } @@ -117,14 +117,14 @@ xmem_pwrite(const void *_buf, int size, unsigned long addr) for (i = 0; i < to_write; i++) { tmp_buf[i] = ~*((uint8_t *)_buf + j + i); } - rv = ext_flash_write(addr + j, to_write, tmp_buf); + rv = ext_flash_write(NULL, addr + j, to_write, tmp_buf); if (!rv) { PRINTF("Could not write flash memory!\n"); return size - remain; } } - ext_flash_close(); + ext_flash_close(NULL); return size; } @@ -135,12 +135,12 @@ xmem_erase(long size, unsigned long addr) { int rv; - rv = ext_flash_open(); + rv = ext_flash_open(NULL); if(!rv) { PRINTF("Could not open flash to save config\n"); - ext_flash_close(); + ext_flash_close(NULL); return -1; } @@ -154,9 +154,9 @@ xmem_erase(long size, unsigned long addr) return -1; } - rv = ext_flash_erase(addr, size); + rv = ext_flash_erase(NULL, addr, size); - ext_flash_close(); + ext_flash_close(NULL); watchdog_periodic(); diff --git a/arch/platform/srf06-cc26xx/launchpad/Makefile.launchpad b/arch/platform/srf06-cc26xx/launchpad/Makefile.launchpad index f10f979da..09af79c0b 100644 --- a/arch/platform/srf06-cc26xx/launchpad/Makefile.launchpad +++ b/arch/platform/srf06-cc26xx/launchpad/Makefile.launchpad @@ -3,7 +3,8 @@ CFLAGS += -DBOARD_LAUNCHPAD=1 CONTIKI_TARGET_DIRS += launchpad common BOARD_SOURCEFILES += board.c board-buttons.c xmem.c -BOARD_SOURCEFILES += ext-flash.c board-spi.c + +MODULES += arch/dev/ext-flash ### Signal that we can be programmed with cc2538-bsl BOARD_SUPPORTS_BSL=1 diff --git a/arch/platform/srf06-cc26xx/launchpad/board.c b/arch/platform/srf06-cc26xx/launchpad/board.c index 7baf71d47..cda0a7c6c 100644 --- a/arch/platform/srf06-cc26xx/launchpad/board.c +++ b/arch/platform/srf06-cc26xx/launchpad/board.c @@ -93,7 +93,7 @@ board_init() while(!ti_lib_prcm_load_get()); /* Make sure the external flash is in the lower power mode */ - ext_flash_init(); + ext_flash_init(NULL); lpm_register_module(&launchpad_module); diff --git a/arch/platform/srf06-cc26xx/launchpad/cc1310/board.h b/arch/platform/srf06-cc26xx/launchpad/cc1310/board.h index 7c58e1db8..41e929571 100644 --- a/arch/platform/srf06-cc26xx/launchpad/cc1310/board.h +++ b/arch/platform/srf06-cc26xx/launchpad/cc1310/board.h @@ -103,25 +103,29 @@ #define BOARD_KEY_RIGHT (1 << BOARD_IOID_KEY_RIGHT) /** @} */ /*---------------------------------------------------------------------------*/ -/** - * \brief SPI IOID mappings - * - * Those values are not meant to be modified by the user - * @{ - */ -#define BOARD_IOID_SPI_MOSI IOID_9 -#define BOARD_IOID_SPI_MISO IOID_8 -/** @} */ -/*---------------------------------------------------------------------------*/ /** * \name External flash IOID mapping * * Those values are not meant to be modified by the user * @{ */ -#define BOARD_IOID_FLASH_CS IOID_20 -#define BOARD_FLASH_CS (1 << BOARD_IOID_FLASH_CS) -#define BOARD_IOID_SPI_CLK_FLASH IOID_10 +#define EXT_FLASH_SPI_CONTROLLER SPI_CONTROLLER_SPI0 + +#define BOARD_IOID_FLASH_SCK IOID_10 +#define BOARD_IOID_FLASH_MOSI IOID_9 +#define BOARD_IOID_FLASH_MISO IOID_8 +#define BOARD_IOID_FLASH_CS IOID_20 + +#define EXT_FLASH_SPI_PIN_SCK 10 +#define EXT_FLASH_SPI_PIN_MOSI 9 +#define EXT_FLASH_SPI_PIN_MISO 8 +#define EXT_FLASH_SPI_PIN_CS 20 + +#define EXT_FLASH_DEVICE_ID 0x14 +#define EXT_FLASH_MID 0xC2 + +#define EXT_FLASH_PROGRAM_PAGE_SIZE 256 +#define EXT_FLASH_ERASE_SECTOR_SIZE 4096 /** @} */ /*---------------------------------------------------------------------------*/ /** diff --git a/arch/platform/srf06-cc26xx/launchpad/cc1350/board.h b/arch/platform/srf06-cc26xx/launchpad/cc1350/board.h index 63ad25374..643d69e0b 100644 --- a/arch/platform/srf06-cc26xx/launchpad/cc1350/board.h +++ b/arch/platform/srf06-cc26xx/launchpad/cc1350/board.h @@ -103,26 +103,29 @@ #define BOARD_KEY_RIGHT (1 << BOARD_IOID_KEY_RIGHT) /** @} */ /*---------------------------------------------------------------------------*/ -/** - * \brief SPI IOID mappings - * - * Those values are not meant to be modified by the user - * @{ - */ -#define BOARD_IOID_SPI_MOSI IOID_9 -#define BOARD_IOID_SPI_MISO IOID_8 -/** @} */ -/*---------------------------------------------------------------------------*/ /** * \name External flash IOID mapping * * Those values are not meant to be modified by the user * @{ */ -#define BOARD_IOID_FLASH_CS IOID_20 -#define BOARD_FLASH_CS (1 << BOARD_IOID_FLASH_CS) -#define BOARD_IOID_SPI_CLK_FLASH IOID_10 -/** @} */ +#define EXT_FLASH_SPI_CONTROLLER SPI_CONTROLLER_SPI0 + +#define BOARD_IOID_FLASH_SCK IOID_10 +#define BOARD_IOID_FLASH_MOSI IOID_9 +#define BOARD_IOID_FLASH_MISO IOID_8 +#define BOARD_IOID_FLASH_CS IOID_20 + +#define EXT_FLASH_SPI_PIN_SCK 10 +#define EXT_FLASH_SPI_PIN_MOSI 9 +#define EXT_FLASH_SPI_PIN_MISO 8 +#define EXT_FLASH_SPI_PIN_CS 20 + +#define EXT_FLASH_DEVICE_ID 0x14 +#define EXT_FLASH_MID 0xC2 + +#define EXT_FLASH_PROGRAM_PAGE_SIZE 256 +#define EXT_FLASH_ERASE_SECTOR_SIZE 4096 /*---------------------------------------------------------------------------*/ /** * \brief I2C IOID mappings diff --git a/arch/platform/srf06-cc26xx/launchpad/cc2650/board.h b/arch/platform/srf06-cc26xx/launchpad/cc2650/board.h index 39b906e84..822e776b8 100644 --- a/arch/platform/srf06-cc26xx/launchpad/cc2650/board.h +++ b/arch/platform/srf06-cc26xx/launchpad/cc2650/board.h @@ -103,25 +103,29 @@ #define BOARD_KEY_RIGHT (1 << BOARD_IOID_KEY_RIGHT) /** @} */ /*---------------------------------------------------------------------------*/ -/** - * \brief SPI IOID mappings - * - * Those values are not meant to be modified by the user - * @{ - */ -#define BOARD_IOID_SPI_MOSI IOID_9 -#define BOARD_IOID_SPI_MISO IOID_8 -/** @} */ -/*---------------------------------------------------------------------------*/ /** * \name External flash IOID mapping * * Those values are not meant to be modified by the user * @{ */ -#define BOARD_IOID_FLASH_CS IOID_20 -#define BOARD_FLASH_CS (1 << BOARD_IOID_FLASH_CS) -#define BOARD_IOID_SPI_CLK_FLASH IOID_10 +#define EXT_FLASH_SPI_CONTROLLER SPI_CONTROLLER_SPI0 + +#define BOARD_IOID_FLASH_SCK IOID_10 +#define BOARD_IOID_FLASH_MOSI IOID_9 +#define BOARD_IOID_FLASH_MISO IOID_8 +#define BOARD_IOID_FLASH_CS IOID_20 + +#define EXT_FLASH_SPI_PIN_SCK 10 +#define EXT_FLASH_SPI_PIN_MOSI 9 +#define EXT_FLASH_SPI_PIN_MISO 8 +#define EXT_FLASH_SPI_PIN_CS 20 + +#define EXT_FLASH_DEVICE_ID 0x14 +#define EXT_FLASH_MID 0xC2 + +#define EXT_FLASH_PROGRAM_PAGE_SIZE 256 +#define EXT_FLASH_ERASE_SECTOR_SIZE 4096 /** @} */ /*---------------------------------------------------------------------------*/ /** diff --git a/arch/platform/srf06-cc26xx/sensortag/Makefile.sensortag b/arch/platform/srf06-cc26xx/sensortag/Makefile.sensortag index 46cf25a68..5f7712fef 100644 --- a/arch/platform/srf06-cc26xx/sensortag/Makefile.sensortag +++ b/arch/platform/srf06-cc26xx/sensortag/Makefile.sensortag @@ -6,5 +6,7 @@ CONTIKI_TARGET_DIRS += sensortag common BOARD_SOURCEFILES += sensortag-sensors.c board-buttons.c sensor-common.c BOARD_SOURCEFILES += bmp-280-sensor.c tmp-007-sensor.c opt-3001-sensor.c BOARD_SOURCEFILES += hdc-1000-sensor.c mpu-9250-sensor.c xmem.c -BOARD_SOURCEFILES += ext-flash.c buzzer.c -BOARD_SOURCEFILES += board.c board-spi.c board-i2c.c +BOARD_SOURCEFILES += buzzer.c +BOARD_SOURCEFILES += board.c board-i2c.c + +MODULES += arch/dev/ext-flash diff --git a/arch/platform/srf06-cc26xx/sensortag/board.c b/arch/platform/srf06-cc26xx/sensortag/board.c index e2069f39f..4b6a69bde 100644 --- a/arch/platform/srf06-cc26xx/sensortag/board.c +++ b/arch/platform/srf06-cc26xx/sensortag/board.c @@ -146,7 +146,7 @@ board_init() buzzer_init(); /* Make sure the external flash is in the lower power mode */ - ext_flash_init(); + ext_flash_init(NULL); lpm_register_module(&sensortag_module); diff --git a/arch/platform/srf06-cc26xx/sensortag/cc1350/board.h b/arch/platform/srf06-cc26xx/sensortag/cc1350/board.h index aa8719eea..6fdab1295 100644 --- a/arch/platform/srf06-cc26xx/sensortag/cc1350/board.h +++ b/arch/platform/srf06-cc26xx/sensortag/cc1350/board.h @@ -113,16 +113,6 @@ #define BOARD_KEY_RIGHT (1 << BOARD_IOID_KEY_RIGHT) /** @} */ /*---------------------------------------------------------------------------*/ -/** - * \brief SPI IOID mappings - * - * Those values are not meant to be modified by the user - * @{ - */ -#define BOARD_IOID_SPI_MOSI IOID_19 -#define BOARD_IOID_SPI_MISO IOID_18 -/** @} */ -/*---------------------------------------------------------------------------*/ /** * \name Buzzer configuration * @{ @@ -145,9 +135,23 @@ * Those values are not meant to be modified by the user * @{ */ -#define BOARD_IOID_FLASH_CS IOID_14 -#define BOARD_FLASH_CS (1 << BOARD_IOID_FLASH_CS) -#define BOARD_IOID_SPI_CLK_FLASH IOID_17 +#define EXT_FLASH_SPI_CONTROLLER SPI_CONTROLLER_SPI0 + +#define BOARD_IOID_FLASH_SCK IOID_17 +#define BOARD_IOID_FLASH_MOSI IOID_19 +#define BOARD_IOID_FLASH_MISO IOID_18 +#define BOARD_IOID_FLASH_CS IOID_14 + +#define EXT_FLASH_SPI_PIN_SCK 17 +#define EXT_FLASH_SPI_PIN_MOSI 19 +#define EXT_FLASH_SPI_PIN_MISO 18 +#define EXT_FLASH_SPI_PIN_CS 14 + +#define EXT_FLASH_DEVICE_ID 0x14 +#define EXT_FLASH_MID 0xC2 + +#define EXT_FLASH_PROGRAM_PAGE_SIZE 256 +#define EXT_FLASH_ERASE_SECTOR_SIZE 4096 /** @} */ /*---------------------------------------------------------------------------*/ /** diff --git a/arch/platform/srf06-cc26xx/sensortag/cc2650/board.h b/arch/platform/srf06-cc26xx/sensortag/cc2650/board.h index 9543d2713..7da0e9458 100644 --- a/arch/platform/srf06-cc26xx/sensortag/cc2650/board.h +++ b/arch/platform/srf06-cc26xx/sensortag/cc2650/board.h @@ -115,20 +115,6 @@ #define BOARD_KEY_RIGHT (1 << BOARD_IOID_KEY_RIGHT) /** @} */ /*---------------------------------------------------------------------------*/ -/** - * \brief SPI IOID mappings - * - * Those values are not meant to be modified by the user - * @{ - */ -#define BOARD_IOID_SPI_SCK IOID_17 -#define BOARD_IOID_SPI_MOSI IOID_19 -#define BOARD_IOID_SPI_MISO IOID_18 -#define BOARD_SPI_SCK (1 << BOARD_IOID_SPI_SCK) -#define BOARD_SPI_MOSI (1 << BOARD_IOID_SPI_MOSI) -#define BOARD_SPI_MISO (1 << BOARD_IOID_SPI_MISO) -/** @} */ -/*---------------------------------------------------------------------------*/ /** * \name Buzzer configuration * @{ @@ -151,9 +137,23 @@ * Those values are not meant to be modified by the user * @{ */ -#define BOARD_IOID_FLASH_CS IOID_14 -#define BOARD_FLASH_CS (1 << BOARD_IOID_FLASH_CS) -#define BOARD_IOID_SPI_CLK_FLASH IOID_17 +#define EXT_FLASH_SPI_CONTROLLER SPI_CONTROLLER_SPI0 + +#define BOARD_IOID_FLASH_SCK IOID_17 +#define BOARD_IOID_FLASH_MOSI IOID_19 +#define BOARD_IOID_FLASH_MISO IOID_18 +#define BOARD_IOID_FLASH_CS IOID_14 + +#define EXT_FLASH_SPI_PIN_SCK 17 +#define EXT_FLASH_SPI_PIN_MOSI 19 +#define EXT_FLASH_SPI_PIN_MISO 18 +#define EXT_FLASH_SPI_PIN_CS 14 + +#define EXT_FLASH_DEVICE_ID 0x14 +#define EXT_FLASH_MID 0xC2 + +#define EXT_FLASH_PROGRAM_PAGE_SIZE 256 +#define EXT_FLASH_ERASE_SECTOR_SIZE 4096 /** @} */ /*---------------------------------------------------------------------------*/ /** diff --git a/arch/platform/zoul/Makefile.zoul b/arch/platform/zoul/Makefile.zoul index 6bbcd675b..586a74ae2 100644 --- a/arch/platform/zoul/Makefile.zoul +++ b/arch/platform/zoul/Makefile.zoul @@ -38,8 +38,6 @@ CONTIKI_TARGET_SOURCEFILES += $(BOARD_SOURCEFILES) CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES) -CLEAN += *.zoul - ### Define the CPU directory CONTIKI_CPU=$(CONTIKI)/arch/cpu/cc2538 include $(CONTIKI_CPU)/Makefile.cc2538 diff --git a/arch/platform/zoul/dev/cc1200-zoul-arch.c b/arch/platform/zoul/dev/cc1200-zoul-arch.c index 1aff2ef40..8c9d8cdd7 100644 --- a/arch/platform/zoul/dev/cc1200-zoul-arch.c +++ b/arch/platform/zoul/dev/cc1200-zoul-arch.c @@ -46,10 +46,10 @@ #include "contiki-net.h" #include "dev/leds.h" #include "reg.h" -#include "spi-arch.h" +#include "dev/spi-arch-legacy.h" #include "dev/ioc.h" #include "dev/sys-ctrl.h" -#include "dev/spi.h" +#include "dev/spi-legacy.h" #include "dev/ssi.h" #include "dev/gpio.h" #include "dev/gpio-hal.h" diff --git a/arch/platform/zoul/dev/mmc-arch.c b/arch/platform/zoul/dev/mmc-arch.c index b2aff5a46..f1eca8d32 100644 --- a/arch/platform/zoul/dev/mmc-arch.c +++ b/arch/platform/zoul/dev/mmc-arch.c @@ -39,10 +39,10 @@ #include #include #include -#include "spi-arch.h" +#include "dev/spi-arch-legacy.h" #include "dev/ioc.h" #include "dev/gpio.h" -#include "dev/spi.h" +#include "dev/spi-legacy.h" #include "mmc-arch.h" #define USD_SEL_PORT_BASE GPIO_PORT_TO_BASE(USD_SEL_PORT) diff --git a/arch/platform/zoul/orion/enc28j60-arch-spi.c b/arch/platform/zoul/orion/enc28j60-arch-spi.c index 59e6e4260..bc9c9dadd 100644 --- a/arch/platform/zoul/orion/enc28j60-arch-spi.c +++ b/arch/platform/zoul/orion/enc28j60-arch-spi.c @@ -43,8 +43,8 @@ * eth-gw SPI arch specifics */ /*---------------------------------------------------------------------------*/ -#include "spi-arch.h" -#include "spi.h" +#include "dev/spi-arch-legacy.h" +#include "dev/spi-legacy.h" #include "dev/gpio.h" /*---------------------------------------------------------------------------*/ #define RESET_PORT GPIO_PORT_TO_BASE(ETH_RESET_PORT) diff --git a/arch/cpu/cc2538/debug-uart.h b/examples/mqtt-client/arch/platform/cc2538dk/module-macros.h similarity index 79% rename from arch/cpu/cc2538/debug-uart.h rename to examples/mqtt-client/arch/platform/cc2538dk/module-macros.h index 88a2fc3e0..6f0bce121 100644 --- a/arch/cpu/cc2538/debug-uart.h +++ b/examples/mqtt-client/arch/platform/cc2538dk/module-macros.h @@ -1,16 +1,16 @@ /* - * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/ + * Copyright (c) 2018, George Oikonomou - http://www.spd.gr * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: + * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * * 3. Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. @@ -28,20 +28,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ -/** - * \addtogroup cc2538-char-io - * @{ - * - * \file - * This file is here because DBG I/O expects it to be. It just includes - * our own dbg.h which has a non-misleading name and which also adheres - * to Contiki's naming convention - */ -#ifndef DEBUG_UART_H_ -#define DEBUG_UART_H_ - -#include "dbg.h" - -#endif /* DEBUG_UART_H_ */ - -/** @} */ +/*---------------------------------------------------------------------------*/ +/* Enable MQTT client extensions */ +#define MQTT_CLIENT_CONF_WITH_EXTENSIONS 1 +/*---------------------------------------------------------------------------*/ diff --git a/examples/mqtt-client/arch/platform/openmote-cc2538/module-macros.h b/examples/mqtt-client/arch/platform/openmote-cc2538/module-macros.h new file mode 100644 index 000000000..097c26dd8 --- /dev/null +++ b/examples/mqtt-client/arch/platform/openmote-cc2538/module-macros.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2017, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/* Enable MQTT client extensions */ +#define MQTT_CLIENT_CONF_WITH_EXTENSIONS 1 +/*---------------------------------------------------------------------------*/ diff --git a/examples/mqtt-client/arch/platform/srf06-cc26xx/module-macros.h b/examples/mqtt-client/arch/platform/srf06-cc26xx/module-macros.h new file mode 100644 index 000000000..6f0bce121 --- /dev/null +++ b/examples/mqtt-client/arch/platform/srf06-cc26xx/module-macros.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/* Enable MQTT client extensions */ +#define MQTT_CLIENT_CONF_WITH_EXTENSIONS 1 +/*---------------------------------------------------------------------------*/ diff --git a/examples/mqtt-client/arch/platform/zoul/module-macros.h b/examples/mqtt-client/arch/platform/zoul/module-macros.h new file mode 100644 index 000000000..6f0bce121 --- /dev/null +++ b/examples/mqtt-client/arch/platform/zoul/module-macros.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/* Enable MQTT client extensions */ +#define MQTT_CLIENT_CONF_WITH_EXTENSIONS 1 +/*---------------------------------------------------------------------------*/ diff --git a/examples/mqtt-client/mqtt-client.c b/examples/mqtt-client/mqtt-client.c index 867ef9982..258660459 100644 --- a/examples/mqtt-client/mqtt-client.c +++ b/examples/mqtt-client/mqtt-client.c @@ -71,6 +71,12 @@ static const char *broker_ip = "0064:ff9b:0000:0000:0000:0000:b8ac:7cbd"; #define MQTT_CLIENT_STATUS_LED LEDS_GREEN #endif /*---------------------------------------------------------------------------*/ +#ifdef MQTT_CLIENT_CONF_WITH_EXTENSIONS +#define MQTT_CLIENT_WITH_EXTENSIONS MQTT_CLIENT_CONF_WITH_EXTENSIONS +#else +#define MQTT_CLIENT_WITH_EXTENSIONS 0 +#endif +/*---------------------------------------------------------------------------*/ /* * A timeout used when waiting for something to happen (e.g. to connect or to * disconnect) @@ -197,8 +203,13 @@ static int def_rt_rssi = 0; /*---------------------------------------------------------------------------*/ static mqtt_client_config_t conf; /*---------------------------------------------------------------------------*/ +#if MQTT_CLIENT_WITH_EXTENSIONS extern const mqtt_client_extension_t *mqtt_client_extensions[]; extern const uint8_t mqtt_client_extension_count; +#else +static const mqtt_client_extension_t *mqtt_client_extensions[] = { NULL }; +static const uint8_t mqtt_client_extension_count = 0; +#endif /*---------------------------------------------------------------------------*/ PROCESS(mqtt_client_process, "MQTT Client"); /*---------------------------------------------------------------------------*/ diff --git a/examples/platform-specific/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c b/examples/platform-specific/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c index 306b54640..f69a19478 100644 --- a/examples/platform-specific/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c +++ b/examples/platform-specific/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c @@ -195,15 +195,15 @@ save_config() int rv; cc26xx_web_demo_sensor_reading_t *reading = NULL; - rv = ext_flash_open(); + rv = ext_flash_open(NULL); if(!rv) { printf("Could not open flash to save config\n"); - ext_flash_close(); + ext_flash_close(NULL); return; } - rv = ext_flash_erase(CONFIG_FLASH_OFFSET, sizeof(cc26xx_web_demo_config_t)); + rv = ext_flash_erase(NULL, CONFIG_FLASH_OFFSET, sizeof(cc26xx_web_demo_config_t)); if(!rv) { printf("Error erasing flash\n"); @@ -220,14 +220,14 @@ save_config() } } - rv = ext_flash_write(CONFIG_FLASH_OFFSET, sizeof(cc26xx_web_demo_config_t), + rv = ext_flash_write(NULL, CONFIG_FLASH_OFFSET, sizeof(cc26xx_web_demo_config_t), (uint8_t *)&cc26xx_web_demo_config); if(!rv) { printf("Error saving config\n"); } } - ext_flash_close(); + ext_flash_close(NULL); #endif } /*---------------------------------------------------------------------------*/ @@ -239,18 +239,18 @@ load_config() cc26xx_web_demo_config_t tmp_cfg; cc26xx_web_demo_sensor_reading_t *reading = NULL; - int rv = ext_flash_open(); + int rv = ext_flash_open(NULL); if(!rv) { printf("Could not open flash to load config\n"); - ext_flash_close(); + ext_flash_close(NULL); return; } - rv = ext_flash_read(CONFIG_FLASH_OFFSET, sizeof(tmp_cfg), + rv = ext_flash_read(NULL, CONFIG_FLASH_OFFSET, sizeof(tmp_cfg), (uint8_t *)&tmp_cfg); - ext_flash_close(); + ext_flash_close(NULL); if(!rv) { printf("Error loading config\n"); diff --git a/examples/platform-specific/jn516x/tsch/tx-power-verification/rpl-border-router/Makefile b/examples/platform-specific/jn516x/tsch/tx-power-verification/rpl-border-router/Makefile deleted file mode 100644 index 27454bda2..000000000 --- a/examples/platform-specific/jn516x/tsch/tx-power-verification/rpl-border-router/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -CONTIKI_PROJECT=rpl-border-router - -PLATFORMS_ONLY = jn516x - -TARGET ?= jn516x -JN516x_WITH_DONGLE = 1 - -CONTIKI=../../../../../.. - -PROJECT_SOURCEFILES += slip-bridge.c slip.c - -MODULES_REL += .. - -MAKE_MAC = MAKE_MAC_TSCH -MODULES += os/net/app-layer/coap -MODULES += os/services/orchestra os/lib/json - -all: $(CONTIKI_PROJECT) -include $(CONTIKI)/Makefile.include - -ifeq ($(PREFIX),) - PREFIX = aaaa::1/64 -endif - -#no flow control -connect-router: $(CONTIKI)/tools/tunslip6 - sudo $(CONTIKI)/tools/tunslip6 -v1 -B 1000000 $(PREFIX) - -#using XON/XOFF flow control -connect-router-sw: $(CONTIKI)/tools/tunslip6 - sudo $(CONTIKI)/tools/tunslip6 -v1 -X -B 1000000 $(PREFIX) - -#using hw flow control -connect-router-hw: $(CONTIKI)/tools/tunslip6 - sudo $(CONTIKI)/tools/tunslip6 -v1 -H -B 1000000 $(PREFIX) - -#using no flow control -connect-router-no: $(CONTIKI)/tools/tunslip6 - sudo $(CONTIKI)/tools/tunslip6 -v1 -B 1000000 $(PREFIX) - -connect-router-cooja: $(CONTIKI)/tools/tunslip6 - sudo $(CONTIKI)/tools/tunslip6 -a 127.0.0.1 $(PREFIX) diff --git a/examples/platform-specific/jn516x/tsch/tx-power-verification/rpl-border-router/rpl-border-router.c b/examples/platform-specific/jn516x/tsch/tx-power-verification/rpl-border-router/rpl-border-router.c deleted file mode 100644 index cf88ea467..000000000 --- a/examples/platform-specific/jn516x/tsch/tx-power-verification/rpl-border-router/rpl-border-router.c +++ /dev/null @@ -1,168 +0,0 @@ -/* -* Copyright (c) 2015 NXP B.V. -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* 1. Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* 2. Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* 3. Neither the name of NXP B.V. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY NXP B.V. AND CONTRIBUTORS ``AS IS'' AND -* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL NXP B.V. OR CONTRIBUTORS BE LIABLE -* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -* SUCH DAMAGE. -* -* This file is part of the Contiki operating system. -* -* Author: Theo van Daele -* -*/ -#include "contiki.h" -#include "contiki-lib.h" -#include "contiki-net.h" -#include "net/ipv6/uip.h" -#include "net/ipv6/uip-ds6.h" -#include "net/routing/routing.h" -#include "simple-udp.h" -#include "net/mac/tsch/tsch.h" -#include "net/netstack.h" -#include "dev/slip.h" -#include "coap-engine.h" - -#include -#include -#include -#include - -#define DEBUG DEBUG_NONE -#include "net/ipv6/uip-debug.h" - -static uip_ipaddr_t prefix; -static uint8_t prefix_set; - -static void get_rssi_handler(coap_message_t *request, coap_message_t *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset); -static void get_last_rssi_handler(coap_message_t *request, coap_message_t *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset); - -static char content[COAP_MAX_CHUNK_SIZE]; -static int content_len = 0; - -#define CONTENT_PRINTF(...) { if(content_len < sizeof(content)) content_len += snprintf(content+content_len, sizeof(content)-content_len, __VA_ARGS__); } - -PROCESS(border_router_process, "Border router process"); -AUTOSTART_PROCESSES(&border_router_process); - -RESOURCE(resource_get_rssi, - "title=\"Get RSSI\"", - get_rssi_handler, - NULL, - NULL, - NULL); -static void -get_rssi_handler(coap_message_t *request, coap_message_t *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - int rssi_level; - unsigned int accept = -1; - coap_get_header_accept(request, &accept); - if(accept == -1 || accept == TEXT_PLAIN) { - content_len = 0; - NETSTACK_RADIO.get_value(RADIO_PARAM_RSSI, &rssi_level); - CONTENT_PRINTF("%d", rssi_level); - coap_set_header_content_format(response, TEXT_PLAIN); - coap_set_payload(response, (uint8_t *)content, content_len); - } -} - -RESOURCE(resource_get_last_rssi, - "title=\"Get last RSSI\"", - get_last_rssi_handler, - NULL, - NULL, - NULL); -static void -get_last_rssi_handler(coap_message_t *request, coap_message_t *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - int last_rssi_level; - unsigned int accept = -1; - coap_get_header_accept(request, &accept); - if(accept == -1 || accept == TEXT_PLAIN) { - content_len = 0; - NETSTACK_RADIO.get_value(RADIO_PARAM_LAST_RSSI, &last_rssi_level); - CONTENT_PRINTF("%d", last_rssi_level); - coap_set_header_content_format(response, TEXT_PLAIN); - coap_set_payload(response, (uint8_t *)content, content_len); - } -} - -/*---------------------------------------------------------------------------*/ -void -request_prefix(void) -{ - /* mess up uip_buf with a dirty request... */ - uip_buf[0] = '?'; - uip_buf[1] = 'P'; - uip_len = 2; - slip_send(); - uip_len = 0; -} -/*---------------------------------------------------------------------------*/ -void -set_prefix_64(uip_ipaddr_t *prefix_64) -{ - memcpy(&prefix, prefix_64, 16); - prefix_set = 1; -} -/*---------------------------------------------------------------------------*/ -PROCESS_THREAD(border_router_process, ev, data) -{ - static struct etimer et; - - PROCESS_BEGIN(); - -/* While waiting for the prefix to be sent through the SLIP connection, the future - * border router can join an existing DAG as a parent or child, or acquire a default - * router that will later take precedence over the SLIP fallback interface. - * Prevent that by turning the radio off until we are initialized as a DAG root. - */ - prefix_set = 0; - - PROCESS_PAUSE(); - - PRINTF("RPL-Border router started\n"); - - /* Request prefix until it has been received */ - while(!prefix_set) { - etimer_set(&et, CLOCK_SECOND); - request_prefix(); - PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); - PRINTF("Waiting for prefix\n"); - } - - PRINTF("Obtained prefix: "); - uip_debug_ipaddr_print(&prefix); - PRINTF("\n"); - - NETSTACK_ROUTING.root_set_prefix(&prefix, NULL); - NETSTACK_ROUTING.root_start(); - - coap_engine_init(); - coap_activate_resource(&resource_get_rssi, "Get-RSSI"); - coap_activate_resource(&resource_get_last_rssi, "Get-Last-RSSI"); - - - PROCESS_END(); -} -/*---------------------------------------------------------------------------*/ diff --git a/examples/platform-specific/jn516x/tsch/tx-power-verification/rpl-border-router/slip-bridge.c b/examples/platform-specific/jn516x/tsch/tx-power-verification/rpl-border-router/slip-bridge.c deleted file mode 100644 index 8201bf0f7..000000000 --- a/examples/platform-specific/jn516x/tsch/tx-power-verification/rpl-border-router/slip-bridge.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (c) 2010, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -/** - * \file - * Slip fallback interface - * \author - * Niclas Finne - * Joakim Eriksson - * Joel Hoglund - * Nicolas Tsiftes - */ - -#include "net/ipv6/uip.h" -#include "net/ipv6/uip-ds6.h" -#include "dev/slip.h" -#if CONTIKI_TARGET_JN516X -#include "dev/uart0.h" -#else -#include "dev/uart1.h" -#endif -#include - -#define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN]) - -#define DEBUG DEBUG_NONE -#include "net/ipv6/uip-debug.h" - -void set_prefix_64(uip_ipaddr_t *); - -static uip_ipaddr_t last_sender; -/*---------------------------------------------------------------------------*/ -static void -slip_input_callback(void) -{ - PRINTF("SIN: %u\n", uip_len); - if(uip_buf[0] == '!') { - PRINTF("Got configuration message of type %c\n", uip_buf[1]); - uip_len = 0; - if(uip_buf[1] == 'P') { - uip_ipaddr_t prefix; - /* Here we set a prefix !!! */ - memset(&prefix, 0, 16); - memcpy(&prefix, &uip_buf[2], 8); - PRINTF("Setting prefix "); - PRINT6ADDR(&prefix); - PRINTF("\n"); - set_prefix_64(&prefix); - } - } else if (uip_buf[0] == '?') { - PRINTF("Got request message of type %c\n", uip_buf[1]); - if(uip_buf[1] == 'M') { - char* hexchar = "0123456789abcdef"; - int j; - /* this is just a test so far... just to see if it works */ - uip_buf[0] = '!'; - for(j = 0; j < 8; j++) { - uip_buf[2 + j * 2] = hexchar[uip_lladdr.addr[j] >> 4]; - uip_buf[3 + j * 2] = hexchar[uip_lladdr.addr[j] & 15]; - } - uip_len = 18; - slip_send(); - - } - uip_len = 0; - } - /* Save the last sender received over SLIP to avoid bouncing the - packet back if no route is found */ - uip_ipaddr_copy(&last_sender, &UIP_IP_BUF->srcipaddr); -} -/*---------------------------------------------------------------------------*/ -static void -init(void) -{ - slip_arch_init(); - process_start(&slip_process, NULL); - slip_set_input_callback(slip_input_callback); -} -/*---------------------------------------------------------------------------*/ -static int -output(void) -{ - if(uip_ipaddr_cmp(&last_sender, &UIP_IP_BUF->srcipaddr)) { - /* Do not bounce packets back over SLIP if the packet was received - over SLIP */ - PRINTF("slip-bridge: Destination off-link but no route src="); - PRINT6ADDR(&UIP_IP_BUF->srcipaddr); - PRINTF(" dst="); - PRINT6ADDR(&UIP_IP_BUF->destipaddr); - PRINTF("\n"); - } else { - PRINTF("SUT: %u\n", uip_len); - slip_send(); - printf("\n"); - } - return 0; -} - -/*---------------------------------------------------------------------------*/ -#if !SLIP_BRIDGE_CONF_NO_PUTCHAR -#undef putchar -int -putchar(int c) -{ -#define SLIP_END 0300 - static char debug_frame = 0; - - if(!debug_frame) { /* Start of debug output */ - slip_arch_writeb(SLIP_END); - slip_arch_writeb('\r'); /* Type debug line == '\r' */ - debug_frame = 1; - } - - /* Need to also print '\n' because for example COOJA will not show - any output before line end */ - slip_arch_writeb((char)c); - - /* - * Line buffered output, a newline marks the end of debug output and - * implicitly flushes debug output. - */ - if(c == '\n') { - slip_arch_writeb(SLIP_END); - debug_frame = 0; - } - return c; -} -#endif -/*---------------------------------------------------------------------------*/ -const struct uip_fallback_interface rpl_interface = { - init, output -}; -/*---------------------------------------------------------------------------*/ diff --git a/examples/slip-radio/slip-radio.c b/examples/slip-radio/slip-radio.c index 30a9387df..21779a3dc 100644 --- a/examples/slip-radio/slip-radio.c +++ b/examples/slip-radio/slip-radio.c @@ -254,7 +254,7 @@ PROCESS_THREAD(slip_radio_process, ev, data) #ifdef SLIP_RADIO_CONF_SENSORS SLIP_RADIO_CONF_SENSORS.init(); #endif - printf("Slip Radio started...\n"); + LOG_INFO("Slip Radio started\n"); etimer_set(&et, CLOCK_SECOND * 3); diff --git a/os/dev/gpio-hal.c b/os/dev/gpio-hal.c index 70b50b688..658152293 100644 --- a/os/dev/gpio-hal.c +++ b/os/dev/gpio-hal.c @@ -40,10 +40,15 @@ #include "contiki.h" #include "dev/gpio-hal.h" #include "lib/list.h" +#include "sys/log.h" #include #include /*---------------------------------------------------------------------------*/ +/* Log configuration */ +#define LOG_MODULE "GPIO HAL" +#define LOG_LEVEL LOG_LEVEL_NONE +/*---------------------------------------------------------------------------*/ LIST(handlers); /*---------------------------------------------------------------------------*/ void @@ -78,6 +83,7 @@ void gpio_hal_arch_toggle_pin(gpio_hal_pin_t pin) { if(pin >= GPIO_HAL_PIN_COUNT) { + LOG_ERR("Pin %u out of bounds\n", pin); return; } diff --git a/os/dev/gpio-hal.h b/os/dev/gpio-hal.h index aacbfb1f1..b6af7bf74 100644 --- a/os/dev/gpio-hal.h +++ b/os/dev/gpio-hal.h @@ -130,6 +130,13 @@ typedef struct gpio_hal_event_handler_s { gpio_hal_pin_mask_t pin_mask; } gpio_hal_event_handler_t; /*---------------------------------------------------------------------------*/ +/** + * \brief Unknown GPIO + * + * A default GPIO value for unknown GPIO + */ +#define GPIO_HAL_PIN_UNKNOWN 0xFF +/*---------------------------------------------------------------------------*/ /** * \name Core GPIO functions * diff --git a/os/dev/leds.c b/os/dev/leds.c index eff3197a1..f2ce82c29 100644 --- a/os/dev/leds.c +++ b/os/dev/leds.c @@ -97,7 +97,11 @@ leds_toggle(leds_mask_t ledv) /*---------------------------------------------------------------------------*/ #else /* LEDS_LEGACY_API */ /*---------------------------------------------------------------------------*/ +#if LEDS_COUNT extern const leds_t leds_arch_leds[]; +#else +static const leds_t *leds_arch_leds = NULL; +#endif /*---------------------------------------------------------------------------*/ void leds_init() diff --git a/examples/platform-specific/jn516x/tsch/tx-power-verification/rpl-border-router/project-conf.h b/os/dev/spi-legacy.h similarity index 52% rename from examples/platform-specific/jn516x/tsch/tx-power-verification/rpl-border-router/project-conf.h rename to os/dev/spi-legacy.h index c34c364e3..d1600c785 100644 --- a/examples/platform-specific/jn516x/tsch/tx-power-verification/rpl-border-router/project-conf.h +++ b/os/dev/spi-legacy.h @@ -28,21 +28,65 @@ * */ -#ifndef BR_PROJECT_ROUTER_CONF_H_ -#define BR_PROJECT_ROUTER_CONF_H_ +/** + * \file + * Basic SPI macros + * \author + * Joakim Eriksson + * Niclas Finne + */ -#ifndef UIP_FALLBACK_INTERFACE -#define UIP_FALLBACK_INTERFACE rpl_interface +#ifndef SPI_LEGACY_H_ +#define SPI_LEGACY_H_ + +/* Define macros to use for checking SPI transmission status depending + on if it is possible to wait for TX buffer ready. This is possible + on for example MSP430 but not on AVR. */ +#ifdef SPI_WAITFORTxREADY +#define SPI_WAITFORTx_BEFORE() SPI_WAITFORTxREADY() +#define SPI_WAITFORTx_AFTER() +#define SPI_WAITFORTx_ENDED() SPI_WAITFOREOTx() +#else /* SPI_WAITFORTxREADY */ +#define SPI_WAITFORTx_BEFORE() +#define SPI_WAITFORTx_AFTER() SPI_WAITFOREOTx() +#define SPI_WAITFORTx_ENDED() +#endif /* SPI_WAITFORTxREADY */ + +extern unsigned char spi_busy; + +void spi_init(void); + +/* Write one character to SPI */ +#define SPI_WRITE(data) \ + do { \ + SPI_WAITFORTx_BEFORE(); \ + SPI_TXBUF = data; \ + SPI_WAITFOREOTx(); \ + } while(0) + +/* Write one character to SPI - will not wait for end + useful for multiple writes with wait after final */ +#define SPI_WRITE_FAST(data) \ + do { \ + SPI_WAITFORTx_BEFORE(); \ + SPI_TXBUF = data; \ + SPI_WAITFORTx_AFTER(); \ + } while(0) + +/* Read one character from SPI */ +#define SPI_READ(data) \ + do { \ + SPI_TXBUF = 0; \ + SPI_WAITFOREORx(); \ + data = SPI_RXBUF; \ + } while(0) + +/* Flush the SPI read register */ +#ifndef SPI_FLUSH +#define SPI_FLUSH() \ + do { \ + SPI_RXBUF; \ + } while(0) #endif -/* Needed for slip-bridge */ -#define SLIP_BRIDGE_CONF_NO_PUTCHAR 0 - -#define UIP_CONF_TCP 0 -#define QUEUEBUF_CONF_NUM 16 - -#define TSCH_QUEUE_CONF_MAX_NEIGHBOR_QUEUES 8 - -#include "../../common-conf.h" - -#endif /* PROJECT_ROUTER_CONF_H_ */ +#endif /* SPI_LEGACY_H_ */ diff --git a/os/dev/spi.c b/os/dev/spi.c new file mode 100644 index 000000000..c41cf206f --- /dev/null +++ b/os/dev/spi.c @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2016-2017, Yanzi Networks. + * Copyright (c) 2017, University of Bristol - http://www.bristol.ac.uk/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup spi-hal + * @{ + * + * \file + * Implementation of the platform-independent aspects of the SPI HAL + */ +/*---------------------------------------------------------------------------*/ +#include +#include "contiki.h" +#include +#include +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_acquire(spi_device_t *dev) +{ + if(dev == NULL || dev->spi_controller >= SPI_CONTROLLER_COUNT) { + return SPI_DEV_STATUS_EINVAL; + } + + /* lock and open the bus */ + return spi_arch_lock_and_open(dev); +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_release(spi_device_t *dev) +{ + if(dev == NULL || dev->spi_controller >= SPI_CONTROLLER_COUNT) { + return SPI_DEV_STATUS_EINVAL; + } + + /* close and unlock the bus */ + return spi_arch_close_and_unlock(dev); +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_select(spi_device_t *dev) +{ + return spi_arch_select(dev); +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_deselect(spi_device_t *dev) +{ + return spi_arch_deselect(dev); +} +/*---------------------------------------------------------------------------*/ +bool +spi_has_bus(spi_device_t *dev) +{ + if(dev == NULL || dev->spi_controller >= SPI_CONTROLLER_COUNT) { + return false; + } + + return spi_arch_has_lock(dev); +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_write_byte(spi_device_t *dev, uint8_t data) +{ + if(dev == NULL || dev->spi_controller >= SPI_CONTROLLER_COUNT) { + return SPI_DEV_STATUS_EINVAL; + } + + if(!spi_arch_has_lock(dev)) { + return SPI_DEV_STATUS_BUS_LOCKED; + } + + return spi_arch_transfer(dev, &data, 1, 0, 0, 0); +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_write(spi_device_t *dev, const uint8_t *data, int size) +{ + if(dev == NULL || dev->spi_controller >= SPI_CONTROLLER_COUNT) { + return SPI_DEV_STATUS_EINVAL; + } + + if(!spi_arch_has_lock(dev)) { + return SPI_DEV_STATUS_BUS_LOCKED; + } + + return spi_arch_transfer(dev, data, size, 0, 0, 0); +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_read_byte(spi_device_t *dev, uint8_t *buf) +{ + if(dev == NULL || dev->spi_controller >= SPI_CONTROLLER_COUNT) { + return SPI_DEV_STATUS_EINVAL; + } + + if(!spi_arch_has_lock(dev)) { + return SPI_DEV_STATUS_BUS_LOCKED; + } + + return spi_arch_transfer(dev, NULL, 0, buf, 1, 0); +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_read(spi_device_t *dev, uint8_t *buf, int size) +{ + if(dev == NULL || dev->spi_controller >= SPI_CONTROLLER_COUNT) { + return SPI_DEV_STATUS_EINVAL; + } + + if(!spi_arch_has_lock(dev)) { + return SPI_DEV_STATUS_BUS_LOCKED; + } + + return spi_arch_transfer(dev, NULL, 0, buf, size, 0); +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_read_skip(spi_device_t *dev, int size) +{ + if(dev == NULL || dev->spi_controller >= SPI_CONTROLLER_COUNT) { + return SPI_DEV_STATUS_EINVAL; + } + + if(!spi_arch_has_lock(dev)) { + return SPI_DEV_STATUS_BUS_LOCKED; + } + + return spi_arch_transfer(dev, NULL, 0, NULL, 0, size); +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_transfer(spi_device_t *dev, + const uint8_t *wdata, int wsize, + uint8_t *rbuf, int rsize, int ignore) +{ + if(dev == NULL || dev->spi_controller >= SPI_CONTROLLER_COUNT) { + return SPI_DEV_STATUS_EINVAL; + } + + if(!spi_arch_has_lock(dev)) { + return SPI_DEV_STATUS_BUS_LOCKED; + } + + if(wdata == NULL && wsize > 0) { + return SPI_DEV_STATUS_EINVAL; + } + + if(rbuf == NULL && rsize > 0) { + return SPI_DEV_STATUS_EINVAL; + } + + return spi_arch_transfer(dev, wdata, wsize, rbuf, rsize, ignore); +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_read_register(spi_device_t *dev, uint8_t reg, uint8_t *data, int size) +{ + spi_status_t status; + if(dev == NULL || dev->spi_controller >= SPI_CONTROLLER_COUNT) { + return SPI_DEV_STATUS_EINVAL; + } + + /* write the register first (will read a status) */ + status = spi_write_byte(dev, reg); + if(status != SPI_DEV_STATUS_OK) { + return status; + } + + /* then read the value (will read the value) */ + status = spi_read(dev, data, size); + if(status != SPI_DEV_STATUS_OK) { + return status; + } + + return status; +} +/*---------------------------------------------------------------------------*/ +spi_status_t +spi_strobe(spi_device_t *dev, uint8_t strobe, uint8_t *result) +{ + if(dev == NULL || dev->spi_controller >= SPI_CONTROLLER_COUNT) { + return SPI_DEV_STATUS_EINVAL; + } + + if(!spi_arch_has_lock(dev)) { + return SPI_DEV_STATUS_BUS_LOCKED; + } + + return spi_arch_transfer(dev, &strobe, 1, result, 1, 0); +} +/*---------------------------------------------------------------------------*/ +/** + * @} + */ diff --git a/os/dev/spi.h b/os/dev/spi.h index 5960c411b..0c9aadc73 100644 --- a/os/dev/spi.h +++ b/os/dev/spi.h @@ -1,5 +1,6 @@ /* - * Copyright (c) 2010, Swedish Institute of Computer Science. + * Copyright (c) 2016-2017, Yanzi Networks. + * Copyright (c) 2017, University of Bristol - http://www.bristol.ac.uk/ * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,83 +11,339 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. */ - +/*---------------------------------------------------------------------------*/ /** + * \addtogroup dev + * @{ + * + * \defgroup spi-hal SPI Hardware Abstraction Layer + * + * The SPI HAL provides a set of common functions that can be used in a + * platform-independent fashion. + * + * + * @{ + * * \file - * Basic SPI macros - * \author - * Joakim Eriksson - * Niclas Finne + * Header file for the SPI HAL */ - +/*---------------------------------------------------------------------------*/ #ifndef SPI_H_ #define SPI_H_ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "gpio-hal.h" -/* Define macros to use for checking SPI transmission status depending - on if it is possible to wait for TX buffer ready. This is possible - on for example MSP430 but not on AVR. */ -#ifdef SPI_WAITFORTxREADY -#define SPI_WAITFORTx_BEFORE() SPI_WAITFORTxREADY() -#define SPI_WAITFORTx_AFTER() -#define SPI_WAITFORTx_ENDED() SPI_WAITFOREOTx() -#else /* SPI_WAITFORTxREADY */ -#define SPI_WAITFORTx_BEFORE() -#define SPI_WAITFORTx_AFTER() SPI_WAITFOREOTx() -#define SPI_WAITFORTx_ENDED() -#endif /* SPI_WAITFORTxREADY */ - -extern unsigned char spi_busy; - -void spi_init(void); - -/* Write one character to SPI */ -#define SPI_WRITE(data) \ - do { \ - SPI_WAITFORTx_BEFORE(); \ - SPI_TXBUF = data; \ - SPI_WAITFOREOTx(); \ - } while(0) - -/* Write one character to SPI - will not wait for end - useful for multiple writes with wait after final */ -#define SPI_WRITE_FAST(data) \ - do { \ - SPI_WAITFORTx_BEFORE(); \ - SPI_TXBUF = data; \ - SPI_WAITFORTx_AFTER(); \ - } while(0) - -/* Read one character from SPI */ -#define SPI_READ(data) \ - do { \ - SPI_TXBUF = 0; \ - SPI_WAITFOREORx(); \ - data = SPI_RXBUF; \ - } while(0) - -/* Flush the SPI read register */ -#ifndef SPI_FLUSH -#define SPI_FLUSH() \ - do { \ - SPI_RXBUF; \ - } while(0) +#include +#include +/*---------------------------------------------------------------------------*/ +/* Include Arch-Specific conf */ +#ifdef SPI_HAL_CONF_ARCH_HDR_PATH +#include SPI_HAL_CONF_ARCH_HDR_PATH +#endif /* SPI_HAL_CONF_ARCH_HDR_PATH */ +/*---------------------------------------------------------------------------*/ +#ifdef SPI_CONF_CONTROLLER_COUNT +/** + * \brief Number of SPI module instances on a chip + */ +#define SPI_CONTROLLER_COUNT SPI_CONF_CONTROLLER_COUNT +#else +#define SPI_CONTROLLER_COUNT 0 #endif +/*---------------------------------------------------------------------------*/ +/* Convenience macros to enumerate SPI module instances on a chip */ +#define SPI_CONTROLLER_SPI0 0 +#define SPI_CONTROLLER_SPI1 1 +/*---------------------------------------------------------------------------*/ +/** + * \brief SPI return codes + * + * @{ + */ +typedef enum { + SPI_DEV_STATUS_OK, /* Everything OK */ + SPI_DEV_STATUS_EINVAL, /* Erroneous input value */ + SPI_DEV_STATUS_BUS_LOCKED, /* SPI bus is already locked */ + SPI_DEV_STATUS_BUS_NOT_OWNED, /* SPI bus is locked by someone else */ + SPI_DEV_STATUS_CLOSED /* SPI bus has not opened properly */ +} spi_status_t; +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \brief SPI Device Configuration + * + * This is a structure to an architecture-independent SPI configuration. + * + * @{ + */ + +typedef struct spi_device { + gpio_hal_pin_t pin_spi_sck; /* SPI SCK pin */ + gpio_hal_pin_t pin_spi_miso; /* SPI MISO pin */ + gpio_hal_pin_t pin_spi_mosi; /* SPI MOSI pin */ + gpio_hal_pin_t pin_spi_cs; /* SPI Chip Select pin */ + uint32_t spi_bit_rate; /* SPI bit rate */ + uint8_t spi_pha; /* SPI mode phase */ + uint8_t spi_pol; /* SPI mode polarity */ + uint8_t spi_controller; /* ID of SPI controller to use */ +} spi_device_t; +/** @} */ +/*---------------------------------------------------------------------------*/ +/* These are architecture-independent functions to be used by SPI devices. */ +/*---------------------------------------------------------------------------*/ +/** + * \brief Locks and then opens an SPI controller + * \param dev An SPI device configuration which defines the controller + * to be locked and the opening configuration. + * \return SPI return code + */ +spi_status_t spi_acquire(spi_device_t *dev); + +/** + * \brief Closes and then unlocks an SPI controller + * \param dev An SPI device configuration which defines the controller + * to be closed and unlocked. + * \return SPI return code + * + * Releasing an SPI controller should put it in low-power mode. + * This should work only if the device has already locked the SPI + * controller. + */ +spi_status_t spi_release(spi_device_t *dev); + +/** + * \brief Selects the SPI peripheral + * \param dev An SPI device configuration which defines the CS pin. + * \return SPI return code + * + * Clears the CS pin. This should work only if the device has + * already locked the SPI controller. + */ +spi_status_t spi_select(spi_device_t *dev); + +/** + * \brief Deselects the SPI peripheral + * \param dev An SPI device configuration which defines the CS pin. + * \return SPI return code + * + * Sets the CS pin. Lock is not required. + */ +spi_status_t spi_deselect(spi_device_t *dev); + +/** + * \brief Checks if a device has locked an SPI controller + * \param dev An SPI device configuration which defines the controller. + * \return true if the device has the lock, false otherwise. + */ +bool spi_has_bus(spi_device_t *dev); + +/** + * \brief Writes a single byte to an SPI device + * \param dev An SPI device configuration. + * \param data A byte of data + * \return SPI return code + * + * It should work only if the device has already locked the SPI controller. + */ +spi_status_t spi_write_byte(spi_device_t *dev, uint8_t data); + +/** + * \brief Reads a single byte from an SPI device + * \param dev An SPI device configuration. + * \param data A pointer to a byte of data + * \return SPI return code + * + * It should work only if the device has already locked the SPI controller. + */ +spi_status_t spi_read_byte(spi_device_t *dev, uint8_t *data); + +/** + * \brief Writes a buffer to an SPI device + * \param dev An SPI device configuration. + * \param data A pointer to the data + * \param size Size of the data to write + * \return SPI return code + * + * It should work only if the device has already locked the SPI controller. + */ +spi_status_t spi_write(spi_device_t *dev, + const uint8_t *data, int size); + +/** + * \brief Reads a buffer from an SPI device + * \param dev An SPI device configuration. + * \param data A pointer to the data + * \param size Size of the data to read + * \return SPI return code + * + * It should work only if the device has already locked the SPI controller. + */ +spi_status_t spi_read(spi_device_t *dev, uint8_t *data, int size); + +/** + * \brief Reads and ignores data from an SPI device + * \param dev An SPI device configuration. + * \param size Size of the data to read and ignore + * \return SPI return code + * + * Reads size bytes from the SPI and throws them away. + * It should work only if the device has already locked the SPI controller. + */ +spi_status_t spi_read_skip(spi_device_t *dev, int size); + +/** + * \brief Performs a generic SPI transfer + * \param dev An SPI device configuration. + * \param data A pointer to the data to be written. Set it to NULL to + * skip writing. + * \param wsize Size of data to write. + * \param buf A pointer to buffer to copy the data read. Set to NULL + * to skip reading. + * \param rsize Size of data to read. + * \param ignore Size of data to read and ignore. + * \return SPI return code + * + * It should work only if the device has already locked the SPI controller. + * A total of rlen+ignore_len bytes will be read. The first rlen bytes will + * be copied to buf. The remaining ignore_len bytes won't be copied to the + * buffer. The maximum of wlen and rlen+ignore_len of bytes will be transfered. + */ +spi_status_t spi_transfer(spi_device_t *dev, + const uint8_t *data, int wsize, + uint8_t *buf, int rsize, int ignore); + +/** + * \brief Reads and Writes one byte from/to an SPI device + * \param dev An SPI device configuration. + * \param strobe Byte to write + * \param status Pointer to byte to read + * \return SPI return code + * + * It should work only if the device has already locked the SPI controller. + */ +spi_status_t spi_strobe(spi_device_t *dev, uint8_t strobe, + uint8_t *status); + +/** + * \brief Reads a buffer of bytes from a register of an SPI device + * \param dev An SPI device configuration. + * \param reg Register + * \param data A pointer to the data + * \param size Size of the data to read + * \return SPI return code + * + * It should work only if the device has already locked the SPI controller. + */ +spi_status_t spi_read_register(spi_device_t *dev, uint8_t reg, + uint8_t *data, int size); + +/*---------------------------------------------------------------------------*/ +/* These are architecture-specific functions to be implemented by each CPU. */ +/*---------------------------------------------------------------------------*/ + +/** + * \brief Checks if a device has locked an SPI controller + * \param dev An SPI device configuration which defines the controller + * to be checked if it is locked and the respective device. + * \return 1 if the device has the lock, 0 otherwise. + * + */ +bool spi_arch_has_lock(spi_device_t *dev); + +/** + * \brief Checks if an SPI controller is locked by any device + * \param dev An SPI device configuration which defines the controller + * to be checked. + * \return 1 if the controller is locked, 0 otherwise. + * + */ +bool spi_arch_is_bus_locked(spi_device_t *dev); + +/** + * \brief Locks and opens an SPI controller to the configuration specified. + * \param dev An SPI device configuration. + * \return SPI return code + * + * This should work only if the device has already locked the SPI + * controller. + * + */ +spi_status_t spi_arch_lock_and_open(spi_device_t *dev); + +/** + * \brief Closes and unlocks an SPI controller + * \param dev An SPI device configuration that specifies the controller. + * \return SPI return code + * + * This should turn off the SPI controller to put it in low power mode + * and unlock it. + * It should work only if the device has already locked the SPI + * controller. + * + */ +spi_status_t spi_arch_close_and_unlock(spi_device_t *dev); + +/** + * \brief Performs an SPI transfer + * \param dev An SPI device configuration that specifies the controller. + * \param data A pointer to the data to be written. Set it to NULL to + * skip writing. + * \param wlen Length of data to write. + * \param buf A pointer to buffer to copy the data read. Set to NULL + * to skip reading. + * \param rlen Length of data to read. + * \param ignore_len Length of data to read and ignore. + * \return SPI return code + * + * It should work only if the device has already locked the SPI controller. + * A total of rlen+ignore_len bytes will be read. The first rlen bytes will + * be copied to buf. The remaining ignore_len bytes won't be copied to the + * buffer. The maximum of wlen and rlen+ignore_len of bytes will be transfered. + */ +spi_status_t spi_arch_transfer(spi_device_t *dev, + const uint8_t *data, int wlen, + uint8_t *buf, int rlen, + int ignore_len); + +/** + * \brief Selects an SPI device + * \param dev An SPI device configuration that specifies the CS pin. + * \return SPI return code + * + * Clears the CS pin. It should work only if the device has already + * locked the SPI controller. + */ +spi_status_t spi_arch_select(spi_device_t *dev); + +/** + * \brief Deselects an SPI device + * \param dev An SPI device configuration that specifies the CS pin. + * \return SPI return code + * + * Set the CS pin. Locking the SPI controller is not needed. + */ +spi_status_t spi_arch_deselect(spi_device_t *dev); #endif /* SPI_H_ */ +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ diff --git a/arch/cpu/cc26xx-cc13xx/dbg.h b/os/lib/dbg-io/dbg.h similarity index 83% rename from arch/cpu/cc26xx-cc13xx/dbg.h rename to os/lib/dbg-io/dbg.h index 4460b6eb4..6440b5eca 100644 --- a/arch/cpu/cc26xx-cc13xx/dbg.h +++ b/os/lib/dbg-io/dbg.h @@ -1,10 +1,11 @@ /* - * Copyright (c) 2014, Texas Instruments Incorporated - http://www.ti.com/ + * Copyright (c) 2015, Nordic Semiconductor * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: + * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright @@ -29,16 +30,17 @@ */ /*---------------------------------------------------------------------------*/ /** - * \addtogroup cc26xx + * \addtogroup lib * @{ * - * \defgroup cc26xx-char-io CC13xx/CC26xx Character I/O - * - * CC13xx/CC26xx CPU-specific functions for debugging and SLIP I/O + * \addtogroup dbg-io Portable debugging output functons * @{ * * \file - * Header file for the CC13xx/CC26xx Debug I/O module + * Header file for the dbg-io module. + * \author + * Wojciech Bober + * */ #ifndef DBG_H_ #define DBG_H_ @@ -50,12 +52,14 @@ * \param seq A pointer to the stream * \param len The number of bytes to print * \return The number of printed bytes - * - * This function is an arch-specific implementation required by the dbg-io - * API in cpu/arm/common/dbg-io. It prints a stream of bytes over the - * peripheral used by the platform. */ unsigned int dbg_send_bytes(const unsigned char *seq, unsigned int len); +/** + * \brief Print a character to debug output + * \param c Character to print + * \return Printed character + */ +int dbg_putchar(int c); /*---------------------------------------------------------------------------*/ #endif /* DBG_H_ */ /*---------------------------------------------------------------------------*/ diff --git a/arch/cpu/cc26xx-cc13xx/debug-uart.h b/os/lib/dbg-io/printf.c similarity index 78% rename from arch/cpu/cc26xx-cc13xx/debug-uart.h rename to os/lib/dbg-io/printf.c index c2d9b0ffb..9749f1f7d 100644 --- a/arch/cpu/cc26xx-cc13xx/debug-uart.h +++ b/os/lib/dbg-io/printf.c @@ -1,16 +1,16 @@ /* - * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/ + * Copyright (c) 2009, Simon Berg * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: + * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * * 3. Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. @@ -29,21 +29,36 @@ * OF THE POSSIBILITY OF SUCH DAMAGE. */ /*---------------------------------------------------------------------------*/ -/** - * \addtogroup cc26xx-char-io - * @{ - * - * \file - * This file is here because DBG I/O expects it to be. It just includes - * our own dbg.h which has a non-misleading name and which also adheres - * to Contiki's naming convention - */ +#include "contiki.h" +#include "lib/dbg-io/dbg.h" + +#include +#include +#include /*---------------------------------------------------------------------------*/ -#ifndef DEBUG_UART_H_ -#define DEBUG_UART_H_ +static strformat_result +write_str(void *user_data, const char *data, unsigned int len) +{ + if(len > 0) { + dbg_send_bytes((unsigned char *)data, len); + } + return STRFORMAT_OK; +} /*---------------------------------------------------------------------------*/ -#include "dbg.h" +static strformat_context_t ctxt = +{ + write_str, + NULL +}; /*---------------------------------------------------------------------------*/ -#endif /* DEBUG_UART_H_ */ +int +printf(const char *fmt, ...) +{ + int res; + va_list ap; + va_start(ap, fmt); + res = format_str_v(&ctxt, fmt, ap); + va_end(ap); + return res; +} /*---------------------------------------------------------------------------*/ -/** @} */ diff --git a/os/lib/dbg-io/putchar.c b/os/lib/dbg-io/putchar.c new file mode 100644 index 000000000..26a35446d --- /dev/null +++ b/os/lib/dbg-io/putchar.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2009, Simon Berg + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "lib/dbg-io/dbg.h" + +#include +#include +/*---------------------------------------------------------------------------*/ +int +putchar(int c) +{ + dbg_putchar(c); + return c; +} +/*---------------------------------------------------------------------------*/ diff --git a/os/lib/dbg-io/puts.c b/os/lib/dbg-io/puts.c new file mode 100644 index 000000000..93d73d3a5 --- /dev/null +++ b/os/lib/dbg-io/puts.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2009, Simon Berg + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "lib/dbg-io/dbg.h" + +#include +#include +/*---------------------------------------------------------------------------*/ +int +puts(const char *str) +{ + dbg_send_bytes((unsigned char *)str, strlen(str)); + dbg_putchar('\n'); + return 0; +} +/*---------------------------------------------------------------------------*/ diff --git a/os/lib/dbg-io/snprintf.c b/os/lib/dbg-io/snprintf.c new file mode 100644 index 000000000..96f99e568 --- /dev/null +++ b/os/lib/dbg-io/snprintf.c @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2009, Simon Berg + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" + +#include +#include +#include +/*---------------------------------------------------------------------------*/ +struct fmt_buffer { + char *pos; + size_t left; +}; +/*---------------------------------------------------------------------------*/ +static strformat_result +buffer_str(void *user_data, const char *data, unsigned int len) +{ + struct fmt_buffer *buffer = (struct fmt_buffer *)user_data; + if(len >= buffer->left) { + len = buffer->left; + len--; + } + + memcpy(buffer->pos, data, len); + buffer->pos += len; + buffer->left -= len; + return STRFORMAT_OK; +} +/*---------------------------------------------------------------------------*/ +int +snprintf(char *str, size_t size, const char *format, ...) +{ + int res; + va_list ap; + va_start(ap, format); + res = vsnprintf(str, size, format, ap); + va_end(ap); + return res; +} +/*---------------------------------------------------------------------------*/ +int +vsnprintf(char *str, size_t size, const char *format, va_list ap) +{ + struct fmt_buffer buffer; + strformat_context_t ctxt; + int res; + ctxt.write_str = buffer_str; + ctxt.user_data = &buffer; + buffer.pos = str; + buffer.left = size; + res = format_str_v(&ctxt, format, ap); + *buffer.pos = '\0'; + return res; +} +/*---------------------------------------------------------------------------*/ diff --git a/os/lib/dbg-io/sprintf.c b/os/lib/dbg-io/sprintf.c new file mode 100644 index 000000000..4ecf5b540 --- /dev/null +++ b/os/lib/dbg-io/sprintf.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2009, Simon Berg + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" + +#include +#include +#include +/*---------------------------------------------------------------------------*/ +static strformat_result +buffer_str(void *user_data, const char *data, unsigned int len) +{ + memcpy(*(char **)user_data, data, len); + (*(char **)user_data) += len; + return STRFORMAT_OK; +} +/*---------------------------------------------------------------------------*/ +int +sprintf(char *str, const char *format, ...) +{ + strformat_context_t ctxt; + int res; + va_list ap; + va_start(ap, format); + ctxt.write_str = buffer_str; + ctxt.user_data = &str; + res = format_str_v(&ctxt, format, ap); + *str = '\0'; + va_end(ap); + return res; +} +/*---------------------------------------------------------------------------*/ diff --git a/os/lib/dbg-io/strformat.c b/os/lib/dbg-io/strformat.c new file mode 100644 index 000000000..b5ad18f89 --- /dev/null +++ b/os/lib/dbg-io/strformat.c @@ -0,0 +1,707 @@ +/* + * Copyright (c) 2009, Simon Berg + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" + +#include +/*---------------------------------------------------------------------------*/ +#define HAVE_DOUBLE +#define HAVE_LONGLONG + +#ifndef LARGEST_SIGNED +#ifdef HAVE_LONGLONG +#define LARGEST_SIGNED long long int +#else +#define LARGEST_UNSIGNED long int +#endif /* HAVE_LONGLONG */ +#endif /* LARGEST_SIGNED */ + +#ifndef LARGEST_UNSIGNED +#ifdef HAVE_LONGLONG +#define LARGEST_UNSIGNED unsigned long long int +#else +#define LARGEST_UNSIGNED unsigned long int +#endif /* HAVE_LONGLONG */ +#endif /* LARGEST_UNSIGNED */ + +#ifndef POINTER_INT +#define POINTER_INT unsigned long +#endif +/*---------------------------------------------------------------------------*/ +typedef unsigned int FormatFlags; +/*---------------------------------------------------------------------------*/ +#define MAKE_MASK(shift, size) (((1 << size) - 1) << (shift)) +/*---------------------------------------------------------------------------*/ +#define JUSTIFY_SHIFT 0 +#define JUSTIFY_SIZE 1 +#define JUSTIFY_RIGHT 0x0000 +#define JUSTIFY_LEFT 0x0001 +#define JUSTIFY_MASK MAKE_MASK(JUSTIFY_SHIFT, JUSTIFY_SIZE) +/*---------------------------------------------------------------------------*/ +/* How a positive number is prefixed */ +#define POSITIVE_SHIFT (JUSTIFY_SHIFT + JUSTIFY_SIZE) +#define POSITIVE_NONE (0x0000 << POSITIVE_SHIFT) +#define POSITIVE_SPACE (0x0001 << POSITIVE_SHIFT) +#define POSITIVE_PLUS (0x0003 << POSITIVE_SHIFT) +#define POSITIVE_MASK MAKE_MASK(POSITIVE_SHIFT, POSITIVE_SIZE) + +#define POSITIVE_SIZE 2 +/*---------------------------------------------------------------------------*/ +#define ALTERNATE_FORM_SHIFT (POSITIVE_SHIFT + POSITIVE_SIZE) +#define ALTERNATE_FORM_SIZE 1 +#define ALTERNATE_FORM (0x0001 << ALTERNATE_FORM_SHIFT) +/*---------------------------------------------------------------------------*/ +#define PAD_SHIFT (ALTERNATE_FORM_SHIFT + ALTERNATE_FORM_SIZE) +#define PAD_SIZE 1 +#define PAD_SPACE (0x0000 << PAD_SHIFT) +#define PAD_ZERO (0x0001 << PAD_SHIFT) +/*---------------------------------------------------------------------------*/ +#define SIZE_SHIFT (PAD_SHIFT + PAD_SIZE) +#define SIZE_SIZE 3 +#define SIZE_CHAR (0x0001 << SIZE_SHIFT) +#define SIZE_SHORT (0x0002 << SIZE_SHIFT) +#define SIZE_INT (0x0000 << SIZE_SHIFT) +#define SIZE_LONG (0x0003 << SIZE_SHIFT) +#define SIZE_LONGLONG (0x0004 << SIZE_SHIFT) +#define SIZE_MASK MAKE_MASK(SIZE_SHIFT, SIZE_SIZE) +/*---------------------------------------------------------------------------*/ +#define CONV_SHIFT (SIZE_SHIFT + SIZE_SIZE) +#define CONV_SIZE 3 +#define CONV_INTEGER (0x0001 << CONV_SHIFT) +#define CONV_FLOAT (0x0002 << CONV_SHIFT) +#define CONV_POINTER (0x0003 << CONV_SHIFT) +#define CONV_STRING (0x0004 << CONV_SHIFT) +#define CONV_CHAR (0x0005 << CONV_SHIFT) +#define CONV_PERCENT (0x0006 << CONV_SHIFT) +#define CONV_WRITTEN (0x0007 << CONV_SHIFT) +#define CONV_MASK MAKE_MASK(CONV_SHIFT, CONV_SIZE) +/*---------------------------------------------------------------------------*/ +#define RADIX_SHIFT (CONV_SHIFT + CONV_SIZE) +#define RADIX_SIZE 2 +#define RADIX_DECIMAL (0x0001 << RADIX_SHIFT) +#define RADIX_OCTAL (0x0002 << RADIX_SHIFT) +#define RADIX_HEX (0x0003 << RADIX_SHIFT) +#define RADIX_MASK MAKE_MASK(RADIX_SHIFT, RADIX_SIZE) +/*---------------------------------------------------------------------------*/ +#define SIGNED_SHIFT (RADIX_SHIFT + RADIX_SIZE) +#define SIGNED_SIZE 1 +#define SIGNED_NO (0x0000 << SIGNED_SHIFT) +#define SIGNED_YES (0x0001 << SIGNED_SHIFT) +#define SIGNED_MASK MAKE_MASK(SIGNED_SHIFT, SIGNED_SIZE) +/*---------------------------------------------------------------------------*/ +#define CAPS_SHIFT (SIGNED_SHIFT + SIGNED_SIZE) +#define CAPS_SIZE 1 +#define CAPS_NO (0x0000 << CAPS_SHIFT) +#define CAPS_YES (0x0001 << CAPS_SHIFT) +#define CAPS_MASK MAKE_MASK(CAPS_SHIFT, CAPS_SIZE) +/*---------------------------------------------------------------------------*/ +#define FLOAT_SHIFT (CAPS_SHIFT + CAPS_SIZE) +#define FLOAT_SIZE 2 +#define FLOAT_NORMAL (0x0000 << FLOAT_SHIFT) +#define FLOAT_EXPONENT (0x0001 << FLOAT_SHIFT) +#define FLOAT_DEPENDANT (0x0002 << FLOAT_SHIFT) +#define FLOAT_HEX (0x0003 << FLOAT_SHIFT) +#define FLOAT_MASK MAKE_MASK(FLOAT_SHIFT, FLOAT_SIZE) +/*---------------------------------------------------------------------------*/ +#define CHECKCB(res) { if((res) != STRFORMAT_OK) { va_end(ap); return -1; } } +/*---------------------------------------------------------------------------*/ +#define MAXCHARS_HEX ((sizeof(LARGEST_UNSIGNED) * 8) / 4) + +/* Largest number of characters needed for converting an unsigned integer. */ +#define MAXCHARS ((sizeof(LARGEST_UNSIGNED) * 8 + 2) / 3) +/*---------------------------------------------------------------------------*/ +static FormatFlags +parse_flags(const char **posp) +{ + FormatFlags flags = 0; + const char *pos = *posp; + + while(1) { + switch(*pos) { + case '-': + flags |= JUSTIFY_LEFT; + break; + case '+': + flags |= POSITIVE_PLUS; + break; + case ' ': + flags |= POSITIVE_SPACE; + break; + case '#': + flags |= ALTERNATE_FORM; + break; + case '0': + flags |= PAD_ZERO; + break; + default: + *posp = pos; + return flags; + } + + pos++; + } +} +/*---------------------------------------------------------------------------*/ +static unsigned int +parse_uint(const char **posp) +{ + unsigned v = 0; + const char *pos = *posp; + char ch; + + while((ch = *pos) >= '0' && ch <= '9') { + v = v * 10 + (ch - '0'); + pos++; + } + + *posp = pos; + + return v; +} +/*---------------------------------------------------------------------------*/ +static unsigned int +output_uint_decimal(char **posp, LARGEST_UNSIGNED v) +{ + unsigned int len; + char *pos = *posp; + + while(v > 0) { + *--pos = (v % 10) + '0'; + v /= 10; + } + + len = *posp - pos; + *posp = pos; + + return len; +} +/*---------------------------------------------------------------------------*/ +static unsigned int +output_uint_hex(char **posp, LARGEST_UNSIGNED v, unsigned int flags) +{ + unsigned int len; + const char *hex = (flags & CAPS_YES) ? "0123456789ABCDEF" : "0123456789abcdef"; + char *pos = *posp; + + while(v > 0) { + *--pos = hex[(v % 16)]; + v /= 16; + } + + len = *posp - pos; + *posp = pos; + + return len; +} +/*---------------------------------------------------------------------------*/ +static unsigned int +output_uint_octal(char **posp, LARGEST_UNSIGNED v) +{ + unsigned int len; + char *pos = *posp; + + while(v > 0) { + *--pos = (v % 8) + '0'; + v /= 8; + } + + len = *posp - pos; + *posp = pos; + + return len; +} +/*---------------------------------------------------------------------------*/ +static strformat_result +fill_space(const strformat_context_t *ctxt, unsigned int len) +{ + strformat_result res; + static const char buffer[16] = " "; + + while(len > 16) { + res = ctxt->write_str(ctxt->user_data, buffer, 16); + if(res != STRFORMAT_OK) { + return res; + } + len -= 16; + } + + if(len == 0) { + return STRFORMAT_OK; + } + + return ctxt->write_str(ctxt->user_data, buffer, len); +} +/*---------------------------------------------------------------------------*/ +static strformat_result +fill_zero(const strformat_context_t *ctxt, unsigned int len) +{ + strformat_result res; + static const char buffer[16] = "0000000000000000"; + + while(len > 16) { + res = ctxt->write_str(ctxt->user_data, buffer, 16); + if(res != STRFORMAT_OK) { + return res; + } + len -= 16; + } + + if(len == 0) { + return STRFORMAT_OK; + } + return ctxt->write_str(ctxt->user_data, buffer, len); +} +/*---------------------------------------------------------------------------*/ +int +format_str(const strformat_context_t *ctxt, const char *format, ...) +{ + int ret; + va_list ap; + va_start(ap, format); + ret = format_str_v(ctxt, format, ap); + va_end(ap); + return ret; +} +/*---------------------------------------------------------------------------*/ +int +format_str_v(const strformat_context_t *ctxt, const char *format, va_list ap) +{ + unsigned int written = 0; + const char *pos = format; + + while(*pos != '\0') { + FormatFlags flags; + unsigned int minwidth = 0; + int precision = -1; /* Negative means no precision */ + char ch; + const char *start = pos; + + while((ch = *pos) != '\0' && ch != '%') { + pos++; + } + + if(pos != start) { + CHECKCB(ctxt->write_str(ctxt->user_data, start, pos - start)); + written += pos - start; + } + + if(*pos == '\0') { + va_end(ap); + return written; + } + + pos++; + + if(*pos == '\0') { + va_end(ap); + return written; + } + + flags = parse_flags(&pos); + + /* parse width */ + if(*pos >= '1' && *pos <= '9') { + minwidth = parse_uint(&pos); + } else if(*pos == '*') { + int w = va_arg(ap, int); + + if(w < 0) { + flags |= JUSTIFY_LEFT; + minwidth = w; + } else { + minwidth = w; + } + + pos++; + } + + /* parse precision */ + if(*pos == '.') { + pos++; + + if(*pos >= '0' && *pos <= '9') { + precision = parse_uint(&pos); + } else if(*pos == '*') { + pos++; + precision = va_arg(ap, int); + } + } + + if(*pos == 'l') { + pos++; + + if(*pos == 'l') { + flags |= SIZE_LONGLONG; + pos++; + } else { + flags |= SIZE_LONG; + } + } else if(*pos == 'h') { + pos++; + + if(*pos == 'h') { + flags |= SIZE_CHAR; + pos++; + } else { + flags |= SIZE_SHORT; + } + } + + /* parse conversion specifier */ + switch(*pos) { + case 'd': + case 'i': + flags |= CONV_INTEGER | RADIX_DECIMAL | SIGNED_YES; + break; + case 'u': + flags |= CONV_INTEGER | RADIX_DECIMAL | SIGNED_NO; + break; + case 'o': + flags |= CONV_INTEGER | RADIX_OCTAL | SIGNED_NO; + break; + case 'x': + flags |= CONV_INTEGER | RADIX_HEX | SIGNED_NO; + break; + case 'X': + flags |= CONV_INTEGER | RADIX_HEX | SIGNED_NO | CAPS_YES; + break; +#ifdef HAVE_DOUBLE + case 'f': + flags |= CONV_FLOAT | FLOAT_NORMAL; + break; + case 'F': + flags |= CONV_FLOAT | FLOAT_NORMAL | CAPS_YES; + break; + case 'e': + flags |= CONV_FLOAT | FLOAT_EXPONENT; + break; + case 'E': + flags |= CONV_FLOAT | FLOAT_EXPONENT | CAPS_YES; + break; + case 'g': + flags |= CONV_FLOAT | FLOAT_DEPENDANT; + break; + case 'G': + flags |= CONV_FLOAT | FLOAT_DEPENDANT | CAPS_YES; + break; + case 'a': + flags |= CONV_FLOAT | FLOAT_HEX; + break; + case 'A': + flags |= CONV_FLOAT | FLOAT_HEX | CAPS_YES; + break; +#endif + case 'c': + flags |= CONV_CHAR; + break; + case 's': + flags |= CONV_STRING; + break; + case 'p': + flags |= CONV_POINTER; + break; + case 'n': + flags |= CONV_WRITTEN; + break; + case '%': + flags |= CONV_PERCENT; + break; + case '\0': + va_end(ap); + return written; + } + pos++; + + switch(flags & CONV_MASK) { + case CONV_PERCENT: + CHECKCB(ctxt->write_str(ctxt->user_data, "%", 1)); + written++; + break; + case CONV_INTEGER: + { + /* unsigned integers */ + char *prefix = 0; /* sign, "0x" or "0X" */ + unsigned int prefix_len = 0; + char buffer[MAXCHARS]; + char *conv_pos = buffer + MAXCHARS; + unsigned int conv_len = 0; + unsigned int width = 0; + unsigned int precision_fill; + unsigned int field_fill; + LARGEST_UNSIGNED uvalue = 0; + int negative = 0; + + if(precision < 0) { + precision = 1; + } else { + flags &= ~PAD_ZERO; + } + + if(flags & SIGNED_YES) { + /* signed integers */ + LARGEST_SIGNED value = 0; + switch(flags & SIZE_MASK) { + case SIZE_CHAR: + value = (signed char)va_arg(ap, int); + break; + case SIZE_SHORT: + value = (short)va_arg(ap, int); + break; + case SIZE_INT: + value = va_arg(ap, int); + break; +#ifndef HAVE_LONGLONG + case SIZE_LONGLONG: /* Treat long long the same as long */ +#endif + case SIZE_LONG: + value = va_arg(ap, long); + break; +#ifdef HAVE_LONGLONG + case SIZE_LONGLONG: + value = va_arg(ap, long long); + break; +#endif + } + if(value < 0) { + uvalue = -value; + negative = 1; + } else { + uvalue = value; + } + } else { + + switch(flags & SIZE_MASK) { + case SIZE_CHAR: + uvalue = (unsigned char)va_arg(ap, unsigned int); + break; + case SIZE_SHORT: + uvalue = (unsigned short)va_arg(ap, unsigned int); + break; + case SIZE_INT: + uvalue = va_arg(ap, unsigned int); + break; +#ifndef HAVE_LONGLONG + case SIZE_LONGLONG: /* Treat long long the same as long */ +#endif + case SIZE_LONG: + uvalue = va_arg(ap, unsigned long); + break; +#ifdef HAVE_LONGLONG + case SIZE_LONGLONG: + uvalue = va_arg(ap, unsigned long long); + break; +#endif + } + } + + switch(flags & (RADIX_MASK)) { + case RADIX_DECIMAL: + conv_len = output_uint_decimal(&conv_pos, uvalue); + break; + case RADIX_OCTAL: + conv_len = output_uint_octal(&conv_pos, uvalue); + break; + case RADIX_HEX: + conv_len = output_uint_hex(&conv_pos, uvalue, flags); + break; + } + + width += conv_len; + precision_fill = (precision > conv_len) ? precision - conv_len : 0; + if((flags & (RADIX_MASK | ALTERNATE_FORM)) + == (RADIX_OCTAL | ALTERNATE_FORM)) { + if(precision_fill < 1) { + precision_fill = 1; + } + } + + width += precision_fill; + + if((flags & (RADIX_MASK | ALTERNATE_FORM)) + == (RADIX_HEX | ALTERNATE_FORM) && uvalue != 0) { + prefix_len = 2; + if(flags & CAPS_YES) { + prefix = "0X"; + } else { + prefix = "0x"; + } + } + + if(flags & SIGNED_YES) { + if(negative) { + prefix = "-"; + prefix_len = 1; + } else { + switch(flags & POSITIVE_MASK) { + case POSITIVE_SPACE: + prefix = " "; + prefix_len = 1; + break; + case POSITIVE_PLUS: + prefix = "+"; + prefix_len = 1; + break; + } + } + } + + width += prefix_len; + + field_fill = (minwidth > width) ? minwidth - width : 0; + + if((flags & JUSTIFY_MASK) == JUSTIFY_RIGHT) { + if(flags & PAD_ZERO) { + precision_fill += field_fill; + field_fill = 0; /* Do not double count padding */ + } else { + CHECKCB(fill_space(ctxt, field_fill)); + } + } + + if(prefix_len > 0) { + CHECKCB(ctxt->write_str(ctxt->user_data, prefix, prefix_len)); + } + written += prefix_len; + + CHECKCB(fill_zero(ctxt, precision_fill)); + written += precision_fill; + + CHECKCB(ctxt->write_str(ctxt->user_data, conv_pos, conv_len)); + written += conv_len; + + if((flags & JUSTIFY_MASK) == JUSTIFY_LEFT) { + CHECKCB(fill_space(ctxt, field_fill)); + } + written += field_fill; + } + break; + case CONV_STRING: + { + unsigned int field_fill; + unsigned int len; + char *str = va_arg(ap, char *); + + if(str) { + char *pos = str; + while(*pos != '\0') pos++; + len = pos - str; + } else { + str = "(null)"; + len = 6; + } + + if(precision >= 0 && precision < len) { + len = precision; + } + + field_fill = (minwidth > len) ? minwidth - len : 0; + + if((flags & JUSTIFY_MASK) == JUSTIFY_RIGHT) { + CHECKCB(fill_space(ctxt, field_fill)); + } + + CHECKCB(ctxt->write_str(ctxt->user_data, str, len)); + written += len; + + if((flags & JUSTIFY_MASK) == JUSTIFY_LEFT) { + CHECKCB(fill_space(ctxt, field_fill)); + } + written += field_fill; + } + break; + case CONV_POINTER: + { + LARGEST_UNSIGNED uvalue = + (LARGEST_UNSIGNED)(POINTER_INT)va_arg(ap, void *); + char buffer[MAXCHARS_HEX + 3]; + char *conv_pos = buffer + MAXCHARS_HEX + 3; + unsigned int conv_len; + unsigned int field_fill; + + conv_len = output_uint_hex(&conv_pos, uvalue, flags); + + if(conv_len == 0) { + *--conv_pos = '0'; + conv_len++; + } + + *--conv_pos = 'x'; + *--conv_pos = '0'; + *--conv_pos = '#'; + conv_len += 3; + + field_fill = (minwidth > conv_len) ? minwidth - conv_len : 0; + + if((flags & JUSTIFY_MASK) == JUSTIFY_RIGHT) { + CHECKCB(fill_space(ctxt, field_fill)); + } + + CHECKCB(ctxt->write_str(ctxt->user_data, conv_pos, conv_len)); + written += conv_len; + + if((flags & JUSTIFY_MASK) == JUSTIFY_LEFT) { + CHECKCB(fill_space(ctxt, field_fill)); + } + + written += field_fill; + } + break; + case CONV_CHAR: + { + char ch = va_arg(ap, int); + unsigned int field_fill = (minwidth > 1) ? minwidth - 1 : 0; + + if((flags & JUSTIFY_MASK) == JUSTIFY_RIGHT) { + CHECKCB(fill_space(ctxt, field_fill)); + written += field_fill; + } + + CHECKCB(ctxt->write_str(ctxt->user_data, &ch, 1)); + written++; + + if((flags & JUSTIFY_MASK) == JUSTIFY_LEFT) { + CHECKCB(fill_space(ctxt, field_fill)); + } + written += field_fill; + } + break; + case CONV_WRITTEN: + { + int *p = va_arg(ap, int *); + *p = written; + } + break; + } + } + + return written; +} +/*---------------------------------------------------------------------------*/ diff --git a/os/lib/dbg-io/strformat.h b/os/lib/dbg-io/strformat.h new file mode 100644 index 000000000..62d99b303 --- /dev/null +++ b/os/lib/dbg-io/strformat.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2009, Simon Berg + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef STRFORMAT_H_ +#define STRFORMAT_H_ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" + +#include +/*---------------------------------------------------------------------------*/ +#define STRFORMAT_OK 0 +#define STRFORMAT_FAILED 1 +/*---------------------------------------------------------------------------*/ +typedef unsigned int strformat_result; +/*---------------------------------------------------------------------------*/ +/* The data argument may only be considered valid during the function call */ +typedef strformat_result (*strformat_write)(void *user_data, + const char *data, + unsigned int len); + +typedef struct strformat_context_s { + strformat_write write_str; + void *user_data; +} strformat_context_t; +/*---------------------------------------------------------------------------*/ +int format_str(const strformat_context_t *ctxt, const char *format, ...) + __attribute__ ((__format__ (__printf__, 2,3))); + +int +format_str_v(const strformat_context_t *ctxt, const char *format, va_list ap); +/*---------------------------------------------------------------------------*/ +#endif /* STRFORMAT_H_ */ +/*---------------------------------------------------------------------------*/ diff --git a/os/net/app-layer/coap/coap-engine.c b/os/net/app-layer/coap/coap-engine.c index 0db9c2a39..fb85b5b15 100644 --- a/os/net/app-layer/coap/coap-engine.c +++ b/os/net/app-layer/coap/coap-engine.c @@ -51,7 +51,7 @@ /* Log configuration */ #include "coap-log.h" -#define LOG_MODULE "coap-engine" +#define LOG_MODULE "coap-eng" #define LOG_LEVEL LOG_LEVEL_COAP static void process_callback(coap_timer_t *t); diff --git a/os/net/app-layer/coap/coap-uip.c b/os/net/app-layer/coap/coap-uip.c index ed881ca8b..8db2bbbbf 100644 --- a/os/net/app-layer/coap/coap-uip.c +++ b/os/net/app-layer/coap/coap-uip.c @@ -359,8 +359,8 @@ process_secure_data(void) { LOG_INFO("receiving secure UDP datagram from ["); LOG_INFO_6ADDR(&UIP_IP_BUF->srcipaddr); - LOG_INFO_("]:%u\n Length: %u\n", uip_ntohs(UIP_UDP_BUF->srcport), - uip_datalen()); + LOG_INFO_("]:%u\n", uip_ntohs(UIP_UDP_BUF->srcport)); + LOG_INFO(" Length: %u\n", uip_datalen()); if(dtls_context) { dtls_handle_message(dtls_context, (coap_endpoint_t *)get_src_endpoint(1), @@ -374,8 +374,8 @@ process_data(void) { LOG_INFO("receiving UDP datagram from ["); LOG_INFO_6ADDR(&UIP_IP_BUF->srcipaddr); - LOG_INFO_("]:%u\n Length: %u\n", uip_ntohs(UIP_UDP_BUF->srcport), - uip_datalen()); + LOG_INFO_("]:%u\n", uip_ntohs(UIP_UDP_BUF->srcport)); + LOG_INFO(" Length: %u\n", uip_datalen()); coap_receive(get_src_endpoint(0), uip_appdata, uip_datalen()); } diff --git a/os/net/ipv6/sicslowpan.c b/os/net/ipv6/sicslowpan.c index 3bc7a935e..4708acca7 100644 --- a/os/net/ipv6/sicslowpan.c +++ b/os/net/ipv6/sicslowpan.c @@ -1571,7 +1571,7 @@ output(const linkaddr_t *localdest) LOG_INFO("Fragmentation sending packet len %d\n", uip_len); /* Create 1st Fragment */ - LOG_INFO("output: 1rst fragment "); + LOG_INFO("output: 1st fragment "); /* Reset last tx status to ok in case the fragment transmissions are deferred */ last_tx_status = MAC_TX_OK; @@ -1591,7 +1591,7 @@ output(const linkaddr_t *localdest) /* Copy payload and send */ packetbuf_hdr_len += SICSLOWPAN_FRAG1_HDR_LEN; packetbuf_payload_len = (max_payload - packetbuf_hdr_len) & 0xfffffff8; - LOG_INFO("(len %d, tag %d)\n", packetbuf_payload_len, frag_tag); + LOG_INFO_("(len %d, tag %d)\n", packetbuf_payload_len, frag_tag); memcpy(packetbuf_ptr + packetbuf_hdr_len, (uint8_t *)UIP_IP_BUF + uncomp_hdr_len, packetbuf_payload_len); packetbuf_set_datalen(packetbuf_payload_len + packetbuf_hdr_len); @@ -1636,7 +1636,7 @@ output(const linkaddr_t *localdest) /* last fragment */ packetbuf_payload_len = uip_len - processed_ip_out_len; } - LOG_INFO("(offset %d, len %d, tag %d)\n", + LOG_INFO_("(offset %d, len %d, tag %d)\n", processed_ip_out_len >> 3, packetbuf_payload_len, frag_tag); memcpy(packetbuf_ptr + packetbuf_hdr_len, (uint8_t *)UIP_IP_BUF + processed_ip_out_len, packetbuf_payload_len); @@ -1742,7 +1742,7 @@ input(void) frag_offset = 0; frag_size = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE) & 0x07ff; frag_tag = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_TAG); - LOG_INFO("size %d, tag %d, offset %d)\n", + LOG_INFO_ ("size %d, tag %d, offset %d)\n", frag_size, frag_tag, frag_offset); packetbuf_hdr_len += SICSLOWPAN_FRAG1_HDR_LEN; first_fragment = 1; @@ -1767,13 +1767,13 @@ input(void) frag_offset = PACKETBUF_FRAG_PTR[PACKETBUF_FRAG_OFFSET]; frag_tag = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_TAG); frag_size = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE) & 0x07ff; - LOG_INFO("size %d, tag %d, offset %d)\n", + LOG_INFO_("size %d, tag %d, offset %d)\n", frag_size, frag_tag, frag_offset); packetbuf_hdr_len += SICSLOWPAN_FRAGN_HDR_LEN; /* If this is the last fragment, we may shave off any extrenous bytes at the end. We must be liberal in what we accept. */ - LOG_INFO("last_fragment?: packetbuf_payload_len %d frag_size %d\n", + LOG_INFO_("last_fragment?: packetbuf_payload_len %d frag_size %d\n", packetbuf_datalen() - packetbuf_hdr_len, frag_size); /* Add the fragment to the fragmentation context (this will also diff --git a/os/net/ipv6/tcpip.c b/os/net/ipv6/tcpip.c index 41d317d17..5db4b9a21 100644 --- a/os/net/ipv6/tcpip.c +++ b/os/net/ipv6/tcpip.c @@ -168,6 +168,8 @@ static void packet_input(void) { if(uip_len > 0) { + LOG_INFO("input: received %u bytes\n", uip_len); + check_for_tcp_syn(); #if UIP_TAG_TC_WITH_VARIABLE_RETRANSMISSIONS @@ -499,7 +501,7 @@ get_nexthop(uip_ipaddr_t *addr) uip_ipaddr_t *nexthop; uip_ds6_route_t *route; - LOG_INFO("output: processing packet from "); + LOG_INFO("output: processing %u bytes packet from ", uip_len); LOG_INFO_6ADDR(&UIP_IP_BUF->srcipaddr); LOG_INFO_(" to "); LOG_INFO_6ADDR(&UIP_IP_BUF->destipaddr); diff --git a/os/net/mac/csma/csma-output.c b/os/net/mac/csma/csma-output.c index 74803ecf1..59949c040 100644 --- a/os/net/mac/csma/csma-output.c +++ b/os/net/mac/csma/csma-output.c @@ -85,7 +85,7 @@ /* macMaxFrameRetries: Maximum number of re-transmissions attampts. Range 0--7 */ #ifdef CSMA_CONF_MAX_FRAME_RETRIES -#define CSMA_MAX_FRAME_RETRIES CSMA_MAX_FRAME_RETRIES +#define CSMA_MAX_FRAME_RETRIES CSMA_CONF_MAX_FRAME_RETRIES #else #define CSMA_MAX_FRAME_RETRIES 7 #endif @@ -403,7 +403,7 @@ noack(struct packet_queue *q, struct neighbor_queue *n, int num_transmissions) static void tx_ok(struct packet_queue *q, struct neighbor_queue *n, int num_transmissions) { - n->collisions = CSMA_MIN_BE; + n->collisions = 0; n->transmissions += num_transmissions; tx_done(MAC_TX_OK, q, n); } @@ -493,7 +493,7 @@ csma_output_packet(mac_callback_t sent, void *ptr) /* Init neighbor entry */ linkaddr_copy(&n->addr, addr); n->transmissions = 0; - n->collisions = CSMA_MIN_BE; + n->collisions = 0; /* Init packet queue for this neighbor */ LIST_STRUCT_INIT(n, packet_queue); /* Add neighbor to the neighbor list */ @@ -523,7 +523,8 @@ csma_output_packet(mac_callback_t sent, void *ptr) LOG_INFO("sending to "); LOG_INFO_LLADDR(addr); - LOG_INFO_(", seqno %u, queue length %d, free packets %d\n", + LOG_INFO_(", len %u, seqno %u, queue length %d, free packets %d\n", + packetbuf_datalen(), packetbuf_attr(PACKETBUF_ATTR_MAC_SEQNO), list_length(n->packet_queue), memb_numfree(&packet_memb)); /* If q is the first packet in the neighbor's queue, send asap */ diff --git a/os/net/mac/csma/csma.c b/os/net/mac/csma/csma.c index aa7a98a3d..7259e35c8 100644 --- a/os/net/mac/csma/csma.c +++ b/os/net/mac/csma/csma.c @@ -108,9 +108,9 @@ input_packet(void) } #endif /* CSMA_SEND_SOFT_ACK */ if(!duplicate) { - LOG_WARN("received packet from "); - LOG_WARN_LLADDR(packetbuf_addr(PACKETBUF_ADDR_SENDER)); - LOG_WARN_(", seqno %u, len %u\n", packetbuf_attr(PACKETBUF_ATTR_MAC_SEQNO), packetbuf_datalen()); + LOG_INFO("received packet from "); + LOG_INFO_LLADDR(packetbuf_addr(PACKETBUF_ADDR_SENDER)); + LOG_INFO_(", seqno %u, len %u\n", packetbuf_attr(PACKETBUF_ATTR_MAC_SEQNO), packetbuf_datalen()); NETSTACK_NETWORK.input(); } } diff --git a/os/net/mac/tsch/Makefile.tsch b/os/net/mac/tsch/Makefile.tsch deleted file mode 100644 index e19ff8b13..000000000 --- a/os/net/mac/tsch/Makefile.tsch +++ /dev/null @@ -1 +0,0 @@ -CONTIKI_SOURCEFILES += tsch.c tsch-slot-operation.c tsch-queue.c tsch-packet.c tsch-schedule.c tsch-log.c tsch-rpl.c tsch-adaptive-timesync.c diff --git a/os/net/routing/rpl-lite/rpl-dag.c b/os/net/routing/rpl-lite/rpl-dag.c index 7cf99e03b..00ee1663e 100644 --- a/os/net/routing/rpl-lite/rpl-dag.c +++ b/os/net/routing/rpl-lite/rpl-dag.c @@ -180,6 +180,21 @@ find_objective_function(rpl_ocp_t ocp) } /*---------------------------------------------------------------------------*/ void +rpl_refresh_routes(const char *str) +{ + if(rpl_dag_root_is_root()) { + LOG_WARN("incrementing DTSN (%s), current %u)\n", + str, curr_instance.dtsn_out); + if(LOG_INFO_ENABLED) { + rpl_neighbor_print_list("Refresh routes (before)"); + } + + /* Increment DTSN */ + RPL_LOLLIPOP_INCREMENT(curr_instance.dtsn_out); + } +} +/*---------------------------------------------------------------------------*/ +void rpl_global_repair(const char *str) { if(rpl_dag_root_is_root()) { diff --git a/os/net/routing/rpl-lite/rpl.h b/os/net/routing/rpl-lite/rpl.h index 7fb4c8718..25ac3863e 100644 --- a/os/net/routing/rpl-lite/rpl.h +++ b/os/net/routing/rpl-lite/rpl.h @@ -126,6 +126,13 @@ int rpl_is_reachable(void); */ int rpl_lollipop_greater_than(int a, int b); +/** + * Triggers a route fresh via DTSN increment + * + * \param str a textual description of the cause for refresh + */ +void rpl_refresh_routes(const char *str); + /** @} */ #endif /* RPL_H */ diff --git a/os/services/shell/shell-commands.c b/os/services/shell/shell-commands.c index 2068bf249..46ee92fe5 100644 --- a/os/services/shell/shell-commands.c +++ b/os/services/shell/shell-commands.c @@ -412,6 +412,17 @@ PT_THREAD(cmd_rpl_local_repair(struct pt *pt, shell_output_func output, char *ar PT_END(pt); } +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(cmd_rpl_refresh_routes(struct pt *pt, shell_output_func output, char *args)) +{ + PT_BEGIN(pt); + + SHELL_OUTPUT(output, "Triggering routes refresh\n") + rpl_refresh_routes("Shell"); + + PT_END(pt); +} #endif /* UIP_CONF_IPV6_RPL */ /*---------------------------------------------------------------------------*/ static @@ -721,6 +732,7 @@ struct shell_command_t shell_commands[] = { #if UIP_CONF_IPV6_RPL { "rpl-set-root", cmd_rpl_set_root, "'> rpl-set-root 0/1 [prefix]': Sets node as root (1) or not (0). A /64 prefix can be optionally specified." }, { "rpl-local-repair", cmd_rpl_local_repair, "'> rpl-local-repair': Triggers a RPL local repair" }, + { "rpl-refresh-routes", cmd_rpl_refresh_routes, "'> rpl-refresh-routes': Refreshes all routes through a DTSN increment" }, { "rpl-global-repair", cmd_rpl_global_repair, "'> rpl-global-repair': Triggers a RPL global repair" }, #endif /* UIP_CONF_IPV6_RPL */ #if ROUTING_CONF_RPL_LITE diff --git a/tests/04-compile-nxp-ports/Makefile b/tests/04-compile-nxp-ports/Makefile index b1fdd9ea6..cec1f91af 100644 --- a/tests/04-compile-nxp-ports/Makefile +++ b/tests/04-compile-nxp-ports/Makefile @@ -11,7 +11,6 @@ platform-specific/jn516x/rpl/coap-dr1175-node/jn516x \ platform-specific/jn516x/rpl/coap-dr1199-node/jn516x \ platform-specific/jn516x/tsch/simple-sensor-network/node/jn516x \ platform-specific/jn516x/tsch/tx-power-verification/node/jn516x \ -platform-specific/jn516x/tsch/tx-power-verification/rpl-border-router/jn516x \ platform-specific/jn516x/tsch/uart1-test-node/jn516x \ sensniff/jn516x \ rpl-border-router/jn516x \ diff --git a/tests/18-coap-lwm2m/06-lwm2m-ipso-test.sh b/tests/18-coap-lwm2m/06-lwm2m-ipso-test.sh index 15fd96243..7684044a8 100755 --- a/tests/18-coap-lwm2m/06-lwm2m-ipso-test.sh +++ b/tests/18-coap-lwm2m/06-lwm2m-ipso-test.sh @@ -3,12 +3,13 @@ # Contiki directory CONTIKI=$1 # Test basename -BASENAME=06-lwm2m-test +BASENAME=06-lwm2m-ipso-test IPADDR=fd00::302:304:506:708 # Starting Contiki-NG native node echo "Starting native node - lwm2m/ipso objects" +make -C $CONTIKI/examples/ipso-objects clean >/dev/null make -C $CONTIKI/examples/ipso-objects > make.log 2> make.err sudo $CONTIKI/examples/ipso-objects/example-ipso-objects.native > node.log 2> node.err & CPID=$! @@ -19,7 +20,15 @@ wget -nc https://joakimeriksson.github.io/resources/leshan-server-demo-1.0.0-SNA echo "Starting leshan server" java -jar leshan-server-demo-1.0.0-SNAPSHOT-jar-with-dependencies.jar >leshan.log 2>leshan.err & LESHID=$! -sleep 50 + +COUNTER=10 +while [ $COUNTER -gt 0 ]; do + sleep 5 + if grep -q 'OK' leshan.err ; then + break + fi + let COUNTER-=1 +done echo "Closing native node" sleep 1 diff --git a/tests/18-coap-lwm2m/07-lwm2m-standalone-test.sh b/tests/18-coap-lwm2m/07-lwm2m-standalone-test.sh index 5516eeb46..b13352447 100755 --- a/tests/18-coap-lwm2m/07-lwm2m-standalone-test.sh +++ b/tests/18-coap-lwm2m/07-lwm2m-standalone-test.sh @@ -5,9 +5,10 @@ CONTIKI=$1 # Test basename BASENAME=07-lwm2m-standalone-test -git clone https://github.com/contiki-ng/example-lwm2m-standalone.git # Building standalone posix example -make -C example-lwm2m-standalone/lwm2m > make.log 2> make.err +echo "Compiling standalone posix example" +make CONTIKI_NG=../../$CONTIKI -C example-lwm2m-standalone/lwm2m clean >/dev/null +make CONTIKI_NG=../../$CONTIKI -C example-lwm2m-standalone/lwm2m >make.log 2>make.err echo "Downloading leshan" wget -nc https://joakimeriksson.github.io/resources/leshan-server-demo-1.0.0-SNAPSHOT-jar-with-dependencies.jar @@ -20,11 +21,19 @@ example-lwm2m-standalone/lwm2m/lwm2m-example coap://127.0.0.1:5686 > node.log 2> CPID=$! -sleep 50 +COUNTER=10 +while [ $COUNTER -gt 0 ]; do + sleep 5 + if grep -q 'OK' leshan.err ; then + echo OK with $COUNTER + break + fi + let COUNTER-=1 +done -echo "Closing native node" +echo "Closing standalone example" sleep 1 -pgrep ipso | sudo xargs kill -9 +pgrep lwm2m-example | sudo xargs kill -9 echo "Closing leshan" sleep 1 diff --git a/tests/18-coap-lwm2m/example-lwm2m-standalone b/tests/18-coap-lwm2m/example-lwm2m-standalone index 7ab51eaaa..67b858437 160000 --- a/tests/18-coap-lwm2m/example-lwm2m-standalone +++ b/tests/18-coap-lwm2m/example-lwm2m-standalone @@ -1 +1 @@ -Subproject commit 7ab51eaaa309c123fbd318c6ad3338cce1e48e48 +Subproject commit 67b858437f7cf1e4e027d821c4c2ac15fdf2ab44