SSブログ

SilentCのユーザードライバーを試す前に COLDFIRE.BINを作ろう [SilentC]

※例によってかなり適当にやっているので、あまり信用しない様に
Img_0933_s.jpgNet 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月号 [雑誌]

Interface (インターフェース) 2009年 01月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2008/11/25
  • メディア: 雑誌



nice!(0)  コメント(1)  トラックバック(0) 

nice! 0

コメント 1

noritan

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) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。