OSDN Git Service

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