The beginnings of a shell for launching user apps and taling over serial to a remote...
authorKevin Klues <klueska@cs.berkeley.edu>
Sat, 30 May 2009 12:01:20 +0000 (05:01 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Fri, 5 Jun 2009 01:16:42 +0000 (18:16 -0700)
include/arch/kbdreg.h [new file with mode: 0644]
include/arch/types.h
include/kbdreg.h [deleted file]
kern/src/console.c
user/apps/parlib/matrix.c

diff --git a/include/arch/kbdreg.h b/include/arch/kbdreg.h
new file mode 100644 (file)
index 0000000..0c7ffea
--- /dev/null
@@ -0,0 +1,83 @@
+#ifndef ROS_KBDREG_H
+#define ROS_KBDREG_H
+
+// Special keycodes
+#define KEY_HOME       0xE0
+#define KEY_END                0xE1
+#define KEY_UP         0xE2
+#define KEY_DN         0xE3
+#define KEY_LF         0xE4
+#define KEY_RT         0xE5
+#define KEY_PGUP       0xE6
+#define KEY_PGDN       0xE7
+#define KEY_INS                0xE8
+#define KEY_DEL                0xE9
+
+
+/* This is i8042reg.h + kbdreg.h from NetBSD. */
+
+#define        KBSTATP         0x64    /* kbd controller status port(I) */
+#define         KBS_DIB        0x01    /* kbd data in buffer */
+#define         KBS_IBF        0x02    /* kbd input buffer low */
+#define         KBS_WARM       0x04    /* kbd input buffer low */
+#define         KBS_OCMD       0x08    /* kbd output buffer has command */
+#define         KBS_NOSEC      0x10    /* kbd security lock not engaged */
+#define         KBS_TERR       0x20    /* kbd transmission error */
+#define         KBS_RERR       0x40    /* kbd receive error */
+#define         KBS_PERR       0x80    /* kbd parity error */
+
+#define        KBCMDP          0x64    /* kbd controller port(O) */
+#define         KBC_RAMREAD    0x20    /* read from RAM */
+#define         KBC_RAMWRITE   0x60    /* write to RAM */
+#define         KBC_AUXDISABLE 0xa7    /* disable auxiliary port */
+#define         KBC_AUXENABLE  0xa8    /* enable auxiliary port */
+#define         KBC_AUXTEST    0xa9    /* test auxiliary port */
+#define         KBC_KBDECHO    0xd2    /* echo to keyboard port */
+#define         KBC_AUXECHO    0xd3    /* echo to auxiliary port */
+#define         KBC_AUXWRITE   0xd4    /* write to auxiliary port */
+#define         KBC_SELFTEST   0xaa    /* start self-test */
+#define         KBC_KBDTEST    0xab    /* test keyboard port */
+#define         KBC_KBDDISABLE 0xad    /* disable keyboard port */
+#define         KBC_KBDENABLE  0xae    /* enable keyboard port */
+#define         KBC_PULSE0     0xfe    /* pulse output bit 0 */
+#define         KBC_PULSE1     0xfd    /* pulse output bit 1 */
+#define         KBC_PULSE2     0xfb    /* pulse output bit 2 */
+#define         KBC_PULSE3     0xf7    /* pulse output bit 3 */
+
+#define        KBDATAP         0x60    /* kbd data port(I) */
+#define        KBOUTP          0x60    /* kbd data port(O) */
+
+#define        K_RDCMDBYTE     0x20
+#define        K_LDCMDBYTE     0x60
+
+#define        KC8_TRANS       0x40    /* convert to old scan codes */
+#define        KC8_MDISABLE    0x20    /* disable mouse */
+#define        KC8_KDISABLE    0x10    /* disable keyboard */
+#define        KC8_IGNSEC      0x08    /* ignore security lock */
+#define        KC8_CPU         0x04    /* exit from protected mode reset */
+#define        KC8_MENABLE     0x02    /* enable mouse interrupt */
+#define        KC8_KENABLE     0x01    /* enable keyboard interrupt */
+#define        CMDBYTE         (KC8_TRANS|KC8_CPU|KC8_MENABLE|KC8_KENABLE)
+
+/* keyboard commands */
+#define        KBC_RESET       0xFF    /* reset the keyboard */
+#define        KBC_RESEND      0xFE    /* request the keyboard resend the last byte */
+#define        KBC_SETDEFAULT  0xF6    /* resets keyboard to its power-on defaults */
+#define        KBC_DISABLE     0xF5    /* as per KBC_SETDEFAULT, but also disable key scanning */
+#define        KBC_ENABLE      0xF4    /* enable key scanning */
+#define        KBC_TYPEMATIC   0xF3    /* set typematic rate and delay */
+#define        KBC_SETTABLE    0xF0    /* set scancode translation table */
+#define        KBC_MODEIND     0xED    /* set mode indicators(i.e. LEDs) */
+#define        KBC_ECHO        0xEE    /* request an echo from the keyboard */
+
+/* keyboard responses */
+#define        KBR_EXTENDED    0xE0    /* extended key sequence */
+#define        KBR_RESEND      0xFE    /* needs resend of command */
+#define        KBR_ACK         0xFA    /* received a valid command */
+#define        KBR_OVERRUN     0x00    /* flooded */
+#define        KBR_FAILURE     0xFD    /* diagnosic failure */
+#define        KBR_BREAK       0xF0    /* break code prefix - sent on key release */
+#define        KBR_RSTDONE     0xAA    /* reset complete */
+#define        KBR_ECHO        0xEE    /* echo response */
+
+#endif /* !ROS_KBDREG_H */
index 4ef863b..a742e71 100644 (file)
@@ -79,7 +79,9 @@ typedef int32_t off_t;
 })
 
 // Return the offset of 'member' relative to the beginning of a struct type
+#ifndef offsetof
 #define offsetof(type, member)  ((size_t) (&((type*)0)->member))
+#endif
 
 // Ivy currently can only handle 63 bits (OCaml thing), so use this to make
 // a uint64_t programatically
diff --git a/include/kbdreg.h b/include/kbdreg.h
deleted file mode 100644 (file)
index 0c7ffea..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-#ifndef ROS_KBDREG_H
-#define ROS_KBDREG_H
-
-// Special keycodes
-#define KEY_HOME       0xE0
-#define KEY_END                0xE1
-#define KEY_UP         0xE2
-#define KEY_DN         0xE3
-#define KEY_LF         0xE4
-#define KEY_RT         0xE5
-#define KEY_PGUP       0xE6
-#define KEY_PGDN       0xE7
-#define KEY_INS                0xE8
-#define KEY_DEL                0xE9
-
-
-/* This is i8042reg.h + kbdreg.h from NetBSD. */
-
-#define        KBSTATP         0x64    /* kbd controller status port(I) */
-#define         KBS_DIB        0x01    /* kbd data in buffer */
-#define         KBS_IBF        0x02    /* kbd input buffer low */
-#define         KBS_WARM       0x04    /* kbd input buffer low */
-#define         KBS_OCMD       0x08    /* kbd output buffer has command */
-#define         KBS_NOSEC      0x10    /* kbd security lock not engaged */
-#define         KBS_TERR       0x20    /* kbd transmission error */
-#define         KBS_RERR       0x40    /* kbd receive error */
-#define         KBS_PERR       0x80    /* kbd parity error */
-
-#define        KBCMDP          0x64    /* kbd controller port(O) */
-#define         KBC_RAMREAD    0x20    /* read from RAM */
-#define         KBC_RAMWRITE   0x60    /* write to RAM */
-#define         KBC_AUXDISABLE 0xa7    /* disable auxiliary port */
-#define         KBC_AUXENABLE  0xa8    /* enable auxiliary port */
-#define         KBC_AUXTEST    0xa9    /* test auxiliary port */
-#define         KBC_KBDECHO    0xd2    /* echo to keyboard port */
-#define         KBC_AUXECHO    0xd3    /* echo to auxiliary port */
-#define         KBC_AUXWRITE   0xd4    /* write to auxiliary port */
-#define         KBC_SELFTEST   0xaa    /* start self-test */
-#define         KBC_KBDTEST    0xab    /* test keyboard port */
-#define         KBC_KBDDISABLE 0xad    /* disable keyboard port */
-#define         KBC_KBDENABLE  0xae    /* enable keyboard port */
-#define         KBC_PULSE0     0xfe    /* pulse output bit 0 */
-#define         KBC_PULSE1     0xfd    /* pulse output bit 1 */
-#define         KBC_PULSE2     0xfb    /* pulse output bit 2 */
-#define         KBC_PULSE3     0xf7    /* pulse output bit 3 */
-
-#define        KBDATAP         0x60    /* kbd data port(I) */
-#define        KBOUTP          0x60    /* kbd data port(O) */
-
-#define        K_RDCMDBYTE     0x20
-#define        K_LDCMDBYTE     0x60
-
-#define        KC8_TRANS       0x40    /* convert to old scan codes */
-#define        KC8_MDISABLE    0x20    /* disable mouse */
-#define        KC8_KDISABLE    0x10    /* disable keyboard */
-#define        KC8_IGNSEC      0x08    /* ignore security lock */
-#define        KC8_CPU         0x04    /* exit from protected mode reset */
-#define        KC8_MENABLE     0x02    /* enable mouse interrupt */
-#define        KC8_KENABLE     0x01    /* enable keyboard interrupt */
-#define        CMDBYTE         (KC8_TRANS|KC8_CPU|KC8_MENABLE|KC8_KENABLE)
-
-/* keyboard commands */
-#define        KBC_RESET       0xFF    /* reset the keyboard */
-#define        KBC_RESEND      0xFE    /* request the keyboard resend the last byte */
-#define        KBC_SETDEFAULT  0xF6    /* resets keyboard to its power-on defaults */
-#define        KBC_DISABLE     0xF5    /* as per KBC_SETDEFAULT, but also disable key scanning */
-#define        KBC_ENABLE      0xF4    /* enable key scanning */
-#define        KBC_TYPEMATIC   0xF3    /* set typematic rate and delay */
-#define        KBC_SETTABLE    0xF0    /* set scancode translation table */
-#define        KBC_MODEIND     0xED    /* set mode indicators(i.e. LEDs) */
-#define        KBC_ECHO        0xEE    /* request an echo from the keyboard */
-
-/* keyboard responses */
-#define        KBR_EXTENDED    0xE0    /* extended key sequence */
-#define        KBR_RESEND      0xFE    /* needs resend of command */
-#define        KBR_ACK         0xFA    /* received a valid command */
-#define        KBR_OVERRUN     0x00    /* flooded */
-#define        KBR_FAILURE     0xFD    /* diagnosic failure */
-#define        KBR_BREAK       0xF0    /* break code prefix - sent on key release */
-#define        KBR_RSTDONE     0xAA    /* reset complete */
-#define        KBR_ECHO        0xEE    /* echo response */
-
-#endif /* !ROS_KBDREG_H */
index 3337e95..ce06c92 100644 (file)
@@ -2,7 +2,7 @@
 
 #include <arch/x86.h>
 #include <arch/console.h>
-#include <kbdreg.h>
+#include <arch/kbdreg.h>
 #include <string.h>
 #include <assert.h>
 
index a5aaff2..3cdfaf3 100644 (file)
@@ -3,11 +3,58 @@
 #include <fcntl.h>
 #include <time.h>
 #include <unistd.h>
-#include <sys/stat.h>
+#include <arch/types.h>
+#include <arch/kbdreg.h>
+
+#define CRT_ROWS       25
+#define CRT_COLS       80
+#define CRT_SIZE       (CRT_ROWS * CRT_COLS)
+
+char * readline(const char *prompt);
+
+void clrscr(int leaverows) {
+for(int i=0; i<(CRT_ROWS-leaverows); i++)
+       write(STDOUT_FILENO, "\n", 1);
+}
 
 int main(int argc, char** argv)
+{      
+       printf("Welcome to the Tessellation OS newlib test suite!\n");
+       printf("Enter at you're own risk....\n");
+       clrscr(3);
+       while(1) {
+               char* s = readline("nanwan@ros$ ");
+               printf("%s\n", s);
+       }       
+       return 0;
+}
+
+char* readline(const char *prompt)
 {
+       int i, c;
+       #define BUFLEN 256
+       static char buf[BUFLEN];
 
-       printf("Welcome to the ROS newlib test suite!\nEnter at you're own risk....\n");
-       return 0;
+       if (prompt != NULL)
+               printf("%s", prompt); fflush(stdout);
+
+       i = 0;
+       while (1) {
+               read(STDIN_FILENO, &c, 1);
+               if (c < 0) {
+                       printf("read error: %e\n", c);
+                       return NULL;
+               } else if (c >= ' ' && i < BUFLEN-1) {
+                       write(STDOUT_FILENO, &c, 1);
+                       buf[i++] = c;
+               } else if (c == '\b' && i > 0) {
+                       write(STDOUT_FILENO, &c, 1);
+                       i--;
+               } else if (c == '\n' || c == '\r') {
+                       write(STDOUT_FILENO, &c, 1);
+                       buf[i] = 0;
+                       return buf;
+               }
+       }
 }
+