依岡 壯(よりおか つよし)
1 はじめに
近年、パソコンの普及に伴い、パソコンに接続して使用するパソコン周辺機器も普及しています。プリンタやデジタルカメラも、“パソコンに接続して使用する”という意味で、パソコン周辺機器といえるでしょう。たとえば、プリンタは、パソコン上にあるファイルを印刷する際に使用しますし、デジタルカメラで撮影した画像ファイルをパソコンに保存するといった使い方をします。筆者を含め、このような使い方をする方が、多いのではないでしょうか。
つまり、デジタルカメラで撮影した画像を印刷するには、パソコンを経由しないと印刷できないということになります。そこで考えられたのが、パソコンを介さずに、デジタルカメラから直接プリンタに印刷データを転送するという手法です。この手法は、数社から提案され製品化もされていますが、メーカ独自仕様であったため、他メーカとの互換性がないということで普及には至りませんでした。
そこで考えられたのが、CIPA規格DC-001-2003(以下、PictBridge)です。本規格の主なコンセプトとしては、以下の通りです。
パソコンを介さずにプリンタ-デジタルカメラの接続でプリントアウトができること。データ転送を担う物理レイアに非依存。メーカや機種に関係なく接続が可能。
なお、現在リリースされているPictBridge規格のVersion1.0では、通信インターフェースはUSBが前提とされています。USB上にPictBrigeを構成する場合、図1-1で示すように、デジタルカメラなどの印刷対象データが保存されている機器(以下、DSC:Digital Still Camera)と印刷対象データを印刷するプリンタ(以下、Printer)とが、USBケーブルで接続された構成になります。
2 当社のPictBridgeソリューション
2.1 開発の経緯
当社では以前より、USBホストドライバのソフトウェアを開発・販売しており、プリンタ及びプリンタ関連製品や、デジタルカメラ関連製品などにUSBホストが搭載される事例が数多くありました。デジタルカメラとプリンタのダイレクト接続は、USB On-the-Goとともに、PCレスのUSB接続例として、市場からの要望や問い合わせなどが多いものでした。
組込み用のUSBホストドライバ市場を開拓し、プリンタメーカ各社を顧客にもっていた当社としては、是非対応したい規格として登場したのがPictBridgeでした。このような経緯から、当初はUSBホストドライバを販売するプリンタメーカに対して、プリンタ側のPictBridgeを開発し、その後デジタルカメラ側の販売を開始しました。
2.2 採用事例
開発経緯の通り、当初はプリンタメーカへの販売を中心にしてきましたが、デジタルカメラ側の販売を開始すると、携帯電話やDVDレコーダーなど、デジタルカメラ以外での引き合いが増加しています。PictBridgeに対応すれば、PictBridge対応のプリンタとはメーカを問わず接続でき、静止画像を手軽に印刷できるという特徴が、画像を取り扱う幅広い機器から好評を得ている結果です。
2.3 今後の展開
今後はその傾向はさらに強まり、携帯電話やデジタルTVなどでの更なる採用のほか、計測データや医療機器のデータを画像として印刷するといった用途でのPictBridge採用はすでに広まりつつあります。ゲーム機や防犯カメラなどにも用途はあるかもしれません。
また、画像出力側(プリンタ側)も紙に出力するだけではなく、ディスプレイへの出力に利用することもできます。つまり、JPEGやPNGといった画像フォーマットを入力する機器と出力する機器を接続する標準規格と捉えることが可能です。また、PTP/IPの仕様が同じくCIPAで策定されたことにより、PictBridgeをIP上、つまりEthernetや無線LAN上でサポートする道も開かれています。
3 ソフトウェア構成
PictBridegeのソフトウェア構成としては、図3-1のようになります。大きく分けて以下の4つのモジュールに分類されます。
3.1 USB Host/Function
データ転送を行なう物理レイヤ。PrinterはUSBホスト、DSCはUSB Functionになります。
3.2 SIC(USB Still Image Capture device class)
USB-IF(USB Implementers Forum)によって策定されたクラスドライバ。PTPとセットで使用されます。
3.3 PTP(Picture Transfer Protocol)
PIMA(Photographic and Imaging Manufactures Association)によって策定された画像転送における標準プロトコル。
3.4 PictBridge
CIPA(Camera & Imaging Products Association)によって策定された画像入力デバイスと出力デバイスとをダイレクトに接続して容易にデジタルプリントを実現するための規格。CIPA DC-001-2003というのが正式名称であり、"PictBridge"は愛称です。また、規格発表前は、"DPS"という仮称が使用されていたため、本章では"DPS"という名称も使用しています。
4 モジュール概要
ここからは、PictBridgeにおける動作の詳細を述べていきます。3章のソフトウェア構成で示した、1.USB Host/Function、2.SIC、3.PTP、4.PictBridgeの各モジュールにおいて、PictBridgeの動作に必要な機能を見ていきましょう。
4.1 USB Host/Function
システムを構成する上で必須となる機構としては、以下の5点です。
4.1.1 機器の挿入/抜去の検知
USB機器の挿入及び抜去をアプリケーションに通知する機構。アプリケーションは、挿入をトリガにして、データ送受信準備を行い、抜去をトリガにして、確保したリソースの開放などの処理を行います。
4.1.2 標準ディスクリプタの実装
すべてのUSBデバイスが、共通で認識しなければならない標準ディスクリプタが存在します。
4.1.3 Control / Bulk / Interrupt 転送の実装
USBホストとUSBデバイス間のデータ転送方式としては、次の4方式が定義されています。
- Control転送
USB ホストが、USBデバイスに対してデバイスリクエストと呼ばれるコマンドを発行する際に使用される転送方式。 - Bulk転送
大量のデータ転送を行う際に使用する転送方式。Interrupt転送やIsochronous転送が一定時間内でのデータ転送を保障するのに対して、バルク転送では転送タイミングが保障されません。その代わり、USBバスがあいているときに目一杯の帯域幅を使用してデータを転送することができます。 - Interrupt転送
一定周期でデータ転送を行う際に使用する転送方式。ここでのInterruptは、“とぎれとぎれ”といった意味になります。 - Isochronous転送
音声やビデオ画像のように、データの正当性よりもデータが届く周期が保障されることが重要な用途に使用する転送方式。特徴としては、他の3つの転送と異なり、エラー発生時のリトライ等の処理は行いません。ただし、PictBridgeがベースとするSICでは、Isochronous転送は使用しないため、Isochronous転送が実装されていなくともPictBridgeを実現することは可能です。
4.2 SIC
SICでは、次の4つの機構が必要になります。
パイプの初期化とデータ転送
SICでは、エニュメレーション用のControl転送×1 (以下、Control)とデータのInputとOutput用のBulk転送×2 (以下、Bulk-INとBulk-Out)とUSBデバイスからのEvent通知用のInterrupt転送×1 (以下、Intr-In)との計4つのパイプ(データ転送路)を確保する必要があります。
クラス依存のデバイスリクエストの実装
SICでは、次のクラス依存のデバイスリクエストが定義されています。
表4-1 SICクラス依存のデバイスリクエスト
リクエスト | 概要 |
---|---|
Cancel Request | データ転送の中断 |
Get Extended Evnet Data | 拡張イベントデータの取得 |
Device Reset Request | デバイスのリセット |
Get Device Status Request | デバイスのステータスの取得 |
「Get Extended Evnet Data」については、具体的な使用方法が明記されていないため、未実装でも動作上問題はありません。
プロトコルの実装
SICは、上位にPTPが実装されることを前提に規格化されています。このため、SICとPTPとのインターフェースは明確に分離されておらず、プロトコルの実装については、SICに分類されるか、PTPに分類されるかはシステム設計に依存します。ここでは、SICの機構として説明します。
一つのトランザクションは、「Operation Requestフェーズ」(または、「Commandフェーズ」)、「Dataフェーズ」、「Responseフェーズ」から構成されます。ただし、Dataフェーズがないものもあります。このため、各フェーズ間の状態遷移としては、右の図のようになります。
各フェーズのデータをUSBバス上に転送する際には、コンテナと呼ばれるフォーマットで転送対象のデータをカプセル化する必要があります。データ構成としては、12バイト長データを先頭に付加して転送する形式になります。ここでは、この12バイトデータのことをコンテナヘッダと呼ぶこととします。つまり、USBバス上には以下のような形式のデータがUSBホストとデバイス間でやり取りされます。
Event構成
SICでは、トランザクションとは別に、Eventが定義されています。Eventは、主にDSCからPrinterに非同期に通知されます。例えば、メディアが抜かれたことを通知するStoreRemovedやファイルが追加されたことを通知するObjectAdded等があります。Eventのデータ形式は、以下の図のような形式になります。
4.3 PTP
PTPでは、通信媒体で接続された2つのデバイスをInitiatorとResponderと呼んでいます。Initiatorは、コマンドを要求するもの、Responderは、それに応答するものと定義されています。PictBridgeでは、InitiatorがPrinter(USB Host)で、ResponderがDSC(USB Function)にあたります。
PTPでは、次の5つの機構が必要になります。
セッションのオープン/クローズ
InitiatorとResponder間は、セッションを確立した後に通信が行われます。OpenSession オペレーション後にセッションが確立されます。この際、セッションは、SessionIDという32-bitの番号によって管理されます。このSessionIDは、Initiator(USB Host)によって割り振られるので、USB Host側で、SessionIDがユニークに割り当てられるように管理する必要があります。
データ転送インターフェース
PTPは、USB、IEEE1394、IrDA、RS232Cなどの通信媒体には依存しない仕様となっています。このため、システム設計時には、通信媒体に非依存になるような構成にする必要があります。
Operation Requestの実装
PTPで定義されているものの中から、PictBridgeで使用するOperation Requestを表記します。
表4-2 Operation Request
リクエスト | 概要 |
---|---|
GetDeviceInfo | USBデバイスのストレージ情報取得 |
OpenSession | USBホストとデバイス間のセッション確立 |
CloseSession | USBホストとデバイス間のセッション閉鎖 |
GetStorageIDs | 有効なStorageIDのリスト取得 |
GetStorageInfo | 特定のストレージ領域のデータセット取得 |
GetNumObjects | 存在するオブジェクトの総数取得 |
GetObjectHandles | 存在するObjectHandleの配列の取得 |
GetObjectInfo | デバイスからのオブジェクト情報の取得 |
GetObject | デバイスからのオブジェクトの取得 |
GetThumb | デバイスからのサムネイルの取得 |
SendObjectInfo | InitiatorからResponderにオブジェクトを送信する際に最初に使用する操作 |
SendObject | デバイスにオブジェクトを送信 |
GetPartialObject | デバイスからオブジェクトの一部を取得 |
Eventの実装
PictBridgeで使用するEventを表記します。このうち、RequestObjectTransferのみが必須となります。
表4-3 Event
リクエスト | 概要 |
---|---|
ObjectAdded | デバイスに新しいオブジェクトの追加 |
ObjectRemoved | デバイスからオブジェクトを削除 |
StoreAdded | メディアの挿入 |
StoreRemove | メディアの抜去 |
ObjectInfoChanged | オブジェクト情報の変更 |
RequestObjectTransfer | オブジェクトの転送要求 |
オブジェクトフォーマット
PTPの仕様書では、扱えるデータとして、画像や動画や音声、テキストなど多くのオブジェクトフォーマットが定義されています。イメージもしくはデータオブジェクトのフォーマット形式をObjectFormatCodesという16ビット長データに格納し、管理します。
4.4 PictBridge
本章では、PictBridgeを、Connection、Discovery、PTA、SOA、アプリケーションの5つの機構に分類するものとします。どのような構成にするかはシステム設計に依存します。ConnectionとDiscoveryは、DSCとPrinterとの通信を確立するまでに必要な機構で、PTA とSOAとアプリケーションは、DSCとPrinter間のデータのやり取りを行なう機構になります。
Connection
USBデバイスの挿抜を上位のアプリケーションであるPictBridgeに通知する機構です。この機構をトリガにして、PTPセッションを確立した後にDiscovery機構が起動します。
Discovery
Discoveryは、接続された機器がPictBridge機能を有する機器かどうかのネゴシエーションを行なう機構です。
PTA(Pass Through Action)
XMLを使ったRequest/Responseの対でやりとりするアクションです。PTA は、複数のPTPコマンドから構成されます。また、DSCとPrinter間の転送方向及びRequest/ResponseによってPTPのコマンドシーケンスが異なります。
表4-4 DPS Request(Printer→DSC)
PTPコマンド | 転送方向 |
---|---|
SendObjectInfo command | Printer→DSC |
SendObjectInfo data | Printer→DSC |
SendObjectInfo response | Printer←DSC |
SendObject command | Printer→DSC |
SendObject data 【XML request】 | Printer→DSC |
SendObject response | Printer←DSC |
ObjectRemoved event (注) | Printer←DSC |
表4-5 DPS Response(Printer→DSC)
PTPコマンド | 転送方向 |
---|---|
RequestObjectTransfer event | Printer←DSC |
GetObjectInfo command | Printer→DSC |
GetObjectInfo data | Printer←DSC |
GetObjectInfo response | Printer←DSC |
GetObject command | Printer→DSC |
GetObject data 【XML response】 | Printer←DSC |
GetObject response | Printer←DSC |
Object Removed event (注) | Printer←DSC |
表4-6 DPS Request(DSC→Printer)
PTPコマンド | 転送方向 |
---|---|
ObjectAdded event (注) | DSC→Printer |
RequestObjectTransfer event | DSC→Printer |
GetObjectInfo command | DSC←Printer |
GetObjectInfo data | DSC→Printer |
GetObjectInfo response | DSC→Printer |
GetObject command | DSC←Printer |
GetObject data 【XML request】 | DSC→Printer |
GetObject response | DSC→Printer |
ObjectRemoved event (注) | DSC→Printer |
表4-7 DPS Response(DSC→Printer)
PTPコマンド | 転送方向 |
---|---|
SendObjectInfo command | DSC←Printer |
SendObjectInfo data | DSC←Printer |
SendObjectInfo response | DSC→Printer |
SendObject command | DSC←Printer |
SendObject data 【XML response】 | DSC←Printer |
SendObject response | DSC→Printer |
ObjectRemoved event (注) | DSC→Printer |
(注)ObjectAdded eventとObjectRemoved eventは推奨のため省略してもかまいません。
SOA(Special Optimized Action)
XMLを使わないアクションです。DPSのアクションとPTPのコマンドは、1対1に対応しています。DPSのアクションは、次のように定義されています。
表4-8 DPSアクション
DPSアクション | 種類 | 概要 |
---|---|---|
DPS_ConfigurePrintService | PTA | バージョンとその他のコンフィギュレーション情報の交換 |
DPS_GetCapability | PTA | プリンタの能力情報の取得 |
DPS_GetJobStatus | PTA | プリンタのジョブステータスの取得 |
DPS_GetDeviceStatus | PTA | プリンタのデバイスステータスの取得 |
DPS_StartJob | PTA | コンフィギュレーションの確立とプリントジョブの開始 |
DPS_AbortJob | PTA | プリントジョブの中断 |
DPS_ContinueJob | PTA | プリントジョブの再開 |
DPS_NotifiJobStatus | PTA | プリントジョブステータスの変化をDSCに通知 |
DPS_NotifyDeviceStatus | PTA | プリンタデバイスのステータスの変化をDSCに通知 |
DPS_GetFileID | PTA | ファイルIDの取得 |
DPS_GetFileList | PTA | ストレージ上のファイルリストの取得 |
DPS_GetFileInfo | SOA | PTPコマンドのGetObjectInfo |
DPS_GetFile | SOA | PTPコマンドのGetObject |
DPS_GetPartialFile | SOA | PTPコマンドのGetPartialObject |
DPS_GetThumb | SOA | PTPコマンドのGetThumb |
アプリケーション
アプリケーションは、表4-8のDPSアクションを用いて、ダイレクトプリントを実現します。処理例として、図4-5を示します。
5 解析
実際にPictBridgeを動作させたときの挙動をUSBアナライザのデータを元に解析します。ここでは、DPS_NotifyDeviceStatusに着目します。
DPS_NotifyDeviceStatusのXMLデータフォーマットは、次のようになります。
DPS_NotifyDeviceStatusは、PrinterからDSCに対して、プリンタステータスを通知するため、DPS Requestは表4-4になり、DPS Responseは表4-5になります。これを図5-3に当てはめると、以下のようになります。
表5-1 DPS_NotifyDeviceStatus Request
Transfer No. | PTPコマンド | SICフェーズ |
---|---|---|
14 | SendObjectInfo | Command |
15 | Data | |
16 | Response | |
17 | SendObject | Command |
18 | Data | |
19 | Response |
表5-2 DPS_NotifyDeviceStatus Response
Transfer No. | PTPコマンド | SICフェーズ |
---|---|---|
20 | RequestObjectTransfer | Event |
21 | GetObjectInfo | Command |
22 | Data | |
23 | Response | |
24 | GetObject | Command |
25 | Data | |
26 | Response |
これより、Transfer18には、DPS_NotifyDeviceStatus Request、Transfer25には、DPS_NotifyDeviceStatus ResponseのXMLデータが格納されていることが分かります。それぞれのデータをASCIIコードで表示したものは、以下のようになります。
図5-4、5-5は、SICデータで先頭の12バイト(グレー部分)は、コンテナヘッダになります。このため、12バイト目以降のデータがXMLデータになります。XML部分のみを切り出すと、以下のようになります。
図5-1、5-2と図5-6、5-7を比較することで、USBバス上で、DPS_NotifyDeviceStatusのRequest/Responseデータのやり取りが行なわれていることが確認できます。
PictBridgeでは、このようにPTPコマンドから構成されるDPSのアクションをシーケンシャルに実行することで、ダイレクトプリントを実現しています。
参考文献
- Universal Serial Bus Specification, Revision 2.0, 27 April 2000
- Picture Transfer Protocol for Digital Still Photography Devices, PIMA 15740:2000,5 July 2000
- PIMA 15740:2000 Approved 2000-07-05 FIRST EDITION
- CIPA DC-001-2003 Digital Photo Solutions for Imaging Devices, 3 February 2003
- White Paper of CIPA DC-001-2003 Digital Photo Solutions for Imaging Devices (Japanese),2 February 2003
-
- 第1回 組込みシステムのこれから
- 第2回 IoTの成功はセキュリティ次第
- 第3回 組込みでもGPUやFPGAと早めに親しんでおこう
- 第4回 電子産業の紅白歌合戦、CEATECで垣間見えた未来
- 第5回 小口開発案件の集合市場、IoTの歩き方(上)
- 第6回 小口開発案件の集合市場、IoTの歩き方(下)
- 第7回 徹底予習:AI時代の組込みシステム開発のお仕事
- 第8回 いまどきのセンサー(上):ありのままの状態を知る
- 第9回 いまどきのセンサー(下):データを賢く取捨選択する
- 第10回 組込みブロックチェーンの衝撃(上)
- 第11回 組込みブロックチェーンの衝撃(下)
- 第12回 エネルギーハーベスティングの使い所、使い方
- 第13回 「人を育てる」から「道具を育てる」へ、農業から学ぶAI有効活用法
- 第14回 CPS時代に組込みシステム開発に求められることとは
- 第15回 次世代車のE/Eアーキテクチャに見る組込みの進む道
- 第16回 RISC-Vが拓く専用プロセッサの時代
- 第17回 振動計測の大進化で、熟練エンジニアのスキルを広く身近に
-
- 零の巻:組込みというお仕事
- 壱の巻:2進数と16進数を覚えよう!
- 弐の巻:割り込みとポーリング
- 参の巻:printf()が使えない?
- 四の巻:これにもIntelが入ってるの?
- 五の巻:Endianってなに?
- 六の巻:マルチタスクとは
- 七の巻:スタックってなあに?(1)
- 七の巻:スタックってなあに?(2)
- 八の巻:メモリを壊してみましょう
- 九の巻:コードが消える?~最適化の罠~
- 拾の巻:例外が発生しました
- 拾壱の巻:コードサイズを聞かれたら
- 拾弐の巻:キャッシュは諸刃の剣
- 拾参の巻:デバイスにアクセスするには
- 拾四の巻:セキュリティってなに?(1)
- 拾四の巻:セキュリティってなに?(2)
- 拾四の巻:セキュリティってなに?(3)
- 拾五の巻 :DMA対応と言われたら(1)
- 拾五の巻 :DMA対応と言われたら(2)
- 拾六の巻:ヒープとスタック
- 拾七の巻:フラグメンテーション
- 拾八の巻:CPU起動とブートローダ
- 拾九の巻:kmとKByteの「kとK」
- ビリーへの質問:DMAとキャッシュの関係
- ビリーへの質問:スタックオーバーフローについて
- ビリーへの質問:CPUレジスタについて