USB HOSTを試したくなりいろ調べてみた。PICでは24系を使ったページが多く まだPIC32MXを使った例はかなり少ないようである。 これはPIC24に比べて32の販売はまだ日が浅い事と、ライブラリのサンプルソースが XC32対応がされていない事が一員であるかもしれない。 また秋月で販売されているPIC32MXは容量が少ないタイプである事も原因かもしれない。
XC32はgccベースなのだが、無償版は最適化が出来ないようで、試しにライブラリの "USB Host - HID - Mouse"をコンパイルしてサイズを確認してみた。
bash-3.2$ mips-elf-size MPLAB.X.production.elf text data bss dec hex filename 60664 8 884 61556 f074 MPLAB.X.production.elf
32ではリンクできず64でもきわどく収まっている感じだ。この環境で何か作ろうと するのであれば128のタイプを使うのが良いだろう。
今時コンパイラーで金をとるビジネスモデルはどうなんだろうか?秋葉原で手に入る USBが付いた32Bit DIPはPIC32MXだけでだと思うので、最適化が出来るコンパイラーが 無償であればもっと活用されるのではないかと思うのだが。
PinguinoというArduinoと似た開発環境があり、この配布物にPIC32のgccが含まれていて こちらは最適化が通常通り利用できる。またmips16というインストラクションにも 対応しているようだ。データシートにはmips16なインストラクションを使うと40% のコードサイズの削減が可能と書ある。
MicrochipのUSB HOSTスタックをPinguino対応された方がいて、 このソース をどうにか手元の環境でビルドする事ができた。環境は microchip_solutions_v2013-06-15とpinguinoX.4-rev959とXC 1.20になる。 Makefileをmacで使えるようにした事とエラーになるのでusb_host.cで usb_hal_local.hをincludeしないようにして usb_host_local.hもローカルにコピーして、usb_hal_local.hを外し、 uart1.cのANSELCをコメントアウトした。このバイナリを確認すると、
bash-3.2$ mips-elf-size main32.elf text data bss dec hex filename 22372 2136 2720 27228 6a5c main32.elf
となって秋月の、PIC32MX220F032Bにも入りそうである。ところが、このhexをMPLABXで
PicKit3で焼いたところ動かない。どうも上のhexは論理アドレス(9d000000)の構成に
なっていて、通常のhexは物理アドレス(1d000000)な為ではないかと思われる。困った。。。
ちなみに-mips16オプションを付けないでmakeするとリンクできません。
ld: main32.elf section `.data' will not fit in region `kseg0_program_mem' ld: region `kseg0_program_mem' overflowed by 896 bytes
-Osを外してもリンクできない。
ld: address 0x9d00db08 of main32.elf section `.text' is not within region `kseg0_program_mem' ld: region `kseg0_program_mem' overflowed by 26080 bytes
pic32progのbitbang対応
のコードを試したがうまくいかず、
本家のソースで2232のmpsse
を試したところ、デバイスが認識できた。接続は以下のようにおこなった。
FT2232ピン | JTAG | PIC32MX220F032 | Pinguino |
ACBUS0 | TCK | 17 | D22 |
ACBUS1 | TDI | 16 | D8 |
ACBUS2 | TDO | 18 | D21 |
ACBUS3 | TMS | 14 | D11 |
ACBUS7 | RESET | 1 | MCRL |
bash-3.2$ ./pic32prog Programmer for Microchip PIC32 microcontrollers, Version 1.91M Copyright: (C) 2011-2013 Serge Vakulenko Adapter: Dangerous Prototypes Bus Blaster Processor: MX220F032B (id 04A00053) Flash memory: 32 kbytes Boot memory: 3 kbytes
プログラミングについては61145g.pdfというドキュメントに詳細がある。 いろいろ試して、結局adapter-mpsse.cを修正してmpsseのjtag処理速度を500KHzから 100KHzに変更したところ書き込みに成功した。が、何度か試している動いたり動かなか ったりしている。リセットを押しながらコマンドを動かすと、Eraseまで実行されて止 まってしまい、もう一度コマンドを実行すると正常に書かれる。
bash-3.2$ ./pic32prog ../usbhost/main32.hex Programmer for Microchip PIC32 microcontrollers, Version 1.91M Copyright: (C) 2011-2013 Serge Vakulenko Adapter: Dangerous Prototypes Bus Blaster Processor: MX220F032B Flash memory: 32 kbytes Boot memory: 3 kbytes Data: 24508 bytes Erase: done Program flash: ................................................................. ................................................................................ ################################################ done Program boot: ######## done Verify flash: ................................................................. ................................................................................ ################################################ done Verify boot: ######## done Rate: 3189 bytes per second
pic32progはそれほど古いコードでもないのにlibusbの0.1系で書かれている。 そもそもFTのライブラリを使っていないのはなにかわけがあるのだろうか。 urjtagでも見てみた。リセットを押しながら試すと以下のようにCPUのIDが 表示されます。
jtag> detect IR length: 5 Chain length: 1 Device Id: 00000100101000000000000001010011 (0x0000000004A00053) Unknown manufacturer!
昔、自分がFT用に移植した wrt54g.cでも認識できた。JTAGの処理をFTのmpsseで書いたのだが、今見るとなにが なんだかさっぱりわからない。^ ^;
ところが手持ちのキーボードで試したところ残念な結果に。
***** Microchip Explorer USB Keyboard Host Demo ***** Device Detached ***** USB Error - hubs are not supported *****HUB対応したソースが見つかったが未確認。 usbhost_mouseの方も試してみた。
***** Microchip Explorer USB MOuse Host Demo ***** HID: Raw Report 00-FD-00-00- Left Bt : 00 Right Bt : 00 X-Axis : 00 Y-Axis : 00
PIC24とPIC32にはEEPROMが付いていないので、不揮発なデータはFlashに保存して おく必要がある。PIC24の場合は以下のようなコードになるようだ。
NVMCON=0x4042; TBLPAG=((PROG_ADDR1 & 0x7f0000)>>16); addrOffset=(PROG_ADDR1 & 0x00ffff); __builtin_tblwtl(addrOffset,0x0000); asm("DISI #5"); __builtin_write_NVM(); //store BD_address of PC in program memory // (memory addresses are PROG_ADDR1 and PROG_ADDR2 ) NVMCON=0x4003; TBLPAG=((PROG_ADDR1 & 0x7f0000)>>16); addrOffset=(PROG_ADDR1 & 0x00ffff); asm("tblwtl.b %1, [%0]": "=r"(addrOffset) : "d"(buf1[8]));
PIC32についてはxc32に入っているライブラリファイルで実装できるようだ。 ファイルは/Applications/microchip/xc32/v1.20/pic32-libs/peripheral/nvm/source の下にある。使い方の説明はMicrochipのドキュメントAN1543にある。
PIC32MXでCambridge Silicon Radio Ltd.の4.0LEのUSBドングルを使って辻見さんの LEのスタックを動かしてみたがうまく動かない。。。
***** USB Custom Demo App Initialized ***** GEN: USB Generic Client Initalized: flags=0x00 address=1 VID=0x0A12 PID=0x0001 Generic demo device attached - event, deviceAddress=1 HCI_CMD_RESET: 03 0C 00 HCI_CMD_RESET: 0E 04 01 03 0C 00 HCI_CMD_READ_BD_ADDR: 09 10 00 HCI_CMD_READ_BD_ADDR: 0E 0A 01 09 10 00 0D 71 DA 7D 1A 00 HCI_CMD_MASK: 01 0C 08 2F FF FF FF FF FF BF 3D HCI_CMD_MASK: 0E 04 01 01 0C 00 LE_SET_ADVERTISING_DATA: 08 20 20 13 02 01 05 03 03 12 18 03 19 C0 03 07 09 59 5 4 4B 2D 4C 45 00 00 00 00 00 00 00 00 00 00 00 00 LE_SET_ADVERTISING_DATA_COMPLITE: 0E 04 01 08 20 00 LE_SET_ADVERTISING_PARAMETERS: 06 20 0F 00 01 00 01 00 00 00 00 00 00 00 00 00 0 7 00 LE_SET_ADVERTISING_PARAMETERS_COMPLITE: 0E 04 01 06 20 00 LE_SET_ADVERTISING_ENABLE: 0A 20 01 01 LE_SET_ADVERTISING_ENABLE_COMPLETE: 0E 04 01 0A 20 00 LE_CONNECTION_COMPLITE_EVENT: 3E 13 01 00 45 00 01 01 1F 70 D8 12 01 4A 18 00 00 00 48 00 05 ACL Read: 45 20 07 00 03 00 04 00 02 87 00 ATT_EXCHANGE_MTU_REQUEST: 45 20 07 00 03 00 04 00 03 87 00 ACL Read: 45 20 0B 00 07 00 04 00 10 01 00 FF FF 00 28 ATT_READ_BY_GROUP_TYPE_REQUEST: 45 20 12 00 0E 00 04 00 11 06 01 00 05 00 00 18 06 00 09 00 0F 18 ACL Read: 45 20 0B 00 07 00 04 00 10 0A 00 FF FF 00 28 ATT_READ_BY_GROUP_TYPE_REQUEST: 45 20 09 00 05 00 04 00 01 10 01 00 0A ACL Read: 45 20 0B 00 07 00 04 00 08 01 00 05 00 00 2A HCI: 13 05 01 45 00 01 00 ATT_READ_BY_TYPE_REQUEST: 45 20 0E 00 0A 00 04 00 09 08 03 00 59 54 4B 2D 4C 45 ACL Read: 45 20 0B 00 07 00 04 00 08 04 00 05 00 00 2A ATT_READ_BY_TYPE_REQUEST: 45 20 09 00 05 00 04 00 01 08 1A 00 0A ACL Read: 45 20 0B 00 07 00 04 00 08 06 00 09 00 03 28 ATT_READ_BY_TYPE_REQUEST: 45 20 09 00 05 00 04 00 09 03 07 00 12 ACL Read: 45 20 0B 00 07 00 04 00 08 08 00 09 00 03 28 ATT_READ_BY_TYPE_REQUEST: 45 20 09 00 05 00 04 00 01 08 1A 00 0A
2014/04/03からフラッシュが64Kと128Kのチップの取り扱いが秋月で始まった。BT スタックで大きい物は32Kでは厳しかったので、とっても嬉しい。DigiKeyで購入 しようかずっと考えていたのだが、秋月の価格はDigiKeyよりも安く散財せずに よかった。
PIC32MXのフラッシュをMacで焼く方法をちょっと整理してみる。
pcm1723さんのライター | ICSP | PIC32UBL | シリアル接続でICSPするライター。LPC1114FN28/102 版、NUC120LE3AN 版、 ATmega328P/168/88 版があるようです。PIC32UBLはWindows用の純正ツールで Mac版を作った人がいるような情報がありますが試していません。 |
PICKit2 | ICSP | pic32prog | Cloneを作ってみたが、pk2cmdでPIC18Fには書き込めるがなぜか、pic32progで PIC32MXには書き込めない。いろいろ確認したがよくわからないので放置 |
PICKit2 | ICSP | pk2cmd | MicroChipがサポート外で公開されていた、Mac用のコマンドラインツール。
|
PICKit2 | ICSP | pic32に対応してないので焼けません。pk2cmdは一部PIC32MXをサポートしている のにMPLAB Xは全くサポートされていないようだ。 | |
PICKit2 Clone | ICSP | pic32prog | PIC18F2550で作れるようです。ネットで画像検索するといろいろな回路図が でてくる。ファームもダウンロードできるようですが、ライセンスは大丈夫なのかな。 ファームはV2.32というファームが最終バージョンです。こちらはたまたPICKit3を 持っていたので作れたが、ニワトリと卵の問題があります。 |
PICKit3 | ICSP | MPLAB X | Pinguinoの環境で作ったhexを焼いてみたがアドレスの問題かうまく動かなかった。 |
PICKit3 with scripting firmware | ICSP | pic32prog | PICkit 3 Programmer App and Scripting Tool v3.10は非推奨になっているようだ。 |
JTAG Key系 | JTAG | pic32prog | FT2232を使ったライター。製品は試していないがFT2232直結だとすこぶる不安定。 バッファ入れないとダメなのかな。 |
FT232 | JTAG | pic32prog改 | pic32progのJTAG Key系サポートはMPSSEによるものだがBitBangで使えるようにした pic32progをすzのAVR研究さんが公開されている。 |
USB-BlasterやClone | JTAG | OpenOCD? | ALTERAのJTAGツールだが誰か使えるようにしてないかな? PIC18F14K50を使ったCloneが あり最も安いJTAGツールかも。OpenOCDで焼けるのかもしれないがOpenOCDは難しそう なので試していない。 |
opendous-jtag | JTAG | OpenOCD? | at90usb162をJTAGモジュールのよう。 |
ByteBlaster(自作) | JTAG | OpenOCD? | USB-パラレル変換では使えないので、Macでは使えないのだが。 そもそもパラレルポートがついているPC自体ほぼ絶滅しちゃったけど。。。 |
BootCampで入れているWindows 7でツールをインストールしてPICKit3 with scripting firmwareを試してみた。このツールは終了時にエラーが出ていた。scriptingモードに してpic32progを試してみたところ、下記のように問題なく使えた。ただVerifyが遅く FTの10倍くらい時間がかかってしまっている。試した後にとりあえずmplabモードに 戻してみたが、そんな事をやっている途中で、関係ないだろうが10ポートのUSB HUBの 4ポートが使えなくなってしまった。 T T
bash-3.2$ pic32prog main32.hex Programmer for Microchip PIC32 microcontrollers, Version 1.91M Copyright: (C) 2011-2013 Serge Vakulenko Adapter: PICkit3 Version 2.0.5 Processor: MX220F032B Flash memory: 32 kbytes Boot memory: 3 kbytes Data: 30092 bytes Erase: done Program flash: ................................................................. ................................................................................ ................................................................................ ########################################################### done Program boot: ######## done Verify flash: ................................................................. ................................................................................ ................................................................................ ########################################################### done Verify boot: ######## done Rate: 474 bytes per second
いろいろ調べていてわかったのだがPIC32にはMX1,2系とMX3,4系それと昨年発表された MZシリーズがあるようだ。pk2cmdはMX3,4のサポートだけのようだ。MX1,2系が規模 が小さくMZが大きいようだ。
btstackをビルドしていたところリンク時に以下のようなエラーメッセージが出る。
/Users/hiroki/Develop/Device/pinguinoX.4-rev959/macosx/p32/bin/../lib/gcc/mips-e lf/4.6.2/../../../../mips-elf/lib/libc.a(lib_a-writer.o): In function `_write_r' : (.text+0x1c): undefined reference to `write' /Users/hiroki/Develop/Device/pinguinoX.4-rev959/macosx/p32/bin/../lib/gcc/mips-e lf/4.6.2/../../../../mips-elf/lib/libc.a(lib_a-closer.o): In function `_close_r' : (.text+0x14): undefined reference to `close' /Users/hiroki/Develop/Device/pinguinoX.4-rev959/macosx/p32/bin/../lib/gcc/mips-e lf/4.6.2/../../../../mips-elf/lib/libc.a(lib_a-fstatr.o): In function `_fstat_r' : (.text+0x18): undefined reference to `fstat' /Users/hiroki/Develop/Device/pinguinoX.4-rev959/macosx/p32/bin/../lib/gcc/mips-e lf/4.6.2/../../../../mips-elf/lib/libc.a(lib_a-isattyr.o): In function `_isatty_ r': (.text+0x14): undefined reference to `isatty' /Users/hiroki/Develop/Device/pinguinoX.4-rev959/macosx/p32/bin/../lib/gcc/mips-e lf/4.6.2/../../../../mips-elf/lib/libc.a(lib_a-lseekr.o): In function `_lseek_r' : (.text+0x1c): undefined reference to `lseek' /Users/hiroki/Develop/Device/pinguinoX.4-rev959/macosx/p32/bin/../lib/gcc/mips-e lf/4.6.2/../../../../mips-elf/lib/libc.a(lib_a-readr.o): In function `_read_r': (.text+0x1c): undefined reference to `read' collect2: ld returned 1 exit status make: *** [all] Error 1
いろいろ調べたらatt_server.cのatt_server_init()にある、以下の処理に起因してい ることがわかった。
sm_register_packet_handler(att_event_packet_handler); att_dispatch_register_server(att_packet_handler);
関数ポインタをinclude/btstack/btstack.hで定義されているbtstack_packet_handler_t を渡しているのだがなんでだろう。。。
何の事ははくて、引数で渡している、関数の中でprintfを使っていたからだった。
btstackを新しいマイコンに移植する際にはhci_transportをUSBインターフェースに対応 させる事とhci_cpuでいくつかの関数をサポートする必要がある。
とりあえず128Kで十分だと思うが、なにか試したい物が出てきた時にすぐに使えるよう にオプティマイズさんのPIC32MX795F512L のキットを購入してみた。組み立て済みのものも売っていたが貧乏性なのでちょっと 安いキットを購入してみた。表面実装の部品のキットだが、パターンも広く思ったより も簡単であった。ランニングエレクトロニクスさんにもPIC32MX695F512Hを 使ったモジュールがあるが 小さいがちょっとだけ高い。
Macのビデオを調べていたら UVCカメラドライバーの製作 PIC24F/PIC32MX というページが見つかった。時間が出来たら試してみたい。
platformioというツールでESP8266やMSP430のビルドをおこなってうまくいっている ので、PIC32MXも試してみたが、toolchain-microchippic32 @ ~1.40803.0がないという エラーで使えない。darwin_i386用のパッケージが用意されていないらしい。
ケンケンのホームページ面白そう。手持ちの部品で作れそうなんで
いつか作ってみたいな。