OSDN Git Service

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