★【 My Biz Blog 】★

興味のあるビジネス情報を伝えていきます♪
(IoT,Azure,Windows 10, etc...)

WEC2013 on VMWareは可能か?(7)

2014-02-13 01:05:53 | Windows Embedded CE/Compact
前回作成したWCELDRを、まずはCeSysツールでVHDファイルに書き込み、

さらにVHDファイルをvmdkファイル(VMWareの仮想ハードディスク)に変換し、

VMWare Playerで読み込ませてみました。


・・・が、Boot SourceとしてAM79C970が表示されない・・・


調べていくと、どうもPCIのID指定に誤りがあった模様。

前々回の記事「WEC2013 on VMWareは可能か?(5)」で、

WCELDRのソースコードの一つ、init.cの中で、

ネットワークアダプタのライブラリを使えるようにするために

Device_t構造体配列に、値を追加でセットしました。

こんな感じで。

{ L"AM79C970", DeviceTypeEdbg, IfcTypePci, 0x10222000, &s_AM79C973 }

ここで、4つ目のデータがPCIデバイスを識別するためのIDで、

ベンダーIDとデバイスIDを指定しているのですが、

実はデバイスID-ベンダーIDの順でつなげた値を指定しないといけなかったみたい・・・。

なので、0x20001022を指定しないといけなかったんですね。・・・。


再度WCELDRをビルドしなおして、試したところ、

以下のように、WCELDRのコンソールメニュー上で

AM79C970が表示されました。




続いてコンソールメニューでDHCPを無効、静的IPアドレスを設定して、

ネットワークブートさせる設定として処理を継続させたところ・・・




通常であれば「BOOT ME...」というメッセージが表示されるのですが、

何も表示されない・・・。



今回使ったKITL用のネットワークアダプタのライブラリのせいでしょうか。

AM79C970からAM79C973にリプレイスされたという記載があって、

AM79C970もサポートしてるもんだと思ってたのですが、

もしかしてサポートしてないんだろうか(汗)。


WCE6.0まではAM79C970のライブラリがついていたはずなので、

そちらを移植するか・・・・

現行ソースをデバッグしてみるか・・・データシートがあっても難しいかなぁ・・・


ちょっと・・・いや、かなり思案中

WEC2013 on VMWareは可能か?(6)

2014-02-09 00:30:00 | Windows Embedded CE/Compact
前回の記事で、WCELDRにネットワークアダプタのライブラリを追加してみました。

残念ながら、そのままWCELDRをビルドしても、

リンクフェーズでエラーとなりました。


どんなエラーかというと、

『unresolved external symbol_OALStall referenced in ...』

つまり、コンパイルフェーズで生成したオブジェクトの中に、

OALStall関数が見当たらないということです。



もともと、追加したネットワークアダプタのライブラリは、

KITL用に作成されたものです。

で、ライブラリ内にOAL(OEM Adapted Layer)が提供する関数を使用しているのですが、

WCELDRはOSが起動する前のブート用のコードなので、

そのOALの関数が含まれていないんですね。


なので、この関数を何かしら実装する必要があります。



不足しているOALStallという関数が何をする処理かというと、

パラメータで指定された時間(単位はマイクロ秒)だけ

Waitする処理です。


AM79C973のライブラリのソースコードを確認すると、

いろんな箇所でこの関数をコールしてますね。

このデバイスの特性上、数10マイクロ秒で状態が変化するのを

待ったりしているんでしょうね。



じゃあ、どうやってこの関数を実装するかというと、

WCELDR内に既に実装されているソースコードを活用しようと思います。


WCELDRのBLDRに、init.cというソースコードがあり、

その中に

void
OEMBootStall(
uint32_t delay
)
{
  uint32_t eax, ebx, ecx, edx, esi, edi;

  eax = 0x8600;
  ecx = (delay >> 16) & 0xFFFF;
  edx = (delay >> 0) & 0xFFFF;
  BootBiosInt15(&eax, &ebx, &ecx, &edx, &esi, &edi);
}

という実装があります。

この処理は、BIOSのWait機能(割り込みルーチン15H function 86H)を呼び出します。

ちょうどいい関数ですね(笑)。


OALStallの関数インターフェースは、

%WINCEROOT%¥platform¥common¥src¥inc¥oal_timer.h

に定義があるので、この定義通りの関数を作成し、

関数内でOEMBootStallを呼び出すようにしてやればよさそうです。


ライブラリのソースコードやinit.cになるべく手を入れたくないので、

別途oalfunc.cというファイルをWCELDRのBLDRのフォルダ内に作成し、

中に以下のような処理を実装してみました。


#include "bldr.h"

extern void OEMBootStall( uint32_t delay );

VOID OALStall( UINT32 uSecs )
{
  OEMBootStall( uSecs );
}



このファイルがコンパイルされるように、

consoleおよびserialフォルダ内のsourcesファイルの

SOURCESパラメータにoalfunc.cを追記します。


そして再度buildし、エラーが解消されることを確認してください。




これでVMWare Player用のWCELDRができた(はず)なので(笑)、

次回をこれを実際にVMWareでロードし、ネットワークブート可能かを

確認したいと思います。





WEC2013のVS2013対応

2014-02-07 12:30:00 | Windows Embedded CE/Compact
Windows Embeddedの公式blogに、

Windows Embedded Compact 2013にアップデートに関する記事が

掲載されています。

Coming soon: Visual Studio 2013 and other updates to Compact 2013



最新のVisual Studio 2013に対応するというのが主なアップデート内容。

Visual Studioの最新版に対応していくというスタンスは、

とてもありがたいです。


なぜなら、WECはリリース後15年間の長期にわたり供給されるんですが、

対応しているVisual Studioが古いままだと

入手が難しくなって仕様変更等の際に困るから(汗)。


その他のアップデートとしては、

組込機器で結構使用されているFreescale社のCPU「i.MX」シリーズの

i.MX6 SABLE lite用のBSPとTIのSDP44xxシリーズ用WiFiドライバが

追加されるのかな。






WEC2013 on VMWareは可能か?(5)

2014-02-05 19:00:00 | Windows Embedded CE/Compact
※2014.2.8 加筆修正しています。
※2014.2.13 さらに加筆修正しています。



前回までで、WCELDRのビルドと組込方法まで解説しました。

今回からは、WCELDRの変更方法を解説します。



今回、Plattformフォルダにある、BSPのソースコードを変更するのですが、

CEPC用BSPのソースコードを変更してしまうといろいろと面倒があるので、

まずBSPを複製してVMWare用のBSPを生成することにしました。


ツールメニューから、

[Platform Builder]→[Clone BSP]を選択してください。

以下のようなダイアログが表示されます。



[Source BSP]はコンボボックスになっているので、

選択肢からCEPCのBSPを選択します。


New BSP Informationの各項目は以下のような意味です。

・Name:BSPの名前を入力してください。

・Description:BSPの概要を入力してください。

・Platform directory:Platformディレクトリ配下にBSP専用のフォルダが生成されますが、そのフォルダ名を入力します。

・Vender:BSPを作成した会社名などを入力します。

・Version:バージョン番号を入力します。自由に入力してください。


[Clone]ボタンをクリックすると、

Source BSPのファイルを使用し、ダイアログで設定したBSPとして複製されます。

複製が完了したら、一度Visual Studioを立ち上げ直し、

複製したBSPでOSイメージのプロジェクトを作成してください。




複製が完了したら、WCELDRの変更をしていきます、


以前の記事で、VMWare Playerがエミュレートしてるネットワークアダプタは

AMD AM79C970Aで、KITL用に提供されているAM79C973用ライブラリが

流用できそうということを書きました。

ということで、WCELDRにネットワークアダプタのライブラリを追加します。



KITL用に提供されているAMD AM79C973用ライブラリのソースコードは

以下のフォルダに格納されています。

WINCE800¥platform¥common¥src¥common¥ethdrv¥am79c973


このコードはビルドされると、以下のフォルダにライブラリ(lib)を生成します。

$(_PLATCOMMONLIB)¥$(_CPUDEPPATH)¥oal_ethdrv_am79c973.lib


WCELDRにこのlibを組み込んで、

このlibが提供する関数を呼び出すようにする必要がありますが、

WCELDRは自身をRAMに展開するXLDRと、

OSイメージをRAMに展開する機能を担うBLDRの二つのモジュールで構成されているので、

ネットワークアダプタのlibは、BLDRに組み込みます。



■□■ libの組み込み ■□■ 

で、どのようにするかというと、

BLDRモジュールをビルドするためのsourcesファイルに書き込むことで実現します。

コンソール版の場合は、

WINCE800¥platform¥CEPC¥src¥boot¥bldr¥console¥sources

シリアル版の場合は、

WINCE800¥platform¥CEPC¥src¥boot¥bldr¥serial¥sources

を編集します。


sources内のTARGETLIBSに、

以下の行を追加してください。

$(_PLATCOMMONLIB)¥$(_CPUDEPPATH)¥oal_ethdrv_am79c973.lib ¥



■□■ lib提供関数への対応 ■□■ 

BLDRがこのlibが提供する関数を呼び出せるようにします。


①以下のヘッダーファイルを新規に作成し、

 libが提供する関数の定義を書き出します。

 WINCE800¥platform¥common¥src¥common¥bldr¥inc¥bootTransportEdbgAm79c973.h

 書き出す関数は以下の通りです。

 詳細なインターフェースは、先に記載したlib用ソースコードを参照ください。

  ・AM79C973InitDMABuffer
  ・AM79C973Init
  ・AM79C973SendFrame
  ・AM79C973GetFrame



②次に以下のファイルを編集します。

 WINCE800¥platform¥CEPC¥src¥boot¥bldr¥init.c


 ※他のネットワークドライバのlibを使用するコードが書かれているので、

  それを参考にしながら編集します。

 
 作成したヘッダーファイルをincludeします。

 #include <bootTransportEdbgAm79c973.h>



 そして、ネットワークアダプタのインターフェース登録用の

 BootEdbgDriver_t構造体の変数を作り、

 libが提供する関数のアドレスをその変数にセットします。

 static
 const
 BootEdbgDriver_t
 s_AM79C973 = {
  AM79C973InitDMABuffer,
  AM79C973Init,
  NULL,
  AM79C973SendFrame,
  AM79C973GetFrame,
  NULL
 };


 次に、定義されているDevice_t構造体配列に、作成した構造体変数等をセットします。

  { L"Am79C973", DeviceTypeEdbg, IfcTypePci, 0x20001022, &s_AM79C973 }

 一つ目のパラメータは、メニューで表示するネットワークドライバ名です。

 二つ目のパラメータは、デバイス種別です。

 ここでは他のネットワークドライバと同様に「DeviceTypeEdbg」をセットします。

 三つ目のパラメータは、そのデバイスが接続されるインターフェースの種別です。

 VMWare PlayerではPCI接続としてエミュレートされているはずなので、

 IfcTypePciをセットします。

 四つ目のパラメータは、ベンダーIDとデバイスIDをつなげた値です。

 ただし、デバイスID→ベンダーIDの順でつなげてください。

 五つ目のパラメータが、先に作成したBootEdbgDriver_t構造体変数の

 アドレスをセットします。



ここまで完了したら一度ビルドを通してみてください。

⇒残念ながら、リンクフェーズで失敗するかと思います。



次回は、このリンクフェーズのエラーについて見ていきます。




WEC2013 on VMWareは可能か?(4)

2014-02-03 23:21:36 | Windows Embedded CE/Compact
前回の記事では、WCELDRの作り方まで解説しました。

今回は、このWCELDRをブートメディアに組み込む方法について解説します。


まず、組み込むブートメディアの準備から。

CEPC用のブートメディアとしては、

普通のHDDや、組込用PCでよく見受けられるCFが挙げられますが、

ターゲット機器がUSBブート可能なのであれば、

USBメモリをブートメディアに使用することも可能です。

⇒例えばBIOSがUSBブートに対応していなければ、

 USBブートはもちろんできません・・・。


ブートメディアが決まったら、

そのメディアをフォーマットします。

ポイントは、ブート対象パーティションについて

 ・Activeにマークする

 ・FATまたはFAT32でフォーマットする

ことです。

※WCELDRは、exFATをサポートしていないので注意が必要です。

Windows Vista以降のOSであれば、DiskPartというコマンドラインツールを使用して、

上記の設定が可能です。

以下に、DiskPartのコマンド例を記載しておきます。

ここでは、対象ブートメディアをDiskPartが実行できるPCに接続し、

Xドライブとして認識されている場合です。

SELECT VOLUME X
CLEAN
CONVERT MBR
CREATE PARTITION PRIM
SELECT PARTITION 1
FORMAT FS=FAT32
ACTIVE
ASSIGN LETTER=X

この例では、CLEANコマンドを実行するため、

対象ブートメディア上に存在しているすべてのパーティションが一度消される点に

ご注意ください(大事なデータが入っていて消えちゃっても、責任取れません・・・)。





つぎに、ブートメディアにWCELDRを入れる方法です。

単純にWCELDRのバイナリをブートメディアにコピーしても、ブートしません。

WEC2013のToolkitに付属している、CeSysというツールを使用します。


まず、CEPCのBSPを使用したOSイメージのプロジェクトをVS2012で開いている状態で、

[Build]メニューから[Open Release Directory in Build Window]を選択してください。


次に、CeSysツールを実行します。

CeSysツールは以下のフォルダに存在します。

%WINCEROOT%¥platform¥CEPC¥src¥boot¥tools¥bin¥i386

ブートメディアがXドライブとして認識されていて、

WCELDRのコンソール版を組み込む場合、

CeSysツールを以下のようなパラメータをつけて呼び出します。

>CeSys X: wceldrC -f


CeSysツールを実行する場合の注意点として、

エクスプローラなどで対象ブートメディアを開いていると、エラーを出力して失敗しますので、

エクスプローラを含む他のアプリケーションがブートメディアにアクセ椅子していない状態で

CeSysツールを実行指定ください。


上記でブートメディアの作成は完了です。

あ、最後に、ブートメディアにOSイメージ(nk.bin)を入れてください。

ブートメディアのブートパーティションの直下に、

リネームせずにそのまま入れてください。