OSDN Git Service

Separated the banner, boot, init, test from main.
authorShinichiro Nakamura <shinta.main.jp@gmail.com>
Mon, 23 Jul 2012 18:42:24 +0000 (03:42 +0900)
committerShinichiro Nakamura <shinta.main.jp@gmail.com>
Mon, 23 Jul 2012 18:42:24 +0000 (03:42 +0900)
firm/sample/simple_mp3_player/bootload/Makefile
firm/sample/simple_mp3_player/bootload/banner.c [new file with mode: 0644]
firm/sample/simple_mp3_player/bootload/banner.h [new file with mode: 0644]
firm/sample/simple_mp3_player/bootload/boot.c [new file with mode: 0644]
firm/sample/simple_mp3_player/bootload/boot.h [new file with mode: 0644]
firm/sample/simple_mp3_player/bootload/init.c [new file with mode: 0644]
firm/sample/simple_mp3_player/bootload/init.h [new file with mode: 0644]
firm/sample/simple_mp3_player/bootload/main.c
firm/sample/simple_mp3_player/bootload/portconf.h
firm/sample/simple_mp3_player/bootload/test.c [new file with mode: 0644]
firm/sample/simple_mp3_player/bootload/test.h [new file with mode: 0644]

index 7202215..0f909e8 100644 (file)
@@ -20,6 +20,7 @@ H8WRITE = ../../tools/kz_h8write/kz_h8write
 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
diff --git a/firm/sample/simple_mp3_player/bootload/banner.c b/firm/sample/simple_mp3_player/bootload/banner.c
new file mode 100644 (file)
index 0000000..c43a890
--- /dev/null
@@ -0,0 +1,12 @@
+
+#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");
+}
+
diff --git a/firm/sample/simple_mp3_player/bootload/banner.h b/firm/sample/simple_mp3_player/bootload/banner.h
new file mode 100644 (file)
index 0000000..6e01b16
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef BANNER_H
+#define BANNER_H
+
+void banner(void);
+
+#endif
+
diff --git a/firm/sample/simple_mp3_player/bootload/boot.c b/firm/sample/simple_mp3_player/bootload/boot.c
new file mode 100644 (file)
index 0000000..886ccc0
--- /dev/null
@@ -0,0 +1,162 @@
+
+#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(); /* ここで,ロードしたプログラムに処理を渡す */
+        /* ここには返ってこない */
+      }
+    }
+  }
+}
+
diff --git a/firm/sample/simple_mp3_player/bootload/boot.h b/firm/sample/simple_mp3_player/bootload/boot.h
new file mode 100644 (file)
index 0000000..b7cb2bb
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef BOOT_H
+#define BOOT_H
+
+void boot_from_sdc(const char *filename);
+void boot_from_ser(void);
+
+#endif
+
diff --git a/firm/sample/simple_mp3_player/bootload/init.c b/firm/sample/simple_mp3_player/bootload/init.c
new file mode 100644 (file)
index 0000000..7873212
--- /dev/null
@@ -0,0 +1,84 @@
+
+#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;
+}
+
diff --git a/firm/sample/simple_mp3_player/bootload/init.h b/firm/sample/simple_mp3_player/bootload/init.h
new file mode 100644 (file)
index 0000000..6ed5b28
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef INIT_H
+#define INIT_H
+
+int init_system(void);
+int init_components(void);
+
+#endif
+
index 8a4c080..dc1bc0a 100644 (file)
-#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");
index 301873b..14ef400 100644 (file)
@@ -2,6 +2,8 @@
 #ifndef PORTCONF_H
 #define PORTCONF_H
 
+#include "defines.h"
+
 /*
  * Data Direction Register
  */
diff --git a/firm/sample/simple_mp3_player/bootload/test.c b/firm/sample/simple_mp3_player/bootload/test.c
new file mode 100644 (file)
index 0000000..f7afac0
--- /dev/null
@@ -0,0 +1,83 @@
+
+#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");
+}
+
diff --git a/firm/sample/simple_mp3_player/bootload/test.h b/firm/sample/simple_mp3_player/bootload/test.h
new file mode 100644 (file)
index 0000000..1a800f6
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef TEST_H
+#define TEST_H
+
+void test_execute(void);
+
+#endif
+