ラベル software の投稿を表示しています。 すべての投稿を表示
ラベル software の投稿を表示しています。 すべての投稿を表示

2025年9月2日

単体テストのモックとスタブとドライバー

単体テストのコードを書いていると、モックだとかスタブだとかドライバーだとか、そういう言葉はほとんど出てこない。

出てこないというか、テストしたい関数があって、テストする関数があって、テストしたい関数が呼び出している関数があると、

  • テストをするのに効率的なフレームワークがほしい
  • テスト対象が呼び出している関数が勝手に動くと面倒なので、偽物を作ってテスト目的に合わせて自由に作り替えたい 

というような要望が出てくる。
この要望は自然と湧いてくるので、いちいち名前を付けなくてもなんとかなる。
作業場で「スタブ」しか使っていなかったので、私は今でも曖昧に使っている。


気になったのは、これは誰が用語定義したのだろう?ということだ。
手元にある応用情報2024年のテキストを見てみると「スタブ」と「ドライバ」はあったが「モック」は載っていない。この本によると「スタブ:テストモジュールの下位モジュールの機能をシミュレーションする」「ドライバ:テストモジュールの上位モジュールの機能をシミュレーションする」とあった。
検索で「基本情報 モック」や「応用情報 モック」としてもそれっぽいのは出てこない。

    何でも"モック"と呼んでない?mock, stub, fake, dummy, spyの違い

Jest だと spy ってのがあった。
fff は fake function だ。
ただなんとなく、ライブラリとかでは CMock みたいにモックがよく使われているような気がする。

しかしまあ、定義があろうがなかろうがやりたいことは決まっているのだから、現場では適当に用語を決めて間違った認識をしないように統一しておけばいいんじゃなかろうか。
 

私はどうしようか。
応用情報の本にあった定義だと上か下かしかないので簡単だ。上位モジュールのシミュレーションって、単体テストだとテスト関数がやることじゃないの? あるいはコールバックで呼び出す関数も含まれる?
それさえなければ「スタブ」になる。

シンプルすぎるが、以前の作業場が「スタブ」だけだったのもこの定義から来たんじゃなかろうか。少なくとも間違った定義ではないから、もうそれでいいや。

2019年10月14日

[arm]Armv8-MのTrustZone

nRF9160で気になっていたのが、TrustZoneだ。
Cortex-AのTrustZoneを知らないので比較できないのだが、この記事によるとGCCから扱えるようだ。

https://www.lobaro.com/using-the-armv8-m-trustzone-with-gcc/


Introduction & Motivation

Cortex-M33プロセッサにはARM TrustZoneと呼ばれる機能がある。
この記事では、GNU ARM GCC compilerとCMSE(Cortex M Security Extensions)を使ってTrustZoneついての私見を述べる。

これはARMv8-MならnRF9160じゃなくてもいいし、GCC以外のコンパイラでもいい。

 

Secure & Non Secure CPU Operationg States

今まではThreadモード(通常モード)とHandlerモード(割込みモード)だけだったが、ARMv8-Mになるとsecure / non-secureという属性が加わる。

電源を入れたときはsecureモードで始まる。このときはメモリも周辺機能も全部使える。これは今までのM3やM4などと同じ。

TrustZoneの考え方は、セキュリティ関連のコードやデータをデバイス内の小さな特定領域に隠すということだ。その領域は"secure"と呼ばれ、そうじゃないところは"non-secure"と呼ばれる。メモリ、割込み、周辺機器をsecure/non-secureに分割するのはユーザが決める。電源ON時のコードはその分割をする処理から始めるのが普通だ。nRF9160のコード例(Secure Partition Managerと呼ぶらしい)では、FLASHの256KBをsecureに、768KBをnon-secureに割り当てている。

CPUは実行関係のレジスタ(スタックポインタとSystem Control Block)として2つのバンク(secure/non-secure)を持つ。今のCPU動作がsecureかnon-secureかというのは、どっちのバンクを使っているかということと同じ意味である。バンクのメカニズムはハードウェアで2回実装されている一部の周辺機器(SysTickなど)でも同様です【私:2回(twice)って何??】。secureなプログラムは常にどちら側にもアクセスできる。non-secureなスタックポインタとnon-secureなベクタアドレスの配置を設定した後、secureなブートコードはnon-secureなベクタテーブルの関数ポインタを使用する。そして、CPUはnon-secureなファームウェアとして動作し始める。

non-secureファームウェアは、secureファームウェアの存在を認識してはならない。TrustZoneがない時代と同じように普通に開発して、普通にnon-secureなメモリ領域とリンクするようにする。CPUがnon-secureに動き始めると、security exceptionが発生しない限りsecureなコード、データ、周辺機器にに直接アクセスできなくなる。non-secureコードからsecureな機能にアクセスする唯一の正当な方法は、secure側が提供することになる特別なゲートウェイ/エントリー/veneer機能を使うことである。では、ARM GCCとCMSE(Cortex M Security-Extensions)を使ってやってみよう。

 

Non-secure callable(NSC) memory regions and the secure gateway(SG) ASM instruction

non-secureからsecureな機能を呼び出せるようにするため、secureファームウェアのコードに"Non-secure callable(NSC)"といういくつかの小さなFLASH領域を設定しなくてはならない。nRF9160ではSPU(System Protection Unit。PDFのp.257参照)が担当している。

secureメモリの一部をNSCとして指定することにより、最初のOPコードとしてアセンブラの"SG(Secure Gateway)"命令を呼び出すことで、non-secureから呼び出せないという制限を緩和できる。SG命令を実行すると、プログラムはより制限されたsecureメモリ内にある=NSCではないメモリにあるsecure機能実装に分岐する。このようにしてnon-secureコードからsecure機能を呼び出すことで、まずNSCにジャンプし、続けてsecureメモリ内にある実際の機能にジャンプする。こういう過程を経ることにより、secureメモリへのアクセスは残りのsecureメモリから切り離される。詳しいことはこちらを読め:Reasons for introducing the NSC regions

 

Defining non-secure callable functions in secure firmware

幸いなことに、non-secureファームウェアからsecure機能を呼び出す過程はARMv8-Mコンパイラによってプログラマからは隠されている。non-secureファームウェアから呼び出すsecure機能のエントリーポイントはsecureファームウェアの定義をした後でcmse_nonsecure_entry属性をつける。

//some c file of secure firmware project defining veneer gateway functions
(ソース例は原文を見よう)

GCCでコンパイルするときにはオプションとして"-mcmse"がいる。

// GCC COMPILER flags used during secure side building
arm-none-eabi-gcc -o secureFirmware.elf -mcmse [...]

関数本体は通常secureメモリの.textセクションに配置される。が、SGと分岐する命令は.gnu.sgstubsセクション(GCCの場合。GCC以外は違う名前かもしれない)。

NSC領域の小さなredirect機能は、SGを実行して分岐する処理しかやらないので、"veneer"機能や"SG stubs"などと呼ばれる【私:blogでは"SG stups"と書いてあったけど、typoよね? それと、ここまでfunctionを「機能」と書いてきたけど、C言語の関数という意味で使われたりもする? redirect functionってなんだろう? non-secureからsecureに遷移するってこと?】。secureファームウェアのリンカスクリプトファイルは、non-secureファームウェアにジャンプする前にsecureブートプロセスの一部のNSCとして宣言するveneerコードをsecure領域に配置しなくてはならない。

// Linkerscript Section for TrustZone Secure Gateway veneers
(リンカスクリプトは原文を見よう)

【私:何が言いたいのかわからなかった。リンカスクリプトの見方が分かってない。】

 

Calling secure functions from non-secure firmware (NS->S)

通常、secureファームウェアはnon-secureファームウェアイメージから独立して開発&FLASH書込みされる。secureファームウェアの機能を使うために、secure側の関数を呼び出せるように書かれたヘッダファイル(.h)はnon-secureソースファイル側でincludeする。加えて、non-secureファームウェアはsecureメモリのNSC部分の前にveneerエントリーポイントスタブがどこにあるかを知っていないといけない【私:「NSC部分の前に」はbeforeだから時間的に前。FLASHのsecureとnon-secureの設定を行う前に決定していないといけない、という意味か?】。これは特殊なオブジェクトファイル(CMSE_importLib.o)とアドレス情報を必要としているnon-secureファームウェアをリンクすることで解決する【私:done、は、何とかしてくれる、くらいの意味だろうか?】。このオブジェクトファイルは以下のcmseリンカオプションを使用してsecureファームウェアがリンクされる間に生成されなくてはならない【私:CMSE_importLib.oはここで生成されているのだろうか?】。

// GCC LINKER flags used during SECURE side linking
arm-none-eabi-gcc -Xlinker --cmse-implib -Xlinker --out-implib=CMSE_importLib.o -Xlinker --sort-section=alignment [...]

オプション"-in-implib=CMSE_importLib.o"は、過去バージョン(TrustZone未対応)で既に定義された同じメモリに展開されるオブジェクトファイルを新しいバージョン(TrustZone対応)でも維持できるようにする【私:-in-implibではなく-out-implibの間違いでは?】。こうすることで(過去バージョンで作成済みのimport libにリンクされている可能性がある)non-secureイメージの更新をせずにsecureイメージに追加できるようになる。

.hファイルを使用してCMSE_importLib.oオブジェクトをリンクするために、non-secureファームウェアはControlCriticalIO()関数を呼び出す【私:the example aboveは、たぶん「原文を見よう」のコードだ。】。

// GCC LINKER flags used during non-secure side linking
arm-none-eabi-gcc -o non-secureFirmware.elf CMSE_importLib.o [...]

 

Calling non-secure (callback) functions from secure firmware (S->NS)

どのようにしてTrustZoneが2つの隔離されたファームウェアをgatewayやveneer機能で接続するのかを見てみよう。これはsecureファームウェアがnon-secureファームウェアから呼び出される機能を許可しているからだ。

もう1つの方向、すなわちsecureファームウェアからnon-secure関数を呼び出す場合、なんらかの方法でsecureコードにnon-secure関数のアドレスが与えられたならば、実行することができる。通常、これはsecure gateway functionが引数にnon-secureコールバックポインタを与えることで行われる。

(サンプルは原文を見よう)

"nonsecure_call()"属性は、潜在的なセキュリティリスクを割けるためにnon-secureコードにジャンプする前にバンクじゃないgeneral purposeレジスタをクリアするようsecureコンパイラに指示するために必要だ。そしてまた、ブランチアセンブラ命令の関数ポインタアドレスLSBをクリアする指示にも使われる。こういうことを行って、CPUはsecure状態からnon-secure状態に戻ってくる。

non-secureコールバックはvolatile値のように扱わねばならないので、non-secure割込みによって変更される可能性があるため、関数ポインタは"cb"にコピーが必要となる【私:cbはサンプルコードの中にあるfuncptr_ns型の変数か】。コールバックを実行する前に、ポインタがnon-secureメモリのみを挿しているのかチェックしなくてはならない。secureメモリを挿しているなら、それはセキュリティリスクとなりうる【私:ポインタ変数が4byteだとして、それが全部non-secure側にあるかどうかをチェックするのだろうか?】。

 

Hints and further reading

secure側のリンカスクリプトはveneer関数のセクションを考慮し、non-secure側のリンカスクリプトはsecureファームウェアのメモリ領域を反映しなくてはならない、ということを覚えておこう。archiveファイル(*.a)がnon-secureの呼び出し可能な関数を含んでいるなら、secureファームウェアのリンカオプションとして"whole-archive"を付けなくてはならない。この方法でのみCMSE import libが必要とするveneer関数に含めることができる。

 


けっこうがんばって読んでみたのだが、どうだろうか?
というか・・・私やっぱり英語力ないな。。。
ただ、この人のはGoogle翻訳などできれいに和訳されやすかった。がんばったのは、Google翻訳に通す前に自分でやってみたということについてだ。自信がないときはその後でGoogle翻訳して「ああやっぱり間違ってた」となるのだがね。

 

 

さて、整理しよう。

【NSC】
Non-Secure Callableの略。
non-secure状態からsecure状態に遷移するときに使うsecure側の領域。NSC memory regionsやNSC regionなどという使い方。

【SG】
Secure Gatewayの略。
non-secure状態からsecure状態に遷移したいときに使うアセンブラ命令。

 

まず、Defining non-secure callable functions in secure firmwareのところ。
ControlCriticalIO()という関数をcmse_nonsecure_entry属性つきで作る。
これはnon-secureファームウェアから呼び出されることになるのだが、その前にSGオペコードを呼び出したりなどをやってくれるのだろう。
これをsecureFirmware.elfという名前で生成している。-mcmseオプション付きだとsecure用になるのか。

 

次に出てきたのはリンカスクリプトで、.gnu.sgstubsが載っている。
これは自作が必要なのかもしれない。

 

次はCalling secure functions from non-secure firmwareのところ。
--Xlinkerを使ってリンカに指示している。オプションは--cmse-implib, --out-implib, --sort-section。
--out-implibはファイル名を付けているので、これが生成されるのだろう。

そして最後にCMSE_importLib.oと一緒にリンクしてnon-secureFirmware.elfを生成している。

 

最後の話で、callback_fnをcbにコピーするところがよくわからなかった。
C言語だから、引数は値渡しだよな? ポインタだから、アドレス値を渡しているはずだ。
じゃあ、コピーしなくてもいいんじゃないのかと思ったが、レジスタじゃなくてスタックで渡された場合だろうか。
うーん、答えが出ない。。

 

あと、secureとnon-secureにメモリのパーティションを分ける話があったが、FLASHはいいとして、SRAMの方はどうなってるのだろうか?
nRF9160のSPMを読むと、SRAMも分けるようだ。分けるというか、強制的に分けられるというべきか。だからSRAMについての記述がないのか。

 

nRFのFLASHって、自分で書き換えができたんだっけ?
OTAがあるのは覚えているが、BondingなんかはAPIを使ってしかやってないので、今ひとつ・・・いや全然記憶にない。


むー、もっと調査が必要か。

しかしまあ、しばらく触っていないうちにずいぶん状況が変わってきたな。
特にセキュリティ周り。
nRF51822だとBLEで手一杯だったので考慮しなかったが、nRF9160はTrustZoneがいるくらいのレベルが要求されているのだろう。まあ、nRF9160はBLEじゃなくてインターネット接続と直接接続される前提になっているからかもしれないが。

今までインターネットとは距離を置くことでセキュリティのことは放置してきたのだが、そういう時代ではなくなったのだな。。。

2015年9月13日

[keil]Packを整理したらビルドできなくなった

KeilでnRF52のサンプルをビルドしようとした。

最近、Nordicからメールで更新通知が来ていて、Packとかが新しくなったようだった。
Packとか何とかはよくわからないけど、とりあえず更新しておけばいいんじゃなかろうか、くらいでやっておいた。

ふっと、KeilのPack Installerで見てみると、過去バージョンが残ったままになっているようだった。
いつインストールしたかとか、どういう管理していたかも記憶にないので、とりえあず最新版以外はPackごとRemoveした。

そしたらですな、以前ビルドできていたサンプルソースがビルドできなくなったのだ。
コンパイルエラーとかじゃ無くて、プロジェクト自体のエラーみたいなものだ。
CMSIS COREとDevice Startupが無い、とおっしゃる。

「Manage Run-Time Environment」で見てみると、確かに赤くなってエラーっぽい。

image

よくわからんので「Select Software Packs」のダイアログを出すと、ARM::CMSISとDeviceFamilyが赤くなっていた。
まあ、さっき消したから、ないんだろうな。
でも最新版は入っているはずと、画面の上にある「Use latest versions of all installed Software Packs」にチェックをした。
これで最新版になっているはず。

はずだったのだが・・・だめだった。
Manage Run-Time Environmentにも新しいのが出てこないので、どうしようもない。
該当するPackを入れればいいんだろうが、それは負けた気がする。

よくわからぬまま、もう一度Nordicからメールできていた更新ファイルをインストールし直した。
今日は8.0.4とかいうのが最新っぽい。

  • nRF5x_MDK_8_0_4_Keil4.msi
  • NordicSemiconductor.nRF_DeviceFamilyPack.8.0.4.pack

そうしたら、新しいのが使えるようになっていた。

image

インストール→消す、とやったのがまずかったのだろう。
消してからインストール、ですかね。


別のサンプルプロジェクトを立ち上げたところ、また同じことが起こった。
今度は、インストールし直さずとも、Select Software PacksでLatestにチェックを入れ、Run-Time Environmentで選び直せばうまくいった。

2015年5月30日

Windows Live Writeで投稿できなくなった

技術系の話じゃないが、ちょっと困ったことになった。
このブログはBloggerなのだが、いつも使っているWindows Live Writerでの投稿が出来なくなった。

Blogger側の問題かと思っていたのだが、こちらを読むとそうではないようだ。

bloggerでWindows Live Writerが使えなくなりました。[blogger] | ブログ改善のネタ帳

Bloggerの認証が変わったが、Live Writerはそれに対応していないから使えない、ということらしい。
うーむ。

今のままではダメですよ、というのは事前にアナウンスされていたようだ。
まあ、そりゃそうだよな。私が知らんかっただけだ。
OAuth 2 または OpenID Connect への移行期限まであと 1 ヶ月 - Google Developer Japan Blog



画像の埋め込みと、ソースの埋め込みさえ簡単にできれば特にこだわらないのだが、なかなかねぇ。
またZoundry Ravenに戻すか。


Zoundry Ravenでもダメみたいだ。
がーん。
A Tinkerer's Blog: Unable To Access Blogger/Blogspot From Raven/RavenPlus

どうしよう・・・。

あまりここに時間を掛けたくないので、Live Writerが使えるようになるか、他のブログエディタが見つかるまでは更新をお休みしよう。



2015年4月4日

gdbでCソースが見えないときは、コンパイル後のデバッグオプションを疑おう

nRF51822で、なぜかブレークポイントが設定できなくなった。
以前はできていたので、その時の環境に戻す、という選択もある。
が、今後のことも考えて、「こうやったら直った」を探そうと思う。

まあ、きっちりした解決にはならないかもしれないが、近づくことはできるだろう。


簡単なソースファイルをarm-none-eabi-gccでビルドした場合は、gdbでソースファイルが確認できた。
では、今のnRF51822で使っているMakefileでそのファイルをビルドしてみよう。

 

コマンドラインでビルド&デバッグ

  • ソースファイルはmain99ma.c、その下にmkdir gcc/_buildしておく。
  • cd gcc
  • arm-none-eabi-gcc ../main99ma.c -mcpu=cortex-m0 -mthumb -mabi=aapcs --std=gnu99 -Wall -Werror -mfloat-abi=soft -flto -fno-builtin -ggdb3 -O0 --specs=nano.specs -lc -lnosys -Xlinker -Map=_build/tst.map
    -Wl,--gc-sections -o _build/tst
  • cd ..
  • arm-none-eabi-gdb gcc/_build/tst
  • (gdb) list main99ma.c:main
#include <stdio.h>
int main(void)
{
    printf("Hello.\n");
    return 0;
}

 

これをmakefileに入れ込む。
結果は・・・・・だめだ。No source file named main99ma.cだ。
ふむ、幸先がよい。


コマンドラインでビルドしたときのオプションだが、よく見るとmakefileのものとまだ違いがあった。
同じにしよう。

  • arm-none-eabi-gcc -mcpu=cortex-m0 -mthumb -mabi=aapcs --std=gnu99 -Wall -Werror -mfloat-abi=s
    oft -flto -fno-builtin -ggdb3 -O0 -c -o _build/main99ma.o ../main99ma.c
  • arm-none-eabi-gcc -Xlinker -Map=_build/tst.map -mthumb -mabi=aapcs -L .. -mcpu=cortex-m0 -Wl,--gc-sections --specs=nano.specs -lc -lnosys _build/main99ma.o -o _build/tst

あれ・・・リンクエラーが出た。libc_nano.aが参照しているsbrkなどが無い、と。
単に2つに分けただけなんだが・・・。
あ、これはリンクするオブジェクトの並べ方がよくない。

  • arm-none-eabi-gcc -Xlinker -Map=_build/tst.map -mthumb -mabi=aapcs -L .. -mcpu=cortex-m0 -Wl,--gc-sections --specs=nano.specs _build/main99ma.o -lc -lnosys  -o _build/tst

これで通った。
確か、並べた順番に処理していくので、大元になるライブラリは最後の方に並べるとか、そんなルールだったと思う。

 

あららららら。
このtstをgdbで読むと「Reading symbols from gcc/_build/tst...(no debugging symbols found)...done.」だと。
1行だとsymbolがあるのに、2行にすると消える・・・?

mapファイルを見比べると、確かに、なさそうだ。
と、いうことは・・・・!


2つに分けた、リンクの方をさらに修正。

  • arm-none-eabi-gcc -ggdb3 -Xlinker -Map=_build/tst.map -mthumb -mabi=aapcs -L .. -mcpu=cortex-m0 -Wl,--gc-sections --specs=nano.specs _build/main99ma.o -lc -lnosys  -o _build/tst

そうすると、できあがったtstにシンボルが入っていて、gdbもちゃんと読めた。
そうか、デバッグオプションっていうと、コンパイルレベルのものしか考えてなかったんだけど、リンクレベルにも影響があるんだ。

nRF51822アプリのmakefileを書き換えて、eclipseでもちゃんとCソースにブレークが貼れることが確認できた。
満足した。


さて、先ほど「リンクの方を」と書いたが、GCCのリンクオプションを見ると、-gは無い。
まあ、-Xlinkerとか-Wlに続けて書いているわけじゃないから、リンクオプションにはなってないんだが。

しかし、修正した方は特にコンパイルを行っているわけでもない。
だから昔の感覚からすると、

プリプロセス→コンパイル→リンク

のリンクになる、と考えてしまう。

ただ、最近のコンパイラはもう1段挟むようになり、gcc4からそうなったという記事をC Magazineで読んだ記憶がある。
だから、それをリンクする工程でも「デバッグオプションは残しておいてくれ」という意味で付けるのだろうか。

Interface誌のコンパイラ特集を読みながら調べようかと思ったが、これはもうちょっと時間に余裕があるときにやろう。
今回の教訓は、「Cソースレベルのデバッグができないときは、コンパイル以降のデバッグオプションを見てみよう」だ。

2015年4月2日

汎用的に作る時代か

nRF51822で、I2Cを動かそうとしている。
mbedであれこれやったので、そんなに難しいことでもないだろう。

うちにあるI2Cデバイスは、LCDのST7032iが載ったストロベリーリナックスさんで買った、これだ。
I2C低電圧キャラクタ液晶モジュール(16x2行) - SB1602B - ネット販売

そしてもちろん、FeliCa Linkもある。
Sony Japan | FeliCa | 法人のお客様 | 製品情報 | RC-S967・S730

まあ、その2つしか持ってないのだが。


最近、自分の作るコードを、コードの傾向を見て思うのだが、一番その時のサイズが小さくて済むような作り方をしようとしている。
これは、メモリが少ない環境では利点になるのだけど、今のように性能が向上してチップが安価になると、むしろ足かせにしかならない。

例えば、さっき書いたST7032i。
当時はTOPPERS/ASP向けに作ったような気がする。ASPじゃないかもしれないけど、とりあえずTOPPERSへ。
もし、nRF51822でTOPPERSを動かすなら、このまま使えるのかもしれない。
しかし、なんとなくであるが、nRF51822でTOPPERSは雨後かしづらいんじゃないかと思った。

nRF51822は、BLEを動かすためにあるといってもよいと思う。
割込の優先順位も、かなり決められていたと思う。
なんか、SoftDeviceがOSを兼ねているような感じがしたのだ。


うーん、難しいね。

2014年12月16日

[ble]CC2540 USB Dongleから直接WireSharkで見る

WireSharkでリアルタイムの流れが見えてもしょうが無かろう、などと言っていたが、だんだん気になってきた。
もしかして、私は技術的に難しそうだから逃げただけじゃないだろうか。。。
えぇい、作ってしまえ!

というわけで、luaを作った。
https://sites.google.com/site/hiro99ma/ble/files/ble_cc2540dongle.lua?attredirects=0&d=1

USB CC2540 Dongleのポートを見て、WireSharkのBT LE LLプロトコルに流しているだけだ。
あんまり動かしてないけど、Advertisingくらいは取れていそうだ。
フィールドとかは気にしないでおくれ(練習の消し忘れ)。

短いluaファイルなので大したことないのかもしれないが、ここまで至るまでが大変だったのだ。
特に、BLEのDissectorをどうやって指定するのかがわからなくてね。。。
UDPとかTCPはやり方がよく出てくるけど、DissectorTable.get()の引数がわからんかったのだ。
メニューの「Internals > Dissector tables」で一覧は出てくるけど、BLEっぽいのがないし、検索もできない。
やむなく、1つ1つツリーを開いて探し、ようやく見つけた次第だ。

最後は、Dissectorに渡すサイズがどこから計算してよいかわからず、いくつかパケットを見て、-10すればよさそうだ、という手抜きで済ませてしまった。

 

まあ、一番の問題は、単にUSBのバルク転送を見ているだけなので、何でもかんでもBLEのデータだと思ってしまうところだろうな。

2014年12月13日

[ble]どうせならWireSharkで直接パケットを見られないだろうか

なんか、いつものことながら、道を外れつつある・・・。
いや、人の道は外れないけど、やろうとしてたことを外れるというか。
まあ、より道は子供の頃から楽しいものだから、仕方あるまい。

前回、PSDファイルをPCAPに変換してWireSharkで見る、という作業を行った。
接続の構成は、こんな感じ。

image

ソフトまで含めると、こうなる。
前回やったのは、黒い矢印のところだけ。

image

WireSharkは「ネットワークインターフェース」のデータを取り扱うソフトなので、ネットワークインターフェースじゃないものは扱うことができない。
だから、BLEのデータもWireSharkで見ることができないから、一度PSDファイルにしたものをWireSharkで読めるPCAP形式に変換してみた、というのが前回の話だ。

 

だから、ネットワークインターフェースで見えるようにさえしてしまえば、どんなデータもWireSharkで見ることができる、というのもまた真である。
今回で言えば、CC2540 DongleとPC間はUSBで接続されているので、USBの通信をネットワークインターフェースで見えるようにすればよいだけのことだ。
「USBはネットワークとは別だろう」と思うかもしれないが、そんなことを言ってしまうと「ネットワークのデータは画像データじゃないじゃないか」と言ってるようなもので、ノイマン型コンピュータの中で生きている我々にとっては「データはメモリに載っかってしまえばみんな同じ」なのだ。
あとは、どう扱うか、だけ。

WireSharkもそれをわかっていて、USBを解析する方法が書かれている。
私はWindowsだったので、USBPcapを使ってみた。
tourのStep1~3で、Dongleのデータをpcapファイルに保存し、WireSharkで見てみた。
うん、Bulk転送でそれっぽいデータが受信できている。
Dongleの操作はWireSharkではできないので、これはTI Packet Snifferで操作した。
Step4のlive captureも同じ要領で試して、それっぽいデータが受信できていた。
(USBPcap2となっている箇所は、自分のスニファしたいUSB Host番号に合わせること!)

あとは、これをリアルタイムで解釈するようにがんばるかどうか。。。
この記事を書き始める前までは、LUAでプラグイン書いてやってみよー、と思ってたんだけど、今のところリアルタイムのWireSharkで見る必要性がほとんどないのだな。
自分でスニファアプリを作ったとかすれば必要になってくるけど、今使っているBVMCNDT52はUSBを電源供給で使うだけなので、そういうのがいらない。COMポート経由とかでも同じことはできると思うけど、そんなことを考えるのが面倒だからDongleを買ったのだよ。

そんなわけで、「TIのドングル出力を直接WireSharkで見られるか?」という問に対してはYesなんだけど、「今からがんばりたいか?」という問に対してはNo、と答えてしまうな。

2014年8月23日

[vuforia]Unityも使ってみる

そういえば、VuforiaのインストールガイドにはNDKもインストールするよう書かれていた。
一応インストールはしたものの、サンプルにはjniがないし、ndk-buildしてもビルドされるわけでも無い。

staticライブラリをコピーするくらいだから、「こちらにビルドしたものをご用意しました」という状態なのだろう。


で、だ。
ネットで見ていると、NDKでビルドするという話がしばしば出てくる。
iOSの記事だからかもしれないが、Unityというのでデータを生成するとCのヘッダができるようなことも書かれていた。
うーん、NDKはやっぱりいるのか?
わからんので、Unityでのサンプルも試しておこう。
なお、Unityってのも知らないので、ごにょごにょ長くなるだろうが許してくれ。

 

https://developer.vuforia.com/resources/dev-guide/step-1-installing-extension
まず、Vuforiaのunitypackageをダウンロードして、C:\Program Files (x86)\Unity\Editor\Standard Packagesにコピー。

https://developer.vuforia.com/resources/dev-guide/step-2-compiling-simple-project
Unityを起動して、プロジェクトの作成でvuforiaなんとかにチェックを入れて、create。
しばらく待つと、3Dの平面にカメラっぽいものが見える画面が出てきた。

左下にあるフォルダツリーで、Assets > Qualcomm Augmented Reality > Prefabsを開く。
(はっ、「プレハブ」って、Prefabなのか? 何かの略かと思ってたのだが・・・)
左上のHierarchyからMain Cameraを削除し、代わりにPrefabsの中にあるARCameraをドラッグして持っていく。

ドラッグしたARCameraをクリックすると、右側のInspectorにずらずら出てきた。
説明では、StreamingAssets/QCARが有効になるとか何とか(今気付いたが、QCARはQualComm ARの略か)。
QCARフォルダの中にはテキストファイルが1つだけあり、ダブルクリックするとMono Developというツールが起動してしまった。CSharpって書いてあったので、今回は関係なさそうだ。

今度は、TargetImageをドラッグして左上にドラッグアンドドロップ。
Inspectorに、またずらずら出てくる。
ここの「Image TargetBehavior」は必須らしい。
"Press here"と書いてあるのでクリックすると、ブラウザでVuforiaのサイトにあるTarget Managerというサイトがひらいた。
このサイトでデータを作るようだ。

適当にTargetを作って、Unity Editor用をダウンロードすると、Unityアイコンがついたファイルが取って来れた。
これを組み込めんばいいらしい。
メニューの Assets > Import Package > Custom Packageでダイアログが開くので、さっきダウンロードしたファイルを選択。
そうすると、これらをインポートします、みたいな画面が出てくるので、そのままImport。

Importすると、InspectorのImage TargetBehaviorにいくつか追加されている。
Targetを1つだけ作っていたためか、Data Setでは1つだけ選択できた。
それを選ぶと、真ん中のSceneウィンドウに絵が出てきた。
なんじゃこりゃー。

image

ImageTargetというのは、どうやら目印になる画像のようだ。
サンプルでいうところの、砂利の画像みたいなやつだ。
てっきり、ここで作った画像が3Dで見えるやつになるかと思っていたのだが、やはり3Dは甘くないな。
(pngファイルから自動的に3Dにするなんてすごい!と思いこんでいたのは秘密だ。)

 

ここから、ようやく3Dオブジェクトの話になる。
説明ではあっさりと「シンプルなCubeオブジェクトを作る(GameObject > Create Other > Cube)と書いてあるが・・・はて。
ああ、メニューから作るのか。
Hierarchyの一番下にCubeができるが、これをドラッグしてImageTargetの配下にする。
Directional Lightも追加できるよ、とあるので追加してみたが、ライトが当たったように見えるのかよくわからん。

TrackableEventHandlerがどうのこうのあるが、デフォルトがあるようなので、そのまま使っておこう。

これで、とりあえず準備はできたようだ。
メニューから、File > Build Settingsを選ぶと、ダイアログが出てくる。
設定は特にせずとも、Androidを選んでビルドすると、よさそうだ。
"Scenes In Build"には、Add Currentすれば現在のが追加されるようだ。
追加して、保存してからBuild and Run、なのかな。

そうすると、Nexus7に転送されて立ち上がるのだが・・・画像を見せても何も出ない。
のっぺりした画像だったからダメなのかと思い、ImageTargetを白黒のにしてみたけど、だめ。

まず1つ見つかったのは、ImageTargetの設定だ。
説明ページには言及が無いが、Inspectorの画像を見るとData Set Load Behaviourの設定で「Load Data Set xxx」と、その下の「Active」にチェックが入っているのだ。
これは、デフォルトではチェックされていない。
書いておいてくれよ・・・。

でも、これをやっても変わらない。
うーむ。。。

image

ん??

image

image

ああ!
ゴミみたいなのが、追従して動いてる!!
小さいだけか・・・。

Cubeの"Transform"にあるScaleを、全部0.2にした。
どうやら、ImageTargetを1.0としたときの比率になるようだ。
これでビルドすると、出てきた!
黒い四角が出てきた!!
よかったんだけど、絵としてわかりづらいので、四角の表面に何か貼り付けてみたい。

どうやら「テクスチャ」というものらしい。
左下のAsserts > Qualcomm Augmented Reality > TexturesのUserDefinedTarget.pngを、左上のCubeの中にD&D。
そうすると、CubeのInspectorに追加された。
もっといい方法があるのかもしれんが、よくわからん・・・。
Base(RGB)もよくわからんが、Selectをクリックすると画像があったので、適当に選ぶと貼り付けられた。
Shaderが「Unlit/Texture」だと貼り付けられるみたいだ。

image

わーい。

Cubeを作ったときは「Default-Diffuse」というのがあるんだけど、これが編集も何もできないのでこういう手順を踏んだが、Unityの使い方から学ばねばならんのかな。
3Dにそこまで思い入れがあるわけじゃないけど、「ああUnityね、使ったことなくもないよ」くらいは言えるようになりたいじゃ無いか。

[lib]vuforiaサンプルのビルドが通らんのでバッチに変更

まだVuforiaのAndroidサンプルでビルドできていない。

前回のClasspathは、エラーが出ていたけど、何度も出たり入ったりしているうちに、なぜか表示された。
なんじゃそりゃ・・・。
なんかわからんが、設定できたからよしとしよう。
この設定ができなかった場合、プロジェクトファイルがQCAR_SDK_ROOTを見るようになっているところが動かなくなるだろう。

そうすると、自動ビルドまでは通るようになった。
よしよし、と実機に焼こうとしたら、エラーが出た。
AntBuilderLaunchConfigurationTypeが無いとか何とか。
うーむ。

antがないってことらしいが、調べていくとEclipseにantは統合されているらしい。
pluginの一覧を見ても、apache antが出てくるので、入っているのだろう。
エラーは「"org.eclipse.ant.AntBuilderLaunchConfigurationType"が無い」なので、antがないってより、期待したプラグインが無いということなのか・・・。

プロジェクトのプロパティから「Builders」を見ると、CopyVuforiaFilesにアイコンが表示されていない。
Editしようとしても同じエラーが出るので、これがよろしくないのだろう。
ファイルの中身を見ると、vuforiaのstaticライブラリをコピーするだけのようなので、これを削除して手動でコピーすれば良いと言えばよいはず。

が、忘れそうな気もするので、とりあえずWindowsのバッチファイルを作って、Buildersに登録した。

mkdir libs\armeabi-v7a
copy ..\..\build\lib\armeabi-v7a\* libs\armeabi-v7a

antで書くとプラットフォーム依存が無くなってよいのだろうけど、めんどくさかった。
まあ、シンプルな方がわかりやすいしね。

2013年4月27日

[git]コミットのログ

仕事でgitを使い始めた。

今までは、一人でadd、一人でcommit、一人でpush。
何も困ることはなかった。

しかし、これが複数になると全然、もう全然状況が異なる。
svnもそうだったけど、gitはできることが多いためか、正直なところ「いじるのが怖い」という気持ちになっている。

まあ、pushしなければまだ大丈夫、という気持ちだけで耐えているところだ。


コミットされたログを見ていると、いくつかパターンがあることがわかった。

よく見るandroidのlibnfc-nxpなんかを見てみると、こんな感じだった。

  1. 普通の文言
  2. Mergeではじまる
  3. mergeではじまる
  4. amではじまる
  5. Revertではじまる
  6. Reconcileではじまる
  7. DO NOT MERGEで始まる

うーん・・・。

やったことがあるのはrevertだけなので、5番はgit revert {xxx}という操作で自動的に生成されることがわかった。

別にコメントだから変更はできるのだけど、自動で打たれるコメントをそのまま使うことが多いんじゃないかね。
だいたい、自動のやつはそのまま残して、追記するんじゃなかろうか。


git amというコマンドがあり、これはmbox形式のdiffファイルみたいなものを、うまいことマージしてくれるらしい。
Apply Mergeとかなんかであろうか?

これは4番なのではなかろうか。

 

すまん、これ以外がよくわからない・・・。
どう調べたらいいんだろうか?
この「わからなさ」が怖いと感じているというところである。

試せばいいんだろうけど、どう調べればいいんかね?

2013年3月9日

[cygwin]curlに失敗するときはcurlrcを作るのだ

Androidの環境を取り直そうと、cygwinでrepoしようとした。
ビルドはできないけど、ソース取得くらいはできる。

まずは、repoを取ってこないと。

curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > repo
curl: (77) error setting certificate verify locations:
  CAfile: /usr/ssl/certs/ca-bundle.crt
  CApath: none

知らないエラーが・・・。
ネットで調べると、.curlrcを作ればいいようだった。

$ echo insecure >> ~/.curlrc

よかったよかった。


だけでは済まなかった。
repoは取って来れたが、まだまだエラーが。

 

gpgもいる。
cygwinだと、gnupgって名前だった。
http://d.hatena.ne.jp/Kazzz/20110307/p1

curlじゃないところで、同じようにcertificateが出た。
これは、ca-certificateという名前のをインストールするのだと。
http://d.hatena.ne.jp/kakkun61/20121008/1349632271

ここまで行くとずいぶん進んだのだが、repo syncがうまくいかん。
Kazzzさんのところではpython2.5をインストールするようになっていたが、今のcygwinは2.7が最新で、戻しても2.6までだった。。
もう少し探すと、rebaseallするように書かれていた。
http://www.crystal-creation.com/software/technical-information/smart-phone/android/information/source/download.htm

そういえば、xpのときも何かするときにrebaseallしてたな。。。そのおかげでrepoもうまくいってたのか。
rebaseallするとなんかskipしたようなメッセージが出るのだが、これは無視していいらしい。
http://cygwin.com/ml/cygwin/2012-07/msg00664.html

 

そうして、repo syncできるようになって、何時間かかるのか心配できるようになりましたとさ。
めでたしめでたし。

2013年3月8日

[lo]ImpressをAndroidから操作できる

LibreOffice 4.0.1がリリースされた。
知らなかったのだが、LibreOffice4にはAndroidからプレゼンテーションソフトである「Impress」を操作できるらしい。
4.0.1ではWindowsもサポートされたのこと。

https://wiki.documentfoundation.org/Development/Impress/RemoteHowTo/ja
これを見ながらやってみた。

image

相手はNexus7。
スライドの一覧が表示されて、タッチするとImpress側の画面も変わる。
おおー、と素直に楽しめた。

 

苦労したのは・・・ペアリング。
やりかたがよくわからず、PC側で検索したけど見つからず・・・あ、Android側を有効にしないと・・・パスフレーズ?・・・あ、PC側に一瞬出てたけど気付かなかった!・・・

などと、同じようなことを繰り返していたのだ。
NFCでペアリングという商品を見ていて「最初しか使わんやん」と冷たい見方をしていた私だったが、このつながらなささはかなりいらいらさせられた。
うん、そういうのなら私も賛成だよ。

2013年2月28日

[tizen]また微妙に変わった(サイトが)

なんか、変わった。

https://source.tizen.org/documentation/developer-guide/downloading-and-building

 

なんだろう・・・と思ったら、タイトルが違うんだ!
「Downloading and Building」→「Cloning and Building」となった。
(まあ、URLは同じようだが、そこは気にすることはあるまい。)

別に、細かいところを突きたいわけではなく、現在進行中なんだな、ということを確認したかっただけだ。
仕事でやってるわけじゃないし、本業が忙しいので、これくらいでいいのだ。

2013年2月24日

[tizen]今日やったこと

「Tizen(たいぜん)のこと調べるのは、もう大変(たいへん)」、というセリフがすんなり出てくるくらい、私にとってはまだよくわかっていない。

また、ちょうど先週に2.0がリリースされたばかりで、いろいろまだ整理中だったりしているようだ。
たとえば、Tizen associationのja-JPがなくなっていたりとか。
たしか、先週見たときにはまだあったような気がする・・・。

以前から追っていれば、まだわかったのかもしれない(あるいは、かえって訳がわからなくなったか)。
しかし、私はちょうど先週から、というか、3日程度しか見てないので、状況がわかっていない。

そんな目線で、やってみたことを書いておこう。
ソースファイルがダウンロードできなかった件のまとめみたいなものだ。


まず、GBSとMICをインストールするらしい。
Ubuntuか、openSUSEか、Fedoraらしい。
うちは、Xubuntu 12.04がインストールされていたので、それを使った(前回起動したのが159日前だって・・・)。

説明に従っていくだけだった。
/etc/apt/sources.listに追加するのも、ちょうど12.04だったのでそのまま。


で、次のDownloading and buildingをやろうとして、ふと止まる。
Gerrit UI ?
Androidでは、たしかソースのレビューに使っていたような気がするが、私はソースファイルをダウンロードしたいだけなので関係あるのか?

どうも、あるらしい。
GBS(Git Build System)を使ってパッケージ管理みたいなものができるようだが、Androidでのrepoっぽいものではなく、GBSはビルドしたりもできるらしい。
とはいえ、そういうのにアカウントを作ってしまうと、操作を間違ってgit pushとかしてしまわないだろうか・・・。

不安ではあるが、仕方ない。
Environment setupと、slideshareにあったTizen gbs (git build-system)を見ながらやった。
SSHキーはgithubで作ったものがあるので、そのまま使うことにした(セキュリティ的に分けるもの?)。

sshコマンドを使って、
$ ssh review.tizen.org
とやるのだが、確かに「Welcome」とは出たものの、「不幸なことにインタラクティブななんとかかんとか」と出てきた。
解決するために、これこれを実行しなさい、みたいなメッセージが出るのだが、やってもサーバにつながらない。
よくわからんのでそのままにしているが、これがダウンロードできない原因かも・・・と小骨が刺さったような気持ちになっている。


review.tizen.orgのアカウントができたので、Downloading and buildingをやってみた。
Gerrit UIというのは、ブラウザ上にあるもののようだ。

image

ここに、ずらーーーっとプロジェクトがある。
Androidの、ディレクトリごとに切ってあるあれと同じようなものみたい。

で、cloneすればいいらしい。

$ gbs clone review.tizen.org:<プロジェクト名> <プロジェクト名>

と書いてあるのだが、実際のgbs-cloneは

$ gbs clone review.tize.org:プロジェクト.git

みたいな書き方になる。


それはまあいいとして、GBSには設定ファイルが必要となる。
.gbs.confらしいが、GBSをインストールしてもなかった。
別のサイトで「gbs」とだけ打てばできるとあったのだが、GBSのバージョンが変わったせいか、だめだった(私のは0.13だった)。
見つからなければHOMEの下に作るって書いてあるんだけど・・・。

「gbs build」と打つとなぜかできていたので、それを編集することにした。
こちらのサイト「Git Build System - GBSの環境構築 on Ubuntu 12.04 (1)」ではいろいろ聞いてきてくれたようだが、とりあえず私の時にはなかった。
なので、書いてあることを参考にconfファイルを編集した。

confファイルにreview.tizen.orgのアカウントとパスワードを書いておくと自動的にログインしてくれるようだ。
パスワードが平文だと嫌だなあ、と思いつつも入力しておくと、次に見たときには暗号化か何かわからんけどごにょごにょした文字列になっていた。

他にもいろいろ参考にしたことがあったように思うが、もう忘れてしまった。


「gbs build –A i586」と入力してみたが、エラーになる。
ソースファイルがないとか、なんとか。
まあ、実際にないのだけどね。

じゃあ、あのプロジェクトの中からどれをダウンロードすればいいのだ?というのが前回の話だ。
未だにわかっていないが、見ているといろいろと参考になりそうなところがあった。

  1. インストール直後のGBSでやること
  2. Git Build System - GBSの環境構築 on Ubuntu 12.04 (1)

特に2の方にはrepoのためのパスが書かれている。
今は、releases/latestの次に/2.0/が挟まっているので、そこら辺を書き換えたらうまくいってくれんかなー、と期待している。

まあ、試すのは次回だな。

TIZENのソースファイルをダウンロードしようとして、うまくいかん

Androidだとみんなやってるから、ちょっと違うことをしてみようかと思い、TIZENを見てみようと思った。

SDKは、書いてある通りにやって、インストールできた(Windows XP)。
では、せっかくなのでソースファイルもダウンロードしてみようと思った。

が、うまくいかない・・・。


「TIZEN gbsセットアップ」という資料を見て、ツール類はなんとかなったと思う。
(うちは「gbs」とするだけでは設定ファイルができず、「gbs build」としないとできなかった。)

本家にも、ファイルの取ってき方は書いてある。
gbs cloneを使えばいいのだろう(誤記があって、gbsのパラメータにはgitファイルを指定する)。
それもまあ、わかった。

ソースファイルの場所はここ、ということも書かれている。
が、この膨大なプロジェクトの中からどれをダウンロードしたらいいのかがわからん。
Androidだと、repoを使って一括ダウンロードができるのだが・・・。

repoファイルをつくって提供している方もおられるのだが、さっきやったところでは接続ができなかった。
うーむ・・・。

Porting Guide、というページもあったので少し読んだが、こっちではgbsではなくoscというコマンドを使っている。
もう、訳がわからない・・・。


なんとなくわかったような気になったことだけ書いておこう。

  • アプリ側は「developer.tizen.org」、プラットフォーム側は「source.tizen.org」という棲み分けのようだ。
  • IntelがやっているからATOMとかかと思ったが、ARMで動く。
  • Tizen 2.0は2013/2/18にリリースされたらしい。1.0は「Larkspur」(植物:ひえんそう)、2.0は「Magnolia」(植物:木蓮)。ということは、次があるんだったら「N」で始まるのかな。
  • Tizen 2.0 alpha、というのは昨年出ていたらしい。
  • ときどき「IVI」という単語が出てくるが、「in-vehicle infotainment」の略らしい。よくわからんが、車載向けプロジェクトか何かみたい。Tizenの設定がときどき「ivi」のパスを指定していてダウンロードできない、みたいに書いてあるところがあった。

このくらいか・・・。
何もわかってねぇなあ・・・。


kernelだけgbsでcloneし、そこで「gbs build –A i586」と打つと、なにやらいろいろとダウンロードされて、ビルドされたように見える。
「-A armv7l」(あーむぶい7える)は、だめだった。

うーん、やっぱりわからんわ。

2013年2月9日

libpafeとlibnfc

Fukuoka NFC Hack 7でRaspberry PiでPaSoRi RC-S370を動かしている例を見た。
そのとき、libpafeとlibnfcを両方やってみたということだった。

そういえば、私も少し触ったことがあったな、と思い出してみた。
思い出すだけで、ソースファイルは見ないから間違ってるかも。


libpafeは、PaSoRiを動かすことに特化している。
また、FeliCa用になっている。
やれることは限定されるけれども、だいたい使う機能は載せられているので、よくできていると思う。

 

libusbは、NFC R/W全般が使えるようにがんばっている。
開発元が日本ではないので、RC-S360へのサポートも含まれてはいるけれども、メンテナンスする人が少ないためか、細かいところまではサポートしていなかったような気がする。

ちなみにlibnfcは、コンパイルオプションか何かでデバイスの検索対象を指定できたような気がする。
USBだけでなく、シリアル接続も対象になっていて、シリアルの場合は接続されている全ポートに対して何かコマンドを投げて応答を見るような作りになっていたと思う。
大ざっぱだなぁ、とは思ったが、接続されているシリアルポートがわからないのだったら他に方法はない。

 

うちのRC-S620/Sでlibusbが動くよう、あれこれ見ていってはいたのだけど、途中でめんどくさくなった。
「もう、自分で作った方が早い!」(できのいかんは別として・・・)というわけで、結果的に自分でライブラリを作ることになったのであった。


今のところの完成形は、こちら。
https://github.com/hirokuma/libhknfcrw_c

「今のところ」のくせに「完成形」も何もあったもんじゃないのだが・・・。
ともかく、今の私の中での最新版である。

当初、C++でつくっていた。
どうせNFC R/Wなんか1つしかつながないから、static classだけでいいや、という作りだ。
でも、ライブラリの汎用性を考えていくと、結局Cで作っておいた方が使い勝手がいいか、ということになった。
これが上記のライブラリだ。
なお、C++版を多少いじったのがArduino版だ。
その前に作ったのがAndroid版で、C++版とC#版(SDK for NFC)から持ってきたりしている。

NFC R/Wへの読み書きと、memcpyやタイマ系の部分を分離させ、そこだけ各自のプラットフォーム用に実装すれば使えるようなイメージにしている。
cygwinとFM3基板で動かせるようにはしたので、まあ動くのだろう。

残念ながら、消費電力を抑えるようには作られていない。
そこまでいくと、その上に載せるアプリの仕様などに引っ張られるので、もういいや、と思ったのだ(と思うが、それよりも「めんどう」という気持ちの方が強いがね)。

基本部分は、NfcPcdというソースファイルにあるので、見るべきはそれくらいか。
定数をひたすらバッファに設定してR/Wに送信し、その受信データを見る、というだけだ。

作った当時は、RC-S620/Sのコマンドがわからないので、PN533のドキュメントを見ながら試し、だめだったらパラメータを変更してみる、というような試行錯誤をしていた。
そのため、見た目はわかりやすいが無駄っぽい処理が多い。
あんまりトリッキーなことはしていないと思うので、動かしてみて、必要な処理だけにして、不要なところを改善する、などとするといいのかもね。

2013年1月24日

[openocd]Interface付録のFM3マイコンに対応したようだ

[nor/fm3] mb9bfxx7 mb9bfxx8 support.

これが3週間前にfixedになったようだ。
Interface誌の付録になっているFM3は、MB9B618T。
今まで、OpenOCDでは、xx6、のサポートまでだったので、FLASHメモリを全部は扱えなかったらしい。

 

まだgitに入っている段階で、0.7.0のリリースはされていないようだ。
ファイルを取ってきて、ビルドすると、とりあえずマイコン指定でxx8を選んでも怒られなかったように思う。
まあ、もともとそんなに大きなプログラムは作ってないんだけどね・・・。

 

とにかく、ビルドで疲れた。
せっかく残業無し日だったのに、いつもより遅いじゃないか。。。
ビルド方法は、こちらを参考に、というよりも、そのままやった。

  • libusb-win32は、書いてある通り1.2.4を使った。最近のはusb.hから名前が変わっているので心配だったのだ(既存との名前衝突を避けるために変更したらしい)。
  • libFTDIは、0.20を使った。
  • ヘッダファイルを置く場所を、勝手に/usr/local/includeとかにしていたのだが、コンパイラをi686-pc-mingw32でやっているので、ここに書いてあるパスに置かないと読んでくれない。
    無理に-Iで指定させたら、あちこちぶつかりだした。
    mingw32じゃないとだめかどうかは、確認してない。動けばよかろうなのだ。

最初、mingw32をcygwinにインストールしていなかったのだが、libFTDIはビルドできたのだ。
そのままOpenOCDをビルドし出すとエラーになったので、インストール。
最後の最後になって、libFTDIのリンクに失敗。cygwinでビルドしていたライブラリだったので、いくつかリンクできないものがあったらしい。

そんなごにょごにょしたことをやりたくなければ、サイトに書いてあるようにビルドするとよろしい。


なんで半年くらいほおっておいたFM3を触ってみたかというと、やはりArduino効果だろう。
Arduinoを動かしてて、「あー、USBホストシールドがあるといいかも」「バニラシールドもあると収まりがいいな」などと散財してしまいそうだったので、その誘惑を断ち切るためにも既存に目を向けることにしたのだ。

Arduinoって5Vだけど、うちには3.3Vのものしかないので、つなげるのが難しいのよね。。。
スイッチサイエンスさんから、簡易レベルコンバータを買ってFeliCa Plugと接続しようとしたところで、「いやいや、3.3Vで動かせる環境は既にあるやん」と思い出したのだ。

基板がきれいだから、見た目もきれいにしたくなってしまうという誘惑に打ち勝たねば。

2012年12月23日

Wi-FiもOOBがある

Wi-Fi Static Handoverの続きだ。

NFC Forumには、今のところBluetoothの例しかない。
しかし、これをまねすればWi-Fiでもやれるんじゃなかろうか、というのが前回の結論だったと思う。
Wi-FiのOut-of-Band設定はWPSを使う、という考え方になるだろう。

 

WPSの設定方式?には、PIN方式とCredential方式があるようだ。
PIN方式は、E(Enrollee?)とR(Registrar?)があるようだ。
「ようだ」ばっかりだが、いい資料を見つけられていないので仕方ない。

今回参考にしたのは、Androidのソースに入っていたwpa_supplicant8だ。
いつの間にか8になったのね・・・。


wpa_supplicant8のソースを見ると、NDEFが出てくる。
実装としては、デバイスとしてUSBやNFCを選択できるようになっているみたいだ。
ただ、Androidでそれが有効になっているかどうかはわからない。

めんどうだったが、このソースからOOBデータ(と呼ぶのか?)を割り出した。
実際に動かしたわけではないので、間違ってたらすまない。

見た感じでは、NFC ForumのBluetooth Handover例とは異なり、HsレコードがなくてCarrier Configuration Recordが1つだけのNDEFメッセージになっているみたいだ。
これをまねすべきかどうかは、何とも言えんな。
wpa_supplicant8がNFC対応しているといっても、どうやらPN531みたいだし、NfcServiceがわざわざやってくれそうな気がしないので、Bluetoothのまねをした方がいいだろうな。

2012年9月1日

ソフトウェアライセンスを付けようとしたが、よくわからん

たまに、githubなどにソースファイルを置いている。
よくわからないが突然、ソフトウェアライセンスを付けた方がいいんじゃないのか?と思った。

まあ使う人はいないだろうけど、練習としてやっておいても損はあるまい。

 

といっても、そういうのをやったことがないので「MITライセンスとか修正BSDライセンスが自由そうでいいんじゃないの」くらいしか考えてなかった。
英語の文字列をソースのコメントにひっつけておけばいいや、くらい。

調べていくと、なんかいくつか出てきたので、覚え書きを書いておこう。


最初に見たのが、このタイプ。
これは、http://opensource.org/licenses/BSD-3-Clauseに出ていたものだ。
この「3」というのは、項目が3つあるからのようだ。

/*
 * Copyright (c) 2012-2012, hiro99ma
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice,
 *         this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright notice,
 *         this list of conditions and the following disclaimer
 *         in the documentation and/or other materials provided with the distribution.
 *  - Neither the name of the "hiro99ma" nor the names of its contributors
 *         may be used to endorse or promote products derived from this software
 *         without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 * OF SUCH DAMAGE.
 */

 

項目が2つのものもあった。

これは、http://opensource.org/licenses/BSD-2-Clauseにあった。

/*
 * Copyright (c) 2012-2012, hiro99ma
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice,
 *         this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright notice,
 *         this list of conditions and the following disclaimer
 *         in the documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 * OF SUCH DAMAGE.
 */

訳がわからなくなったので検索すると、こちらのサイトが詳しかった。

3番目は、著作権者の名前を使いたいなら事前に書面で連絡してね、というものらしいが、削除してもいいとか。
私はどっちでもいいんだけど、FreeBSDのサイトには3番目がないので、まねしておこう。

 

"hiro99ma"をオーナー名として入れたが、いいのかな?
そもそも、hiro99maって、なんだろうねぇ。。。