以前に、gcc では、内部データフラッシュメモリーへのアクセスがサポートされない
事で、開発をストールさせていたが、GR-Cotton でRL78/G13が使われており
WEBコンパイラは gcc となっている、また、データEEPROMのアクセスライブ
ラリーもあるようなので、これらを利用する事にした。
※以前に、ルネサスのIDEでは、RL78はC++をサポートしないので、gcc 用
ライブラリの提供をお願いした際「できません」と断られた事があった。
GR-Cotton では WEB コンパイラで gcc を使っていて、gcc 用ライブラリーを同梱し
ている。
それなら、それを教えてくれてもいいと思うのだが・・・
今回、仕事でRL78のオファーを受けた事で、データ・フラッシュは必須なので、
検討を始めた。
以前に、データフラッシュライブラリのオブジェクト(CS+IDE)をダンプした
ら、リバースエンジニアできそうな感じだったのだが、gcc 判があれば話が早い。
早速、GR-Cotton のプロジェクトを作成して、ソースコード一式を入手した。
その中にデータEEPROM操作関係のAPIがあるので、関係する部分を取得して、
自分のシステムに組み込んでみた。
※肝心な部分は、やはり、ライブラリーになっており隠蔽されている。(pfdl.a)
「pfdl.a」は、2つのオブジェクトをアーカイブしたものであるようだ。
% rl78-elf-nm pfdl.a pfdl.o: 0000009d R _PFDL_Close 00000025 R _PFDL_Execute 00000091 R _PFDL_Handler 00000000 R _PFDL_Open 0000009d R PFDL_Close 00000025 R PFDL_Execute 0000006b r PFDL_Execute_erase 0000008a r PFDL_Execute_exit 00000061 r PFDL_Execute_firmware 0000007c r PFDL_Execute_read 0000007f r PFDL_Execute_read_next 00000091 R PFDL_Handler 00000000 R PFDL_Open pfdl_version.o: 00000000 R _PFDL_GetVersionString 00000009 R _PFDL_VERSION_STRING 00000000 R PFDL_GetVersionString
ライブラリから、オブジェクトを分解して、肝心なオブジェクトを逆アセンブルして
みた。
rl78-elf-ar x pfdl.a rl78-elf-objdump -D pfdl.o > pfdl.lst
00000000: 0: c1 push ax 1: c3 push bc 2: a8 08 movw ax, [sp+8] 4: 71 00 90 00 set1 !f0090 .0 8: c7 push hl 9: 16 movw hl, ax a: bf 04 08 movw !f0804 , ax d: 8c 01 mov a, [hl+1] f: 9f 01 08 mov !f0801 , a 12: e5 03 08 oneb !f0803 15: f2 clrb c 16: fc f8 ff 0e call !!efff8 1a: c6 pop hl 1b: cf 80 08 04 mov !f0880 , #4 1f: 62 mov a, c 20: 9d f0 mov 0xffef0, a 22: c2 pop bc 23: c0 pop ax 24: d7 ret
上記は、PFDL_Open API の逆アセンブルソースだが、妙なアドレスをアクセスしている。
「F0804、F0801、F0803、F0880」これは、データフラッシュ関係の
制御レジスターと思われる。(ハードウェアーマニュアルには記載は無い)
また、「EFFF8」をコールしている、この部分に、データEEPROMのファーム
があるものと思われる。(このファームの存在も、一切記述が無い)
※改めて思うが、何故、隠蔽して、情報をオープンにしないのか、全く理解に苦しむ。
※本当に知りたいのなら、リバースエンジニアリングできるし、制限を設ける理由も思
いつかない。(ユーザーは不便になり、メーカーはサポートする仕事が増えるだけ)
早速テスト・・・
PFDL_Open関数を呼び出すと、戻ってこない・・・
PFDLライブラリのドキュメントを調べると、暗黙的に利用するワークRAMがあるよ
うだ。(セルフRAM領域)
※不思議な事に、デバイスにより、必要な場合と不必要な場合がある。
しかし、自分が使っているRL78/G13(R5F100LG)では、セルフRAMは
必要無い。
また、これとは別に、デバイス共通で、RAMの最終アドレス付近は、(0xFFE20
~後ろ)はライブラリの利用領域として予約されている。
※スタックやデータバッファと記述がある。
自分は、スタックを共有する為、RAMの最終アドレスを設定している。
色々、悩んだ末、解決した。
どうやら、ライブラリ内では、スタックを再設定して、内部処理を行い、ライブラリを出
る時に元に戻しているようだ。
この動作の為、共有していると正常に動作しないようだ、アプリ側のスタックを完全に分
離して、オーバーラップしないようにしたら、あっけなく動作した・・・
※これだからブラックボックスは嫌いだ・・・(まぁ自分の思い込みが原因ではあるけど)
以前にRXマイコンで作成した、対話形式で、データフラッシュの操作を行うプログラム
を組み込んで、実際に操作してみた。
とりあえず、操作できるようだ、これで、RL78も他のマイコンと遜色無く使える事が
判ったので、色々利用してみたい。
RL78はコストが安いので、R8C/M120とRXの中間を埋める「駒」として重宝
しそうだー