diff --git a/cmdline/read-temp.c b/cmdline/read-temp.c index 8d9a183..fffcd8b 100644 --- a/cmdline/read-temp.c +++ b/cmdline/read-temp.c @@ -24,11 +24,12 @@ respectively. #include /* this is libusb */ #include "opendevice.h" /* common code moved to separate module */ #include //for htons() +#include #include "../firmware/masterchip/usbdrv/usbconfig.h" /* device's VID/PID and names */ void usage() { - printf("Usage: read-temp [spi|temp] [opcode] [addr] [value]\n"); + printf("Usage: read-temp [spi|temp|dbg] [[opcode] [addr] [value]]\n"); } int main(int argc, char **argv) @@ -117,6 +118,56 @@ int cnt, vid, pid; fprintf(stderr, "answer: value=0x%04x (%i)\n", rxIndex,rxIndex); // fprintf(stderr, "rxValue = 0x%04x value = 0x%04x\n", rxValue, addr); // fprintf(stderr, "rxIndex = 0x%04x index = 0x%04x\n", rxIndex, value); + } else if(strcasecmp(argv[1], "dbg") == 0) { + if(argc != 2) { + usage(); + return 0; + } + + int rqRefreshHasNew[] = {6, 0, 0}; + int rqHasNew[] = {2, 0, 0}; + int rqGetNew[] = {2, 1, 0}; + int rqAdvance[] = {6, 1, 0}; + int *rq; + + while(1) { + // refresh "hasNew" variable + rq = rqRefreshHasNew; + cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, rq[0], rq[1], rq[2], buffer, sizeof(buffer), 5000); + if(cnt < 0){ + fprintf(stderr, "\nUSB error in iteration ?!?: %s\n", usb_strerror()); + } + + // check whether we have new + rq = rqHasNew; + cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, rq[0], rq[1], rq[2], buffer, sizeof(buffer), 5000); + if(cnt < 0){ + fprintf(stderr, "\nUSB error in iteration ?!?: %s\n", usb_strerror()); + } + rxIndex = ((int)buffer[1] & 0xff) | (((int)buffer[0] & 0xff) << 8); + + if(rxIndex) { // if we have new data? + // advance the new char pointer... + rq = rqAdvance; + cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, rq[0], rq[1], rq[2], buffer, sizeof(buffer), 5000); + if(cnt < 0){ + fprintf(stderr, "\nUSB error in iteration ?!?: %s\n", usb_strerror()); + } + rxIndex = ((int)buffer[1] & 0xff) | (((int)buffer[0] & 0xff) << 8); + + // get the new char and print it + rq = rqGetNew; + cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, rq[0], rq[1], rq[2], buffer, sizeof(buffer), 5000); + if(cnt < 0){ + fprintf(stderr, "\nUSB error in iteration ?!?: %s\n", usb_strerror()); + } + rxIndex = ((int)buffer[1] & 0xff) | (((int)buffer[0] & 0xff) << 8); + if(rxIndex != 0 && (rxIndex & 0xff) != 0xff){ + fprintf(stderr, "%c", rxIndex); + } + } + usleep(1000); + } } else { usage(); } diff --git a/firmware/slavechip/Makefile b/firmware/slavechip/Makefile index 29f0cb2..0e0fe40 100644 --- a/firmware/slavechip/Makefile +++ b/firmware/slavechip/Makefile @@ -2,7 +2,7 @@ include ../Makefile.inc COMPILE = avr-gcc $(CFLAGS) $(DEFINES) -OBJECTS = main.o mcp_adc.o i2c_simple.o softtimer.o spi_proto.o spi.o spi_pointers.o muxer.o +OBJECTS = main.o mcp_adc.o i2c_simple.o softtimer.o spi_proto.o spi.o spi_pointers.o muxer.o debug.o # symbolic targets: all: firmware.hex diff --git a/firmware/slavechip/Project.ede b/firmware/slavechip/Project.ede new file mode 100644 index 0000000..a0eb630 --- /dev/null +++ b/firmware/slavechip/Project.ede @@ -0,0 +1,8 @@ +;; Object thermocouple +;; EDE project file. +(ede-proj-project "thermocouple" + :name "thermocouple" + :file "Project.ede" + :targets (list + ) + ) diff --git a/firmware/slavechip/debug.c b/firmware/slavechip/debug.c new file mode 100644 index 0000000..5dcc9a8 --- /dev/null +++ b/firmware/slavechip/debug.c @@ -0,0 +1,38 @@ +#include "debug.h" +#include + +char debugStr[DEBUGCHARS]; +volatile char dbgCurChar; +volatile uint8_t dbgStrFill; // amount of available chars in debugStr +volatile uint8_t dbgHasNewSPI; + +void dbgLog(const char* fmt, ...) { + uint8_t maxwrite = DEBUGCHARS - dbgStrFill; + va_list va; + va_start(va,fmt); + char* pos = debugStr + dbgStrFill; + dbgStrFill += vsnprintf(pos, maxwrite, fmt, va); + va_end(va); +} + +uint8_t dbgHasNew() { + dbgHasNewSPI = (dbgStrFill > 0); + return (dbgStrFill > 0); +} + +char dbgReadChar() { + if(dbgHasNew()) { + char ret = debugStr[0]; + for(int i=0; i + +#define DEBUGCHARS 100 +extern char debugStr[]; +extern volatile uint8_t dbgStrFill; // amount of available chars in debugStr +extern volatile uint8_t dbgHasNewSPI; +extern volatile char dbgCurChar; + + +void dbgLog(const char* fmt, ...); +uint8_t dbgHasNew(); +char dbgReadChar(); +void dbgAdvanceChar(); +#endif diff --git a/firmware/slavechip/i2c_simple.c b/firmware/slavechip/i2c_simple.c index 18ac1ba..4523863 100644 --- a/firmware/slavechip/i2c_simple.c +++ b/firmware/slavechip/i2c_simple.c @@ -99,8 +99,13 @@ inline uint8_t i2c_write(uint8_t addr, uint8_t len, uint8_t *data) return i2c_write_i(addr, len, data, 1); } + + uint8_t i2c_write_read(uint8_t addr, uint8_t writelen, uint8_t *writedata, uint8_t readlen, uint8_t *readdata) { - if(writelen == i2c_write_i(addr, writelen, writedata, 0)) {return i2c_read(addr, readlen, readdata);} + if(writelen == i2c_write_i(addr, writelen, writedata, 0)) { + return i2c_read(addr, readlen, readdata); + } + return 0; } diff --git a/firmware/slavechip/main.c b/firmware/slavechip/main.c index d6eabb7..f0e48d8 100644 --- a/firmware/slavechip/main.c +++ b/firmware/slavechip/main.c @@ -4,6 +4,8 @@ #include "i2c_simple.h" #include "mcp_adc.h" +#include "debug.h" + uint8_t foo; uint16_t bar; uint16_t timertmp; @@ -67,6 +69,7 @@ int __attribute__((noreturn)) main(void) { muxer_set(MUXER_CHANNEL_0); temperatures[2]=0; + dbgLog("Hallo, Welt!\n"); for(;;){ diff --git a/firmware/slavechip/main.h b/firmware/slavechip/main.h index 881d47e..4544e03 100644 --- a/firmware/slavechip/main.h +++ b/firmware/slavechip/main.h @@ -12,6 +12,7 @@ #define SOFTTIMERNUMS 4 #include "softtimer.h" +#include "debug.h" extern uint8_t foo; extern uint16_t bar; diff --git a/firmware/slavechip/spi_pointers.c b/firmware/slavechip/spi_pointers.c index f592ff6..cb09299 100644 --- a/firmware/slavechip/spi_pointers.c +++ b/firmware/slavechip/spi_pointers.c @@ -1,34 +1,23 @@ - #include "spi_pointers.h" #include "main.h" uint8_t *spi_proto_globals8[] = { - &foo, - &foo, - &foo, - &foo, - &foo, - &foo, - &foo - }; + &dbgHasNewSPI, + &dbgCurChar +}; + uint16_t *spi_proto_globals16[] = { - &timertmp, - &temperatures[0], - &temperatures[1], - &temperatures[2], - &temperatures[3], - &bar, - &bar, - &bar, - &bar, - &bar, - &bar, - &bar, - &bar - }; + &timertmp, + &temperatures[0], + &temperatures[1], + &temperatures[2], + &temperatures[3], +}; + funptr_t spi_proto_funcs[] = { - &baz - }; + &dbgHasNew, + &dbgAdvanceChar +};