18ed725e308ac4b85934e04f83fa4a5286ccd98a
[rpikern] / src / main.c
1 #include "config.h"
2
3 #include <stdio.h>
4 #include <string.h>
5 #include <stdint.h>
6 #include <ctype.h>
7 #include "asm.h"
8 #include "rpi.h"
9 #include "contty.h"
10 #include "serial.h"
11 #include "timer.h"
12 #include "video.h"
13 #include "intr.h"
14
15 void dbgled(int x);
16
17 void reboot(void);
18
19 static void cmdrun(char *cmd);
20
21 int main(void)
22 {
23         int lastnl = 0;
24         static char cmdbuf[256];
25         static int cmdend;
26
27         rpi_init();
28         /*init_serial(115200); done in rpi_init now for early debugging */
29         con_init();
30
31         printf("Detected raspberry pi %d, I/O base: %x\n", rpi_model, rpi_iobase);
32         printf("Main RAM base: %x, size: %u bytes\n", rpi_mem_base, rpi_mem_size);
33         printf("Video RAM base: %x, size: %u bytes\n", rpi_vmem_base, rpi_vmem_size);
34
35         timer_init();
36         video_init();
37
38         enable_intr();
39
40         printf("Going interactive\n");
41
42         for(;;) {
43                 while(ser_pending()) {
44                         int c = getchar();
45
46                         switch(c) {
47                         case '\r':
48                         case '\n':
49                                 if(!lastnl) {
50                                         printf("\r\n");
51                                         cmdbuf[cmdend] = 0;
52                                         cmdend = 0;
53                                         cmdrun(cmdbuf);
54                                 }
55                                 lastnl = 1;
56                                 break;
57
58                         case -1:
59                                 lastnl = 0;
60                                 printf("error!\n");
61                                 break;
62
63                         default:
64                                 lastnl = 0;
65                                 putchar(c);
66                                 if(cmdend < sizeof cmdbuf) {
67                                         cmdbuf[cmdend++] = c;
68                                 }
69                         }
70                 }
71
72                 /*video_update(1);*/
73         }
74
75         return 0;
76 }
77
78 void reboot(void)
79 {
80         printf("Rebooting ...\n");
81         rpi_reboot();
82 }
83
84 static void cmdrun(char *cmd)
85 {
86         static int cur_x, cur_y;
87         char *ptr, *args;
88
89         while(*cmd && isspace(*cmd)) cmd++;
90         ptr = cmd;
91         while(*ptr && !isspace(*ptr)) ptr++;
92         *ptr = 0;
93         args = ptr + 1;
94
95         if(strcmp(cmd, "reboot") == 0) {
96                 reboot();
97
98         } else if(strcmp(cmd, "down") == 0) {
99                 printf("scroll down\n");
100                 cur_y += 10;
101                 video_scroll(cur_x, cur_y);
102
103         } else if(strcmp(cmd, "up") == 0) {
104                 printf("scroll up\n");
105                 cur_y -= 10;
106                 video_scroll(cur_x, cur_y);
107
108         } else if(strcmp(cmd, "ticks") == 0) {
109                 printf("%lu\n", num_ticks);
110
111         } else if(strcmp(cmd, "help") == 0) {
112                 printf("help not implemented yet\n");
113         } else if(strcmp(cmd, "ver") == 0) {
114                 printf("rpikern version 0.0\n");
115         } else {
116                 printf("Unknown command: %s\n", cmd);
117         }
118 }