SilentCのユーザードライバーを試す前に COLDFIRE.BINを作ろう [SilentC]
※例によってかなり適当にやっているので、あまり信用しない様に
Net Set Radioには32MbitのシリアルROMが搭載されています。勿論ここには色々なデータを入れて置いたり、ロガーのストレージとしての利用も可能です。
今回はNet Set RadioのMP3再生機能を使って音声や音楽を鳴らす計画を立てました。ちなみに未だにSilentCからのコントロールではありません。
先のシリアルROMにMP3のデータを入れれば良いのでしょうけれど、その為には外からデータをNet Set Radioに送り込むPCのプログラムとか、Net Set Radio内で動くシリアルROMへの書き込みプログラムとか、それなりのユーザーインタフェースとか色々作らねばならないので、なかなか気が進みませんでした。
で、考えてみるとSilentC以外の領域がまだFLASH ROMに128Kbyte残っており、その領域への書き込みはSilentCがやってくれるではないですか。
と言う訳で後半128Kbyteに書き込むべきデータ、つまりCOLDFIRE.BINの製作です。
まずは元になるMP3データの作成です。音声は音声合成ソフトを使ってWAVファイルを作成し、それをMP3に変換しました。
問題は音楽データです。書き込み可能なROM領域は最大で128Kbyteしか無いのですが、元のMP3データファイルは1.2M以上あるファイルです。ビットレートをうーんと落としてなんと16Kbpsでようやく105Kbyteとなりました。高音が抜けてしまってこもった感じになってしまいましたが、まあしょうがない。
これらMP3データをCソースファイルに変換します。変換する時に、ファイルの属性(音データの開始アドレスとかサイズとか)のレコードも一緒に作って置きます。このレコードにユーザードライバーで動くプログラムからアクセスし、音を出すのです。
作ったCソースをCodeWarriorでROMデータ→BINファイルに変換します。
FLASH領域に書き込むデータを作るので、TargetsはINTERNAL_FLASHを使用します。
作成するCOLDFIRE.BINにはコードは含まれていないので、コードを生成する物は一切REMOVEしてしまいます。mainは勿論、start何とかとか、exception何とかとか。
lcfファイルも不必要と思われる所はコメントアウトしてしまいます。
INTERNAL_FLASH settingのLinker→ColdFire Linkerでは、まずエントリーポイントを削除してしまいます。一々開発環境に怒られますが、だってデータしか無くてエントリーする物が無いのですから。怒られても無視しておきます。
Force Action Symbolsには必要な変数名を記述しておきます。
_calling_mp3,_mikupops_mp3,_charge_mp3,_lost_mp3
更に出来上がったSフォーマットのファイルからバイナリーファイルを作成するPost Linkerの設定も行います。このページ辺りを見てください。
http://hamayan.blog.so-net.ne.jp/2008-11-30-1
batファイルはCOLDFIRE.BINを作る様に変更が必要です。
出来上がったCOLDFIRE.BINをtftpを使ってColdFire基板に送り込みます。ここは簡単だ!。
あとはユーザードライバー側から先のファイルプロパティへアクセスし(別々のプロジェクトなのでリンカーでアドレスの解決ができません。COLDFIRE.BINを作った時に出力されるMAPファイルを見ながら、絶対アドレスを指定してアクセスします。)
全部で112Kbyteの領域サイズとなってしまったので、スカッとGDBスタブは削除されてしまいました。まぁ良いか。
Net Set Radioには32MbitのシリアルROMが搭載されています。勿論ここには色々なデータを入れて置いたり、ロガーのストレージとしての利用も可能です。
今回はNet Set RadioのMP3再生機能を使って音声や音楽を鳴らす計画を立てました。ちなみに未だにSilentCからのコントロールではありません。
先のシリアルROMにMP3のデータを入れれば良いのでしょうけれど、その為には外からデータをNet Set Radioに送り込むPCのプログラムとか、Net Set Radio内で動くシリアルROMへの書き込みプログラムとか、それなりのユーザーインタフェースとか色々作らねばならないので、なかなか気が進みませんでした。
で、考えてみるとSilentC以外の領域がまだFLASH ROMに128Kbyte残っており、その領域への書き込みはSilentCがやってくれるではないですか。
と言う訳で後半128Kbyteに書き込むべきデータ、つまりCOLDFIRE.BINの製作です。
まずは元になるMP3データの作成です。音声は音声合成ソフトを使ってWAVファイルを作成し、それをMP3に変換しました。
問題は音楽データです。書き込み可能なROM領域は最大で128Kbyteしか無いのですが、元のMP3データファイルは1.2M以上あるファイルです。ビットレートをうーんと落としてなんと16Kbpsでようやく105Kbyteとなりました。高音が抜けてしまってこもった感じになってしまいましたが、まあしょうがない。
これらMP3データをCソースファイルに変換します。変換する時に、ファイルの属性(音データの開始アドレスとかサイズとか)のレコードも一緒に作って置きます。このレコードにユーザードライバーで動くプログラムからアクセスし、音を出すのです。
static const unsigned char mikupops[] = { 0xFF,0xE3,0x28,0x64,0x00,0x00,0x00,0x01,0xA4,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x48,0x00,0x00,0x00,0x00,0x4C,0x41,0x4D,0x45,0x33,0x2E,0x39,0x37,0x55,0x55,0x55,
const FILE_PROPERTIES mikupops_mp3 = { "mikupops.mp3", "2008/11/30 21:44:56", 0, (void *)mikupops, "", (void *)0, 107280, };
作ったCソースをCodeWarriorでROMデータ→BINファイルに変換します。
FLASH領域に書き込むデータを作るので、TargetsはINTERNAL_FLASHを使用します。
作成するCOLDFIRE.BINにはコードは含まれていないので、コードを生成する物は一切REMOVEしてしまいます。mainは勿論、start何とかとか、exception何とかとか。
lcfファイルも不必要と思われる所はコメントアウトしてしまいます。
# Sample Linker Command File for CodeWarrior for ColdFire KEEP_SECTION {.vectortable} # Memory ranges MEMORY { code (RX) : ORIGIN = 0x00020000, LENGTH = 0x00020000 } SECTIONS { # Heap and Stack sizes definition # MCF52233 Derivative Memory map definitions from linker command files: # __IPSBAR, __RAMBAR, __RAMBAR_SIZE, __FLASHBAR, __FLASHBAR_SIZE linker # symbols must be defined in the linker command file. # Memory Mapped Registers (IPSBAR= 0x40000000) # ___IPSBAR = 0x40000000; # 32 Kbytes Internal SRAM ___RAMBAR = 0x20000000; ___RAMBAR_SIZE = 0x00008000; # 256 KByte Internal Flash Memory ___FLASHBAR = 0x00000000; ___FLASHBAR_SIZE = 0x00040000; ___SP_AFTER_RESET = ___RAMBAR + ___RAMBAR_SIZE - 4; # .userram : {} > userram .code : {} > code # .vectorram : {} > vectorram # .vectors : # { # exceptions.c(.vectortable) # . = ALIGN (0x4); # } > vectorrom # .cfmprotect : # { # *(.cfmconfig) # . = ALIGN (0x4); # } > cfmprotrom .text : { *(.text) . = ALIGN (0x4); *(.rodata) . = ALIGN (0x4); ___ROM_AT = .; ___DATA_ROM = .; } >> code # .data : AT(___ROM_AT) # { # ___DATA_RAM = .; # . = ALIGN(0x4); # *(.exception) # . = ALIGN(0x4); # __exception_table_start__ = .; # EXCEPTION # __exception_table_end__ = .; # # ___sinit__ = .; # STATICINIT # __START_DATA = .; # # *(.data) # . = ALIGN (0x4); # __END_DATA = .; # # __START_SDATA = .; # *(.sdata) # . = ALIGN (0x4); # __END_SDATA = .; # # ___DATA_END = .; # __SDA_BASE = .; # . = ALIGN (0x4); # } >> userram # .bss : # { # ___BSS_START = .; # __START_SBSS = .; # *(.sbss) # . = ALIGN (0x4); # *(SCOMMON) # __END_SBSS = .; # # __START_BSS = .; # *(.bss) # . = ALIGN (0x4); # *(COMMON) # __END_BSS = .; # ___BSS_END = .; # # . = ALIGN(0x4); # } >> userram # .custom : # { # ___HEAP_START = .; # ___heap_addr = ___HEAP_START; # ___HEAP_END = ___HEAP_START + ___heap_size; # ___SP_END = ___HEAP_END; # ___SP_INIT = ___SP_END + ___stack_size; # # . = ALIGN (0x4); # } >> userram # ___VECTOR_RAM = ADDR(.vectorram); # __SP_INIT = ___SP_INIT; # _romp_at = ___ROM_AT + SIZEOF(.data); # .romp : AT(_romp_at) # { # __S_romp = _romp_at; # WRITEW(___ROM_AT); # WRITEW(ADDR(.data)); # WRITEW(SIZEOF(.data)); # WRITEW(0); # WRITEW(0); # WRITEW(0); } }
INTERNAL_FLASH settingのLinker→ColdFire Linkerでは、まずエントリーポイントを削除してしまいます。一々開発環境に怒られますが、だってデータしか無くてエントリーする物が無いのですから。怒られても無視しておきます。
Force Action Symbolsには必要な変数名を記述しておきます。
_calling_mp3,_mikupops_mp3,_charge_mp3,_lost_mp3
更に出来上がったSフォーマットのファイルからバイナリーファイルを作成するPost Linkerの設定も行います。このページ辺りを見てください。
http://hamayan.blog.so-net.ne.jp/2008-11-30-1
batファイルはCOLDFIRE.BINを作る様に変更が必要です。
MakeDC32 "MCF52233_INTERNAL_FLASH.elf.S19" 00020000 00040000 del COLDFIRE.BIN ren SILENTC.BIN COLDFIRE.BIN
出来上がったCOLDFIRE.BINをtftpを使ってColdFire基板に送り込みます。ここは簡単だ!。
あとはユーザードライバー側から先のファイルプロパティへアクセスし(別々のプロジェクトなのでリンカーでアドレスの解決ができません。COLDFIRE.BINを作った時に出力されるMAPファイルを見ながら、絶対アドレスを指定してアクセスします。)
miku = (FILE_PROPERTIES *)0x3C174; /*ミクミク*/ VS1011e_SDI_Write( miku->file, (unsigned long)miku->size );
全部で112Kbyteの領域サイズとなってしまったので、スカッとGDBスタブは削除されてしまいました。まぁ良いか。
Interface (インターフェース) 2009年 01月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2008/11/25
- メディア: 雑誌
2008-12-01 00:46
nice!(0)
コメント(1)
トラックバック(0)
Entry Point は、Sレコードファイル最後のS7行のアドレスに使われます。そのため、COLDFIRE.BINを使う限りは全く機能しません。何でもいいから入れておくと、安心します。そのため、 Force Active Symbols の一つ、あるいはこれら Symbol のテーブルを Entry Point に指定すると丸くおさまるはずです。
私のプロジェクトの場合、JMPテーブルを Entry Point に入れてあり、 Force Active Symbols は空欄になっているはずです。
# 今は、 CodeWarrior が無いので、確認できません。
by noritan (2008-12-01 08:28)