H8WRITE_SERDEV = /dev/ttyUSB0
OBJS = vector.o startup.o intr.o main.o interrupt.o
+OBJS += init.o boot.o banner.o test.o
OBJS += lib.o serial.o xmodem.o elf.o dram.o spreg.o spi.o
OBJS += led.o re.o sw.o sg12232c.o vs1011e.o
OBJS += mmc.o pff.o
--- /dev/null
+
+#include "banner.h"
+#include "lib.h"
+
+void banner(void)
+{
+ puts("\n");
+ puts("========================================================\n");
+ puts(" KOZOS EXPBRD Boot Loader Version 0.0.1 \n");
+ puts("========================================================\n");
+}
+
--- /dev/null
+#ifndef BANNER_H
+#define BANNER_H
+
+void banner(void);
+
+#endif
+
--- /dev/null
+
+#include "boot.h"
+#include "defines.h"
+#include "pff.h"
+#include "sg12232c.h"
+#include "led.h"
+#include "lib.h"
+#include "xmodem.h"
+#include "elf.h"
+
+void boot_from_sdc(const char *filename)
+{
+ static unsigned char *loadbuf = NULL;
+ char *entry_point;
+ void (*f)(void);
+ extern int buffer_start; /* リンカ・スクリプトで定義されているバッファ */
+
+ FATFS fatfs;
+ WORD br, i;
+ BYTE buff[64];
+ int rc;
+
+ /*
+ * SDカードをマウント。
+ */
+ rc = pf_mount(&fatfs);
+ if (rc) {
+ return;
+ }
+
+ /*
+ * ファイルを開く。
+ */
+ rc = pf_open(filename);
+ if (rc) {
+ return;
+ }
+
+ sg12232c_draw_string(2, 10, "Booting from SDC.", 0);
+
+ /*
+ * SDカード上のOSイメージをメモリ上に読み込み。
+ */
+ loadbuf = (char *)(&buffer_start);
+ for (;;) {
+ rc = pf_read(buff, sizeof(buff), &br);
+ if (rc || !br) {
+ break;
+ }
+ for (i = 0; i < br; i++) {
+ *loadbuf = buff[i];
+ loadbuf++;
+ }
+ sg12232c_draw_progressbar(5, 20, 121 - 5, 25, 0, 100, fatfs.fptr * 100 / fatfs.fsize, 0);
+ led_toggle(Led1);
+ led_toggle(Led2);
+ }
+ if (rc) {
+ sg12232c_draw_string(2, 10, "File read error.", 0);
+ return;
+ }
+
+ /*
+ * メモリ上に展開(ロード)
+ */
+ loadbuf = (char *)(&buffer_start);
+ entry_point = elf_load(loadbuf);
+
+ /*
+ * 実行。
+ */
+ if (!entry_point) {
+ sg12232c_draw_string(2, 10, "Run error.", 0);
+ } else {
+ sg12232c_clear();
+ led_write(Led1, LedOff);
+ led_write(Led2, LedOff);
+ led_write(LedG, LedOff);
+ led_write(LedR, LedOff);
+ f = (void (*)(void))entry_point;
+ f();
+ }
+}
+
+static void wait()
+{
+ volatile long i;
+ for (i = 0; i < 300000; i++)
+ ;
+}
+
+/* メモリの16進ダンプ出力 */
+static int dump(char *buf, long size)
+{
+ long i;
+
+ if (size < 0) {
+ puts("no data.\n");
+ return -1;
+ }
+ for (i = 0; i < size; i++) {
+ putxval(buf[i], 2);
+ if ((i & 0xf) == 15) {
+ puts("\n");
+ } else {
+ if ((i & 0xf) == 7) puts(" ");
+ puts(" ");
+ }
+ }
+ puts("\n");
+
+ return 0;
+}
+
+void boot_from_ser(void)
+{
+ static char buf[16];
+ static long size = -1;
+ static unsigned char *loadbuf = NULL;
+ char *entry_point;
+ void (*f)(void);
+ extern int buffer_start; /* リンカ・スクリプトで定義されているバッファ */
+
+ sg12232c_draw_string(2, 10, "Waiting a boot image.", 0);
+
+ while (1) {
+ puts("kzload> "); /* プロンプト表示 */
+ gets(buf); /* シリアルからのコマンド受信 */
+
+ if (!strcmp(buf, "load")) { /* XMODEMでのファイルのダウンロード */
+ sg12232c_draw_string(2, 10, "Receiving a boot image.", 0);
+ loadbuf = (char *)(&buffer_start);
+ size = xmodem_recv(loadbuf);
+ wait(); /* 転送アプリが終了し端末アプリに制御が戻るまで待ち合わせる */
+ if (size < 0) {
+ puts("\nXMODEM receive error!\n");
+ sg12232c_draw_string(2, 10, "Receive error occurred.", 0);
+ } else {
+ puts("\nXMODEM receive succeeded.\n");
+ sg12232c_draw_string(2, 10, "Receive succeeded. ", 0);
+ }
+ } else if (!strcmp(buf, "dump")) { /* メモリの16進ダンプ出力 */
+ puts("size: ");
+ putxval(size, 0);
+ puts("\n");
+ dump(loadbuf, size);
+ } else if (!strcmp(buf, "run")) { /* ELF形式ファイルの実行 */
+ entry_point = elf_load(loadbuf); /* メモリ上に展開(ロード) */
+ if (!entry_point) {
+ puts("run error!\n");
+ } else {
+ puts("starting from entry point: ");
+ putxval((unsigned long)entry_point, 0);
+ puts("\n");
+ f = (void (*)(void))entry_point;
+ f(); /* ここで,ロードしたプログラムに処理を渡す */
+ /* ここには返ってこない */
+ }
+ }
+ }
+}
+
--- /dev/null
+#ifndef BOOT_H
+#define BOOT_H
+
+void boot_from_sdc(const char *filename);
+void boot_from_ser(void);
+
+#endif
+
--- /dev/null
+
+#include "init.h"
+#include "lib.h"
+#include "interrupt.h"
+#include "defines.h"
+#include "banner.h"
+#include "serial.h"
+#include "dram.h"
+#include "led.h"
+#include "re.h"
+#include "sw.h"
+#include "sg12232c.h"
+#include "spi.h"
+#include "vs1011e.h"
+
+int init_system(void)
+{
+ /* 以下はリンカ・スクリプトで定義してあるシンボル */
+ extern int erodata, data_start, edata, bss_start, ebss;
+
+ /*
+ * データ領域とBSS領域を初期化する.この処理以降でないと,
+ * グローバル変数が初期化されていないので注意.
+ */
+ memcpy(&data_start, &erodata, (long)&edata - (long)&data_start);
+ memset(&bss_start, 0, (long)&ebss - (long)&bss_start);
+
+ /* ソフトウエア・割り込みベクタを初期化する */
+ softvec_init();
+
+ /* シリアルの初期化 */
+ serial_init(SERIAL_DEFAULT_DEVICE);
+
+ banner();
+
+ return 0;
+}
+
+int init_components(void)
+{
+ /* DRAMの初期化 */
+ puts("Init : DRAM...");
+ dram_init();
+ puts("Done.\n");
+
+ /* LEDの初期化 */
+ puts("Init : LED...");
+ led_init();
+ puts("Done.\n");
+
+ /* ロータリーエンコーダーの初期化 */
+ puts("Init : Rotary Encoder...");
+ re_init();
+ puts("Done.\n");
+
+ /* スイッチの初期化 */
+ puts("Init : Switch...");
+ sw_init();
+ puts("Done.\n");
+
+ /* LCDの初期化 */
+ puts("Init : LCD...");
+ sg12232c_init();
+ sg12232c_clear();
+ sg12232c_draw_box(0, 0, 121, 31, 0);
+ sg12232c_draw_string(2, 2, "KOZOS EXPBRD #00", 0);
+ puts("Done.\n");
+
+ /* SPI Bus initializing. */
+ puts("Init : SPI Bus...");
+ spi_init();
+ puts("Done.\n");
+
+ /* VS1011e */
+ puts("Init : VS1011E...");
+ vs1011e_init();
+ vs1011e_volume_write(0x40, 0x40);
+ puts("Done.\n");
+
+ puts("Init : All Done.\n");
+
+ return 0;
+}
+
--- /dev/null
+#ifndef INIT_H
+#define INIT_H
+
+int init_system(void);
+int init_components(void);
+
+#endif
+
-#include "defines.h"
+#include "init.h"
+#include "test.h"
+#include "boot.h"
#include "interrupt.h"
-#include "serial.h"
-#include "xmodem.h"
-#include "elf.h"
-#include "dram.h"
-#include "lib.h"
-#include "led.h"
-#include "re.h"
-#include "sw.h"
-#include "pff.h"
-#include "sg12232c.h"
-#include "vs1011e.h"
-#include "spi.h"
#include "portconf.h"
-
-static int init(void)
-{
- /* °Ê²¼¤Ï¥ê¥ó¥«¡¦¥¹¥¯¥ê¥×¥È¤ÇÄêµÁ¤·¤Æ¤¢¤ë¥·¥ó¥Ü¥ë */
- extern int erodata, data_start, edata, bss_start, ebss;
-
- /*
- * ¥Ç¡¼¥¿Îΰè¤ÈBSSÎΰè¤ò½é´ü²½¤¹¤ë¡¥¤³¤Î½èÍý°Ê¹ß¤Ç¤Ê¤¤¤È¡¤
- * ¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤¬½é´ü²½¤µ¤ì¤Æ¤¤¤Ê¤¤¤Î¤ÇÃí°Õ¡¥
- */
- memcpy(&data_start, &erodata, (long)&edata - (long)&data_start);
- memset(&bss_start, 0, (long)&ebss - (long)&bss_start);
-
- /* ¥½¥Õ¥È¥¦¥¨¥¢¡¦³ä¤ê¹þ¤ß¥Ù¥¯¥¿¤ò½é´ü²½¤¹¤ë */
- softvec_init();
-
- /* ¥·¥ê¥¢¥ë¤Î½é´ü²½ */
- serial_init(SERIAL_DEFAULT_DEVICE);
- puts("\n");
-
- /* DRAM¤Î½é´ü²½ */
- puts("Init : DRAM...");
- dram_init();
- puts("Done.\n");
-
- /* LED¤Î½é´ü²½ */
- puts("Init : LED...");
- led_init();
- puts("Done.\n");
-
- /* ¥í¡¼¥¿¥ê¡¼¥¨¥ó¥³¡¼¥À¡¼¤Î½é´ü²½ */
- puts("Init : Rotary Encoder...");
- re_init();
- puts("Done.\n");
-
- /* ¥¹¥¤¥Ã¥Á¤Î½é´ü²½ */
- puts("Init : Switch...");
- sw_init();
- puts("Done.\n");
-
- /* LCD¤Î½é´ü²½ */
- puts("Init : LCD...");
- sg12232c_init();
- sg12232c_clear();
- sg12232c_draw_box(0, 0, 121, 31, 0);
- sg12232c_draw_string(2, 2, "KOZOS EXPBRD #00", 0);
- puts("Done.\n");
-
- /* SPI Bus initializing. */
- puts("Init : SPI Bus...");
- spi_init();
- puts("Done.\n");
-
- /* VS1011e */
- puts("Init : VS1011E...");
- vs1011e_init();
- puts("Done.\n");
-
- volatile int i;
-
- /*
- * L : Max.
- * R : Min.
- */
- {
- puts("Init : Phone (L)...");
- led_write(Led1, LedOn);
- led_write(Led2, LedOff);
- vs1011e_volume_write(0x1A, 0xF0);
-
- vs1011e_sinetest_init();
- for (i = 0; i < 20000; i++) { }
- vs1011e_sinetest_fini();
- for (i = 0; i < 20000; i++) { }
-
- vs1011e_sinetest_init();
- for (i = 0; i < 20000; i++) { }
- vs1011e_sinetest_fini();
- for (i = 0; i < 20000; i++) { }
-
- vs1011e_sinetest_init();
- for (i = 0; i < 20000; i++) { }
- vs1011e_sinetest_fini();
- for (i = 0; i < 20000; i++) { }
- puts("Done.\n");
- }
-
- /*
- * L : Min.
- * R : Max.
- */
- {
- puts("Init : Phone (R)...");
- led_write(Led1, LedOff);
- led_write(Led2, LedOn);
- vs1011e_volume_write(0xF0, 0x1A);
-
- vs1011e_sinetest_init();
- for (i = 0; i < 20000; i++) { }
- vs1011e_sinetest_fini();
- for (i = 0; i < 20000; i++) { }
-
- vs1011e_sinetest_init();
- for (i = 0; i < 20000; i++) { }
- vs1011e_sinetest_fini();
- for (i = 0; i < 20000; i++) { }
-
- vs1011e_sinetest_init();
- for (i = 0; i < 20000; i++) { }
- vs1011e_sinetest_fini();
- for (i = 0; i < 20000; i++) { }
- puts("Done.\n");
- }
-
- led_write(Led1, LedOff);
- led_write(Led2, LedOff);
- vs1011e_volume_write(0x1A, 0x1A);
-
- uint8 vol_left, vol_right;
- vs1011e_volume_read(&vol_left, &vol_right);
- puts("Init : Volume (L:");
- putxval(vol_left, 2);
- puts(",R:");
- putxval(vol_right, 2);
- puts(")\n");
-
- puts("Init : All Done.\n");
-
- return 0;
-}
-
-void boot_from_sdc(const char *filename)
-{
- static unsigned char *loadbuf = NULL;
- char *entry_point;
- void (*f)(void);
- extern int buffer_start; /* ¥ê¥ó¥«¡¦¥¹¥¯¥ê¥×¥È¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥Ð¥Ã¥Õ¥¡ */
-
- FATFS fatfs;
- WORD br, i;
- BYTE buff[64];
- int rc;
-
- /*
- * SD¥«¡¼¥É¤ò¥Þ¥¦¥ó¥È¡£
- */
- rc = pf_mount(&fatfs);
- if (rc) {
- return;
- }
-
- /*
- * ¥Õ¥¡¥¤¥ë¤ò³«¤¯¡£
- */
- rc = pf_open(filename);
- if (rc) {
- return;
- }
-
- sg12232c_draw_string(2, 10, "Booting from SDC.", 0);
-
- /*
- * SD¥«¡¼¥É¾å¤ÎOS¥¤¥á¡¼¥¸¤ò¥á¥â¥ê¾å¤ËÆɤ߹þ¤ß¡£
- */
- loadbuf = (char *)(&buffer_start);
- for (;;) {
- rc = pf_read(buff, sizeof(buff), &br);
- if (rc || !br) {
- break;
- }
- for (i = 0; i < br; i++) {
- *loadbuf = buff[i];
- loadbuf++;
- }
- sg12232c_draw_progressbar(5, 20, 121 - 5, 25, 0, 100, fatfs.fptr * 100 / fatfs.fsize, 0);
- led_toggle(Led1);
- led_toggle(Led2);
- }
- if (rc) {
- sg12232c_draw_string(2, 10, "File read error.", 0);
- return;
- }
-
- /*
- * ¥á¥â¥ê¾å¤ËŸ³«(¥í¡¼¥É)
- */
- loadbuf = (char *)(&buffer_start);
- entry_point = elf_load(loadbuf);
-
- /*
- * ¼Â¹Ô¡£
- */
- if (!entry_point) {
- sg12232c_draw_string(2, 10, "Run error.", 0);
- } else {
- sg12232c_clear();
- led_write(Led1, LedOff);
- led_write(Led2, LedOff);
- led_write(LedG, LedOff);
- led_write(LedR, LedOff);
- f = (void (*)(void))entry_point;
- f();
- }
-}
-
-static void wait()
-{
- volatile long i;
- for (i = 0; i < 300000; i++)
- ;
-}
-
-/* ¥á¥â¥ê¤Î16¿Ê¥À¥ó¥×½ÐÎÏ */
-static int dump(char *buf, long size)
-{
- long i;
-
- if (size < 0) {
- puts("no data.\n");
- return -1;
- }
- for (i = 0; i < size; i++) {
- putxval(buf[i], 2);
- if ((i & 0xf) == 15) {
- puts("\n");
- } else {
- if ((i & 0xf) == 7) puts(" ");
- puts(" ");
- }
- }
- puts("\n");
-
- return 0;
-}
-
-void boot_from_ser(void)
-{
- static char buf[16];
- static long size = -1;
- static unsigned char *loadbuf = NULL;
- char *entry_point;
- void (*f)(void);
- extern int buffer_start; /* ¥ê¥ó¥«¡¦¥¹¥¯¥ê¥×¥È¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥Ð¥Ã¥Õ¥¡ */
-
- sg12232c_draw_string(2, 10, "Waiting a boot image.", 0);
-
- while (1) {
- puts("kzload> "); /* ¥×¥í¥ó¥×¥Èɽ¼¨ */
- gets(buf); /* ¥·¥ê¥¢¥ë¤«¤é¤Î¥³¥Þ¥ó¥É¼õ¿® */
-
- if (!strcmp(buf, "load")) { /* XMODEM¤Ç¤Î¥Õ¥¡¥¤¥ë¤Î¥À¥¦¥ó¥í¡¼¥É */
- sg12232c_draw_string(2, 10, "Receiving a boot image.", 0);
- loadbuf = (char *)(&buffer_start);
- size = xmodem_recv(loadbuf);
- wait(); /* žÁ÷¥¢¥×¥ê¤¬½ªÎ»¤·Ã¼Ëö¥¢¥×¥ê¤ËÀ©¸æ¤¬Ìá¤ë¤Þ¤ÇÂÔ¤Á¹ç¤ï¤»¤ë */
- if (size < 0) {
- puts("\nXMODEM receive error!\n");
- sg12232c_draw_string(2, 10, "Receive error occurred.", 0);
- } else {
- puts("\nXMODEM receive succeeded.\n");
- sg12232c_draw_string(2, 10, "Receive succeeded. ", 0);
- }
- } else if (!strcmp(buf, "dump")) { /* ¥á¥â¥ê¤Î16¿Ê¥À¥ó¥×½ÐÎÏ */
- puts("size: ");
- putxval(size, 0);
- puts("\n");
- dump(loadbuf, size);
- } else if (!strcmp(buf, "run")) { /* ELF·Á¼°¥Õ¥¡¥¤¥ë¤Î¼Â¹Ô */
- entry_point = elf_load(loadbuf); /* ¥á¥â¥ê¾å¤ËŸ³«(¥í¡¼¥É) */
- if (!entry_point) {
- puts("run error!\n");
- } else {
- puts("starting from entry point: ");
- putxval((unsigned long)entry_point, 0);
- puts("\n");
- f = (void (*)(void))entry_point;
- f(); /* ¤³¤³¤Ç¡¤¥í¡¼¥É¤·¤¿¥×¥í¥°¥é¥à¤Ë½èÍý¤òÅϤ¹ */
- /* ¤³¤³¤Ë¤ÏÊ֤äƤ³¤Ê¤¤ */
- }
- }
- }
-}
+#include "lib.h"
int main(void)
{
INTR_DISABLE; /* ³ä¹þ¤ß̵¸ú¤Ë¤¹¤ë */
- init();
+ init_system();
+ init_components();
+ test_execute();
if (PORTCONF_SDC_DETECT()) {
puts("Boot : SDC detected.\n");
#ifndef PORTCONF_H
#define PORTCONF_H
+#include "defines.h"
+
/*
* Data Direction Register
*/
--- /dev/null
+
+#include "test.h"
+#include "led.h"
+#include "vs1011e.h"
+#include "lib.h"
+
+void test_execute(void)
+{
+ volatile int i;
+
+ /*
+ * L : Max.
+ * R : Min.
+ */
+ {
+ puts("Test : Phone (L)...");
+ led_write(Led1, LedOn);
+ led_write(Led2, LedOff);
+ led_write(LedG, LedOn);
+ led_write(LedR, LedOff);
+ vs1011e_volume_write(0x40, 0xF0);
+
+ vs1011e_sinetest_init();
+ for (i = 0; i < 20000; i++) { }
+ vs1011e_sinetest_fini();
+ for (i = 0; i < 20000; i++) { }
+
+ vs1011e_sinetest_init();
+ for (i = 0; i < 20000; i++) { }
+ vs1011e_sinetest_fini();
+ for (i = 0; i < 20000; i++) { }
+
+ vs1011e_sinetest_init();
+ for (i = 0; i < 20000; i++) { }
+ vs1011e_sinetest_fini();
+ for (i = 0; i < 20000; i++) { }
+ puts("Done.\n");
+ }
+
+ /*
+ * L : Min.
+ * R : Max.
+ */
+ {
+ puts("Test : Phone (R)...");
+ led_write(Led1, LedOff);
+ led_write(Led2, LedOn);
+ led_write(LedG, LedOff);
+ led_write(LedR, LedOn);
+ vs1011e_volume_write(0xF0, 0x40);
+
+ vs1011e_sinetest_init();
+ for (i = 0; i < 20000; i++) { }
+ vs1011e_sinetest_fini();
+ for (i = 0; i < 20000; i++) { }
+
+ vs1011e_sinetest_init();
+ for (i = 0; i < 20000; i++) { }
+ vs1011e_sinetest_fini();
+ for (i = 0; i < 20000; i++) { }
+
+ vs1011e_sinetest_init();
+ for (i = 0; i < 20000; i++) { }
+ vs1011e_sinetest_fini();
+ for (i = 0; i < 20000; i++) { }
+ puts("Done.\n");
+ }
+
+ led_write(Led1, LedOff);
+ led_write(Led2, LedOff);
+ led_write(LedG, LedOff);
+ led_write(LedR, LedOff);
+ vs1011e_volume_write(0x40, 0x40);
+
+ uint8 vol_left, vol_right;
+ vs1011e_volume_read(&vol_left, &vol_right);
+ puts("Test : Volume (L:");
+ putxval(vol_left, 2);
+ puts(",R:");
+ putxval(vol_right, 2);
+ puts(")\n");
+}
+
--- /dev/null
+#ifndef TEST_H
+#define TEST_H
+
+void test_execute(void);
+
+#endif
+