OSDN Git Service

Moved some unused codes.
[kozos-expbrd/kozos_expbrd.git] / misc / hwtest / 08 / 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 #include "pff.h"
13 #include "splash.h"
14 #include "vs1011e.h"
15
16 static int init(void)
17 {
18   /* °Ê²¼¤Ï¥ê¥ó¥«¡¦¥¹¥¯¥ê¥×¥È¤ÇÄêµÁ¤·¤Æ¤¢¤ë¥·¥ó¥Ü¥ë */
19   extern int erodata, data_start, edata, bss_start, ebss;
20
21   /*
22    * ¥Ç¡¼¥¿Îΰè¤ÈBSSÎΰè¤ò½é´ü²½¤¹¤ë¡¥¤³¤Î½èÍý°Ê¹ß¤Ç¤Ê¤¤¤È¡¤
23    * ¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤¬½é´ü²½¤µ¤ì¤Æ¤¤¤Ê¤¤¤Î¤ÇÃí°Õ¡¥
24    */
25   memcpy(&data_start, &erodata, (long)&edata - (long)&data_start);
26   memset(&bss_start, 0, (long)&ebss - (long)&bss_start);
27
28   /* ¥½¥Õ¥È¥¦¥¨¥¢¡¦³ä¤ê¹þ¤ß¥Ù¥¯¥¿¤ò½é´ü²½¤¹¤ë */
29   softvec_init();
30
31   /* ¥·¥ê¥¢¥ë¤Î½é´ü²½ */
32   serial_init(SERIAL_DEFAULT_DEVICE);
33
34   /* DRAM¤Î½é´ü²½ */
35   dram_init();
36
37   /* LED¤Î½é´ü²½ */
38   led_init();
39
40   /* ¥í¡¼¥¿¥ê¡¼¥¨¥ó¥³¡¼¥À¡¼¤Î½é´ü²½ */
41   re_init();
42
43   /* ¥¹¥¤¥Ã¥Á¤Î½é´ü²½ */
44   sw_init();
45
46   /* LCD¤Î½é´ü²½ */
47   lcd_init();
48
49   /* splash */
50   lcd_clear();
51   lcd_draw_box(0, 0, 121, 31, 0);
52   lcd_draw_string(2, 2, "KOZOS EXPBRD #00", 0);
53
54   /* VS1011e */
55   vs1011e_init();
56 #if 0
57   vs1011e_sinetest_init();
58 #else
59   vs1011e_play(splash_playfunc);
60 #endif
61
62   return 0;
63 }
64
65 void die(int code)
66 {
67   puts("die with code 0x");
68   putxval(code, 4);
69   puts(".\n");
70   while (1) { }
71 }
72
73 int main(void)
74 {
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   /*
85    * A trap for the debug.
86    */
87   for (;;) {}
88
89   FATFS fatfs;
90   WORD br, i;
91   BYTE buff[64];
92   int rc;
93
94   lcd_draw_string(2, 10, "Booting...", 0);
95   led_write(Led1, LedOff);
96   led_write(Led2, LedOff);
97   led_write(LedG, LedOn);
98   led_write(LedR, LedOff);
99
100   /*
101    * SD¥«¡¼¥É¤ò¥Þ¥¦¥ó¥È¡£
102    */
103   rc = pf_mount(&fatfs);
104   if (rc) {
105     lcd_draw_string(2, 10, "SD mount failed.", 0);
106     led_write(LedG, LedOff);
107     led_write(LedR, LedOn);
108     die(rc);
109   }
110
111   /*
112    * ¥Õ¥¡¥¤¥ë¤ò³«¤¯¡£
113    */
114   puts("\n\nOpen kozos boot image.\n");
115   rc = pf_open("kozos");
116   if (rc) {
117     lcd_draw_string(2, 10, "No boot image.", 0);
118     led_write(LedG, LedOff);
119     led_write(LedR, LedOn);
120     die(rc);
121   }
122
123   /*
124    * SD¥«¡¼¥É¾å¤ÎOS¥¤¥á¡¼¥¸¤ò¥á¥â¥ê¾å¤ËÆɤ߹þ¤ß¡£
125    */
126   puts("Reading...\n");
127   loadbuf = (char *)(&buffer_start);
128   for (;;) {
129     rc = pf_read(buff, sizeof(buff), &br);
130     if (rc || !br) {
131       break;
132     }
133     for (i = 0; i < br; i++) {
134       *loadbuf = buff[i];
135       loadbuf++;
136     }
137   }
138   if (rc) {
139     puts("error.\n");
140     lcd_draw_string(2, 10, "File read error.", 0);
141     led_write(LedG, LedOff);
142     led_write(LedR, LedOn);
143     die(rc);
144   }
145   led_write(Led1, LedOff);
146   led_write(Led2, LedOff);
147
148   /*
149    * ¥á¥â¥ê¾å¤ËŸ³«(¥í¡¼¥É)
150    */
151   puts("Extracting...\n");
152   loadbuf = (char *)(&buffer_start);
153   entry_point = elf_load(loadbuf);
154
155   /*
156    * ¼Â¹Ô¡£
157    */
158   puts("Running...\n");
159   if (!entry_point) {
160     puts("error.\n");
161     lcd_draw_string(2, 10, "Run error.", 0);
162     led_write(LedG, LedOff);
163     led_write(LedR, LedOn);
164   } else {
165     lcd_clear();
166     led_write(Led1, LedOff);
167     led_write(Led2, LedOff);
168     led_write(LedG, LedOff);
169     led_write(LedR, LedOff);
170     f = (void (*)(void))entry_point;
171     f();
172   }
173
174   for (;;) { }
175
176   return 0;
177 }
178