OSDN Git Service

3fbbbe1a8637234d245af89c567a3dc2e7c0ed4d
[kozos-expbrd/kozos_expbrd.git] / firm / hwtest / 06 / bootload / main.c
1 #include "defines.h"
2 #include "interrupt.h"
3 #include "serial.h"
4 #include "xmodem.h"
5 #include "elf.h"
6 #include "dram.h"
7 #include "lib.h"
8 #include "led.h"
9 #include "re.h"
10 #include "sw.h"
11 #include "lcd.h"
12
13 static int init(void)
14 {
15   /* °Ê²¼¤Ï¥ê¥ó¥«¡¦¥¹¥¯¥ê¥×¥È¤ÇÄêµÁ¤·¤Æ¤¢¤ë¥·¥ó¥Ü¥ë */
16   extern int erodata, data_start, edata, bss_start, ebss;
17
18   /*
19    * ¥Ç¡¼¥¿Îΰè¤ÈBSSÎΰè¤ò½é´ü²½¤¹¤ë¡¥¤³¤Î½èÍý°Ê¹ß¤Ç¤Ê¤¤¤È¡¤
20    * ¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤¬½é´ü²½¤µ¤ì¤Æ¤¤¤Ê¤¤¤Î¤ÇÃí°Õ¡¥
21    */
22   memcpy(&data_start, &erodata, (long)&edata - (long)&data_start);
23   memset(&bss_start, 0, (long)&ebss - (long)&bss_start);
24
25   /* ¥½¥Õ¥È¥¦¥¨¥¢¡¦³ä¤ê¹þ¤ß¥Ù¥¯¥¿¤ò½é´ü²½¤¹¤ë */
26   softvec_init();
27
28   /* ¥·¥ê¥¢¥ë¤Î½é´ü²½ */
29   serial_init(SERIAL_DEFAULT_DEVICE);
30
31   /* DRAM¤Î½é´ü²½ */
32   dram_init();
33
34   /* LED¤Î½é´ü²½ */
35   led_init();
36
37   /* ¥í¡¼¥¿¥ê¡¼¥¨¥ó¥³¡¼¥À¡¼¤Î½é´ü²½ */
38   re_init();
39
40   /* ¥¹¥¤¥Ã¥Á¤Î½é´ü²½ */
41   sw_init();
42
43   /* LCD¤Î½é´ü²½ */
44   lcd_init();
45
46   return 0;
47 }
48
49 /* ¥á¥â¥ê¤Î16¿Ê¥À¥ó¥×½ÐÎÏ */
50 static int dump(char *buf, long size)
51 {
52   long i;
53
54   if (size < 0) {
55     puts("no data.\n");
56     return -1;
57   }
58   for (i = 0; i < size; i++) {
59     putxval(buf[i], 2);
60     if ((i & 0xf) == 15) {
61       puts("\n");
62     } else {
63       if ((i & 0xf) == 7) puts(" ");
64       puts(" ");
65     }
66   }
67   puts("\n");
68
69   return 0;
70 }
71
72 static void wait()
73 {
74   volatile long i;
75   for (i = 0; i < 300000; i++)
76     ;
77 }
78
79 int main(void)
80 {
81   static char buf[16];
82   static long size = -1;
83   static unsigned char *loadbuf = NULL;
84   char *entry_point;
85   void (*f)(void);
86   extern int buffer_start; /* ¥ê¥ó¥«¡¦¥¹¥¯¥ê¥×¥È¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥Ð¥Ã¥Õ¥¡ */
87
88   INTR_DISABLE; /* ³ä¹þ¤ß̵¸ú¤Ë¤¹¤ë */
89
90   init();
91
92   puts("kzload (kozos boot loader) started.\n");
93
94   while (1) {
95     puts("kzload> "); /* ¥×¥í¥ó¥×¥Èɽ¼¨ */
96     gets(buf); /* ¥·¥ê¥¢¥ë¤«¤é¤Î¥³¥Þ¥ó¥É¼õ¿® */
97
98     if (!strcmp(buf, "load")) { /* XMODEM¤Ç¤Î¥Õ¥¡¥¤¥ë¤Î¥À¥¦¥ó¥í¡¼¥É */
99       loadbuf = (char *)(&buffer_start);
100       size = xmodem_recv(loadbuf);
101       wait(); /* Å¾Á÷¥¢¥×¥ê¤¬½ªÎ»¤·Ã¼Ëö¥¢¥×¥ê¤ËÀ©¸æ¤¬Ìá¤ë¤Þ¤ÇÂÔ¤Á¹ç¤ï¤»¤ë */
102       if (size < 0) {
103         puts("\nXMODEM receive error!\n");
104       } else {
105         puts("\nXMODEM receive succeeded.\n");
106       }
107     } else if (!strcmp(buf, "dump")) { /* ¥á¥â¥ê¤Î16¿Ê¥À¥ó¥×½ÐÎÏ */
108       puts("size: ");
109       putxval(size, 0);
110       puts("\n");
111       dump(loadbuf, size);
112     } else if (!strcmp(buf, "run")) { /* ELF·Á¼°¥Õ¥¡¥¤¥ë¤Î¼Â¹Ô */
113       entry_point = elf_load(loadbuf); /* ¥á¥â¥ê¾å¤ËŸ³«(¥í¡¼¥É) */
114       if (!entry_point) {
115         puts("run error!\n");
116       } else {
117         puts("starting from entry point: ");
118         putxval((unsigned long)entry_point, 0);
119         puts("\n");
120         f = (void (*)(void))entry_point;
121         f(); /* ¤³¤³¤Ç¡¤¥í¡¼¥É¤·¤¿¥×¥í¥°¥é¥à¤Ë½èÍý¤òÅϤ¹ */
122         /* ¤³¤³¤Ë¤ÏÊ֤äƤ³¤Ê¤¤ */
123       }
124     } else if (!strcmp(buf, "ramchk")) {
125       dram_check();
126     } else if (!strcmp(buf, "ramchk2")) {
127       dram_check2();
128     } else if (!strcmp(buf, "ramclr")) {
129       dram_clear();
130     } else if (!strcmp(buf, "led1")) {
131       led_toggle(Led1);
132     } else if (!strcmp(buf, "led2")) {
133       led_toggle(Led2);
134     } else if (!strcmp(buf, "ledg")) {
135       led_toggle(LedG);
136     } else if (!strcmp(buf, "ledr")) {
137       led_toggle(LedR);
138     } else if (!strcmp(buf, "re")) {
139       puts("value: ");
140       putxval(re_read(), 0);
141       puts("\n");
142     } else if (!strcmp(buf, "sw")) {
143       if (sw_read(Sw1)) {   puts("Sw1\n"); }
144       if (sw_read(Sw2)) {   puts("Sw2\n"); }
145       if (sw_read(SwRe)) {  puts("SwRe\n"); }
146     } else if (!strcmp(buf, "lcd")) {
147       uint8 reverse = 0;
148       lcd_clear();
149       lcd_draw_box(0, 0, 121, 31, reverse);
150       lcd_draw_string(2, 2, "KOZOS", reverse);
151     } else {
152       puts("unknown.\n");
153     }
154   }
155
156   return 0;
157 }