OSDN Git Service

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