PHS経由でネットに接続できるEthernetアダプタのファームウェアをハック・後編 ―― 画像付きメールを利用した遠隔監視システムの製作事例

中本伸一

tag: 組み込み

技術解説 2007年11月27日

● SilentCを拡張してカメラを制御できるようにする

 SilentCは,ユーザが自由に機能を拡張できるように考慮されています.リセット時にUserDriver.binというファイルが存在していれば,その内容をユーザ・ドライバ領域にプログラムします.こうしてインストールされたドライバは,SilentCと連携して動作します.この方法は,いろいろなセンサ・デバイスなどを接続してSilentCで利用する際にも便利です.

 インストールされたユーザ・ドライバにアクセスするには,SilentCのUserDriver関数を利用します.書式は表2の通りです.

関 数 int UserDriver(char vector, int arg);
パラメータ vector=ベクタ番号 arg=ドライバに渡す引き数
戻り値 ユーザ・ドライバからリターンする際のDレジスタの値を返す
サンプル char *ptr=MemoryAlloc(128);         // 128バイトのメモリを確保する UserDriver(0,ptr); // そのポインタを0xf400から始まるユーザ・ドライバに渡す PrNum(UserDriver(1,0));   // 0xf403から始まるユーザ・ドライバを呼び出し,   //戻り値を表示する
表2 ユーザ・ドライバにアクセスする関数の詳細



 vectorは,ドライバの先頭から何番目のドライバを呼び出すかを指定します.ユーザ・ドライバを作成する際に先頭番地(0xf400)から3バイトずつJMP命令を並べておき,例えばvectorに0を指定すると,SilentCはJSR 0xf400を実行します.同じようにvectorに1を指定すると,JSR 0xf403を実行します.複数のドライバを作成してそれらへのジャンプ・テーブルを参照し,呼び出す仕組みです.

 argにはユーザがドライバに渡したい値を指定します.例えば,MemoryAllocで確保した領域をSilentCでユーザ・ドライバに渡してその領域にデータをセットしてもらい,その結果をSilentCが利用するという使い方になります.戻り値はユーザ・ドライバから戻る際のDレジスタの値をそのまま返します.デバイスのタイムアウトなどの判定に利用できます.

 http://www.silentsystem.jp/download.htmからJPEGカメラ用のドライバを入手してOS-1に一度インストールしておけば,その後は表3で説明する機能がSilentCから利用可能になります.これらの機能を利用して,SilentCでカメラ画像をメールに添付して返信する機能を実現します.

関 数 char *UserDriver(0, char *buf);
処理内容 カメラ・ドライバを初期化する
パラメータ buf=カメラからのシリアル入力のためのバッファへのポインタを与える. バッファ・サイズは128バイト固定長.bufに0を与えると,カメラをクローズする(終了処理)
戻り値 初期化に成功すると0を返す.bufに0を与えた場合は使用していたシリアル・バッファのポインタを返すので,必ずこのポインタでMemoryFreeを呼び出してバッファを解放すること
関 数 void UserDriver(1, char res);
処理内容 カメラのシャッタを切る
パラメータ res=画像の解像度を指定する 0= 80× 64 1=160×128 2=320×240(QVGA) 3=640×480(VGA)
戻り値 なし
関 数 int UserDriver(2, char *jpegbuf);
処理内容 JPEGデータを受け取るバッファをセットする
パラメータ jpegbuf=JPEGデータを受け取るためのバッファへのポインタを与える.バッファ・サイズは,BASE64モードの場合は90バイト,バイナリ・モードの場合は60バイト確保する必要あり.0を与えると,設定されたJPEGデータ・バッファのポインタを返す
戻り値 成功すると0を返す.jpegbufに0を与えた場合は使用していたJPEGバッファのポインタを返すので,必ずこのポインタでMemoryFreeを呼び出してJPEGバッファを解放すること
関 数 int UserDriver(2, 1);
処理内容 JPEGデータの受信を開始する
パラメータ なし
戻り値 JPEGデータの総バイト数を返す
関 数 int UserDriver(2, 2);
処理内容 受信したJPEGデータをバッファにセットする(バイナリ・モード). 60バイトずつのパケット単位でセットされる
パラメータ なし
戻り値 セットされたバイト数を返す.通常は1パケット・サイズである60が返る. 60以下の場合は,最後のデータ・パケットを意味する. 0の場合は,直前のパケットが最終パケットだったということを意味する
関 数 int UserDriver(2, 3);
処理内容 受信したJPEGデータをBASE64エンコードしてバッファにセットする(BASE64モード). 80バイト+CR+LF単位でセットされる.メールで添付ファイルを送る際に利用する
パラメータ なし
戻り値 エンコードされたバイト数を返す.BASE64文字列の長さではないことに注意. 通常は1パケット・サイズである60が返る.60以下の場合は,最後のデータ・パケットを意味する.0の場合は,直前のパケットが最終パケットだったということを意味する
関 数 int UserDriver(2, 4);
処理内容 JPEGデータの受信を終了する
パラメータ なし
戻り値 必ず0を返す.パケット受信終了後に必ず呼び出すこと
関 数 void UserDriver(3,0);
処理内容 シリアル・ブリッジ・モードへ移行する(カメラのシリアルとOSIO-1のシリアルをブリッジする).スピードは57,600bpsとなる
パラメータ なし
戻り値 なし
表3 JPEGカメラ用のドライバで利用できる機能
組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日