マイコン工作実験日記

Microcontroller を用いての工作、実験記録

32F469IDISCOVERY

2015-10-24 14:06:07 | Weblog


STのニュースを読んであたらしいSTM 32 Discoveryのボードとして32F469IDISCOVERYが出たことを知りました。なんでもSTM32F469はマイコンとしては初めてMIPI-DSIをサポートするデバイスということらしい。YouTubeにも800×400の4インチLCDをサクサクとドライブするデモが公開されています。



そのうちにAitendoとかでもMIPI対応のLCDが売られるようになるんでしょうか。MIPIで信号の本数が減るのは嬉しいのですが、STM32F469はLQFPだと176ピンか208ピンになるようです。ちょっと気後れしちゃうな。やはり趣味で使うには当面はSPIだな。

クレカのATR応答を読んでみる

2015-10-16 22:56:59 | Weblog
前回までの記事ではSIMカードの中を覗いて、いろいろな番号が記録されていることを知ることができました。SIMカードの仕様は低位レベルはISO 7816に準拠しているわけですが、我々の身近には、他にも代表的な応用例があります。それが、キャッシュカードやクレジットカードです。ちょうど先月いっぱいで有効期限の切れたカードがあったので、こいつをマイコンにつないでみましょう。



どうせハサミを入れて処分する予定だったカードです。チップ部分だけ切り取りました。これまで実験に使っていたSIMカードと並べてみると端子形状が同じでした。DNP製なのかな。ちゃんと標準SIMサイズに切り取ればSIMソケットに入ったかもしれません。



SIMの時と同じように変換基板を用意。なんか、チップをワイヤ・ボンディングしているみたい。



Nucleo-F103RBとのつなぎ方は、SIMカードのつなぎ方と全く同じです。あらかじめNucleo側の基板にはピンソケットを用意しておいたので、SIMソケットと載せ替えるだけです。



リセットをかけて、カードからのATR応答を読み出してみました。

9バイトの応答がありました。こいつをATR parsingにかけてみると...

ちゃんとデーコードできたので、応答が正しく受信できていることがわかります。TDの結果をみるとプロトコルがT1となっています。ISO 7816ではT0とT1の2種類のプロトコルが定義されており、SIMカードではT0プロトコルが使われていました。今回の実験のベースとしてつかっているSTのサンプルもT0プロトコルをサポートしているのですが、残念ながらT1には対応していません。したがって、T1プロトコルをサポートするドライバを書き足してやらないと、この先のファイルアクセスはできません。

と、いうわけで、今回の実験はここまで。T1プロトコルをサポートするドライバを用意しても、クレジットカードのファイル構造やアクセスの仕方などを勉強しないといけないので、簡単にカード内容を確認できそうにはありません。

SIMカードからIMSIやMSISDNを読み出す

2015-10-14 20:59:37 | Weblog
なんのことはない、PIN番号入力無しでSIMカード内のデータが読み出せることがわかったので、いくつか読み出してみることにしました。SIMカード内のデータは階層的なファイル構造を持って保存されており、下図のようにGSMとTelecomという2つの主要なDF(Dedicated Fike)というサブディレクトリを持っており、その中に各グループに属するEF(Elementary File)というファイル内にデータが記録されています。下図では、今回読み出してみたEFを示しています。EFICCIDはSIMカード固有の番号ですが、この情報はMF(Master File)の直下に配置されています。

それぞれのファイルの内容を読み出すには、ISO7816-4のコマンドを送ってアクセスします。SELECTコマンドを使ってEFを選択したのちに、そのファイルの構造に応じてREAD BINARYあるいはREAD RECORDコマンドを使ってファイルのデータを読み出します。ファイルの長さが不明の場合には、SELECTの後でGET RESPONSEを使って長さを調べておきます。実際の読み出し結果は次のとおり。(一部の番号はデタラメに編集してあります)

  • ICCIDはSIMカードに割り当てられた固有の番号です。ここではデタラメな値に編集してあります。
  • SST(SIM Service Table)は、そのSIMカードがサポートしている機能やサービスを示しています。
  • SPN (Service Provider Name)は事業者名で NTT DOCOMOになっています。
  • IMSI (International Mobile Subscriber Identity)は携帯の契約者に割り当てられた番号です。
  • PLMNselにはローミング可能な事業者番号が登録されているみたいです。
  • MISIDNは電話番号です。この例の表示は080-8869-7210に相当します。(適当な番号です)
  • SDN (Service DIaling Number)は、サービス番号です。この例では5件登録されていますが、最後の1件は空ですので、実際には4件入っています。

しばらくSDNの値を眺めていたら、UTF-16でコーディングされていることがわかりました。各レコードの2バイト目からレコードの説明がUTF-16で入っており、22バイト目が番号の長さ。サービス番号文字列が24バイト目から入っています。例えば、最初のレコードでは
  • 説明: 0x30C9, 0x30B3, 0x30E2, 0x6545, 0x969C, 0x554F, 0x5408, 0x305B (ドコモ故障問合せ)
  • 長さ: 3
  • 番号: 113
となっているのです。同様にして、
  • ドコモ総合案内・受付 -- 151
  • 海外紛失・盗難等 -- +81368326600
  • 海外故障 -- +81367181414
が登録されていることがわかりました。

サービス番号はAndroid端末では連絡帳のメニューから設定を開くと読み出すことができます。DoCoMoの携帯で開いてみると、同じ文面が表示されたのでした。



Android端末もSIMから番号を読み出して表示しているわけですね。


再度SIMをロックしてしまいそうになった

2015-10-11 16:15:45 | Weblog
新しいSIMカードにしたので今度はロックしないようにと思っていたのですが、STの提供しているサンプルSTM32011のの動作をちゃんと理解していなかったので、再びロックする寸前になってしまいました。そこで、新改めてサンプルの動きを確認することに。

SIMカード上のファイルへのアクセスは ISO7618-4で定められているコマンドを送信して行います。ISO標準は無料でダウンロードすることができませんが、GSMや3GPPのSIMに関する資料を参照すると必要なISO768-4のコマンドやその使い方も説明されているので、GSM11.11とかを参照すればISO標準を購入しなくてもSTM32011のコードを読んで理解することが可能です。

SIMカードにリセットがかかると、SIMカードはMF(Master File)という、ディレクトリ構成の最上位にあるファイルをアクセスできる状態にあります。STM32011のサンプルでは、いったんMFをSELECTコマンドで選択した後、GET RESPONSEコマンドを発行することでMFに関する情報を取得してますので、その内容を確認してみました。


22バイトの応答がありましたが、その内容は次のようになっています。

バイト位置意味長さ
1 -- 2未使用200 00
3 -- 4選択したディレクトリに割り当てあれていないメモリ量200 00
5 -- 6File ID23F 00
7ファイル種別101
8 -- 12未使用500 00 00 00 00
13以後の長さ109
14ファイルの特性1B3
15直下にあるDFの数103
16直下にあるEFの数109
17CHV, UNBLOCK CHV, 管理コードの数104
18未使用100
19CHV1ステータス181
20UNBLOCK CHV1ステータス18A
21CHV2ステータス183
22UNBLOCK CHV2ステータス190


CHV1ステータスが0x81となっていますが、これはPIN1が設定されており、すでに2回 PIN番号を間違えているので、残り1回間違えるとSIMロックがかかるという状態であることを意味しています。危ない崖っ淵です。ところが、ファイル特性バイトをみると0xB3となっており、CHV1の有効/無効を示すMSBが1になっています。ここがMSBだとCHV1は無効であるという状態を示しています。つまり、PIN番号照合をしなくてもカードにアクセスすることが可能な状態になっていたのです。サンプルのプログラムを改めて読んでみると、PIN番号照合が無効になっている場合には、いったんこれをわざと有効にしてから、照合をおこなうという作りになっていたのでした。それに気づかずに、PIN番号の照合をしている部分だけ直してアクセスを試行していたのでした。

比較のために、ロックしてしまったFOMAカードの方も確認してみました。



こちらも同様に22バイトが返ってきましたが...

バイト位置意味長さ
1 -- 2未使用200 00
3 -- 4選択したディレクトリに割り当てあれていないメモリ量200 00
5 -- 6File ID23F 00
7ファイル種別101
8 -- 12未使用500 00 00 00 00
13以後の長さ109
14ファイルの特性113
15直下にあるDFの数103
16直下にあるEFの数107
17CHV, UNBLOCK CHV, 管理コードの数104
18未使用100
19CHV1ステータス180
20UNBLOCK CHV1ステータス18A
21CHV2ステータス182
22UNBLOCK CHV2ステータス190


特性バイトが0x13となっておりCHV1(PIN1)確認が有効となっていることを示しています。またCHV1ステータスが 0x80となっており、もう試行回数が残っていないことを示しています。つまり、ロックされているこということです。

ATRを確認してみる

2015-10-09 21:40:16 | Weblog
一部ではありますがSIMカードの読み取りまではできました。しかし、IMSIの読み取りまではできませんでしたし、サンプルにちょっと手を加えて動かしただけなので、あまり自分の勉強にもなっていません。そこで、SIMカードの読み取りについては、もう少し深く掘り下げながら引き続き実験を続けていこうとおもいます。

そのためにもまずは足元を固めることにしました。これまではブレッドボードでしたがあまりにも場所を喰っていたので、ユニバーサル基板を使ってソケットをつなぎなおしました。



SIMカードとしてはFOMAカードを使っていましたが、このSIMはFOMAからLTEに機種変更した際に、古いガラケーと一緒に残してあったものです。そのため、このSIM自体が無効化されており、そのためにPINロックがかかった状態になっていたのかもしれません。改めて動作確認を進めるために、手持ちのマイクロSIMを使うべくサイズ変換のためのSIMアダプターも用意しました。今度使うSIMはデータ通信用に使っているIIJ Mioサービスのものですが、docomo網を使うためSIMもdocomoから提供されています。このSIMはおよそ3年前から使用しています。



今度は実験対象が現用のSIMカードなので、誤ってロックがかかることの無いように慎重に動作確認作業を進めていくことにします。まずは第一段階として、SIMカードの起動時の動きを確認するための、メッセージを追加してみます。SIMに電源を与えてリセット信号を加えると、SIMからリセットに応答するメッセージが送られてきます。このメッセージはATR (Answer To Reset)と呼ばれており、カードの動作に関する情報を保持しています。SIMにはクロックを与える必要がありますが、起動時にはおよそ9600pbs程度の速度になるようにして、通信を開始するようです。そして、ATRによって得られるSIMの動作状況を確認して、その後の実際の通信で使用する速度を決めて動作します。実際に実験してみると。。。



ATRとして20バイトの情報を受信して、その内容からその後の通信速度を100kに変更しています。ATRはバイナリ形式でエンコードされているので、これをエンコードしないとその意味を把握することはできません。ググってみたらデコードしてくれるサイトが見つかりました。素晴らしい。





詳しい意味はこれから勉強していきたいと思いますが、このSIMは 5V, 3V, 1.8Vの電源電圧に対応していることがわかります。4MHzクロック使用時の通信速度は125,000に相当となっていますが、実験ではAPBクロックとして32MHzを使っており、USARTは10分周に設定しているため3.2MHzクロックで動作します。そのため、125,000/4 × 3.2 = 100kbpsとなります。

試しにFOMAカードが返すATRも確認してみました。


同じように20バイトのデータが返ってきましたので、これをデコードしてみると...


こちらのカードは5Vと3Vだけの対応であり、1.8Vには対応していないことがわかります。

SIMカードを読んでみる -- 読み出し編

2015-10-05 00:12:54 | Weblog
SIMカードとマイコンとの接続ができたので、いよいよ実際の読み出しです。もちろん、読み出しのためのソフトウェアが必要となるのですが、前回の記事でも触れたSTやATMELから出ているアプリケーション・ノートにはプログラムも付属しているので、それをビルドすることで簡単に読み出し実験をおこなうことができます。

今回はSTが提供しているSTSW-STM32011をベースとして用いました。このサンプルはSTの評価ボード向けのコードとなっていますが、Nucleoボードは対象ボードに含まれていません。そのため、ちょっと手を加えてやる必要があります。わたしが、加えた修正は次のようなものです。
  1. platform_config.hにNucleo-F103RBで使用する端子割り当ての定義を追加。
  2. smartcard.c にてSC_Init()の最後でSC_PowerCmd(DISABLE)が呼ばれてSIMカードの電源を落としてしまうので、SC_PowerCmd(ENABLE)に修正。カード検出端子を使わないので、SC_Detect()は常にカード検出状態を返すように修正。
  3. main.c からカード検出に関わる割り込み設定と処理を削除。
以上のような修正で、ターゲットであるNucleo-F103RBに対応させることができますが、サンプルのメインルーチンではSIMカードのアクセスのためのコマンド送信とレスポンス受信の処理は行っているものの、なんの表示も行ってくれません。ですので、動作状況がわかるように、適宜トレースメッセージを出力するようにしてやりました。



サンプルプログラムは、ICCIDというSIMカード固有の番号と、SIMカードに登録された電話番号(IMSI)を読み取るように作られています。上記ログでは、ICCIDの読み取りに成功して、98 18 01 00 00 03 40 XX XX F2という値が表示されています。この番号はWikipediaで説明されているようにSIMカードに刻印されている製造番号の後半と似たような番号になるハズなのですが、カードに刻印されている番号は次のとおりであり、なんかちょっと違っています。



そもそも、ICCIDの最初の2桁は世界共通で89となるはずで、その後に国番号である81とドコモの事業者番号100が続くはずです。ところが、実際に読み取られた値をでは89 18 01 00となっており桁位置が入れ替わっていることがわかります。どうしてだろうかと思って調べてみるとGSM 11.11において ICCIDのコーディング方法が、このように規定されていることが確認できました。したがって、これで正しく読み取りできていることになります。

さて、ICCIDに続いてIMSIを読もうとしているのですが、それに失敗して動作を終了しています。IMSIの読み取りにはSIMカードに設定されたPIN番号の入力が必要なのですが、サンプルプログラムではこの番号が8桁の0になっていました。ドコモのピン番号はディフォルトで0000ですので、これが一致しないのでエラーになっているんだろうと想像していました。ところが、プログラムで与えるピン番号を修正してもIMSIの読み取りができずに SW1 = 98, SW2 = 40というエラーが返ってきてしまいます。GSM11.11でこのエラーコードの意味を調べてみると、PIN番号の確認試行回数をオーバーしてしまっているというエラーのようです。

あぁ、すっかり忘れていました。PIN番号を3回間違えると、ロックがかかってしまうのですね。確かにプログラムの動作を確認するためのメッセージを追加したりしながら、何度も実行していましたから、気づかないうちにロックしてしまったようです。

どうやらSIMカードの内容のほとんどはPIN番号が正しくないと読み出せないようです。それでもGSM 11.11を調べてみると事業者名(SPN: Service Provider Name)だけはPIN番号無しでも読み出せることがわかったので、SPNを選択して、これを読み出すためのコマンドの送受処理を追加してやりました。



最後に出力されている 4E 54 54 20 44 6F 43 6F 4D 6Fの部分をASCII文字にすれば、NTT DoCoMoとなります。

このようにして、いまどきのマイコンのUSARTを使えばSIMカードの内容を読み出すことができることを確認することができました。ただし、読み出しのためにはSIMカードに保存されている情報のファイル形式に関する情報が必要であり、それに対応するISO/IEC 7816コマンドを送り出してやる必要があります。また、ほんとんどの情報の確認にはPIN番号が必要となることもわかりました。SIMカードの仕掛けについてチョット理解することができた実験でした。

SIMカードを読んでみる -- マイコン接続編

2015-10-04 09:52:49 | Weblog
近頃のマイコンには、UARTの機能としてSmart card対応機能をもった機種がいくつもあります。そんな中から、今回は積み基板となっていたNucleo-F103RBを初めて使ってみました。

結論から先に書いてしまうと、つなぎ方は次のとおりです。

Nucleo-F103RBDirectionSIM Socket
PinFunctionPin
PB5GPIO Output-->C1 (Vcc)
PB9GPIO Output-->C2 (Reset)
PB10USART3 TX<--->C7 (I/O)
PB12USART3 CK-->C3 (Clock)
GNDGND---C5 (GND)


SIMソケットは8ピンですが、実際には5ピンを使うだけでつなぐことができます。USARTで使うのはTXとCKの2つの信号線だけです。TXの端子を送信/受信動作で切り替えて使う半2重でデータを送受します。C1端子は、SIMカードのVCCですが、今回はGPIOを使って電源のON/OFFをしています。SIMカードの電気的インターフェイスはISO/IEC 7816-3で定められていますが、その仕様ではVCC電圧は、カードのクラスに応じて5V, 3V, 1.8Vの3種類となっています。今回つかうNucleoは3.3V動作ですので、GPIOのHレベルもほぼ3.3Vとなり、その電圧がSIMカードに加わってしまう事になりますが、まぁ問題はないでしょう。

ISO/IEC7816ではC6端子は、Vpp (Programming Voltage)となっており、書き込み時の電圧を供給する端子となっていますが、一般的なSIMカードではVCC端子電圧を使っての書き込みが可能であり、Vpp端子は使う必要は無いようです。SIMカードの基本仕様となっているETSIのGSM 11.11では、GNDにはつなぐなと書かれています。使用したSIMソケットにはカード挿入を検出するための端子が用意されていますので、カード挿入を検出してからVccを加えるというような処理も可能ですが、今回の実験では同端子は使用していません。

実はSTM32F103の場合にはST社からもSIMカードのつなぎ方を説明したアプリケーション・ノート(AN2598)が出されています。このAPノートではST8024というドライバICを使ってSIMカードを使う例が示されていますが、電圧に問題がなければ直接つないでしまって構わないようです。同様にATMELのSAM3Sシリーズの場合にもSAM3S-EKを使用したアプリケーション・ノート(AT02410)が出ています。こちらの説明ではドライバICを使わずにマイコンを直結していますので、ドライバはなくても良さそうと判断した次第です。



このようにしてSIMカードのつなぎ方がわかったので、Nucleo-F103RBとSIMをブレッドボードをつかってジャンパで接続してみました。手頃な大きさのボードを持っていないので、無用にデカイです。




慣れ親しんだEclipse+Jlinkで開発している都合で、ST-Linkは使わずにJ-Linkで書き込み/デバックをしています。ST-Link部分は電源供給のためにのみ使用。次回の記事では、実際のSIMカードの読み取り結果について報告します。

SIMカードを読んでみる -- ソケット編

2015-10-03 20:36:59 | Weblog
しばらく前のことですが、秋月でSIMカードのコネクタが売られていることに気づいたので購入してありました。今週になってようやくと思い立って、マイコンとの接続実験をしてみることにしました。たしか買ったのは3週間ほど前だったと思うのですが、Webで確認するとちっとも在庫数が減っていません。このSIMソケットは標準サイズのソケットなので、マイクロSIMや ナノSIMサイズが主流となった今では、製品に使われることもないのでしょう。そんな背景もあって秋月に流れてきて「お宝マーク」のついたパーツとして販売されているのではないでしょうか。まぁ、普通の人にはなんの役に立たないんですが、好事家の実験材料としてはおもしろいのではないかと。

このソケット表面実装部品なので、残念ながら手軽に接続実験というわけにもいきません。端子の部分は0.6mmピッチになっています。そこでまずはDIP変換基板を作成。



標準サイズなので、現在自分が使っているスマホのSIMカードはそのままではこのソケットには入れられません。アダプタを使う必要があります。実験で誤ってSIMカードを壊してしまっても困ります。そこで捨てずにとってあった古いガラケーを引っ張りだして、中からSIMカードを引き出しました。DoCoMoのFOMAカードです。DoCoMoの旧ロゴが印刷されているのが、時代を感じさせます。



この写真をとって気づいたのですが、どうせ使えないSIMカードで実験するのだったら、SIMソケットを使うまでもなくSIMの端子にそのままワイヤをハンダ付けしてしまうのもひとつのテですね。

材料は揃ったので、次回の記事はマイコンとの接続編です。