]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tools/tinyos/misc/tos-serial-debug.c
Merge devel code into the trunk.
[tinyos-2.x.git] / tools / tinyos / misc / tos-serial-debug.c
diff --git a/tools/tinyos/misc/tos-serial-debug.c b/tools/tinyos/misc/tos-serial-debug.c
new file mode 100644 (file)
index 0000000..bd0a963
--- /dev/null
@@ -0,0 +1,221 @@
+// $Id$
+
+/*                                                                     tab:4
+ * "Copyright (c) 2000-2003 The Regents of the University  of California.  
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose, without fee, and without written agreement is
+ * hereby granted, provided that the above copyright notice, the following
+ * two paragraphs and the author appear in all copies of this software.
+ * 
+ * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
+ * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
+ * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
+ *
+ * Copyright (c) 2002-2003 Intel Corporation
+ * All rights reserved.
+ *
+ * This file is distributed under the terms in the attached INTEL-LICENSE     
+ * file. If you do not find these files, copies can be found by writing to
+ * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, 
+ * 94704.  Attention:  Intel License Inquiry.
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <termios.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#ifdef __CYGWIN__
+#include <windows.h>
+#endif
+
+#define BAUDRATE B19200 //the baudrate that the device is talking
+#define SERIAL_DEVICE "/dev/ttyS0" //the port to use.
+
+int input_stream;
+
+void print_usage(char *name);
+void open_input(int argc, char **argv);
+
+int main(int argc, char ** argv) {
+    int n = 0;
+
+    if (argc > 3 || argc > 1 && argv[1][0] == '-') {
+       print_usage(argv[0]);
+       exit(2);
+    }
+    open_input(argc, argv);
+    while(1) { 
+       unsigned char c;
+       int cnt = read(input_stream, &c, 1);
+
+       if (cnt < 0) {
+           perror("error reading from serial port");
+           exit(2);
+       }
+       if (cnt == 1) {
+           if (c == 0x7e || ++n == 26) {
+               n = 0;
+               printf("\n");
+           }
+           printf("%02x ", c);
+           fflush(stdout);
+       }
+    }
+}
+
+void print_usage(char *name){
+    //usage...
+    fprintf(stderr, "usage: %s [serial port] [baudrate]\n", name);
+    fprintf(stderr, "Default serial port is " SERIAL_DEVICE ", default baud rate is 19200\n");
+}
+
+
+void open_input(int argc, char **argv) {
+    /* open input_stream for read/write */ 
+    struct termios newtio;
+    const char *name = SERIAL_DEVICE;
+    unsigned long baudrate = BAUDRATE;
+
+    if (argc > 1)
+       name = argv[1];
+    if (argc > 2) {
+       int reqrate = atoi(argv[2]);
+
+       switch (reqrate) {
+#ifdef B50
+       case 50: baudrate = B50; break;
+#endif
+#ifdef B75
+       case 75: baudrate = B75; break;
+#endif
+#ifdef B110
+       case 110: baudrate = B110; break;
+#endif
+#ifdef B134
+       case 134: baudrate = B134; break;
+#endif
+#ifdef B150
+       case 150: baudrate = B150; break;
+#endif
+#ifdef B200
+       case 200: baudrate = B200; break;
+#endif
+#ifdef B300
+       case 300: baudrate = B300; break;
+#endif
+#ifdef B600
+       case 600: baudrate = B600; break;
+#endif
+#ifdef B1200
+       case 1200: baudrate = B1200; break;
+#endif
+#ifdef B1800
+       case 1800: baudrate = B1800; break;
+#endif
+#ifdef B2400
+       case 2400: baudrate = B2400; break;
+#endif
+#ifdef B4800
+       case 4800: baudrate = B4800; break;
+#endif
+#ifdef B9600
+       case 9600: baudrate = B9600; break;
+#endif
+#ifdef B19200
+       case 19200: baudrate = B19200; break;
+#endif
+#ifdef B38400
+       case 38400: baudrate = B38400; break;
+#endif
+#ifdef B57600
+       case 57600: baudrate = B57600; break;
+#endif
+#ifdef B115200
+       case 115200: baudrate = B115200; break;
+#endif
+#ifdef B230400
+       case 230400: baudrate = B230400; break;
+#endif
+#ifdef B460800
+       case 460800: baudrate = B460800; break;
+#endif
+#ifdef B500000
+       case 500000: baudrate = B500000; break;
+#endif
+#ifdef B576000
+       case 576000: baudrate = B576000; break;
+#endif
+#ifdef B921600
+       case 921600: baudrate = B921600; break;
+#endif
+#ifdef B1000000
+       case 1000000: baudrate = B1000000; break;
+#endif
+#ifdef B1152000
+       case 1152000: baudrate = B1152000; break;
+#endif
+#ifdef B1500000
+       case 1500000: baudrate = B1500000; break;
+#endif
+#ifdef B2000000
+       case 2000000: baudrate = B2000000; break;
+#endif
+#ifdef B2500000
+       case 2500000: baudrate = B2500000; break;
+#endif
+#ifdef B3000000
+       case 3000000: baudrate = B3000000; break;
+#endif
+#ifdef B3500000
+       case 3500000: baudrate = B3500000; break;
+#endif
+#ifdef B4000000
+       case 4000000: baudrate = B4000000; break;
+#endif
+       default:
+           fprintf(stderr, "Unknown baudrate %s, defaulting to 19200\n",
+                   argv[2]);
+       }
+    }
+    
+    input_stream = open(name, O_RDWR|O_NOCTTY);
+    if (input_stream == -1) {
+       fprintf(stderr, "Failed to open %s", name);
+       perror("");
+       fprintf(stderr, "Make sure the user has permission to open device.\n");
+       exit(2);
+    }
+    printf("%s input_stream opened\n", name);
+#ifdef __CYGWIN__
+    /* For some very mysterious reason, this incantation is necessary to make
+       the serial port work under some windows machines */
+    HANDLE handle = (HANDLE)get_osfhandle(input_stream);
+    DCB dcb;
+    if (!(GetCommState(handle, &dcb) &&
+         SetCommState(handle, &dcb))) {
+      fprintf(stderr, "serial port initialisation problem\n");
+      exit(2);
+    }
+#endif
+
+    /* Serial port setting */
+    memset(&newtio, 0, sizeof(newtio));
+    newtio.c_cflag = CS8 | CLOCAL | CREAD;
+    newtio.c_iflag = IGNPAR | IGNBRK;
+    cfsetispeed(&newtio, baudrate);
+    cfsetospeed(&newtio, baudrate);
+
+    tcflush(input_stream, TCIFLUSH);
+    tcsetattr(input_stream, TCSANOW, &newtio);
+}