OSDN Git Service

Added env script.
[kozos-expbrd/kozos_expbrd.git] / firm / bootload / boot.c
1
2 #include "boot.h"
3 #include "defines.h"
4 #include "pff.h"
5 #include "sg12232c.h"
6 #include "led.h"
7 #include "lib.h"
8 #include "xmodem.h"
9 #include "elf.h"
10
11 void boot_from_sdc(const char *filename)
12 {
13   static unsigned char *loadbuf = NULL;
14   char *entry_point;
15   void (*f)(void);
16   extern int buffer_start; /* リンカ・スクリプトで定義されているバッファ */
17
18   FATFS fatfs;
19   WORD br, i;
20   BYTE buff[64];
21   int rc;
22
23   /*
24    * SDカードをマウント。
25    */
26   rc = pf_mount(&fatfs);
27   if (rc) {
28     return;
29   }
30
31   /*
32    * ファイルを開く。
33    */
34   rc = pf_open(filename);
35   if (rc) {
36     return;
37   }
38
39   sg12232c_draw_string(2, 10, "Booting from SDC.", 0);
40
41   /*
42    * SDカード上のOSイメージをメモリ上に読み込み。
43    */
44   loadbuf = (char *)(&buffer_start);
45   for (;;) {
46     rc = pf_read(buff, sizeof(buff), &br);
47     if (rc || !br) {
48       break;
49     }
50     for (i = 0; i < br; i++) {
51       *loadbuf = buff[i];
52       loadbuf++;
53     }
54     sg12232c_draw_progressbar(5, 20, 121 - 5, 25, 0, 100, fatfs.fptr * 100 / fatfs.fsize, 0);
55     led_toggle(Led1);
56     led_toggle(Led2);
57   }
58   if (rc) {
59     sg12232c_draw_string(2, 10, "File read error.", 0);
60     return;
61   }
62
63   /*
64    * メモリ上に展開(ロード)
65    */
66   loadbuf = (char *)(&buffer_start);
67   entry_point = elf_load(loadbuf);
68
69   /*
70    * 実行。
71    */
72   if (!entry_point) {
73     sg12232c_draw_string(2, 10, "Run error.", 0);
74   } else {
75     sg12232c_clear();
76     led_write(Led1, LedOff);
77     led_write(Led2, LedOff);
78     led_write(LedG, LedOff);
79     led_write(LedR, LedOff);
80     f = (void (*)(void))entry_point;
81     f();
82   }
83 }
84
85 static void wait()
86 {
87   volatile long i;
88   for (i = 0; i < 300000; i++)
89     ;
90 }
91
92 /* メモリの16進ダンプ出力 */
93 static int dump(char *buf, long size)
94 {
95   long i;
96
97   if (size < 0) {
98     puts("no data.\n");
99     return -1;
100   }
101   for (i = 0; i < size; i++) {
102     putxval(buf[i], 2);
103     if ((i & 0xf) == 15) {
104       puts("\n");
105     } else {
106       if ((i & 0xf) == 7) puts(" ");
107       puts(" ");
108     }
109   }
110   puts("\n");
111
112   return 0;
113 }
114
115 void boot_from_ser(void)
116 {
117   static char buf[16];
118   static long size = -1;
119   static unsigned char *loadbuf = NULL;
120   char *entry_point;
121   void (*f)(void);
122   extern int buffer_start; /* リンカ・スクリプトで定義されているバッファ */
123
124   sg12232c_draw_string(2, 10, "Waiting a boot image.", 0);
125
126   while (1) {
127     puts("kzload> "); /* プロンプト表示 */
128     gets(buf); /* シリアルからのコマンド受信 */
129
130     if (!strcmp(buf, "load")) { /* XMODEMでのファイルのダウンロード */
131       sg12232c_draw_string(2, 10, "Receiving a boot image.", 0);
132       loadbuf = (char *)(&buffer_start);
133       size = xmodem_recv(loadbuf);
134       wait(); /* 転送アプリが終了し端末アプリに制御が戻るまで待ち合わせる */
135       if (size < 0) {
136         puts("\nXMODEM receive error!\n");
137         sg12232c_draw_string(2, 10, "Receive error occurred.", 0);
138       } else {
139         puts("\nXMODEM receive succeeded.\n");
140         sg12232c_draw_string(2, 10, "Receive succeeded.     ", 0);
141       }
142     } else if (!strcmp(buf, "dump")) { /* メモリの16進ダンプ出力 */
143       puts("size: ");
144       putxval(size, 0);
145       puts("\n");
146       dump(loadbuf, size);
147     } else if (!strcmp(buf, "run")) { /* ELF形式ファイルの実行 */
148       entry_point = elf_load(loadbuf); /* メモリ上に展開(ロード) */
149       if (!entry_point) {
150         puts("run error!\n");
151       } else {
152         puts("starting from entry point: ");
153         putxval((unsigned long)entry_point, 0);
154         puts("\n");
155         f = (void (*)(void))entry_point;
156         f(); /* ここで,ロードしたプログラムに処理を渡す */
157         /* ここには返ってこない */
158       }
159     }
160   }
161 }
162