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