GPS/GNSSモジュールを試用する11 -GtopFlashToolの謎に迫る-
今回の記事はSTM32の内容にもがっちり絡んでくるのでカテゴリどうしようかと悩み
ましたが結局GNSS関連としました。
前回、Gms-g9のファーム更新の際にGtopFlashToolなるものを使用してUART経由で
ファームウエアのアップデートを行っております。その時にGPSロガーとして使用して
いるSTM32Primer2に仕込んだUSB-CDCからではうまくアップデートを行うことが出来
なかったことを述べておりました。今回時間が出来てようやく重い腰を上げて調べる
ことになったのですがそこには意外な結果が待ち受けていたのでした。
●COMポートが開かない??
Lチカから先になかなか進むことができないねむいさんが唯一実用レベルで作った
STM32Primer2ベースのGPSロガーはSTM32のUSBデバイス機能を利用してGPS/GNSS
モジュールのNMEAセンテンスの記録の他にUSB-CDCとUSB-MSCを実現しております。
USB-CDC機能は主にGNSSモジュールのAGPS等の機能設定を仮想COMポートを開いて
シリアル通信の形で、USB-MSC機能はSDカードに記録したデータをPC上から簡単にTXT
ファイル形式で参照できるように出来ております。
で、GlobalTop GPS Viewer(v1.8)からでは上記のとおり問題なくUSB-CDCの仮想COMポ
ートを開きバリバリ通信できるのですが…
なぜか同じGtopが提供しているGtopFlashToolからはCOMポートが開けませんみたいな
エラーを吐いてアップデート作業ができません。
一方はちゃんとCOM開けてもう一方は開けないとかイミフだったのですが検索してい
るとそれっぽい質問が見つかりました。
Windows環境下ではUSB-CDCをなし得るためにusbser.sysを利用するのですがinfファイル
は自前で作らないといけません。MSDNの情報を基にinfファイルをいじってインストール
してみましたが…やっぱりダメorz
>http://support.microsoft.com/kb/837637/ja
> ユニバーサル シリアル バス (USB) モデムの .inf ファイルは Usbser.sys
> ドライバーを使用して両方および Usbser.sys ドライバー .inf ファイルからを
> 直接参照できます。ただし、お勧めしませんこの。
人間の言葉しゃべれこの。
もしかしてGtopFlashToolが何らかのUSBの通信レベルで何かがコケて仮想COMポート
が見えて無いのかと思い埃をかぶっていた秋月ロジアナを用いてUSBのプロトコルを
解析してみたのですがUSBの通信上ではSTALLした箇所が見つけられませんでした。
↑USBの解析できるまでのロジアナの設定で苦労しましたorz
ちょっと困り果ててしまいましたが鴨川を散歩してる最中にGPS Viewerから仮想COM
開けてたのを思い出してひょっとして何らかの固有の文字列をやり取りしてCOM開い
た判定してるのかと思ってUARTの通信を見たらなんと仮想COM開けてて信号のやり取
りまで出来ているようでした!ちゃんと開けてるじゃないですかー!
しかも制御文字もちゃんと送信されてるのでUART周りは全く問題なしと判断しました。
そもそも糞詰まり対策もやってダブルバッファリングまでしてるのでSTM32のUARTレ
ベルに関する点は問題はないです。となるとやっぱりもっと上の階層の問題ですか。
●別の仮想COMではどうなのか
依然述べたとおりFT232Rに代表される出来合いのFTDIのUSBシリアル変換ICなら全く
問題はなし、自作のUSB-CDCが怪しいと思い別の物を試してみました。
1.STマイクロ謹製のSTM32F1のUSB-CDCのサンプル(STM32F103/107共)
->できない
※私のSTM32Primer2のUSB-CDCはこれがベースです。
2. LPC2388のLPCUSBのUSB-CDC
->できない
3. STマイクロ謹製のSTM32F1/F2/F4用のUSB-CDCサンプル
->できるじゃない!
4. MBED CMSIS-DAPのVCOM(FRDM-KL25Zを使用)
->できるじゃない!
…ん?それじゃSTM32F1系のUSB機能がやばいのかしら???
5.Versaloon(STM32Primer2と同じSTM32F1系)のVCOM
->できるじゃない! orz
※VersaloonのUSBのソフトウエア側は独自実装
つまりSTM32のファームウエアの問題ですかorz
でもいろいろ試しててGtopFlashToolのエラーの出方の違いに気づきました!
先にGNSSモジュールをなにも繋がずにフラッシュ書き込みを実行しようとすると
駄目な方は繋いでも繋いでなくても"Fail to open the COM Port"になってて行ける
方はとりあえずCOMポートは開き何か読みに行ってるようで"DL_HANDLE error code"
になっていました。
●SEND_BREAK
というわけでSTM32Primer2のRlinkはOpenOCDでデバッグできないのでそれとソフト的に
等価なSTM32F107VCTのUSB-CDCを用いて上の"Fail to open the COM Port"になる
瞬間をinsightで捉えました…ら一瞬で原因が分かったorz
"Fail to open the COM Port"になる直前にVirtual_Com_Port_NoData_Setup()という
関数を通過していて引数に0x23が来てエラーを返していたことが判明。
この関数はホストから送られてくるUSB-CDC固有のリクエストを扱う関数のようで
このページによれば0x23はSEND_BREAKに相当するものであるとのこと。
STM32F1USB-CDCのサンプルでは未サポートとしてエラーを返していたためGtop Tool
はSEND_BREAKを実行できないCOMポートと判断して"COMポート開けません"とエラー
を返していたことが判明。
ってわけでSEND_BREAKのハンドルを追加してSEND_BREAKのリクエストが送られて
きたらとにかく"USB_SUCCESS"を返すようにしました。
おおっ!
GPSTr@ckerのUSB-CDCでもGms-g9のファーム書き換えできたじゃない♥
GPSViewerではSEND_BREAKは一切送信されていたなかったのでエラーにならなかった
(=COMポートを開くことができた)ことが理解できました。
ところでSEND_BREAKって何か?ともっと調べてみるとUSB-CDC-ACMの規格で定められ
たものだようで文字通り"BREAK信号を送信せよ"という意味です。
そしてBREAKって何というとRS-232Cの規格で定められたものでTxDをスペース(論理L)
に固定する行為を指すとのこと。RS-232Cの電圧レベルでいうと論理が逆転するので、
一定時間+15Vに固定することになります。
そしてGTopFlashToolはなぜわざわざSEND_BREAKを送信していたかということですが、
それはMTK系のGNSSモジュールのファームウエアアップデートの方法にあります。
MTK系モジュールはUART経由で特定のコマンドを受け取るとセルフアップデートモード
に推移しますがその過程で現在通信しているボーレートからセルフアップデート通信
用に自動的にボーレートが上がります。具体的には115200bpsに推移します。このとき
GtopFlashToolからCOMポート経由でBREAK信号が送られているようです。
9600bpsから急にレートの高い115200bpsに上がって間違ったデータとして受け取られ
ないように一定期間データの送信を止める措置を行っているわけです。
というところでいろんなマイコンのUSB-CDCの実装を見ているとSEND_BREAKに対する
取り扱いは現在ではごくまれにしか使われないためかまともにBREAK状態になる実装は
めったになく、適当にOKで返してるのが殆どです。逆に言うとSTM32F1系のUSB-CDCの
サンプルはちゃんと"unsupported"で返してたからマシだったのかも!?
そしてGitHubのGPSTr@ckerは既にGtopFlashToolでもちゃんとファームの書き換えが
出来るように修正済です。さらにFatFs0.10aに更新し今更ですがUSBライブラリもF1系
最終のV4.0.0準拠にして益々最強に強めております!
●あのお方
今回いろいろ調べて最終的に気付いたのですがUSBのファームウエアがらみで困って
いる人のもとに颯爽と現れ強力な解決策を提示して爽やかに去っていくtsuneo氏が
SEND_BREAKにもやはり言及されていました。私の中ではFatファイルシステムにChaN
氏が居ればUSBにはtsuneo氏が居るといった感じです。
そういう私は2014年の今でもUSBアレルギーが全く克服してないのでこれを機会に
今年はUSBを自分の物にすることをテーマに進めていきたいと思います!
連絡・質問・免責は↑のリンクを
↓SNSもやってます↓
powered by まめわざ- ARM/STM32 (101)
- OpenOCD (26)
- ARM/NxP (34)
- ARM/Cypress (5)
- ARM/Others (3)
- ARM/Raspi (1)
- AVR (11)
- FPGA (4)
- GPS/GNSS (18)
- MISC (68)
- STM8 (1)
- Wirelessなアレ (16)
- ブラウザベンチマーク (28)
- 日本の自然歩道 (21)
- いろいろ試す51
⇒ ねむい (06/26) - いろいろ試す51
⇒ ひかわ (06/10) - STM32G0使ってみる4 -1wireデバイスをいろいろ使ってみる-
⇒ ねむい (12/14) - STM32G0使ってみる4 -1wireデバイスをいろいろ使ってみる-
⇒ ひかわ (12/05) - 大緊急事案!!!1!Raspberry Pi Picoはぢめました!!1!!1
⇒ 竹本浩 (08/14) - 大緊急事案!!!1!Raspberry Pi Picoはぢめました!!1!!1
⇒ ねむい (08/12) - 大緊急事案!!!1!Raspberry Pi Picoはぢめました!!1!!1
⇒ 竹本浩 (08/08) - 大緊急事案!!!1!Raspberry Pi Picoはぢめました!!1!!1
⇒ ねむい (08/06) - 大緊急事案!!!1!Raspberry Pi Picoはぢめました!!1!!1
⇒ 竹本浩 (08/01) - 中国自然歩道を往く -GoGoWest! 岡山を突っ走る!-
⇒ ねむい (07/22)
- July 2022 (1)
- June 2022 (1)
- May 2022 (1)
- April 2022 (1)
- March 2022 (1)
- February 2022 (1)
- January 2022 (1)
- December 2021 (2)
- November 2021 (2)
- October 2021 (1)
- September 2021 (1)
- August 2021 (1)
- July 2021 (1)
- June 2021 (1)
- May 2021 (1)
- April 2021 (1)
- March 2021 (1)
- February 2021 (1)
- January 2021 (1)
- December 2020 (3)
- November 2020 (1)
- October 2020 (1)
- September 2020 (1)
- August 2020 (1)
- July 2020 (1)
- June 2020 (2)
- May 2020 (1)
- April 2020 (1)
- March 2020 (1)
- February 2020 (1)
- January 2020 (1)
- December 2019 (3)
- November 2019 (1)
- October 2019 (1)
- September 2019 (2)
- August 2019 (1)
- July 2019 (1)
- June 2019 (1)
- May 2019 (1)
- April 2019 (1)
- March 2019 (1)
- February 2019 (1)
- January 2019 (1)
- December 2018 (3)
- November 2018 (2)
- October 2018 (1)
- September 2018 (1)
- August 2018 (1)
- July 2018 (1)
- June 2018 (1)
- May 2018 (1)
- April 2018 (2)
- March 2018 (1)
- February 2018 (1)
- January 2018 (1)
- December 2017 (2)
- November 2017 (2)
- October 2017 (1)
- September 2017 (1)
- August 2017 (1)
- July 2017 (1)
- June 2017 (1)
- May 2017 (1)
- April 2017 (1)
- March 2017 (2)
- February 2017 (2)
- January 2017 (2)
- December 2016 (7)
- November 2016 (2)
- October 2016 (2)
- September 2016 (1)
- August 2016 (1)
- July 2016 (1)
- June 2016 (1)
- May 2016 (2)
- April 2016 (1)
- March 2016 (2)
- February 2016 (1)
- January 2016 (1)
- December 2015 (3)
- November 2015 (1)
- October 2015 (3)
- September 2015 (2)
- August 2015 (2)
- July 2015 (3)
- June 2015 (3)
- May 2015 (4)
- April 2015 (2)
- March 2015 (4)
- February 2015 (1)
- January 2015 (3)
- December 2014 (3)
- November 2014 (2)
- October 2014 (1)
- September 2014 (2)
- August 2014 (2)
- July 2014 (3)
- June 2014 (2)
- May 2014 (1)
- April 2014 (1)
- March 2014 (4)
- February 2014 (4)
- January 2014 (3)
- December 2013 (5)
- November 2013 (4)
- October 2013 (3)
- September 2013 (2)
- August 2013 (2)
- July 2013 (2)
- June 2013 (3)
- May 2013 (2)
- April 2013 (2)
- March 2013 (2)
- February 2013 (2)
- January 2013 (3)
- December 2012 (4)
- November 2012 (2)
- October 2012 (2)
- September 2012 (4)
- August 2012 (1)
- July 2012 (3)
- June 2012 (2)
- May 2012 (3)
- April 2012 (3)
- March 2012 (2)
- February 2012 (3)
- January 2012 (3)
- December 2011 (5)
- November 2011 (3)
- October 2011 (2)
- September 2011 (2)
- August 2011 (2)
- July 2011 (2)
- June 2011 (2)
- May 2011 (2)
- April 2011 (2)
- March 2011 (2)
- February 2011 (2)
- January 2011 (3)
- December 2010 (7)
- November 2010 (1)
- October 2010 (1)
- September 2010 (1)
- August 2010 (3)
- July 2010 (4)
- May 2010 (1)
- April 2010 (2)
- March 2010 (2)
- February 2010 (2)
- January 2010 (3)
- December 2009 (3)
- November 2009 (8)
- October 2009 (7)
- September 2009 (5)
- August 2009 (4)
- July 2009 (6)
- June 2009 (7)
- May 2009 (14)
- January 1970 (1)
Copyright(C) B-Blog project All rights reserved.