久しぶりの投稿になってしまいました。
というのも、FM3のUSBホスト(CN7、標準Aソケット)とデバイス(CN6、mini-B)の両方を同時に動かすことができず、迷路に入っておりましたが、なんとかUSBメモリの読み出し、書き込みなどのファイル操作がUSBの仮想COMポートからできるようになりましたので、以下そのメモです。
CQ誌2012年7月号付録のDVDに入っている仮想COMポートのソースに、elm-chanさんの組み込み用printfモジュールを使うことで、デバッグがやりやすくなりました。
追加関数として、putc、gets関数を作成しました。
void init_xprint(void)
{
xdev_out(usb_cdc_putc);
xdev_in(usb_cdc_gets);
}
void usb_cdc_putc(unsigned char c)
{
*pUSB0_EP2DTH = c;
}
unsigned char usb_cdc_gets(void)
{
unsigned char c;
databuflen = USB0_EP1S_bit.bSIZE;
for (c=0; c<databuflen; c++) {
if (!(c & 1)) // ここはちょっとあやしい
databuf[c] = *pUSB0_EP1DTL;
else
databuf[c] = *pUSB0_EP1DTH;
}
return *databuf;
}
USB0F_Handlerはエコーバックしている部分をコメントアウトしました。
void USB0F_Handler(void)
{
// unsigned char c;
unsigned int dummy;
if (USB0_EP1S_bit.bDRQ) { // 何か到達した
// databuflen = USB0_EP1S_bit.bSIZE; // サイズを引き受けて
// for (c=0; c<databuflen; c++) {
// if (!(c & 1))
// databuf[c] = *pUSB0_EP1DTL;
// else databuf[c] = *pUSB0_EP1DTH;
// }
usb_cdc_gets();
USB0_EP1S_bit.bDRQ = 0;
dummy = USB0_EP1C;
}
if (USB0_EP2S_bit.bDRQ) {
// databuflen = StrLength(xfunc_out);
// if (databuflen) {
// for (c=0; c<databuflen; c++) {
// if (!(c & 1))
// *pUSB0_EP2DTL = databuf[c];
// else
// *pUSB0_EP2DTH = databuf[c];
// }
// databuflen = 0;
// xputc(0x42); // debug
// }
USB0_EP2S_bit.bDRQ = 0;
dummy = USB0_EP2C;
}
}
これで、仮想COMポートは動くようになりましたが、CQ誌のDVDのベンダ純正USBホストプログラムと同時に動かすことができず、CQ誌のコードを使うことを断念しました。
何か手掛かりはないかと、spansionのサイトを調べているうちに<a href="http://www.spansion.com/Products/microcontrollers/Pages/tool-detail-spansion_usb_wizard.aspx">SPANSION USB WIZARDというツールがあることがわかり、結果的にこのツールが吐いたコードを使うことで、USBホストと仮想COMポートの両方を同時に動かすことができました。
このUSB WIZARDには、CQ FM3のボードに指定もあり、CPUの種類、タイプなどもコードに反映してくれます。また、ファイルシステムとして、elm-chanさんのFatFsも簡単にインプリメントしてくれます。
ただ、最初はSpansion CMSIS / L3 – Low Level Libraryを使ったコードにしていましたが、なぜか動きませんでした。L3をあきらめて、使わないコードにしたところ、無事USBメモリのアクセスLEDが点滅、ホットしました。
さらに、Fujitsu Microelectronics Europeが公開している
F²MC-16LX FAMILY 16-BIT MICROCONTROLLER MB96330のアプリケーションノートのmenu.cを参考にして、メニュー形式でUSBメモリのフォルダ操作、ファイルの読み書きができるようになりました。

ここまで、FM3をいじってきましたが、smartSDRのコントローラとしてラズベリー・パイのようなCPUボードの方が楽なのかなとも思えてきました。
Eclipseで以下のようなエラーが出たときの対処のメモ(正解かどうかはわかりませんが、GDBもちゃんと使えます)

というのも、FM3のUSBホスト(CN7、標準Aソケット)とデバイス(CN6、mini-B)の両方を同時に動かすことができず、迷路に入っておりましたが、なんとかUSBメモリの読み出し、書き込みなどのファイル操作がUSBの仮想COMポートからできるようになりましたので、以下そのメモです。
CQ誌2012年7月号付録のDVDに入っている仮想COMポートのソースに、elm-chanさんの組み込み用printfモジュールを使うことで、デバッグがやりやすくなりました。
追加関数として、putc、gets関数を作成しました。
void init_xprint(void)
{
xdev_out(usb_cdc_putc);
xdev_in(usb_cdc_gets);
}
void usb_cdc_putc(unsigned char c)
{
*pUSB0_EP2DTH = c;
}
unsigned char usb_cdc_gets(void)
{
unsigned char c;
databuflen = USB0_EP1S_bit.bSIZE;
for (c=0; c<databuflen; c++) {
if (!(c & 1)) // ここはちょっとあやしい
databuf[c] = *pUSB0_EP1DTL;
else
databuf[c] = *pUSB0_EP1DTH;
}
return *databuf;
}
USB0F_Handlerはエコーバックしている部分をコメントアウトしました。
void USB0F_Handler(void)
{
// unsigned char c;
unsigned int dummy;
if (USB0_EP1S_bit.bDRQ) { // 何か到達した
// databuflen = USB0_EP1S_bit.bSIZE; // サイズを引き受けて
// for (c=0; c<databuflen; c++) {
// if (!(c & 1))
// databuf[c] = *pUSB0_EP1DTL;
// else databuf[c] = *pUSB0_EP1DTH;
// }
usb_cdc_gets();
USB0_EP1S_bit.bDRQ = 0;
dummy = USB0_EP1C;
}
if (USB0_EP2S_bit.bDRQ) {
// databuflen = StrLength(xfunc_out);
// if (databuflen) {
// for (c=0; c<databuflen; c++) {
// if (!(c & 1))
// *pUSB0_EP2DTL = databuf[c];
// else
// *pUSB0_EP2DTH = databuf[c];
// }
// databuflen = 0;
// xputc(0x42); // debug
// }
USB0_EP2S_bit.bDRQ = 0;
dummy = USB0_EP2C;
}
}
これで、仮想COMポートは動くようになりましたが、CQ誌のDVDのベンダ純正USBホストプログラムと同時に動かすことができず、CQ誌のコードを使うことを断念しました。
何か手掛かりはないかと、spansionのサイトを調べているうちに<a href="http://www.spansion.com/Products/microcontrollers/Pages/tool-detail-spansion_usb_wizard.aspx">SPANSION USB WIZARDというツールがあることがわかり、結果的にこのツールが吐いたコードを使うことで、USBホストと仮想COMポートの両方を同時に動かすことができました。
このUSB WIZARDには、CQ FM3のボードに指定もあり、CPUの種類、タイプなどもコードに反映してくれます。また、ファイルシステムとして、elm-chanさんのFatFsも簡単にインプリメントしてくれます。
ただ、最初はSpansion CMSIS / L3 – Low Level Libraryを使ったコードにしていましたが、なぜか動きませんでした。L3をあきらめて、使わないコードにしたところ、無事USBメモリのアクセスLEDが点滅、ホットしました。
さらに、Fujitsu Microelectronics Europeが公開している
F²MC-16LX FAMILY 16-BIT MICROCONTROLLER MB96330のアプリケーションノートのmenu.cを参考にして、メニュー形式でUSBメモリのフォルダ操作、ファイルの読み書きができるようになりました。

ここまで、FM3をいじってきましたが、smartSDRのコントローラとしてラズベリー・パイのようなCPUボードの方が楽なのかなとも思えてきました。
Eclipseで以下のようなエラーが出たときの対処のメモ(正解かどうかはわかりませんが、GDBもちゃんと使えます)

