X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=rpikern;a=blobdiff_plain;f=src%2Fmain.c;h=0c8bdf5515794b78e08626321ddf5236b2f37758;hp=97fcda79efe429e79b40482fde592f3080f2d4a1;hb=203b43a75a028e9238307bd6e73768eb8e942071;hpb=993155fee2327f1f3cda285c9548bbb09688a3f3 diff --git a/src/main.c b/src/main.c index 97fcda7..0c8bdf5 100644 --- a/src/main.c +++ b/src/main.c @@ -2,30 +2,54 @@ #include #include +#include #include "asm.h" #include "serial.h" +#include "video.h" void dbgled(int x); void exit(int x); +static void cmdrun(char *cmd); + int main(void) { - disable_intr(); - - dbgled(2); + int lastnl = 0; + static char cmdbuf[256]; + static int cmdend; init_serial(115200); - ser_printstr("starting rpkern\n"); + ser_printstr("Starting rpikern\n"); + + video_init(); + ser_printstr("Going interactive\n"); for(;;) { int c = ser_getchar(); - if(c == -1) { + + switch(c) { + case '\r': + case '\n': + if(!lastnl) { + ser_printstr("\r\n"); + cmdbuf[cmdend] = 0; + cmdend = 0; + cmdrun(cmdbuf); + } + lastnl = 1; + break; + + case -1: + lastnl = 0; ser_printstr("error!\n"); - } else { - ser_printstr("got: "); + break; + + default: + lastnl = 0; ser_putchar(c); - ser_putchar('\r'); - ser_putchar('\n'); + if(cmdend < sizeof cmdbuf) { + cmdbuf[cmdend++] = c; + } } } @@ -34,6 +58,27 @@ int main(void) void panic(void) { - dbgled(1); + ser_printstr("PANIC!\n"); exit(0); } + +static void cmdrun(char *cmd) +{ + char *ptr, *args; + + while(*cmd && isspace(*cmd)) cmd++; + ptr = cmd; + while(*ptr && !isspace(*ptr)) ptr++; + *ptr = 0; + args = ptr + 1; + + if(strcmp(cmd, "help") == 0) { + ser_printstr("help not implemented yet\n"); + } else if(strcmp(cmd, "ver") == 0) { + ser_printstr("rpikern version 0.0\n"); + } else { + ser_printstr("Unknown command: "); + ser_printstr(cmd); + ser_printstr("\n"); + } +}