X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=rpikern;a=blobdiff_plain;f=src%2Fmain.c;h=39a44d9b2b35f704d7e8c2880793dfa7127ead7b;hp=0c8bdf5515794b78e08626321ddf5236b2f37758;hb=38a008b8d1a3a20c401397b4e132fb578e5f0c10;hpb=203b43a75a028e9238307bd6e73768eb8e942071 diff --git a/src/main.c b/src/main.c index 0c8bdf5..39a44d9 100644 --- a/src/main.c +++ b/src/main.c @@ -1,14 +1,20 @@ #include "config.h" +#include #include #include #include #include "asm.h" +#include "rpi.h" +#include "contty.h" #include "serial.h" +#include "timer.h" #include "video.h" +#include "intr.h" void dbgled(int x); -void exit(int x); + +void reboot(void); static void cmdrun(char *cmd); @@ -18,52 +24,71 @@ int main(void) static char cmdbuf[256]; static int cmdend; - init_serial(115200); - ser_printstr("Starting rpikern\n"); + unsigned int cpsr; + asm volatile("mrs %0, cpsr" : "=r"(cpsr)); + printf("CPSR: %x (mode: %x)\n", cpsr, cpsr & 0x1f); + + rpi_init(); + /*init_serial(115200); done in rpi_init now for early debugging */ + con_init(); + + printf("Detected raspberry pi %d, I/O base: %x\n", rpi_model, rpi_iobase); + printf("Main RAM base: %x, size: %u bytes\n", rpi_mem_base, rpi_mem_size); + printf("Video RAM base: %x, size: %u bytes\n", rpi_vmem_base, rpi_vmem_size); video_init(); - ser_printstr("Going interactive\n"); + timer_init(); + intr_init(); + enable_intr(); + + printf("Going interactive\n"); + for(;;) { - int c = ser_getchar(); - - 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"); - break; - - default: - lastnl = 0; - ser_putchar(c); - if(cmdend < sizeof cmdbuf) { - cmdbuf[cmdend++] = c; + while(ser_pending()) { + int c = getchar(); + + switch(c) { + case '\r': + case '\n': + if(!lastnl) { + printf("\r\n"); + cmdbuf[cmdend] = 0; + cmdend = 0; + cmdrun(cmdbuf); + } + lastnl = 1; + break; + + case -1: + lastnl = 0; + printf("error!\n"); + break; + + default: + lastnl = 0; + putchar(c); + if(cmdend < sizeof cmdbuf) { + cmdbuf[cmdend++] = c; + } } } + + /*video_update(1);*/ } return 0; } -void panic(void) +void reboot(void) { - ser_printstr("PANIC!\n"); - exit(0); + printf("Rebooting ...\n"); + rpi_reboot(); } static void cmdrun(char *cmd) { + static int cur_x, cur_y; char *ptr, *args; while(*cmd && isspace(*cmd)) cmd++; @@ -72,13 +97,27 @@ static void cmdrun(char *cmd) *ptr = 0; args = ptr + 1; - if(strcmp(cmd, "help") == 0) { - ser_printstr("help not implemented yet\n"); + if(strcmp(cmd, "reboot") == 0) { + reboot(); + + } else if(strcmp(cmd, "down") == 0) { + printf("scroll down\n"); + cur_y += 10; + video_scroll(cur_x, cur_y); + + } else if(strcmp(cmd, "up") == 0) { + printf("scroll up\n"); + cur_y -= 10; + video_scroll(cur_x, cur_y); + + } else if(strcmp(cmd, "ticks") == 0) { + printf("%lu\n", num_ticks); + + } else if(strcmp(cmd, "help") == 0) { + printf("help not implemented yet\n"); } else if(strcmp(cmd, "ver") == 0) { - ser_printstr("rpikern version 0.0\n"); + printf("rpikern version 0.0\n"); } else { - ser_printstr("Unknown command: "); - ser_printstr(cmd); - ser_printstr("\n"); + printf("Unknown command: %s\n", cmd); } }