2012年06月18日

Arduino Mega ADKで「Error: OSCOKIRQ failed to assert」発生の対策を打つ

Arduino Mega ADKで遊んでいて、電源投入直後に以下のようなログが出て動作しない現象に数回出くわしたので、なんでかな〜と思いつつ、その内見かけなくなってたので忘れていたのですが、今日出たので少し調べてみました。

ログ内容
Error: OSCOKIRQ failed to assert

Arduinoスケッチは、以下のようなシンプルにテスト用に書いたスケッチ。Arduino 1.0.1と、先日Googleからリリースされたばかりの新しいADKのパッケージ「adk_release_20120606」を使用しています。

#include <Max3421e.h>
#include <Usb.h>
#include <AndroidAccessory.h>

AndroidAccessory acc("Yasuhiro ISHII",
"dummyADK",
"",
"1.0",
"",
"0000000012345678");

void setup()
{
  Serial.begin(115200);
  acc.powerOn();
}

void loop()
{
  byte buffer[64];
  if (acc.isConnected()) {
    acc.read(buffer, 1, 1);
  }
}

この「Error: OSCOKIRQ failed to assert」ってログは、USB Host shieldのライブラリのMAX3421E::powerOn()の以下の部分で出力されています。

/* MAX3421E initialization after power-on   */
void MAX3421E::powerOn()
{
    /* Configure full-duplex SPI, interrupt pulse   */
    regWr( rPINCTL,( bmFDUPSPI + bmINTLEVEL + bmGPXB ));    //Full-duplex SPI, level interrupt, GPX
    if( reset() == false ) {                                //stop/start the oscillator
        Serial.println("Error: OSCOKIRQ failed to assert");
    }

でもって、MAX3421E::reset()は、こんな感じ。rUSBIRQ.bmOSCOKIRQが立つまたは256回タイムアウトするまで待ちます。

/* reset MAX3421E using chip reset bit. SPI configuration is not affected   */
boolean MAX3421E::reset()
{
  byte tmp = 0;
    regWr( rUSBCTL, bmCHIPRES );                        //Chip reset. This stops the oscillator
    regWr( rUSBCTL, 0x00 );                             //Remove the reset
    while(!(regRd( rUSBIRQ ) & bmOSCOKIRQ )) {          //wait until the PLL is stable
        tmp++;                                          //timeout after 256 attempts
        if( tmp == 0 ) {
            return( false );
        }
    }
    return( true );
}

で、ここの処理のお手本を確認するため、Maxim社が公開してる、Max3421e EVボード用のサンプルコードで見ると、無限に安定待ちビットが立つまで待つようです。データシートを読んでみたのですが、安定待ちに必要な時間を見つけることができませんでした。書いてないということはないと思うので、見落としてるかも、です。

というわけで、では上記ループ何回待ってたら安定待ち出来てたのか、適当ですが、以下のような改変をしてみてみました。
/* reset MAX3421E using chip reset bit. SPI configuration is not affected   */
boolean MAX3421E::reset()
{
//  byte tmp = 0;
short tmp=0; // 変更yishii
    regWr( rUSBCTL, bmCHIPRES );                        //Chip reset. This stops the oscillator
    regWr( rUSBCTL, 0x00 );                             //Remove the reset
    while(!(regRd( rUSBIRQ ) & bmOSCOKIRQ )) {          //wait until the PLL is stable
        tmp++;                                          //timeout after 256 attempts
        if( tmp == 0 ) {
            return( false );
        }
    }
Seria.print("pll stabilized");//変更yishii
Serial.println(tmp);//変更yishii
    return( true );
}
すると、だいたい350回くらいのところでOSCOKビットが立ってました。
というわけで、もちろん上記のようなMAX3421E::resetに改造を加えても回避可能ですが、ライブラリの派生版のせいでいろいろスケッチに互換性を失うのも嫌なので、ここはシンプルに、スケッチ側でpowerOnを呼び出すタイミングを遅らせたいと思います。
MAX3421Eクラスのコンストラクタが実行されてから、MAX3421E::resetで安定待ちするまでに時間待ちをはさめば良いので、以下のようにしました。コンストラクタが実行されてから、実際にsetupが実行されるまでの時間は、処理系やArduinoのマイコンのスタートアップ処理に依存するので、こんなことしなくても問題無くUSB Hostの初期化できる環境もあると思いますが・・・。

#include <Max3421e.h>
#include <Usb.h>
#include <AndroidAccessory.h>

AndroidAccessory acc("Yasuhiro ISHII",
"dummyADK",
"",
"1.0",
"",
"0000000012345678");

void setup()
{
  Serial.begin(115200);
  delay(5); // ★5ms遅らす
  acc.powerOn();
}

void loop()
{
  byte buffer[64];
  if (acc.isConnected()) {
    acc.read(buffer, 1, 1);
  }
}

これで認識してくれるようになりました。
簡単なことなのですが、知らないうちは、はまりました。。。

ところで新しいADKのライブラリ見るとArduino IDE1.0対応をメインの改変としていると思います。
でも一部気になる所が、、、
$ diff ADK_release_0512/firmware/arduino_libs/AndroidAccessory/AndroidAccessory.cpp
ADK_release_20120606/arduino_libs/AndroidAccessory/AndroidAccessory.cpp
86,87c86,87
<     if (protocol == 1) {
<         Serial.print("device supports protcol 1\n");
---
>     if (protocol >= 1) {
>         Serial.print("device supports protocol 1 or higher\n");
あれ、もしかして新しいADKのバージョンリリースされるのかな〜??と勘ぐってしまいました。^^;


Arduino Mega ADK
Arduino Mega ADK
posted with amazlet at 12.06.18
スイッチサイエンス
売り上げランキング: 20537
Arduino Leonardo(+Headers)
Arduino Leonardo(+Headers)
posted with amazlet at 13.01.17
GHEO SA
売り上げランキング: 43,094
posted by いしいっち at 15:06| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2012年04月16日

メキシコ・シウダーフアレスに行ってきました

3月末からの約3週間、メキシコの国境の町、シウダー・フアレスに行ってきました。
正直、行く前は複雑な気持ちでした。

と、言うのも「シウダー・フアレス」でWikipedia検索すると、冒頭部に
>近年工業化が著しいが、同時に急速に治安が悪化しており、「戦争地帯を除くと世界で
>最も危険な都市」と言われる[1]。
なんてびっくりする事が書かれています。事実この町では、毎日何十人もの人が殺されていているそうで、銃撃戦は日中にすらあるんだそうです。

外務省の「海外安全ホームページ」にもフアレスは「渡航の是非を検討」などと書かれています。ネットを検索すると目を覆いたくなるような写真がごろごろ、2chでもフアレスに対して、世紀末の町や北斗の拳の世界、などと書かれています。 (まぁ、実は北斗の拳は知らないんですけど^^;)

検索すればするほど恐怖感に包まれますが、躊躇せず検索しまくりました。結構悩みましたが、大いに鼓舞して行くことにしました。もちろん念のため、個人持ちPC等のパスワードとかは解除するなどしました。 万一恐怖体験した時には、それは既にもう帰ってこれない時だろうと思いましたので。

-------------------------------------------------------------------------------------

さて、前置きが長くなりましたが、ここメキシコ・フアレスは前述のとおり国境の町でして、アメリカのテキサス州と接しています。ホテルはテキサス州内エル・パソに用意していただき、毎日越境します。
テキサスとはいえ隣り合わせの町です。正直、最初の数日間はうなされてまともに寝れません。

しかしまぁ、お昼のメキシカンフードはなかなかよかったです。
治安から、外食など出来ないので基本的に滞在先のお弁当でしたけどね。

フアレス・テキサス間は車でして、しかし国境は同乗者は歩いて橋を渡ります。こんな経験はなかなか無いので、これは良かったかも。

border1.jpgborder3.jpgborder2.jpgborder5.jpgborder4.jpg

そうそう、週末に近所のRadioShackに行ったんです。そしたら結構Arduino売ってました。簡単にある程度の電子部品が揃うのは良いと思います。大阪のヨドバシの近くにあるRadioShockもイメージ的にはこんな感じかも。

rs2.jpg

rs1.jpg

しかし、怯えていた町の状況とは裏腹に接するメキシカンな方々には、本当によくしていただきました。
日本でもこんないい人なかなか見ないなというほどで、感動すらしちゃいました。
心配したことは杞憂ではなかったと思います。何事も無くて良かったー。


戻ってきてみて、二度とあんなこわい思いはしたくありませんが、いい経験できたと思います!

ちなみに、El Pasoやメキシコ・フアレスに行かれる場合、スペイン語対応電子辞書をお持ちになることをおすすめいたします!
CASIO Ex-word 電子辞書 スペイン語モデル XD-B7500
カシオ計算機 (2011-02-04)
売り上げランキング: 3734

タグ:メキシコ
posted by いしいっち at 00:57| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2012年02月12日

Galaxy Nexus SC-04Dを海外版4.0.2にしてUSB Host APIを試す

★以下の手順を実施され、ご使用の端末の動作や、ドコモの保証等、期待されない状態になったとしても補償しません。実施は全て、自己責任にてお願いいたします★

2011年12月末に予定されていた、GalaxyNexusのアップデート、当初はどのような内容かわかってませんでしたが、結局その実施は先送りされ、先日再開される直前に、その内容が4.0.2の配信と聞いてかなり、ワクワクしてました。

理由は、USB Host APIの対応が期待されたからです。Android 3.1のユーザーさんにとって、当たり前のHost APIですが、僕はタブレット系の端末をもっていないので、それを使った各種お遊びはお預けだったんです。ADKやMicrobridgeの次はHost APIを試したいと思っていたのです。
2月になり、ドコモから4.0.2の配信が開始され、毎日更新の確認をしましたがなかなか降って来ません。まぁ、経験上、配信が開始されてから、実際に降ってくるのには時間がかかる事が多々あったのでそれは良しとして、その間に以下の記事を見つけてしまいました!

コムギドットネット 「GALAXY NEXUS SC-04D アップデート配信開始」
http://komugi.net/archives/2012/02/11004631
記事には、「テザリングや、USBホスト、マスストレージへの対応は今回含まれておりません。」とあります。えーーーーーーーっっ

もう、海外版の4.0.2正規ROMを焼いてしまうことにしました!手順は簡単です。


http://code.google.com/intl/ja/android/nexus/images.html#yakjuicl53f

上記から、「Factory Images "yakju" for Galaxy Nexus "maguro" (GSM/HSPA+)」の「4.0.2 (ICL53F)」をダウンロードします。
GoogleDL.png

展開すると、以下のようなファイルがあらわれます。


.
└── yakju-icl53f
├── bootloader-maguro-primekk15.img
├── flash-all.sh
├── image-yakju-icl53f.zip
└── radio-maguro-i9250xxkk6.img

で、flash-all.shの内容に従って丁寧にひとつずつ僕は実施しました。その後、端末は海外仕様に!

Screenshot_2012-02-11-16-22-05.png

そして、Host APIもちゃんと使えました!!!
13289768608940.jpg

Micro-BからUSB Aの変換ケーブルは以下を購入しました。
iBUFFALO USB(microB to A)変換アダプター ブラック BSMPC11C01BK
バッファローコクヨサプライ (2011-11-01)
売り上げランキング: 558




@ksksue氏作のFTDI用Host APIデバドラと@titoi2氏作ハードウェア+Forth実行環境 on Microchip PIC24Fでの動作です。

ヤッター!

まぁ、ドコモの今後のアップデートでHost APIに対応したらバックアップROMを戻してそれに書き換えます^^;

もちろん、HIDデバイスも動作しましたよ!
IMG_20120212_012025.jpg


posted by いしいっち at 01:38| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする