testavr.c
author darius@Inchoate
Mon, 19 Jan 2009 22:54:19 +1030
changeset 71 553c061fda7c
parent 63 4d914a1fd487
permissions -rw-r--r--
Keep the newer GCC happy.
darius@0
     1
/*
darius@9
     2
 * Test various AVR bits and pieces
darius@9
     3
 *
darius@41
     4
 * Copyright (c) 2008
darius@0
     5
 *      Daniel O'Connor <darius@dons.net.au>.  All rights reserved.
darius@0
     6
 *
darius@0
     7
 * Redistribution and use in source and binary forms, with or without
darius@0
     8
 * modification, are permitted provided that the following conditions
darius@0
     9
 * are met:
darius@0
    10
 * 1. Redistributions of source code must retain the above copyright
darius@0
    11
 *    notice, this list of conditions and the following disclaimer.
darius@0
    12
 * 2. Redistributions in binary form must reproduce the above copyright
darius@0
    13
 *    notice, this list of conditions and the following disclaimer in the
darius@0
    14
 *    documentation and/or other materials provided with the distribution.
darius@0
    15
 *
darius@0
    16
 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
darius@0
    17
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
darius@0
    18
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
darius@0
    19
 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
darius@0
    20
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
darius@0
    21
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
darius@0
    22
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
darius@0
    23
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
darius@0
    24
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
darius@0
    25
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
darius@0
    26
 * SUCH DAMAGE.
darius@0
    27
 */
darius@0
    28
darius@0
    29
#include <avr/io.h>
darius@0
    30
#include <avr/interrupt.h>
darius@0
    31
#include <avr/pgmspace.h>
darius@41
    32
#include <stdio.h>
darius@0
    33
#include <string.h>
darius@4
    34
#include <ctype.h>
darius@13
    35
#include <stdlib.h>
darius@24
    36
#include <util/delay.h>
darius@47
    37
#include <avr/wdt.h>
darius@0
    38
darius@41
    39
#include "cons.h"
darius@0
    40
#include "1wire.h"
darius@37
    41
#ifdef WITHUSB
darius@24
    42
#include "usb.h"
darius@37
    43
#endif
darius@41
    44
#include "tempctrl.h"
darius@60
    45
#include "ds1307.h"
darius@24
    46
darius@47
    47
/*
darius@47
    48
 * Mirror of the MCUCSR register, taken early during startup.
darius@47
    49
 */
darius@47
    50
uint8_t mcucsr __attribute__((section(".noinit")));
darius@47
    51
darius@24
    52
void		process_cmd(void);
darius@0
    53
darius@47
    54
/*
darius@47
    55
 * Read out and reset MCUCSR early during startup.
darius@47
    56
 */
darius@47
    57
void handle_mcucsr(void)
darius@47
    58
    __attribute__((section(".init3")))
darius@47
    59
    __attribute__((naked));
darius@47
    60
void handle_mcucsr(void) {
darius@53
    61
    wdt_disable();
darius@47
    62
    mcucsr = MCUCSR;
darius@47
    63
    MCUCSR = 0;
darius@47
    64
}
darius@47
    65
darius@0
    66
int
darius@0
    67
main(void) {
darius@24
    68
    /* Disable interrupts while we frob stuff */
darius@24
    69
    cli();
darius@24
    70
darius@41
    71
#if 0
darius@24
    72
    /* Disable JTAG (yes twice) */
darius@24
    73
    MCUCSR |= _BV(JTD);
darius@24
    74
    MCUCSR |= _BV(JTD);
darius@37
    75
#endif
darius@37
    76
darius@37
    77
#ifdef WITHUSB
darius@24
    78
    /* USB data bus (7:0) */
darius@24
    79
    DDRA = 0x00;
darius@24
    80
    PORTA = 0x00;
darius@24
    81
    
darius@37
    82
    /* USB control (4:0) */
darius@37
    83
    DDRB = 0x0d;
darius@24
    84
    PORTB = 0x00;
darius@37
    85
#else
darius@37
    86
    DDRA = 0xff;
darius@37
    87
    PORTA = 0x00;
darius@54
    88
darius@54
    89
    DDRB = 0x00;
darius@54
    90
    PORTB = 0x00;
darius@54
    91
darius@37
    92
#endif    
darius@24
    93
    /* GPIO (0:7) */
darius@24
    94
    DDRC = 0xff;
darius@24
    95
    PORTC = 0x00;
darius@24
    96
darius@37
    97
    /* USART (0:1), IDBus (2:5), 485 (6:6), GPIO (7:7) */
darius@37
    98
    DDRD = 0xf7;
darius@37
    99
    PORTD = 0xf7;
darius@37
   100
darius@54
   101
#ifndef WITHUSB
darius@54
   102
    /* Beep
darius@54
   103
     *
darius@54
   104
     * Fpwm = Fclk / (N * 510)
darius@54
   105
     *      = 16e6 / (8 * 510)
darius@54
   106
     *      = 3921Hz
darius@54
   107
     *
darius@54
   108
     * Behind ifndef because PB3 is A0 on PDI chip
darius@54
   109
     *
darius@54
   110
     * Phase correct PWM, non-inverted output, divide by 8 */
darius@54
   111
    TCCR0 = _BV(WGM00) | _BV(WGM11) | _BV(COM00) | _BV(COM01) | _BV(CS01);
darius@56
   112
    OCR0 = 128;
darius@54
   113
#endif
darius@54
   114
darius@37
   115
    /* Set up the one wire stuff */
darius@37
   116
    OWInit();
darius@24
   117
darius@60
   118
    /* Setup IIC */
darius@60
   119
    ds1307_init();
darius@60
   120
    
darius@24
   121
    /* Init UART */
darius@41
   122
    cons_init();
darius@24
   123
    
darius@60
   124
    /* Init temperature control stuff */
darius@60
   125
    tempctrl_init();
darius@60
   126
darius@41
   127
    printf_P(PSTR("\r\n\r\n===============\r\n"
darius@41
   128
		  "Inited!\r\n\r\n"));
darius@24
   129
darius@47
   130
    if ((mcucsr & _BV(PORF)) == _BV(PORF))
darius@47
   131
	printf_P(PSTR("Power on reset\r\n"));
darius@47
   132
darius@47
   133
    if ((mcucsr & _BV(EXTRF)) == _BV(EXTRF))
darius@47
   134
	printf_P(PSTR("External reset\r\n"));
darius@47
   135
darius@47
   136
    if ((mcucsr & _BV(BORF)) == _BV(BORF))
darius@47
   137
	printf_P(PSTR("Brown-out reset\r\n"));
darius@47
   138
darius@47
   139
    if ((mcucsr & _BV(WDRF)) == _BV(WDRF))
darius@47
   140
	printf_P(PSTR("Watchdog reset\r\n"));
darius@47
   141
darius@47
   142
    if ((mcucsr & _BV(JTRF)) == _BV(JTRF))
darius@47
   143
	printf_P(PSTR("JTAG reset\r\n"));
darius@47
   144
darius@24
   145
    /* Ready to go! */
darius@24
   146
    sei();
darius@24
   147
darius@47
   148
    /*
darius@47
   149
     * Enable the watchdog with the largest prescaler.  Will cause a
darius@47
   150
     * watchdog reset after approximately 2 s @ Vcc = 5 V
darius@47
   151
     *
darius@47
   152
     * Gets reset in the loop below and in the tempctrl.c timer IRQ
darius@47
   153
     */
darius@47
   154
    wdt_enable(WDTO_2S);
darius@47
   155
darius@37
   156
#ifdef WITHUSB
darius@41
   157
    printf_P(PSTR("Calling usb_init\r\n"));
darius@24
   158
    usb_init();
darius@41
   159
    printf_P(PSTR("done\r\n"));
darius@41
   160
    _delay_us(1000);
darius@37
   161
#endif
darius@41
   162
    printf_P(PSTR("> "));
darius@24
   163
    cmd.state = 0;
darius@24
   164
    
darius@24
   165
    /* Wait for user input or an "interrupt" */
darius@24
   166
    while (1) {
darius@47
   167
	wdt_reset();
darius@47
   168
darius@41
   169
	tempctrl_update();
darius@41
   170
	
darius@24
   171
	if (cmd.state == 255) {
darius@24
   172
	    process_cmd();
darius@41
   173
	    printf_P(PSTR("> "));
darius@24
   174
	    /* Allow new characters to be processed */
darius@24
   175
	    cmd.state = 0;
darius@24
   176
	}
darius@24
   177
	
darius@37
   178
#ifdef WITHUSB
darius@37
   179
	if (!(PDICTL & _BV(PDIINT)))
darius@24
   180
	    usb_intr();
darius@37
   181
#endif
darius@24
   182
    }
darius@24
   183
}
darius@24
   184
darius@24
   185
void
darius@24
   186
process_cmd(void) {
darius@52
   187
    uint8_t	ROM[8], crc, buf[9], temp;
darius@13
   188
    int8_t	i, arg;
darius@52
   189
    int16_t	t;
darius@15
   190
darius@24
   191
    /* User just pressed enter */
darius@24
   192
    if (cmd.len == 0)
darius@24
   193
	return;
darius@24
   194
	     
darius@51
   195
    if (!strcasecmp_P((char *)cmd.buf, PSTR("?")) ||
darius@51
   196
	!strcasecmp_P((char *)cmd.buf, PSTR("help"))) {
darius@41
   197
        printf_P(PSTR("rs               Reset and check for presence\r\n"
darius@41
   198
		      "sr               Search the bus for ROMs\r\n"
darius@41
   199
		      "re               Read a bit\r\n"
darius@41
   200
		      "rb               Read a byte\r\n"
darius@51
   201
		      "wr bit           Write a bit\r\n"
darius@51
   202
		      "wb byte          Write a byte (hex)\r\n"
darius@51
   203
		      "wc cmd [ROMID]   Write command\r\n"
darius@51
   204
		      "te ROMID         Read the temperature from a DS1820\r\n"
darius@51
   205
		      "in port          Read from a port\r\n"
darius@51
   206
		      "ou port val      Write to a port (val in hex)\r\n"
darius@51
   207
		      "dd port [val]    Read/write DDR for a port (val in hex)\r\n"
darius@51
   208
		      "rt ROMID	        Read DS2502 status page\r\n"
darius@51
   209
		      "we ROMID adr val Write data into a DS2502 PROM (adr & val in hex)\r\n"
darius@51
   210
		      "rr ROMID         Read DS2502 PROM\r\n"
darius@65
   211
		      "zz               Reset MCU\r\n"
darius@60
   212
		      "gc               Get time of day\r\n"
darius@60
   213
		      "sc time          Set time of day (time is YYYY/MM/DD HH:MM:SS)\r\n"
darius@51
   214
#ifdef WITHUSB
darius@51
   215
		      "us               Generate USB data\r\n"
darius@51
   216
#endif
darius@63
   217
		      "tc ...           Temperature control related (tc help for more)\r\n"));
darius@41
   218
	
darius@24
   219
	return;
darius@51
   220
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("zz"), 2)) {
darius@51
   221
	cli();
darius@51
   222
	wdt_enable(WDTO_15MS);
darius@51
   223
	for (;;)
darius@51
   224
	    ;
darius@51
   225
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("rs"), 2)) {
darius@41
   226
	printf_P(PSTR("Resetting... "));
darius@24
   227
	    
darius@24
   228
	if (OWTouchReset() == 1)
darius@41
   229
	    printf_P(PSTR("No presence pulse found\r\n"));
darius@24
   230
	else
darius@41
   231
	    printf_P(PSTR("Presence pulse found\r\n"));
darius@51
   232
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("re"), 2)) {
darius@24
   233
	if (OWReadBit())
darius@41
   234
	    printf_P(PSTR("Read a 1\r\n"));
darius@24
   235
	else
darius@41
   236
	    printf_P(PSTR("Read a 0\r\n"));
darius@51
   237
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("rb"), 2)) {
darius@41
   238
	printf_P(PSTR("Read a 0x%02x\r\n"), OWReadByte());
darius@51
   239
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("wr"), 2)) {
darius@24
   240
	arg = strtol((char *)cmd.buf + 3, (char **)NULL, 10);
darius@24
   241
	OWWriteBit(arg);
darius@41
   242
	printf_P(PSTR("Wrote a %c\r\n"), arg ? '1' : '0');
darius@51
   243
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("wb"), 2)) {
darius@24
   244
	arg = (int)strtol((char *)cmd.buf + 3, (char **)NULL, 16); 
darius@24
   245
	OWWriteByte(arg);
darius@51
   246
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("rt"), 2)) {
darius@51
   247
	if (sscanf_P((char *)cmd.buf, PSTR("rt %hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx"), 
darius@51
   248
		     &ROM[0], &ROM[1], &ROM[2], &ROM[3],
darius@51
   249
		     &ROM[4], &ROM[5], &ROM[6], &ROM[7]) != 8) {
darius@41
   250
	    printf_P(PSTR("Unable to parse ROM ID\r\n"));
darius@37
   251
	    return;
darius@37
   252
	}
darius@51
   253
	
darius@37
   254
	if (ROM[0] != OW_FAMILY_ROM) {
darius@41
   255
	    printf_P(PSTR("ROM specified isn't a DS2502\r\n"));
darius@37
   256
	    return;
darius@37
   257
	}
darius@37
   258
darius@37
   259
	if (OWTouchReset() != 0) {
darius@41
   260
	    printf_P(PSTR("No presence\r\n"));
darius@37
   261
	    return;
darius@37
   262
	}
darius@37
   263
	
darius@37
   264
	crc = 0;
darius@37
   265
darius@37
   266
	OWCRC(OW_READ_STATUS, &crc);
darius@37
   267
	OWSendCmd(ROM, OW_READ_STATUS);
darius@37
   268
darius@37
   269
	OWWriteByte(0x00);
darius@37
   270
	OWCRC(0x00, &crc);
darius@37
   271
darius@37
   272
	OWWriteByte(0x00);
darius@37
   273
	OWCRC(0x00, &crc);
darius@37
   274
	
darius@37
   275
	if (crc != OWReadByte()) {
darius@41
   276
	    printf_P(PSTR("CRC mismatch on command & address\r\n"));
darius@37
   277
	    return;
darius@37
   278
	}
darius@37
   279
	
darius@37
   280
	crc = 0;
darius@37
   281
	for (i = 0; i < 8; i++) {
darius@37
   282
	    temp = OWReadByte();
darius@41
   283
	    printf_P(PSTR("%02x "), temp);
darius@37
   284
	    OWCRC(temp, &crc);
darius@37
   285
	}
darius@41
   286
	printf_P(PSTR("\r\n"));
darius@37
   287
	if (crc != OWReadByte()) {
darius@41
   288
	    printf_P(PSTR("CRC mismatch on data\r\n"));
darius@37
   289
	    return;
darius@37
   290
	}
darius@51
   291
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("we"), 2)) {
darius@51
   292
	uint8_t	adr, data;
darius@51
   293
	
darius@51
   294
	if (sscanf_P((char *)cmd.buf, PSTR("we %hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx %hhx %hhx"),
darius@51
   295
		     &ROM[0], &ROM[1], &ROM[2], &ROM[3],
darius@51
   296
		     &ROM[4], &ROM[5], &ROM[6], &ROM[7],
darius@51
   297
		     &adr, &data) != 10) {
darius@41
   298
	    printf_P(PSTR("Unable to parse ROM ID\r\n"));
darius@37
   299
	    return;
darius@37
   300
	}
darius@37
   301
darius@37
   302
	if (ROM[0] != OW_FAMILY_ROM) {
darius@51
   303
	    printf_P(PSTR("ID specified isn't a ROM\r\n"));
darius@37
   304
	    return;
darius@37
   305
	}
darius@37
   306
darius@37
   307
	if (OWTouchReset() != 0) {
darius@41
   308
	    printf_P(PSTR("No presence\r\n"));
darius@37
   309
	    return;
darius@37
   310
	}
darius@37
   311
darius@51
   312
	printf_P(PSTR("OWProgROM returned %S\r\n"), OWProgROM_Status[OWProgROM(ROM, buf[0], 2, &buf[1], 0, 0)]);
darius@51
   313
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("rr"), 2)) {
darius@51
   314
	if (sscanf_P((char *)cmd.buf, PSTR("rr %hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx"),
darius@51
   315
		     &ROM[0], &ROM[1], &ROM[2], &ROM[3],
darius@51
   316
		     &ROM[4], &ROM[5], &ROM[6], &ROM[7]) != 8) {
darius@41
   317
	    printf_P(PSTR("Unable to parse ROM ID\r\n"));
darius@37
   318
	    return;
darius@37
   319
	}
darius@37
   320
darius@37
   321
	if (ROM[0] != OW_FAMILY_ROM) {
darius@41
   322
	    printf_P(PSTR("ROM specified isn't a ROM\r\n"));
darius@37
   323
	    return;
darius@37
   324
	}
darius@37
   325
darius@37
   326
	crc = 0;
darius@37
   327
	OWSendCmd(ROM, OW_READ_MEMORY);
darius@37
   328
	OWCRC(OW_READ_MEMORY, &crc);
darius@37
   329
darius@37
   330
	OWWriteByte(0x00);
darius@37
   331
	OWCRC(0x00, &crc);
darius@37
   332
darius@37
   333
	OWWriteByte(0x00);
darius@37
   334
	OWCRC(0x00, &crc);
darius@37
   335
darius@37
   336
	if (crc != OWReadByte()) {
darius@41
   337
	    printf_P(PSTR("CRC mismatch on command & address\r\n"));
darius@37
   338
	    return;
darius@37
   339
	}
darius@37
   340
darius@37
   341
	crc = 0;
darius@37
   342
	for (buf[0] = 0; buf[0] < 128; buf[0]++) {
darius@37
   343
	    buf[1] = OWReadByte();
darius@37
   344
	    if (buf[0] > 0) {
darius@37
   345
		if (buf[0] % 16 != 0)
darius@41
   346
		    printf_P(PSTR(" "));
darius@37
   347
		else
darius@41
   348
		    printf_P(PSTR("\r\n"));
darius@37
   349
	    }
darius@37
   350
	    
darius@41
   351
	    printf_P(PSTR("%02x"), buf[1]);
darius@37
   352
	    OWCRC(buf[1], &crc);
darius@37
   353
	}
darius@41
   354
	printf_P(PSTR("\r\n"));
darius@37
   355
	if (crc != OWReadByte()) {
darius@41
   356
	    printf_P(PSTR("CRC mismatch on data\r\n"));
darius@37
   357
	    return;
darius@37
   358
	}
darius@37
   359
	
darius@51
   360
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("wc"), 2)) {
darius@51
   361
	uint8_t c;
darius@51
   362
	
darius@51
   363
	i = sscanf_P((char *)cmd.buf, PSTR("wc %hhx %hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx"),
darius@51
   364
		     &ROM[0], &ROM[1], &ROM[2], &ROM[3],
darius@51
   365
		     &ROM[4], &ROM[5], &ROM[6], &ROM[7],
darius@51
   366
		     &c);
darius@51
   367
	
darius@51
   368
	if (i != 1 && i != 9) {
darius@51
   369
	    printf_P(PSTR("Incorrect usage\r\n"));
darius@24
   370
	    return;
darius@24
   371
	}
darius@24
   372
	    
darius@51
   373
	if (i == 1) {
darius@51
   374
	    OWSendCmd(i == 1 ? NULL : ROM, c);
darius@24
   375
	    return;
darius@24
   376
	}
darius@51
   377
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("te"), 2)) {
darius@51
   378
	if (sscanf_P((char *)cmd.buf, PSTR("te %hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx"), 
darius@51
   379
		     &ROM[0], &ROM[1], &ROM[2], &ROM[3],
darius@51
   380
		     &ROM[4], &ROM[5], &ROM[6], &ROM[7]) != 8) {
darius@41
   381
	    printf_P(PSTR("Unable to parse ROM ID\r\n"));
darius@24
   382
	    return;
darius@24
   383
	}
darius@0
   384
darius@51
   385
	t = OWGetTemp(ROM);
darius@51
   386
	switch (t) {
darius@51
   387
	    case OW_TEMP_WRONG_FAM:
darius@51
   388
		printf_P(PSTR("ROM specified isn't a temperature sensor\r\n"));
darius@51
   389
		break;
darius@0
   390
darius@51
   391
	    case OW_TEMP_CRC_ERR:
darius@51
   392
		printf_P(PSTR("CRC mismatch\r\n"));
darius@51
   393
		break;
darius@51
   394
darius@51
   395
	    case OW_TEMP_NO_ROM:
darius@51
   396
		printf_P(PSTR("No ROM found\r\n"));
darius@51
   397
		break;
darius@51
   398
darius@51
   399
	    default:
darius@51
   400
		printf_P(PSTR("%d.%02d\r\n"), GETWHOLE(t), GETFRAC(t));
darius@51
   401
		break;
darius@24
   402
	}
darius@51
   403
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("sr"), 2)) {
darius@24
   404
	memset(ROM, 0, 8);
darius@10
   405
darius@24
   406
	i = OWFirst(ROM, 1, 0);
darius@24
   407
	do {
darius@24
   408
	    switch (i) {
darius@10
   409
		case OW_BADWIRE:
darius@41
   410
		    printf_P(PSTR("Presence pulse, but no module found, bad module/cabling?\r\n"));
darius@10
   411
		    break;
darius@10
   412
darius@10
   413
		case OW_NOPRESENCE:
darius@41
   414
		    printf_P(PSTR("No presence pulse found\r\n"));
darius@10
   415
		    break;
darius@10
   416
		    
darius@10
   417
		case OW_BADCRC:
darius@41
   418
		    printf_P(PSTR("Bad CRC\r\n"));
darius@10
   419
		    break;
darius@10
   420
darius@10
   421
		case OW_NOMODULES:
darius@10
   422
		case OW_FOUND:
darius@10
   423
		    break;
darius@10
   424
		    
darius@10
   425
		default:
darius@41
   426
		    printf_P(PSTR("Unknown error from 1 wire library\r\n"));
darius@10
   427
		    break;
darius@24
   428
	    }
darius@10
   429
		
darius@24
   430
	    if (i != OW_FOUND)
darius@24
   431
		break;
darius@13
   432
darius@41
   433
	    for (i = 0; i < 8; i++)
darius@41
   434
		printf_P(PSTR("%02x%S"), ROM[i], i == 7 ? PSTR("\r\n") : PSTR(":"));
darius@10
   435
darius@24
   436
	    i = OWNext(ROM, 1, 0);
darius@24
   437
	} while (1);
darius@51
   438
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("in"), 2)) {
darius@51
   439
	uint8_t inp;
darius@51
   440
	    
darius@24
   441
	switch (tolower(cmd.buf[3])) {
darius@24
   442
	    case 'a':
darius@51
   443
		inp = PINA;
darius@24
   444
		break;
darius@24
   445
		
darius@24
   446
	    case 'b':
darius@51
   447
		inp = PINB;
darius@24
   448
		break;
darius@24
   449
		
darius@24
   450
	    case 'c':
darius@51
   451
		inp = PINC;
darius@24
   452
		break;
darius@24
   453
		
darius@24
   454
	    case 'd':
darius@51
   455
		inp = PIND;
darius@24
   456
		break;
darius@24
   457
		
darius@24
   458
	    default:
darius@41
   459
		printf_P(PSTR("Unknown port\r\n"));
darius@24
   460
		return;
darius@0
   461
	}
darius@51
   462
	printf_P(PSTR("0x%02x\r\n"), inp);
darius@51
   463
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("ou"), 2)) {
darius@51
   464
	char port;
darius@51
   465
	int val;
darius@51
   466
	
darius@51
   467
	if (sscanf_P((char *)cmd.buf, PSTR("ou %c %x"), &port, &val) != 2) {
darius@51
   468
	    printf_P(PSTR("Unable to parse ou arguments\r\n"));
darius@51
   469
	    return;
darius@51
   470
	}
darius@51
   471
	
darius@51
   472
	switch (port) {
darius@24
   473
	    case 'a':
darius@51
   474
		PORTA = val & 0xff;
darius@24
   475
		break;
darius@24
   476
		
darius@24
   477
	    case 'b':
darius@51
   478
		PORTB = val & 0xff;
darius@24
   479
		break;
darius@24
   480
		
darius@24
   481
	    case 'c':
darius@51
   482
		PORTC = val & 0xff;
darius@24
   483
		break;
darius@24
   484
		
darius@24
   485
	    case 'd':
darius@51
   486
		PORTD = val & 0xff;
darius@24
   487
		break;
darius@24
   488
		
darius@24
   489
	    default:
darius@41
   490
		printf_P(PSTR("Unknown port\r\n"));
darius@24
   491
		return;
darius@24
   492
	}
darius@51
   493
	printf_P(PSTR("PORT%c <= 0x%02x\r\n"), toupper(port), val);
darius@51
   494
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("dd"), 2)) {
darius@51
   495
	char port;
darius@51
   496
	uint8_t val;
darius@51
   497
	int num;
darius@51
   498
	
darius@51
   499
	num = sscanf_P((char *)cmd.buf, PSTR("dd %c %x"), &port, &val);
darius@51
   500
	
darius@51
   501
	if (num != 2 && num != 3) {
darius@51
   502
	    printf_P(PSTR("Unable to parse dd arguments\r\n"));
darius@51
   503
	    return;
darius@51
   504
	}
darius@51
   505
	
darius@51
   506
	if (num == 2) {
darius@51
   507
	    switch (port) {
darius@51
   508
		case 'a':
darius@51
   509
		    val = DDRA;
darius@51
   510
		    break;
darius@51
   511
darius@51
   512
		case 'b':
darius@51
   513
		    val = DDRB;
darius@51
   514
		    break;
darius@51
   515
darius@51
   516
		case 'c':
darius@51
   517
		    val = DDRC;
darius@51
   518
		    break;
darius@63
   519
		    
darius@51
   520
		case 'd':
darius@51
   521
		    val = DDRD;
darius@51
   522
		    break;
darius@37
   523
		
darius@51
   524
		default:
darius@51
   525
		    printf_P(PSTR("Unknown port\r\n"));
darius@51
   526
		    return;
darius@51
   527
	    }
darius@51
   528
	    printf_P(PSTR("DDR%c => 0x%02x\r\n"), toupper(port), val);
darius@51
   529
	} else {
darius@51
   530
	    switch (port) {
darius@51
   531
		case 'a':
darius@51
   532
		    DDRA = val & 0xff;
darius@51
   533
		    break;
darius@37
   534
		
darius@51
   535
		case 'b':
darius@51
   536
		    DDRB = val & 0xff;
darius@51
   537
		    break;
darius@37
   538
		
darius@51
   539
		case 'c':
darius@51
   540
		    DDRC = val & 0xff;
darius@51
   541
		    break;
darius@37
   542
		
darius@51
   543
		case 'd':
darius@51
   544
		    DDRD = val & 0xff;
darius@51
   545
		    break;
darius@51
   546
		
darius@51
   547
		default:
darius@51
   548
		    printf_P(PSTR("Unknown port\r\n"));
darius@51
   549
		    return;
darius@51
   550
	    }
darius@51
   551
	    printf_P(PSTR("DDR%c <= 0x%02x\r\n"), toupper(port), val);
darius@37
   552
	}
darius@51
   553
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("tc"), 2)) {
darius@41
   554
	tempctrl_cmd((char *)cmd.buf);
darius@37
   555
#ifdef WITHUSB
darius@51
   556
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("us"), 2)) {
darius@24
   557
	usb_gendata();
darius@37
   558
#endif
darius@60
   559
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("gc"), 2)) {
darius@60
   560
	ds1307_printtime(PSTR(""), PSTR("\r\n"));
darius@60
   561
    } else if (!strncasecmp_P((char *)cmd.buf, PSTR("sc"), 2)) {
darius@60
   562
	if (cmd.len < 17) {
darius@60
   563
	    printf_P(PSTR("Command not long enough\r\n"));
darius@60
   564
	} else {
darius@63
   565
	    if (ds1307_settod((char *)cmd.buf + 3) != 1)
darius@60
   566
		printf_P(PSTR("Unable to set time of day\r\n"));
darius@60
   567
	}
darius@24
   568
    } else {
darius@51
   569
	printf_P(PSTR("Unknown command, help for a list\r\n"));
darius@0
   570
    }
darius@24
   571
}
darius@0
   572