OSDN Git Service

5b5b0554ea2268b9955cb508c0cc0b642abb57ef
[kozos-expbrd/kozos_expbrd.git] / firm / hwtest / 09 / 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 "vs1011e.h"
14
15 static int init(void)
16 {
17   /* °Ê²¼¤Ï¥ê¥ó¥«¡¦¥¹¥¯¥ê¥×¥È¤ÇÄêµÁ¤·¤Æ¤¢¤ë¥·¥ó¥Ü¥ë */
18   extern int erodata, data_start, edata, bss_start, ebss;
19
20   /*
21    * ¥Ç¡¼¥¿Îΰè¤ÈBSSÎΰè¤ò½é´ü²½¤¹¤ë¡¥¤³¤Î½èÍý°Ê¹ß¤Ç¤Ê¤¤¤È¡¤
22    * ¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤¬½é´ü²½¤µ¤ì¤Æ¤¤¤Ê¤¤¤Î¤ÇÃí°Õ¡¥
23    */
24   memcpy(&data_start, &erodata, (long)&edata - (long)&data_start);
25   memset(&bss_start, 0, (long)&ebss - (long)&bss_start);
26
27   /* ¥½¥Õ¥È¥¦¥¨¥¢¡¦³ä¤ê¹þ¤ß¥Ù¥¯¥¿¤ò½é´ü²½¤¹¤ë */
28   softvec_init();
29
30   /* ¥·¥ê¥¢¥ë¤Î½é´ü²½ */
31   serial_init(SERIAL_DEFAULT_DEVICE);
32
33   /* DRAM¤Î½é´ü²½ */
34   dram_init();
35
36   /* LED¤Î½é´ü²½ */
37   led_init();
38
39   /* ¥í¡¼¥¿¥ê¡¼¥¨¥ó¥³¡¼¥À¡¼¤Î½é´ü²½ */
40   re_init();
41
42   /* ¥¹¥¤¥Ã¥Á¤Î½é´ü²½ */
43   sw_init();
44
45   /* LCD¤Î½é´ü²½ */
46   lcd_init();
47
48   /* splash */
49   lcd_clear();
50   lcd_draw_box(0, 0, 121, 31, 0);
51   lcd_draw_string(2, 2, "KOZOS EXPBRD #00", 0);
52
53   /* VS1011e */
54   vs1011e_init();
55
56   volatile int i;
57   vs1011e_sinetest_init();
58   for (i = 0; i < 20000; i++) { }
59   vs1011e_sinetest_fini();
60   for (i = 0; i < 20000; i++) { }
61   vs1011e_sinetest_init();
62   for (i = 0; i < 20000; i++) { }
63   vs1011e_sinetest_fini();
64   for (i = 0; i < 20000; i++) { }
65   vs1011e_sinetest_init();
66   for (i = 0; i < 20000; i++) { }
67   vs1011e_sinetest_fini();
68
69   return 0;
70 }
71
72 void boot_from_sdc(const char *filename)
73 {
74   static unsigned char *loadbuf = NULL;
75   char *entry_point;
76   void (*f)(void);
77   extern int buffer_start; /* ¥ê¥ó¥«¡¦¥¹¥¯¥ê¥×¥È¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥Ð¥Ã¥Õ¥¡ */
78
79   FATFS fatfs;
80   WORD br, i;
81   BYTE buff[64];
82   int rc;
83
84   /*
85    * SD¥«¡¼¥É¤ò¥Þ¥¦¥ó¥È¡£
86    */
87   rc = pf_mount(&fatfs);
88   if (rc) {
89     return;
90   }
91
92   /*
93    * ¥Õ¥¡¥¤¥ë¤ò³«¤¯¡£
94    */
95   rc = pf_open(filename);
96   if (rc) {
97     return;
98   }
99
100   lcd_draw_string(2, 10, "Booting from SDC.", 0);
101
102   /*
103    * SD¥«¡¼¥É¾å¤ÎOS¥¤¥á¡¼¥¸¤ò¥á¥â¥ê¾å¤ËÆɤ߹þ¤ß¡£
104    */
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     lcd_draw_progressbar(5, 20, 121 - 5, 25, 0, 100, fatfs.fptr * 100 / fatfs.fsize, 0);
116     led_toggle(Led1);
117     led_toggle(Led2);
118   }
119   if (rc) {
120     lcd_draw_string(2, 10, "File read error.", 0);
121     return;
122   }
123
124   /*
125    * ¥á¥â¥ê¾å¤ËŸ³«(¥í¡¼¥É)
126    */
127   loadbuf = (char *)(&buffer_start);
128   entry_point = elf_load(loadbuf);
129
130   /*
131    * ¼Â¹Ô¡£
132    */
133   if (!entry_point) {
134     lcd_draw_string(2, 10, "Run error.", 0);
135   } else {
136     lcd_clear();
137     led_write(Led1, LedOff);
138     led_write(Led2, LedOff);
139     led_write(LedG, LedOff);
140     led_write(LedR, LedOff);
141     f = (void (*)(void))entry_point;
142     f();
143   }
144 }
145
146 static void wait()
147 {
148   volatile long i;
149   for (i = 0; i < 300000; i++)
150     ;
151 }
152
153 /* ¥á¥â¥ê¤Î16¿Ê¥À¥ó¥×½ÐÎÏ */
154 static int dump(char *buf, long size)
155 {
156   long i;
157
158   if (size < 0) {
159     puts("no data.\n");
160     return -1;
161   }
162   for (i = 0; i < size; i++) {
163     putxval(buf[i], 2);
164     if ((i & 0xf) == 15) {
165       puts("\n");
166     } else {
167       if ((i & 0xf) == 7) puts(" ");
168       puts(" ");
169     }
170   }
171   puts("\n");
172
173   return 0;
174 }
175
176 void boot_from_ser(void)
177 {
178   static char buf[16];
179   static long size = -1;
180   static unsigned char *loadbuf = NULL;
181   char *entry_point;
182   void (*f)(void);
183   extern int buffer_start; /* ¥ê¥ó¥«¡¦¥¹¥¯¥ê¥×¥È¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥Ð¥Ã¥Õ¥¡ */
184
185   lcd_draw_string(2, 10, "Waiting a boot image.", 0);
186
187   while (1) {
188     puts("kzload> "); /* ¥×¥í¥ó¥×¥Èɽ¼¨ */
189     gets(buf); /* ¥·¥ê¥¢¥ë¤«¤é¤Î¥³¥Þ¥ó¥É¼õ¿® */
190
191     if (!strcmp(buf, "load")) { /* XMODEM¤Ç¤Î¥Õ¥¡¥¤¥ë¤Î¥À¥¦¥ó¥í¡¼¥É */
192       lcd_draw_string(2, 10, "Receiving a boot image.", 0);
193       loadbuf = (char *)(&buffer_start);
194       size = xmodem_recv(loadbuf);
195       wait(); /* Å¾Á÷¥¢¥×¥ê¤¬½ªÎ»¤·Ã¼Ëö¥¢¥×¥ê¤ËÀ©¸æ¤¬Ìá¤ë¤Þ¤ÇÂÔ¤Á¹ç¤ï¤»¤ë */
196       if (size < 0) {
197         puts("\nXMODEM receive error!\n");
198         lcd_draw_string(2, 10, "Receive error occurred.", 0);
199       } else {
200         puts("\nXMODEM receive succeeded.\n");
201         lcd_draw_string(2, 10, "Receive succeeded.     ", 0);
202       }
203     } else if (!strcmp(buf, "dump")) { /* ¥á¥â¥ê¤Î16¿Ê¥À¥ó¥×½ÐÎÏ */
204       puts("size: ");
205       putxval(size, 0);
206       puts("\n");
207       dump(loadbuf, size);
208     } else if (!strcmp(buf, "run")) { /* ELF·Á¼°¥Õ¥¡¥¤¥ë¤Î¼Â¹Ô */
209       entry_point = elf_load(loadbuf); /* ¥á¥â¥ê¾å¤ËŸ³«(¥í¡¼¥É) */
210       if (!entry_point) {
211         puts("run error!\n");
212       } else {
213         puts("starting from entry point: ");
214         putxval((unsigned long)entry_point, 0);
215         puts("\n");
216         f = (void (*)(void))entry_point;
217         f(); /* ¤³¤³¤Ç¡¤¥í¡¼¥É¤·¤¿¥×¥í¥°¥é¥à¤Ë½èÍý¤òÅϤ¹ */
218         /* ¤³¤³¤Ë¤ÏÊ֤äƤ³¤Ê¤¤ */
219       }
220     }
221   }
222 }
223
224 int main(void)
225 {
226   INTR_DISABLE; /* ³ä¹þ¤ß̵¸ú¤Ë¤¹¤ë */
227
228   init();
229
230   boot_from_sdc("kozos");
231   boot_from_ser();
232
233   for (;;) { }
234
235   return 0;
236 }
237