OSDN Git Service

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