GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
GR-CITRUSで、CS+のRXシリアルデバッガのモニタプログラムと初期ファームウェア(USBMSCファーム)を結合して且つそれを簡単に書き込めるようにしたいと思い、初期ファームウェアのソースコードを弄り始めたのですが、ROMの先頭の528K(512K+16K)しか書き換え出来ないバグが存在していることに気付きました。(ちなみに、元々のUSBMSCファームは消した後ですので、公開されているソースからビルドしたものです。)最初の1回だけは期待した通りにbinファイルが書き込まれます。その後に違うbinファイルを書き込もうとすると、謎のエラーが発生し、途中から書き換えられていません。(なお、同じbinファイルの書き込みでは、消去と書き込みがスキップされるのでエラーにはなりません。)RX631ではROMのブロックサイズに以下の4つのブロックサイズが存在していますが、GR-CITRUSがクラスタサイズ32KのFATファイルシステムの領域として使用しているFFF0_0000~FFFE_FFFFにはブロックサイズが32Kのものと16Kのものと2種類あります。http://resource.renesas.com/resource/lib/jpn/online_docs/um/RX/RX63N_RX631_ja/?Flashmemory#TOC_47_1_2FFE0_0000~FFEF_FFFF : 64KブロックサイズFFF0_0000~FFF7_FFFF : 32KブロックサイズFFF8_0000~FFFF_7FFF : 16KブロックサイズFFFF_8000~FFFF_FFFF : 4Kブロックサイズ問題となるソース/関数は以下です。これは32K単位で処理を行う設計になっていますが、書き込みに関してはflash_coderom_WriteData()内でループが回っていて32K全体について処理が行われるようになっているものの、消去に関してはflash_coderom_EraseBlock()が指定されたブロック1つだけを処理するようになっています。ところが、FFF8_0000~FFFE_FFFFでは32Kセクタが2つの16Kブロックで構成されていて、flash_coderom_EraseBlock()は前半分の16Kブロック1つを消去するだけで、後ろ半分の16Kブロックの方は消去しません。その為、後ろ半分では消去されていないブロックに書き込みが行われることになり、たぶん書き込みエラーが発生してしまって、それ以後が処理されなくなるのだと推測します。Okamy-citrus_usbfw-27afb53591b1¥src¥MSCFW¥MEDIA¥r_usb_ATAPIdriver.cstatic BOOL usb_pmsc_SmpAtapi_PostWrite_StorageFlash( const uint32_t nClusNo ){ const uint32_t addr = USBC_PMSC_STORAGE_FLASH_ADDR + nClusNo * FATFS_CLUSTER_SIZE; if( memcmp( (void*)addr, usb_gpmsc_AtapiDataBuffer, FATFS_CLUSTER_SIZE ) == 0 ) { return TRUE; } if( flash_coderom_EraseBlock( addr ) != FLASH_SUCCESS ) { return FALSE; } if( flash_coderom_WriteData( addr, usb_gpmsc_AtapiDataBuffer, FATFS_CLUSTER_SIZE ) != FLASH_SUCCESS ) { return FALSE; } return TRUE;}たぶん以下のような処理が必要なのだと思います。(すみません。とりあえず即値です。) 直ることは確認しました。 if( flash_coderom_EraseBlock( addr ) != FLASH_SUCCESS ) { return FALSE; } if( 0xFFF80000 <= addr ) { if( flash_coderom_EraseBlock( addr + 0x4000 ) != FLASH_SUCCESS ) { return FALSE; } }実際、Webコンパイラで以下のbinサイズの大きなプログラムを作ったところ、始めに書いた通りの異常が起きました。/* GR-CITRUS Sketch Template V1.00 */#include <Arduino.h>void setup(){ Serial.begin(115200);}void loop(){ word addr; for (addr = 0xFFE00000; addr < 0xFFF00000; addr += 0x4000) { Serial.print(addr, HEX); Serial.print(" : "); Serial.println(*(byte*)addr, HEX); } Serial.println(""); Serial.println(""); Serial.println(""); Serial.println(""); delay(1000);}void padding(){ __asm(".rept 0xD8000"); __asm(".byte 0x55"); //__asm(".byte 0xAA"); __asm(".endr");}なお、試したbinファイルは以下のものです。それぞれ955KBほどです。(zipファイルは121KBほどです。)citrus_sketch_{0x55_0xAA}.zip内容:citrus_sketch_0x55.bincitrus_sketch_0xAA.bin
NoMaYさん、対策含めて調査いただきありがとうございます。今後の対応を検討していきたいと思います。
NoMaYさん、CITRUSをE1エミュレータに接続し、現象を確認いたしました。ご指摘の通りの動作となっており、Writeエラーが発生しておりました。
ご提案いただいた回避策を実施し、ストレージへの書き込み動作、およびメモリマップでの確認を行い、正常動作することが確認できました。
ご協力いただきまして誠にありがとうございました。
岡宮様
いつもお世話になります。
表題の件は現在出回っているボードでは解決済みでしょうか。
今使用している GR-CITRUS で似たような症状が出て書き込みできなくなっています。
書き込もうとしているバイナリーは 516KB程です。新規作成したばかりの小さなプロジェクトをビルドした 85KB程の
バイナリーでは問題なく書き込めます。
基板の購入時期は不明ですが、今年のがじぇるねのデザインコンテストで先月に提供していただいた基板です。
ビルドしたのは Webコンパイラで 書き込んだ端末は Windows8.1 64ibits(あまり関係ないかもしれませんが)
です。似たような症状がないか探していてたどり着きました。
キャプチャーした画像を張り付けておきます。ちょうど半分くらいの場所で現象が起こります。
TakSanさん、こんにちは。NoMaYと申します。もし、お急ぎでしたら、拙作の以下の修正版ファームウェアを試してみては如何でしょうか?ちょっとオマケ(RXシリアルデバッグモニタ)が合体していたり、ちょっと紛らわしく表題に"CC-RX&CS+編"と表記されていたりしますが、WebコンパイラやIDE for GRで普段通り作っているプログラム(binファイル)では影響無い筈です。(影響無いように作ったつもりです、、、)GR-CITRUSでCS+のRXシリアルデバッガを使えるようにしてみた(CC-RX&CS+編)「一緒に今回やったこと・528Kバイトまでしかフラッシュ書き換え出来ない不具合の修正・外部バスを有効にしてしまっている不具合(GR-CITRUSでは表面化せず)の修正とりあえず試してみるのに必要なファイル一式GR-CITRUS-CCRX-RXSDBG-20161217.zip」「(1) GR-CITRUSのUSBMSCファームウェアの更新(スケッチのbinファイルを書き込む手順と同じ)今回のファイル一式を固めたzipファイルには以下のbinファイルが含まれていますので、通常のスケッチのbinファイルを書き込む場合と同じ手順で書き込んで下さい。ccrx-rxsdbg\usbfw_updater\citrus_rxsdbg_Serial1_OpenDrain.bin正常に更新された場合、最後にGR-CITRUSのLEDがゆっくり(約1秒間隔で)3回点灯した後、ちょっと間が空いてから、LEDが点灯したままになります。この時、再びGR-CITRUSのドライブがマウントされ、通常のスケッチのbinファイルが書き込み出来るようになっています。 [以後省略]」