fighting with interrupt vectors
[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         unsigned int cpsr;
28         asm volatile("mrs %0, cpsr" : "=r"(cpsr));
29         printf("CPSR: %x (mode: %x)\n", cpsr, cpsr & 0x1f);
30
31         rpi_init();
32         /*init_serial(115200); done in rpi_init now for early debugging */
33         con_init();
34
35         printf("Detected raspberry pi %d, I/O base: %x\n", rpi_model, rpi_iobase);
36         printf("Main RAM base: %x, size: %u bytes\n", rpi_mem_base, rpi_mem_size);
37         printf("Video RAM base: %x, size: %u bytes\n", rpi_vmem_base, rpi_vmem_size);
38
39         video_init();
40
41         timer_init();
42         intr_init();
43         enable_intr();
44
45         printf("Going interactive\n");
46
47         for(;;) {
48                 while(ser_pending()) {
49                         int c = getchar();
50
51                         switch(c) {
52                         case '\r':
53                         case '\n':
54                                 if(!lastnl) {
55                                         printf("\r\n");
56                                         cmdbuf[cmdend] = 0;
57                                         cmdend = 0;
58                                         cmdrun(cmdbuf);
59                                 }
60                                 lastnl = 1;
61                                 break;
62
63                         case -1:
64                                 lastnl = 0;
65                                 printf("error!\n");
66                                 break;
67
68                         default:
69                                 lastnl = 0;
70                                 putchar(c);
71                                 if(cmdend < sizeof cmdbuf) {
72                                         cmdbuf[cmdend++] = c;
73                                 }
74                         }
75                 }
76
77                 /*video_update(1);*/
78         }
79
80         return 0;
81 }
82
83 void reboot(void)
84 {
85         printf("Rebooting ...\n");
86         rpi_reboot();
87 }
88
89 static void cmdrun(char *cmd)
90 {
91         static int cur_x, cur_y;
92         char *ptr, *args;
93
94         while(*cmd && isspace(*cmd)) cmd++;
95         ptr = cmd;
96         while(*ptr && !isspace(*ptr)) ptr++;
97         *ptr = 0;
98         args = ptr + 1;
99
100         if(strcmp(cmd, "reboot") == 0) {
101                 reboot();
102
103         } else if(strcmp(cmd, "down") == 0) {
104                 printf("scroll down\n");
105                 cur_y += 10;
106                 video_scroll(cur_x, cur_y);
107
108         } else if(strcmp(cmd, "up") == 0) {
109                 printf("scroll up\n");
110                 cur_y -= 10;
111                 video_scroll(cur_x, cur_y);
112
113         } else if(strcmp(cmd, "ticks") == 0) {
114                 printf("%lu\n", num_ticks);
115
116         } else if(strcmp(cmd, "help") == 0) {
117                 printf("help not implemented yet\n");
118         } else if(strcmp(cmd, "ver") == 0) {
119                 printf("rpikern version 0.0\n");
120         } else {
121                 printf("Unknown command: %s\n", cmd);
122         }
123 }