(57)【特許請求の範囲】
【請求項１】
デバイス設定情報をオペレーティングシステムのカーネルに通知するドライバインターフェースを備えた通知用ドライバであって自身はデバイス設定情報を一切含まない通知用ドライバと、オペレーティングシステムに依存しないデバイス設定情報のみを記述したシナリオ・シーケンス・ファイルとを備え、
前記通知用ドライバに前記シナリオ・シーケンス・ファイルが読み込まれることにより前記ドライバインターフェースを介してデバイス設定情報が前記カーネルに登録されるデバイスドライバの登録装置。
【請求項２】
デバイス設定情報をオペレーティングシステムのカーネルに通知するドライバインターフェースを備えた通知用ドライバであって自身はデバイス設定情報を一切含まない通知用ドライバと、オペレーティングシステムに依存しないデバイス設定情報のみを記述したシナリオ・シーケンス・ファイルとを用いて、前記通知用ドライバに前記シナリオ・シーケンス・ファイルを読み込むことにより前記ドライバインターフェースを介してデバイス設定情報を前記カーネルに登録するデバイスドライバの登録方法。
【請求項３】
前記通知用ドライバは、デバイス設定情報をオペレーティングシステムに通知するインターフェースとしての機能だけを有する請求項２記載のデバイスドライバの登録方法。
【請求項４】
デバイス設定情報をオペレーティングシステムのカーネルに通知するドライバインターフェースを備えた通知用ドライバであって自身はデバイス設定情報を一切含まない通知用ドライバをカーネルにロードするステップＳ１と、
デバイスの初期化を開始してオペレーティングシステムに依存しないデバイス設定情報のみを記述したシナリオ・シーケンス・ファイルを読み込むステップＳ２と、
前記シナリオ・シーケンス・ファイルを基にハンドラを生成するメインスレッドを実行するステップＳ３と、
生成された前記各ハンドラの内容をデバイスドライバとしてカーネルに登録するステップＳ４と、
を具備するデバイスドライバの登録方法。
【請求項５】
前記ステップＳ２は、
Ｓ２−１．レジスタのデフォルト値を設定するステップと、
Ｓ２−２．ワークメモリをクリアするステップと、
を含む請求項４記載のデバイスドライバの登録方法。
【請求項６】
前記ステップＳ３は、テーブルを用いてハンドラ毎にデバイスパラメータ及びデバイスの動作を決定する実行スクリプトをそれぞれ関連付けるステップを含む請求項４記載のデバイスドライバの登録方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、デバイスドライバ登録装置とこれを用いたデバイスドライバの登録方法に関する。
【背景技術】
【０００２】
パソコンやスマートフォンなどの計算機に周辺機器（以下、「デバイス」という。）を接続して使用するには計算機とデバイスとの物理的接続だけでなく、デバイスドライバによって計算機がデバイスを認識して双方で通信可能な状態にする、「論理的接続」が必要とされる。【０００３】
デバイスドライバは、デバイスメーカー側でデバイスとオペレーティングシステム（ＯＳ）の組合せ毎に専用プログラムとして作成されてデバイスと共にユーザ側に提供されることが一般的である。このような提供形態となる主な要因は、デバイスがそれぞれ固有の規格及び仕様に基づいて製造されているためであり、さらにいえば、デバイスドライバがデバイスだけでなくＯＳにも依存しているためである。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平１０−１１３８４号公報
【特許文献２】特開２００４−７０９６４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
デバイスドライバは、デバイスごとに固有の規格や仕様に基づいて設計されるプログラムであり、端的に言えば、デバイスの構成（コンフィギュレーション）や設定に必要なパラメータ及び接続形式などの、ハードウェアに関する情報をカーネルに登録するためのプログラムである。すなわち、大部分がハードウェアに関する情報であり、ＯＳへの依存がほとんどない部分から構成されている。しかし、同時に、ＯＳとデバイスドライバとのインターフェース機能（これを本明細書では「ドライバインターフェース」という。）は、ＯＳ毎にその機能を呼び出す方法や形式が異なっている。さらに、デバイスドライバのインストールは、本来的にＯＳの管理者権限が必要となる。【０００６】
デバイスドライバが保持すべきデバイス設定情報は、デバイスによっては非常に数が多く、デバイスの特性に合わせた微妙な調整が必要となる場合もある。しかし、その調整のためにコンフィギュレーションを少しだけ変えたい場合でも、デバイスメーカー側で一から作成（プログラミング）しなければならず、計算機のユーザー側で、事後的に変更を加えることもできなかった。【０００７】
そして、ひとたびデバイスドライバが作成されると、デバイスドライバの内部で規定されている各種のデバイス設定情報を事後的に変更することは不可能であった。例えば、ソースコードがＣ言語などでプログラミングされている場合は、ソースコードを書き直し、再度コンパイルして実行形式のプログラムファイルを生成し、これをユーザーに配布する必要があった。デバイスドライバを開発する立場から見ると、その作業は多大な労力を要するものであった。【０００８】
本発明は、上記に鑑みてなされたものであり、従来よりも簡便な方法でデバイスドライバをＯＳのカーネルに登録するあらたな仕組みを提供することを主たる技術的課題とする。
【課題を解決するための手段】
【０００９】
本発明に係るデバイスドライバの登録方法は、デバイス設定情報をオペレーティングシステムのカーネルに通知するドライバインターフェースを備えた通知用ドライバと、
デバイス設定情報を記述したシナリオ・シーケンス・ファイルとを用いて、前記通知用ドライバに前記シナリオ・シーケンス・ファイルを読み込むことにより前記ドライバインターフェースを介して前記カーネルに登録する。【００１０】
上記構成における通知用ドライバは、デバイス設定情報をＯＳに通知するインターフェースとしての機能だけを有する。すなわち、デバイスに依存する情報を一切含まない。そのため、通知用ドライバ単独ではデバイスドライバとして全く機能しない。通知用ドライバは、ＯＳに依存するドライバインターフェースのみの部分であり、全てのデバイスに共通して用いることができる。そして、デバイス側からデバイス設定情報を受け取ると直ちにオペレーティングシステムのカーネルに通知することができる。ここで、デバイス設定情報とは、デバイスの制御に関する設定情報、デバイスに設定する設定情報（デバイスに与えるパラメータ等）、及び、デバイスの動作を決定する実行スクリプトなどを含む。【００１１】
そのため、この通知用ドライバをカーネルに読み込ませた後、デバイスの初期化の際にシナリオ・シーケンス・ファイルをこの通知用ドライバに読み込ませることで、デバイスの動作に必要な全てのデバイス設定情報をいつでも自由にカーネルに登録することができるようになる。【００１２】
このような仕組みにより、デバイス提供者側においては、デバイスドライバの開発効率が向上し、設定変更や設定値の調整（チューニング）作業なども、大幅に簡素化することができる。
【発明の効果】
【００１３】
本発明に係るデバイスドライバの登録方法によると、通知用ドライバをカーネルにロードした状態で、初期化の際にシナリオ・シーケンス・ファイルを読み込むだけで、接続するデバイスに応じたデバイスドライバを計算機側で生成できる。そのため、従来よりも簡便な方法でデバイスドライバをＯＳのカーネルに登録することができる。
【図面の簡単な説明】
【００１４】
【図１】デバイスドライバの基本構成を示す概念図である。
【図２】カーネル−デバイス間及びデバイス−デバイス間の物理的又は論理的な接続態様を示す図
【図３】デバイスドライバの登録方法を示すフローチャート
【図４】計算機の基本構成を示す概念図
【図５】カメラモジュールを示すブロック図
【発明を実施するための形態】
【００１５】
以下、図面を参照して本発明の各実施形態について説明する。同一又は同類の部材には同一の符号を用いるか又は添字のみ異ならせて表示するものとし、重複した説明を省略しているが、各実施形態の記載は本発明の技術的思想を理解するために合目的的に解釈され、実施形態の記載に限定解釈されるべきものではない。
【００１６】
（第１の実施形態）−デバイスドライバの基本構成−
図１は、デバイスドライバの基本構成を示す概念図である。デバイスドライバ１０は、ＯＳのカーネル１１とデバイス１２との間に位置するプログラムであり、基本構造は、
（ａ）ドライバインターフェース１０Ａ
（ｂ）デバイスドライバ本体１０Ｂ
（ｃ）デバイスインターフェース１０Ｃ
という３つの構造からなっている。
【００１７】
デバイスは実に数多くの種類が存在するが、どのようなデバイスであっても、基本的に、すべてのデバイスドライバがいずれも図１に示すような構造を有する。デバイス１２側からみて、ドライバインターフェース１０Ａよりも向こう側はユーザー権限で操作される領域（ユーザーエリア１３）、手前側は管理者権限で操作される領域（管理者エリア１４）である。
【００１８】
しかし、従来のデバイスドライバは、（ａ）〜（ｃ）のすべてが一つのプログラムとしてデバイスメーカー側で作成され、ユーザーに配布されていたが、本実施形態のデバイスドライバは、（ａ）の機能を実現するプログラムと、（ｂ）及び（ｃ）の動作に必要なデバイス設定情報を記述したファイルとに分離する構成を採用している。
【００１９】
（ａ）ドライバインターフェース
ドライバインターフェースはＯＳとデバイスドライバの境界に位置するインターフェースであり、基本的にはＯＳごとに異なるが、その機能はＯＳによらず同じである。ドライバインターフェースの主な機能（ファンクション）の例を以下に示す。
１．初期化（デバイスを初期化する）
２．オープン（デバイスをオープンする）
３．クローズ（デバイスをクローズする）
４．リード（デバイスからコマンドやデータを読み出す）
５．ライト（デバイスにコマンドやデータを書き込む）
６．Ｉ／Ｏコントロール（標準化されていないデバイスの制御）
【００２０】
デバイスとカーネルとのインターフェース機能は、デバイスハンドラ（以下「ハンドラ」という。）を用いて実現される。ハンドラとは、カーネルが管理するメモリ上に展開されるプログラムの一種である。普段は待機状態にあるが、通常のプログラムとは別に、特定の処理要求（イベントや割り込み）が発生したときに呼び出されるサブルーチンプログラムである。ドライバ設定情報をカーネルに登録する際には、このハンドラを用いてデバイスドライバの本体１０Ｂが保持している各種のデバイス設定情報をカーネルに通知する。
【００２１】
ドライバインターフェース１０Ａは、ＯＳに依存する部分であるが、基本的には、あるＯＳに対するデバイスドライバを実装する際に一度作成すれば、ＯＳ及びカーネルを動かすマイクロプロセッサユニット（ＭＰＵ）が変わらない限り、以後変わることがない。これに対して、以下に説明するデバイスドライバ本体１０Ｂとデバイスインターフェース１０Ｃは、いずれもデバイスの構成に依存する部分であるため、デバイスやその接続方法（デバイスとのインターフェース）が同じであればＯＳに依らず、共通となる。デバイスドライバ１０の全体から見ると、ドライバインターフェース１０Ａはごくわずかな部分にすぎない。
【００２２】
（ｂ）デバイスインターフェース
デバイスインターフェースは、ＯＳのカーネル側からみたデバイスとのインターフェースであり、物理的インターフェースと論理的インターフェースの２種類がある。デバイスインターフェースは、ハードウェアとの物理的な接続形式（結線上の問題）を扱う部分である。物理的インターフェースでは、登録されるデバイスのレジスタが、カーネルのメモリマップ上に展開される。それは主にメモリ共有と割り込み処理を扱う物理的なバス接続であり、デバイスの接続形式によって、例えば、メモリマップドレジスタ（ＰＣＩバス接続）、Ｉ２Ｃ（Inter-Integrated Circuit）バスインターフェースやＳＰＩ（Serial Peripheral Interface）などの通信型レジスタなどがある。
【００２３】
一方、論理的インターフェースでは、例えば文字列やバイナリストリームなどの、決められたプロトコルに従った一まとまりのデータ（プロトコルパケットデータ)によってデバイスの挙動を表現し制御するインターフェースである。単にデバイスインターフェースといった場合には、文脈により物理的インターフェースと論理的インターフェースのいずれか又は両方を表す。
【００２４】
また、デバイスインターフェースは、割り込み信号を送受信するための割り込みｌｉｎｅを有する。割り込み処理はデバイス側の状態変化を登録型のハンドラによって制御する役割を担う。例えば、デバイスがカメラモジュールである場合を例に取ると、「シャッターが押される」というイベントの処理は、割り込み処理で行っている。シャッターが押されると割り込みハンドラがカーネルから読み出され、その結果として、対応する関数（サブルーチン）が読み込まれる。
【００２５】
（ｃ）デバイスドライバ本体
本実施形態のデバイスドライバ本体１０Ｂは、主に以下の設定情報が記述されている。
１．デバイスの制御に関する設定情報
２．デバイスに設定する設定情報（デバイスに与えるパラメータ等）
【００２６】
本明細書における「デバイス設定情報」とは、上記の１．（デバイスの制御に関する設定情報）と２．（デバイスに設定する設定情報）の両方を含む。また、設定情報にはデータだけでなくコマンドを含む。例えば、スクリプトで記述できるコマンド（インストラクション）例えば割り込み待ち、レジスタへの代入、ＤＭＡ転送の指示、Ｉ２Ｃ／ＳＰＩバスを経由した通信、メモリマップドレジスタへの書き込みや読み出しなどを含む。
【００２７】
デバイスの制御とは、デバイスの本質的な動作に関わる制御であり管理者権限で実行される制御、例えばデバイスのリセット、設定変更などを含む。一方、デバイスに設定するパラメータとは、ユーザー権限で設定されるデバイスの使用目的や使用状況等に応じた制御を行うためのパラメータをいう。例えば、同じ接続形式で同じプリンタでもプリンタの用紙を変更する、カメラのモード（センサとレンズは同じでもシーンによってパノラマ・動画・静止画モードを切り替える、など。）を設定するといった、デバイスから見ると（特別な場合を除いて）電気的には全く検知できないようなデバイスの設定情報を含む。デバイスドライバ本体は本来的にデバイスに依存する部分であるため、デバイスメーカー側から提供される情報に基づいて決まる。
【００２８】
以上のように、デバイスドライバの中核をなすデバイスドライバ本体はデバイスの各種パラメータやドライバインターフェース１０Ａやデバイスインターフェース１０Ｃへのコマンドなど、デバイスに合わせた各種の設定情報を保持している。この部分はデバイス（ハードウェア）への依存性が高いがＯＳへの依存は殆ど無い。しかし、従来のデバイスドライバは、構成の大部分がデバイスや接続方法に依存して決まる共通部分であるにも関わらず、構成の一部がＯＳに依存するために、デバイスドライバ全体がＯＳに依存するものとなっていた。
【００２９】
これに対して、本実施形態のデバイスドライバは、ＯＳに依存する「（ａ）ドライバインターフェース」の部分だけの機能を担う「通知用ドライバ」をＯＳごとに１つ準備し、これをカーネルに登録するところから開始し、デバイスの初期化の際にＯＳに依存しない（デバイスには依存する）デバイス設定情報を「通知用ドライバ」を介してカーネルに読み込ませることで、ユーザー権限で後からユーザーがデバイス設定情報を後から自由に書き換えることができるように構成されている。
【００３０】
このように、初期化の際にデバイス設定情報を読み込んで機能の並び（レジスタの並び）をメインスレッドの前に決定する。これは、ランタイム中に決定しようとすると時間がかかるためである。レジスタに書き込んだ際の振る舞いはデバイスの製造メーカーによって異なる場合も多いがユーザーのニーズは決まっており、レジスタの並びは違っていても実現される機能は大体同じであることが多い。たとえば、カメラモジュールを例にとると、
・カメラＡ
レジスタ＃１．ズーム
レジスタ＃２．フォーカス
・カメラＢ
レジスタ＃１．フォーカス
レジスタ＃２．ズーム
【００３１】
このようにレジスタの並びが違っている場合でも、デバイス設定情報で規定されるパラメータを変更してレジスタの並びを変えるだけでカメラＡ、Ｂの両方に対応できるようになる。
【００３２】
このように、本発明のデバイスドライバは、デバイスを特定しない、「デバイス設定情報の通知用ドライバ」をカーネルにロードし、デバイスを初期化する際にデバイス設定情報を通知用ドライバに読み込んでデバイス設定情報をカーネルに通知することで、自身のデバイスの動作を確定させることができる。なお、通知用ドライバはＣ言語などで作成（プログラミング）し、一度作成すればＯＳ及びマイクロプロセッサユニットが変わらない限り、同じものを繰り返し用いることができる。
【００３３】
本実施形態では、デバイス設定情報を「シナリオ・シーケンス・ファイル」と呼ばれるスクリプト形式のファイルに記述する。通知用ドライバをロードしてデバイスを初期化する際に、例えば、「Ｉ２Ｃインターフェース経由で音声情報を通信するマイクデバイスである」というデバイス設定情報を記述したシナリオ・シーケンス・ファイルを読み込むことで、ＯＳのユーザーからみるとそれがマイクデバイスとして認識されうる。このシナリオ・シーケンス・ファイルはデバイスに依存するがＯＳには依存しない。
【００３４】
このように、初期化のたびごとに必要な機能をディスパッチしても、実際にカーネルに登録された際に占有するメモリ量は従来のデバイスドライバと変わらず、この点においては従来のデバイスドライバと比較して何らデメリットがない。
【００３５】
シナリオ・シーケンス・ファイルの読込処理は、従来のデバイスドライバにはない処理といえるが、近年のパソコンやスマートフォンなどのように、処理能力が高いマイクロプロセッサユニットと十分なメモリを有している場合には、多少ディスパッチの回数が増えてもデバイスが要求する時間内に処理（カーネルへの登録）が終わるので、特に問題が起こることはない。
【００３６】
さらに、シナリオ・シーケンス・ファイルに記述されるコマンドは、呼び出す機能の内容及び順序などからなるが、それぞれの機能は部品化されているため、頻繁に使用される一連の機能はマクロプログラムとして定義しておくと使い勝手がよい。
【００３７】
シナリオ・シーケンス・ファイルの読み込み処理の速度については主にシナリオ・シーケンス・ファイルから呼び出す機能のディスパッチに要する時間と関係する。あまり多くのコマンドを束ねると処理は速くなるが汎用性が損なわれて使いにくくなる。逆に、例えば「メモリ転送」のような頻繁に用いられるコマンドを扱うとディスパッチ回数が増え、非力なマイクロプロセッサユニットで読み込む場合はデバイスが要求する時間内にデバイスの認識が完了せずエラーになるおそれもあり、注意が必要である。したがって、マイクロプロセッサユニットの処理能力等から許容されるディスパッチ回数とシナリオ・シーケンス・ファイルの汎用性を考慮して、適宜設計するべきである。
【００３８】
一般に、プロトコルパケットの処理などはマクロシーケンス化しやすいが、バス接続で割り込み処理の多いものはマクロシーケンス化することはやや非効率であると考えられる。いずれにせよ使いやすい単位でマクロ化することでシナリオ・シーケンス・ファイルは更に使いやすくなっていく。
【００３９】
図２は、カーネル−デバイス間及びデバイス−デバイス間の物理的又は論理的な接続態様を示す図である。図中の実線はバスインターフェース接続を表し、破線は論理的インターフェース接続を表す。例えば、カーネルとＵＳＢホストコントローラとはバス接続で接続されるが、ＵＳＢホストコントローラに接続されるＵＳＢデバイスはプロトコルパケットで通信される論理的インターフェースということになる。例えば、図中のＳＤホストデバイスは、カーネルとＰＣＩバスなどの外部バスで接続され、ＳＤホストデバイスの先にはＷｉＦｉ（無線ＬＡＮ）モジュールなどの無線通信デバイスやメモリカードなどが「ＳＤバス（或いはその上位互換であるＳＤＩＯバス）」と呼ばれる外部バスを通じて接続されうることを示している。
【００４０】
このように、デバイスがどのようなデバイスインターフェースを持つものであっても、通知用ドライバをカーネルに読み込んだ後、デバイスの初期化の際に、カーネルに対するデバイスの登録方法をデバイス設定情報として通知することで、あらゆるデバイスに対応したデバイスドライバを実現することができる。
【００４１】
（第２の実施形態）−デバイスドライバの登録方法−
図３は、第２の実施形態のデバイスドライバの登録方法を示すフローチャートである。
【００４２】
−ステップＳ１−
ステップＳ１では、第１の実施形態で説明した通知用ドライバをカーネルにロードする。ＯＳ起動後にデバイスドライバをロードする方法はＯＳによって異なっている。例えば、ＯＳがＬｉｎｕｘ（登録商標）である場合は、”ｉｎｓｍｏｄ”などのコマンドを用いる。ＯＳがＷｉｎｄｏｗｓ（登録商標）である場合には、「．ｓｙｓ」というドライバ定義ファイルを作成してプラグ・アンド・プレイでＯＳにデバイスドライバの読み込みを行わせることで必要なデバイス設定情報をレジストリに登録する方法が簡便である。その他のＯＳでもデバイスドライバをカーネルにロードするコマンドがある場合にはそれを利用する。このステップは通常は管理者権限で行うか、起動時にシステムが管理者権限で自動実行するように設定することが通常であるが、ユーザー権限で行えるようにすることも可能である。
【００４３】
−ステップＳ２−
次に、デバイスを初期化を開始して（ステップＳ２）、シナリオ・シーケンス・ファイルを読み込む。ステップＳ１で通知用ドライバのロードが終了し、デバイスは待機状態にある。ここで、初期化を開始して、シナリオ・シーケンス・ファイルの読込を開始する。
この初期化ステップは、具体的には、例えば、デバイスの設定情報（パラメータ）を初期値に設定することや、デバイスの動作を決定する実行スクリプトに記述された実行コマンドを初期化する、或いは、シナリオ・シーケンス・ファイルを基にデバイスドライバを生成するための準備としてメモリ上に作業領域を確保することなどを含む。
【００４４】
この初期化ステップをデバイス側とカーネル側のそれぞれからみた動作は、具体的には、例えば以下の通りとなる。
Ｓ２−１．レジスタのデフォルト値を設定  ＜ＯＵＴ側（デバイス側）＞
Ｏｕｔ側のセンサ部のレジスタ（例えば、デバイスがカメラモジュールであるとした場合、画面サイズ、フォーカスをどこから開始するか（通常は無限大側）、ホワイトバランス（画調）、露出時間などの各種デバイスパレメータ）を初期値に設定する。なお、カメラモジュールは一例であり、あらゆるデバイスの設定値が初期値に設定されることを意味する。
Ｓ２−２．ワークメモリのクリア（ワークメモリをゼロで埋める）  ＜ＩＮ側＞
以上のステップにより、デバイスドライバをカーネルに登録した際には、常に同じ動作が保証されることになる。
【００４５】
シナリオ・シーケンス・ファイルを読み込むことで初期化が完了する。
【００４６】
−ステップＳ３−
次に、シナリオ・シーケンス・ファイルを基にハンドラを生成するメインスレッドを実行する（ステップＳ３）。このステップＳ３は特にリードとライトとＩ／Ｏコントロールの機能とシーケンスを生成するステップであり、ユーザー権限で実施することができる。たとえば、ユーザー権限でＩ／Ｏコントロールを使ってファイルの書き込み属性を変えることもできる。デバイスドライバはこの時点ではじめて自身の動作が確定する。
【００４７】
−ステップＳ４−
次に、生成された上記各ハンドラの内容をデバイスドライバとしてカーネルに登録する（ステップＳ４）。このデバイスドライバは、ＯＳ上で利用できるような状態で登録されていればよく、方式や利用形態などを問わず、ＯＳのカーネルに組み込まれていればよい。
【００４８】
すなわち、通知用ドライバがカーネルに読み込まれた時点（ステップＳ１）では、デバイスドライバとしての動作は確定しておらず、そこからデバイスを初期化してシナリオ・シーケンス・ファイルを読み込んでハンドラを生成し、カーネルに登録された時点（ステップＳ４）で初めて、デバイスドライバとして機能するようになる。本実施形態のデバイスドライバは、デバイス側からみた場合には、従来のデバイスドライバと何ら変わりない動作をすることはいうまでもない。
【００４９】
以上のステップＳ１〜Ｓ４により、シナリオ・シーケンス・ファイルに記述されたデバイス設定情報（デバイスパラメータ及びデバイスの動作を決定する実行スクリプト）を読み込むことでＯＳに依存しないデバイスドライバ１０を生成することができ、そのデバイスドライバ１０を用いることでインターフェース２３に接続されたデバイスを制御して使用することができるようになる。また、デバイスドライバ１０は従来のようなコンパイルが不要であるため、デバイスドライバ１０を容易に生成することができる。
【００５０】
−ステップＳ５−
デバイスを取り外すときは終了（Ｔｅｒｍｉｎａｔｅ）する。
【００５１】
（第３の実施形態）
図４は、計算機の基本構成を示す概念図である。計算機２０はマイクロプロセッサユニット２１とメモリ２２とデバイスインターフェース２３（図１の１０Ｃ）を具備する。マイクロプロセッサユニット２１は、主にＣＰＵ（Central Processing Unit）であり、ＦＰＧＡ（field-programmable gate array）やマイコンなど、各種のロジックＩＣを用いてもよい。メモリ２２は、ＲＡＭ（Random Access Memory）などの一時記憶装置を指す。
【００５２】
デバイスインターフェース２３は、マイクロプロセッサユニット２１が制御する周辺機器用のものであればよく、具体的には、例えば図２に示すような各種デバイスに接続するものであればよい。ＰＣＩ（Peripheral Component Interconnect）カード、ネットワークカード、マイク、カメラ、ＵＳＢ、ＳＤカード、ＷｉＦｉ（Wireless Fidelity）内蔵機器、ＡＤＣ（Analog to Digital Converter）、Ｂｌｕｅｔｏｏｔｈ（登録商標）内蔵機器、ＧＰＳ内蔵機器、プリンタ、ＦＡＸ、スキャナなどである。デバイスインターフェース２３は、メモリ２２のような一時記憶装置又はハードディスクなどの記憶装置を接続するためのインターフェースであってもよく、キーボードやマウスと接続するための入力インターフェース、ディスプレイその他表示装置と接続するための出力インターフェースであってもよい。なお、メモリ２２も周辺機器であるため、例えば、メモリ２２は図示しないデバイスインターフェースであるメモリスロットに接続され、マイクロプロセッサユニット２１がメモリ２２用のデバイスドライバでメモリ２２を管理する。
【００５３】
計算機２０にはＯＳがインストールされており、さらに、そのＯＳのカーネルに上記ステップＳ１〜Ｓ５により生成されたデバイスドライバ１０が登録されている。そして、計算機２０のデバイスインターフェース２３の先にデバイス１２が接続されている。
【００５４】
図１に示すドライバインターフェース１０Ａは、ＯＳの上記各ハンドラである。ドライバ１０は、ドライバインターフェース１０Ａ（各ハンドラ）とデバイス毎に決まったデバイスインターフェース１０Ｃの間でデータを送受信する役割を果たす。具体的には、ドライバ１０（１０Ｂ）は、上記ステップＳ３により確定された各ハンドラの処理を実施するためのプログラムである。
【００５５】
以上のようなデバイスドライバ１０をシナリオ・シーケンス・ファイルを基に生成することにより、計算機２０は、デバイス１２との間でデバイスとの通信データを送受信することができる。
【００５６】
（実施例）−シナリオ・シーケンス・ファイルの具体例−
以下に、デバイス設定情報を記述したシナリオ・シーケンス・ファイルの一例を挙げる。
シナリオ・シーケンス・ファイルはデバイスインターフェースに接続されるデバイスのデバイスパラメータとハンドラを生成するための実行スクリプトを記述したファイルであり、スクリプト形式のファイルであるため、テキストエディタで編集できる程度の非常に小さな（例えば２キロバイト以下のような）ファイルサイズのテキストデータで構成することもできる。実装により、ＪａｖａＳｃｒｉｐｔ（登録商標）やＸＭＬなど、ＯＳや計算機のハードウェア（ＭＰＵ）に依存しない中間言語の形式で記述してもよい。
【００５７】
デバイスをカーネルに登録するために必要な情報は、
（ａ）デバイスインターフェースに関する情報
（ｂ）デバイスの動作内容に関する情報
（ｃ）接続先デバイスに関する情報
である。これらの情報をシナリオ・シーケンス・ファイルに記述し、通知用ドライバを介してカーネルに登録すればよい。
【００５８】
構成情報のわずかな変更があっても従来のようにデバイスドライバをソースコードから書き換えて再度コンパイルする必要はなく、シナリオ・シーケンス・ファイルの一部を書き換えてデバイスを初期化しなおすだけでよい。
【００５９】
例えば、プリンタのように、同じデバイスでも複数の接続形式が可能なデバイスが存在する。ネットワークに接続できるプリンタが、ＵＳＢ接続あるいはシリアル接続可能な場合、ドライバインターフェースとデバイスドライバ本体の構成は変わらず、デバイスインターフェースだけが異なっている。接続形態が決まれば以後変わることがないため、実装前にどのデバイスインターフェースを実装するかを決定すればよい。ＵＳＢ接続からネットワーク接続（Ｅｔｈｅｒｎｅｔ（登録商標）接続）に変更したい場合は、ＯＳを起動した状態でしかもデバイスドライバもクローズすることなく、再度デバイスを初期化して、単に経路情報が変更されたことを示すデバイスインターフェースの部分を修正したシナリオ・シーケンス・ファイルを通知用ドライバで読み込むだけでよい。
【００６０】
以下、シナリオ・シーケンス・ファイルで定義するデバイス設定情報（コマンドとパラメータ等）の例について説明する。
【００６１】
[処理命令定義]
処理命令定義は、シナリオそのものの記述を行う実行コマンドが記述される。なお、デバイス（ハードウェア）に依存して決まっている割り込み番号は「int1」などの予約語として扱う。
処理命令  ：  処理内容
wait intr(n)  ：  割り込みID n の割り込みを待つ
write $addr  ：  ＯＳから受け取ったデータを$addrに書き込む
write $addr,size  ：  ＯＳから受け取ったデータを$addrから書き込む
write data,$addr  ：  dataを$addrに書き込む
read $addr,size  ：  $addrからsizeだけのデータをＯＳに返す
copy $add1,$add2,size  ：  $add1から$add2にsizeバイト データを転送する
copy $add1,$add2,size  ：  $add1から$add2にsizeバイト データを転送する
copy #dataset(n)  ：  データセットID n を転送する
res data  ：  dataをＯＳに返す
and mask,$addr  ：  $addrのデータとmaskの論理積を取り、条件分岐式に反映する
or mask,$addr  ：  $addrのデータとmaskの論理和を取り、条件分岐式に反映する
if else endif  ：  シナリオの条件分岐
while endwhile  ：  while〜endwhile間を条件ループする
for n endfor  ：  for〜endfor間をn回ループする
exit  ：  インターフェースを終了する
処理命令定義には、その他、ＤＭＡ転送やｍｕｔｅｘなどを含む同期の仕組みなどの処理命令が記述される。
【００６２】
[データセット定義]
データセット定義は、１つ又は複数のデータを１セットとしたデータセットの定義が記述される。データセットは任意の名前のデータ列を定義することができる。データ列には、レジスタと定義内容、書き込み後のタイミングなどを記述する。データセットは複数パターンを登録しておき、目的や場合に合わせて使い分ける。
【００６３】
データセットの定義  ：  定義内容
b $addr and mask n  ：  データセットbを「$addrの内容にmaskの論理積を１バイト書き込み n ミリ秒待つ」データ列と定義する
w $addr or mask n   ：  データセットwを「$addrの内容にmaskの論理和を２バイト書き込み n ミリ秒待つ」データ列と定義する
l $addr data n  ：  データセットlを「$addrの内容にdataを４バイト書き込み n ミリ秒待つ」データ列と定義する
【００６４】
次に、シナリオ・シーケンス・ファイルを基にＯＳの各ハンドラ（[init]、[term]、[open]、[close]、[I/O-ctrl]、[read]、[write]、[main_thread]）にデバイスパラメータ並びに処理命令定義及びデータセット定義を含む実行スクリプトを割り当てて各ハンドラの処理を構成したデバイスドライバの一例を以下に挙げる。このデバイスドライバを用いることで、決まったサイズのパケットを任意タイミングで送受信するデバイス、例えば、加速度センサーに対してメモリマップドレジスタへの読み書きを制御することができる。なお、以下の一部には「// コメント」を追記している。
【００６５】
[init]
allocate $buffer 16;
allocate $flag 1;
exit;
[term]
free buffer;
free $flag;
exit;
[open]  // 何もしない
exit;
[close] // 何もしない
exit;
[I/O-ctrl] // 何もしない
exit;
[read]
or.w #0001,$flag;
if  // バッファにデータが有れば
read $recive_data,16;  // データを読み出す
write.w 1,$flag
endif
exit;
[write]
write $send_reg,16;  // デバイス読み込み開始
wait int1;  // 完了割り込み待ち
exit;
[main_thread]  // 受信割り込みを待ってバッファに読み出す
while;
wait int1;  // 完了割り込み待ち
read $recive_data,buffer,16;  // デバイスからバッファにデータを読み出しておく
write.w 1,$flag;
endwhile;
【００６６】
インストラクションは上記のとおり比較的簡単なプログラムである。デバイスドライバとしての機能を確定させるために、テキストエディタでシナリオ・シーケンス・ファイルにシナリオ（インストラクションの順序）を記述し、パーシングしたシナリオにより記述した処理内容（例えばルックアップテーブルを持ったもの）をそれぞれのインターフェース（６種)をコールバックハンドラとして割り当てる。シナリオ・シーケンス・ファイルを読み込む方法はオープン・リード・ライト・クローズなどの機能を用いる。また、割り込みがある場合は割り込み待ちを行う。
【００６７】
なお、一連の作業をデバイスメーカーではないユーザー等の第三者がデバイスメーカーからデバイス設定に必要なパラメータを得てシナリオ・シーケンス・ファイルを作成する場合、シナリオのスクリプト内容自体を変更するとドライバの動作が狂うおそれがある。従って、このような場合はテキストファイルではなく、他のアプリケーションツールなどを介してシナリオ・シーケンス・ファイルを作成・修正できるようにして、不要な設定を変更しないようにするなどの工夫をしてもよい。
【００６８】
（第４の実施形態）
図５は、第４の実施形態のカメラモジュールを示すブロック図である。図５に示すように、カメラ本体５０は、計算機２０とカメラモジュール３０とを有する。カメラモジュール３０は、制御部３１と、デバイスインターフェース３３とセンサー３４と、ＩＲフィルタ３５やレンズ３６等の光学系部品とを有する。計算機２０とカメラモジュール３０とは、デバイスインターフェース２３、３３同士が例えばバスにより接続されている。
【００６９】
カメラモジュールの制御部３１は、計算機２０やその他外部入力からの信号によりカメラモジュールの各部を制御する。また、カメラ本体５０は図示しないディスプレイ又はタッチパネルを有し、ディスプレイ又はタッチパネルはカメラモジュール３０に対する設定画面、カメラ本体５０で撮影した静止画や動画などを表示する。なお、カメラ本体５０はメモリや各デバイスに対するインターフェースをさらに有していてもよい。
【００７０】
計算機２０によるカメラ本体５０に対する制御は、目的に応じて変更する必要がある。静止画取り込み、動画取り込み、解像度設定、感度設定などではカメラ本体５０に対する大量の設定値が存在し、そのそれぞれについて、画質の調整など、様々な調整が必要になる。この種のカメラモジュールような光学デバイスにいたっては、調整すべきデバイスパラメータの数は１０００を超えるものもあり、その作業は専門知識を要するものであった。このような場合に、コンパイルすることなくデバイスドライバを生成できることは、開発効率の大幅な向上につながる。
【００７１】
また、事後的にユーザーの側でデバイスドライバを設定できる点に着目し、例えばあるレンズを販売する際に、それに合わせて遠近感を強調した撮影が可能となるような例えばホワイトバランス、エクスポージャー、フォーカス等を設定するパラメータを含むシナリオ・シーケンス・ファイルをユーザーに配布すれば、デバイスドライバをコンパイルすることなくユーザーが新しいデバイス設定情報に書き換え、そのレンズを取り付けたカメラを使用できるようになり、また、ユーザーがさらにその設定値を変更することもできるようになる。
【００７２】
なお、本実施形態では、設定パラメータが多く一般にデバイスドライバの開発に時間のかかるカメラモジュールをデバイスとして例示したが、ＵＳＢ（ユニバーサル・シリアル・バス）を経由する全てのデバイス、パラレルポートやシリアルポートを経由して接続されるデバイス、ＳＤバスを経由して接続されるデバイス、ＰＣＩバスやＩＥＥＥ１３９４などを経由するバス型デバイス（内部バス、外部バスのいずれもが含まれる）など、使用時にカーネルに登録されるあらゆるデバイスが「デバイス」となりうる。
【符号の説明】
【００７３】
１０  デバイスドライバ
１０Ａ  ドライバインターフェース
１０Ｂ  デバイスドライバ本体
１０Ｃ  デバイスインターフェース
１１  カーネル
１２  デバイス
２０  計算機
２１  マイクロプロセッサユニット（ＭＰＵ）
２２  メモリ
２３  デバイスインターフェース
３０  カメラモジュール
３１  制御部
３３  デバイスインターフェース
３４  センサー
３５  ＩＲフィルタ
３６  レンズ
５０  カメラ本体
【図１】
0005997867.tif 000002
【図２】
0005997867.tif 000003
【図３】
0005997867.tif 000004
【図４】
0005997867.tif 000005
【図５】
0005997867.tif 000006