changeset 12:165040ce4929

terget-utils: command entry implemented
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Wed, 01 May 2013 20:01:41 +0000
parents 40f607bb0a2c
children f4fc449a64ea
files target-utils/libcommon/Makefile target-utils/libcommon/cmdentry.c
diffstat 2 files changed, 73 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/target-utils/libcommon/Makefile	Wed May 01 07:39:35 2013 +0000
+++ b/target-utils/libcommon/Makefile	Wed May 01 20:01:41 2013 +0000
@@ -4,7 +4,7 @@
 AR=	arm-elf-ar
 RANLIB=	arm-elf-ranlib
 
-OBJS=	serio.o uartsel.o
+OBJS=	cmdentry.o serio.o uartsel.o
 
 all:	libcommon.a
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/libcommon/cmdentry.c	Wed May 01 20:01:41 2013 +0000
@@ -0,0 +1,72 @@
+/*
+ * This module implements ASCII command entry via the serial port,
+ * with normal echo and minimal editing (rubout and kill).
+ *
+ * The command string buffer is bss-allocated here as well.  It is
+ * sized to allow a maximum-size S-record to be sent as a command,
+ * as that is how we expect flash loading and XRAM chain-loading
+ * to be done.
+ */
+
+#define	MAXCMD	527
+
+char command[MAXCMD+1];
+
+/*
+ * The command_entry() function takes no arguments, and begins by waiting
+ * for serial input - hence the prompt should be printed before calling it.
+ *
+ * This function returns when one of the following characters is received:
+ * CR - accepts the command
+ * ^C or ^U - cancels the command
+ *
+ * The return value is non-zero if a non-empty command was accepted with CR,
+ * or 0 if the user hit CR with no input or if the command was canceled
+ * with ^C or ^U.  In any case a CRLF is sent out the serial port
+ * to close the input echo line before this function returns.
+ */
+command_entry()
+{
+	int inlen, ch;
+
+	for (inlen = 0; ; ) {
+		ch = mygetchar();
+		if (ch >= ' ' && ch <= '~') {
+			if (inlen < MAXCMD) {
+				command[inlen++] = ch;
+				putchar(ch);
+			} else
+				putchar(7);
+			continue;
+		}
+		switch (ch) {
+		case '\r':
+		case '\n':
+			command[inlen] = '\0';
+			putchar('\n');
+			return(inlen);
+		case '\b':	/* BS */
+		case 0x7F:	/* DEL */
+			if (inlen) {
+				putchar('\b');
+				putchar(' ');
+				putchar('\b');
+				inlen--;
+			} else
+				putchar(7);
+			continue;
+		case 0x03:	/* ^C */
+			putchar('^');
+			putchar('C');
+			putchar('\n');
+			return(0);
+		case 0x15:	/* ^U */
+			putchar('^');
+			putchar('U');
+			putchar('\n');
+			return(0);
+		default:
+			putchar(7);
+		}
+	}
+}