From 99f760764040bef877e677aca29f84421a2e57fb Mon Sep 17 00:00:00 2001 From: Shinichiro Nakamura Date: Tue, 24 Jul 2012 03:42:24 +0900 Subject: [PATCH] Separated the banner, boot, init, test from main. --- firm/sample/simple_mp3_player/bootload/Makefile | 1 + firm/sample/simple_mp3_player/bootload/banner.c | 12 + firm/sample/simple_mp3_player/bootload/banner.h | 7 + firm/sample/simple_mp3_player/bootload/boot.c | 162 ++++++++++++ firm/sample/simple_mp3_player/bootload/boot.h | 8 + firm/sample/simple_mp3_player/bootload/init.c | 84 ++++++ firm/sample/simple_mp3_player/bootload/init.h | 8 + firm/sample/simple_mp3_player/bootload/main.c | 303 +--------------------- firm/sample/simple_mp3_player/bootload/portconf.h | 2 + firm/sample/simple_mp3_player/bootload/test.c | 83 ++++++ firm/sample/simple_mp3_player/bootload/test.h | 7 + 11 files changed, 381 insertions(+), 296 deletions(-) create mode 100644 firm/sample/simple_mp3_player/bootload/banner.c create mode 100644 firm/sample/simple_mp3_player/bootload/banner.h create mode 100644 firm/sample/simple_mp3_player/bootload/boot.c create mode 100644 firm/sample/simple_mp3_player/bootload/boot.h create mode 100644 firm/sample/simple_mp3_player/bootload/init.c create mode 100644 firm/sample/simple_mp3_player/bootload/init.h create mode 100644 firm/sample/simple_mp3_player/bootload/test.c create mode 100644 firm/sample/simple_mp3_player/bootload/test.h diff --git a/firm/sample/simple_mp3_player/bootload/Makefile b/firm/sample/simple_mp3_player/bootload/Makefile index 7202215..0f909e8 100644 --- a/firm/sample/simple_mp3_player/bootload/Makefile +++ b/firm/sample/simple_mp3_player/bootload/Makefile @@ -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 index 0000000..c43a890 --- /dev/null +++ b/firm/sample/simple_mp3_player/bootload/banner.c @@ -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 index 0000000..6e01b16 --- /dev/null +++ b/firm/sample/simple_mp3_player/bootload/banner.h @@ -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 index 0000000..886ccc0 --- /dev/null +++ b/firm/sample/simple_mp3_player/bootload/boot.c @@ -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 index 0000000..b7cb2bb --- /dev/null +++ b/firm/sample/simple_mp3_player/bootload/boot.h @@ -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 index 0000000..7873212 --- /dev/null +++ b/firm/sample/simple_mp3_player/bootload/init.c @@ -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 index 0000000..6ed5b28 --- /dev/null +++ b/firm/sample/simple_mp3_player/bootload/init.h @@ -0,0 +1,8 @@ +#ifndef INIT_H +#define INIT_H + +int init_system(void); +int init_components(void); + +#endif + diff --git a/firm/sample/simple_mp3_player/bootload/main.c b/firm/sample/simple_mp3_player/bootload/main.c index 8a4c080..dc1bc0a 100644 --- a/firm/sample/simple_mp3_player/bootload/main.c +++ b/firm/sample/simple_mp3_player/bootload/main.c @@ -1,306 +1,17 @@ -#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"); diff --git a/firm/sample/simple_mp3_player/bootload/portconf.h b/firm/sample/simple_mp3_player/bootload/portconf.h index 301873b..14ef400 100644 --- a/firm/sample/simple_mp3_player/bootload/portconf.h +++ b/firm/sample/simple_mp3_player/bootload/portconf.h @@ -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 index 0000000..f7afac0 --- /dev/null +++ b/firm/sample/simple_mp3_player/bootload/test.c @@ -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 index 0000000..1a800f6 --- /dev/null +++ b/firm/sample/simple_mp3_player/bootload/test.h @@ -0,0 +1,7 @@ +#ifndef TEST_H +#define TEST_H + +void test_execute(void); + +#endif + -- 2.11.0