OSDN Git Service

Checked with the sample codes.
[kozos-expbrd/kozos_expbrd.git] / firm / 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 /* ¥á¥â¥ê¤Î16¿Ê¥À¥ó¥×½ÐÎÏ */
51 static int dump(char *buf, long size)
52 {
53   long i;
54
55   if (size < 0) {
56     puts("no data.\n");
57     return -1;
58   }
59   for (i = 0; i < size; i++) {
60     putxval(buf[i], 2);
61     if ((i & 0xf) == 15) {
62       puts("\n");
63     } else {
64       if ((i & 0xf) == 7) puts(" ");
65       puts(" ");
66     }
67   }
68   puts("\n");
69
70   return 0;
71 }
72
73 static void wait()
74 {
75   volatile long i;
76   for (i = 0; i < 300000; i++)
77     ;
78 }
79
80 void die(int code)
81 {
82   puts("die with code 0x");
83   putxval(code, 4);
84   puts(".\n");
85   while (1) { }
86 }
87
88 int main(void)
89 {
90   static char buf[16];
91   static long size = -1;
92   static unsigned char *loadbuf = NULL;
93   char *entry_point;
94   void (*f)(void);
95   extern int buffer_start; /* ¥ê¥ó¥«¡¦¥¹¥¯¥ê¥×¥È¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥Ð¥Ã¥Õ¥¡ */
96
97   INTR_DISABLE; /* ³ä¹þ¤ß̵¸ú¤Ë¤¹¤ë */
98
99   init();
100
101 #if 0
102   puts("kzload (kozos boot loader) started.\n");
103
104   while (1) {
105     puts("kzload> "); /* ¥×¥í¥ó¥×¥Èɽ¼¨ */
106     gets(buf); /* ¥·¥ê¥¢¥ë¤«¤é¤Î¥³¥Þ¥ó¥É¼õ¿® */
107
108     if (!strcmp(buf, "load")) { /* XMODEM¤Ç¤Î¥Õ¥¡¥¤¥ë¤Î¥À¥¦¥ó¥í¡¼¥É */
109       loadbuf = (char *)(&buffer_start);
110       size = xmodem_recv(loadbuf);
111       wait(); /* Å¾Á÷¥¢¥×¥ê¤¬½ªÎ»¤·Ã¼Ëö¥¢¥×¥ê¤ËÀ©¸æ¤¬Ìá¤ë¤Þ¤ÇÂÔ¤Á¹ç¤ï¤»¤ë */
112       if (size < 0) {
113         puts("\nXMODEM receive error!\n");
114       } else {
115         puts("\nXMODEM receive succeeded.\n");
116       }
117     } else if (!strcmp(buf, "dump")) { /* ¥á¥â¥ê¤Î16¿Ê¥À¥ó¥×½ÐÎÏ */
118       puts("size: ");
119       putxval(size, 0);
120       puts("\n");
121       dump(loadbuf, size);
122     } else if (!strcmp(buf, "run")) { /* ELF·Á¼°¥Õ¥¡¥¤¥ë¤Î¼Â¹Ô */
123       entry_point = elf_load(loadbuf); /* ¥á¥â¥ê¾å¤ËŸ³«(¥í¡¼¥É) */
124       if (!entry_point) {
125         puts("run error!\n");
126       } else {
127         puts("starting from entry point: ");
128         putxval((unsigned long)entry_point, 0);
129         puts("\n");
130         f = (void (*)(void))entry_point;
131         f(); /* ¤³¤³¤Ç¡¤¥í¡¼¥É¤·¤¿¥×¥í¥°¥é¥à¤Ë½èÍý¤òÅϤ¹ */
132         /* ¤³¤³¤Ë¤ÏÊ֤äƤ³¤Ê¤¤ */
133       }
134     } else if (!strcmp(buf, "ramchk")) {
135       dram_check();
136     } else if (!strcmp(buf, "ramchk2")) {
137       dram_check2();
138     } else if (!strcmp(buf, "ramclr")) {
139       dram_clear();
140     } else if (!strcmp(buf, "led1")) {
141       led_toggle(Led1);
142     } else if (!strcmp(buf, "led2")) {
143       led_toggle(Led2);
144     } else if (!strcmp(buf, "ledg")) {
145       led_toggle(LedG);
146     } else if (!strcmp(buf, "ledr")) {
147       led_toggle(LedR);
148     } else if (!strcmp(buf, "re")) {
149       puts("value: ");
150       putxval(re_read(), 0);
151       puts("\n");
152     } else if (!strcmp(buf, "sw")) {
153       if (sw_read(Sw1)) {   puts("Sw1\n"); }
154       if (sw_read(Sw2)) {   puts("Sw2\n"); }
155       if (sw_read(SwRe)) {  puts("SwRe\n"); }
156     } else if (!strcmp(buf, "lcd")) {
157       uint8 reverse = 0;
158       lcd_clear();
159       lcd_draw_box(0, 0, 121, 31, reverse);
160       lcd_draw_string(2, 2, "KOZOS", reverse);
161     } else {
162       puts("unknown.\n");
163     }
164   }
165 #else
166   FATFS fatfs;                  /* File system object */
167   DIR dir;                              /* Directory object */
168   FILINFO fno;                  /* File information object */
169   WORD bw, br, i;
170   BYTE buff[64];
171   int rc;
172
173   puts("\nMount a volume.\n");
174   rc = pf_mount(&fatfs);
175   if (rc) die(rc);
176
177   puts("\nOpen a test file (message.txt).\n");
178   rc = pf_open("MESSAGE.TXT");
179   if (rc) die(rc);
180
181   puts("\nType the file content.\n");
182   for (;;) {
183       rc = pf_read(buff, sizeof(buff), &br);    /* Read a chunk of file */
184       if (rc || !br) break;                     /* Error or end of file */
185       for (i = 0; i < br; i++)          /* Type the data */
186           putc(buff[i]);
187   }
188   if (rc) die(rc);
189
190 #if _USE_WRITE
191   puts("\nOpen a file to write (write.txt).\n");
192   rc = pf_open("WRITE.TXT");
193   if (rc) die(rc);
194
195   puts("\nWrite a text data. (Hello world!)\n");
196   rc = pf_write("Hello world!\r\n", 14, &bw);
197   if (rc) die(rc);
198
199   puts("\nTerminate the file write process.\n");
200   rc = pf_write(0, 0, &bw);
201   if (rc) die(rc);
202 #endif
203
204 #if _USE_DIR
205   puts("\nOpen root directory.\n");
206   rc = pf_opendir(&dir, "");
207   if (rc) die(rc);
208
209   puts("\nDirectory listing...\n");
210   for (;;) {
211       rc = pf_readdir(&dir, &fno);      /* Read a directory item */
212       if (rc || !fno.fname[0]) break;   /* Error or end of dir */
213       if (fno.fattrib & AM_DIR) {
214           puts("<d>");
215           puts(fno.fname);
216           puts("\n");
217       } else {
218           puts("<f>");
219           puts(fno.fname);
220           puts("\n");
221       }
222   }
223   if (rc) die(rc);
224 #endif
225
226   puts("\nTest completed.\n");
227   for (;;) ;
228 #endif
229
230   return 0;
231 }