#include "config.h"
+#include <stdio.h>
#include <string.h>
#include <stdint.h>
+#include <ctype.h>
#include "asm.h"
+#include "rpi.h"
+#include "contty.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;
+ rpi_init();
init_serial(115200);
- ser_printstr("starting rpkern\n");
+ con_init();
+
+ printf("Detected raspberry pi %d, I/O base: %x\n", rpi_model, rpi_iobase);
+ video_init();
+
+ printf("Going interactive\n");
for(;;) {
- int c = ser_getchar();
- if(c == -1) {
- ser_printstr("error!\n");
- } else {
- ser_printstr("got: ");
+ int c = 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;
+ printf("error!\n");
+ break;
+
+ default:
+ lastnl = 0;
ser_putchar(c);
- ser_putchar('\r');
- ser_putchar('\n');
+ if(cmdend < sizeof cmdbuf) {
+ cmdbuf[cmdend++] = c;
+ }
}
}
return 0;
}
-void panic(void)
+static void cmdrun(char *cmd)
{
- dbgled(1);
- exit(0);
+ 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) {
+ printf("help not implemented yet\n");
+ } else if(strcmp(cmd, "ver") == 0) {
+ printf("rpikern version 0.0\n");
+ } else {
+ printf("Unknown command: %s\n", cmd);
+ }
}