OSDN Git Service

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