(57)【特許請求の範囲】
【請求項１】
第１ファームウェアの更新処理を行う処理装置と、
前記第１ファームウェアを分割した単位である第１ファームウェアファイルを、複数の第１記憶ブロックにそれぞれ記憶する不揮発性の第１記憶領域と、
前記第１ファームウェアを更新する第２ファームウェアを分割した単位である第２ファームウェアファイルを、複数の第２記憶ブロックの一部にそれぞれ記憶する不揮発性の第２記憶領域とを備え、
前記第２記憶領域における前記第２記憶ブロックの数は、前記第１記憶領域における前記第１記憶ブロックの数より多く、
各前記第２ファームウェアファイルは、各前記第１ファームウェアファイルにそれぞれ対応し、
前記処理装置が、各前記第１ファームウェアファイルを対応する各前記第２ファームウェアファイルに更新することで、前記第１ファームウェアの更新処理を行うことを特徴とする、
ファームウェア更新装置。
【請求項２】
複数の前記第２記憶ブロックのうち、前記第２ファームウェアファイルを記憶していない記憶ブロックを予備記憶ブロックとし、
前記処理装置が、
１つの前記第１記憶ブロックに記憶された前記第１ファームウェアファイルを前記予備記憶ブロックに複製し、
複製が完了した当該第１ファームウェアファイルを、対応する各前記第２ファームウェアファイルに更新し、
更新が完了した当該第２ファームウェアファイルが記憶される前記第２記憶ブロックに、他の前記第１記憶ブロックに記憶された前記第１ファームウェアファイルを複製する更新処理を繰り返し行うことを特徴とする、
請求項１に記載のファームウェア更新装置。
【請求項３】
前記予備記憶ブロックとなる前記第２記憶ブロックが、更新処理ごとに異なることを特徴とする、
請求項２に記載のファームウェア更新装置。
【請求項４】
前記第１ファームウェアの更新処理の進捗状態を管理する状態管理領域をさらに備え、
前記状態管理領域が、前記第１記憶領域および前記第２記憶領域を備える不揮発性メモリとは異なる不揮発性メモリにおいて備えられることを特徴とする、
請求項２または３に記載のファームウェア更新装置。
【請求項５】
前記状態管理領域が、更新処理の進捗状態を、一連番号で管理することを特徴とする、
請求項４に記載のファームウェア更新装置。
【請求項６】
前記状態管理領域は、複数の記憶ブロックを備え、
前記状態管理領域が、前記一連番号を複数の前記記憶ブロックでそれぞれ保持することによって、更新処理の進捗状態を管理することを特徴とする、
請求項５に記載のファームウェア更新装置。
【請求項７】
前記状態管理領域は、更新処理の進捗状態を示す状態番号と、前記予備記憶ブロックに対応する前記第２記憶ブロックの位置を示す予備記憶ブロック番号と、更新処理を開始できるか否かを切り替える切替えフラグとを管理し、
前記状態管理領域が、前記状態番号と前記予備記憶ブロック番号とを先に初期化した後に、前記切替えフラグを有効にすることで、更新処理を開始させることを特徴とする、
請求項４〜６のいずれかに記載のファームウェア更新装置。
【請求項８】
前記状態管理領域が、更新処理が完了した場合に前記切替えフラグを無効にすることを特徴とする、
請求項７に記載のファームウェア更新装置。
【請求項９】
第１ファームウェアを分割した単位である第１ファームウェアファイルを、複数の第１記憶ブロックにそれぞれ記憶する不揮発性の第１記憶領域と、
前記第１ファームウェアを更新する第２ファームウェアを分割した単位である第２ファームウェアファイルを、複数の第２記憶ブロックの一部にそれぞれ記憶する不揮発性の第２記憶領域とを用いるファームウェア更新方法であって、
前記第２記憶領域における前記第２記憶ブロックの数は、前記第１記憶領域における前記第１記憶ブロックの数より多く、
各前記第２ファームウェアファイルは、各前記第１ファームウェアファイルにそれぞれ対応し、
複数の前記第２記憶ブロックのうち、前記第２ファームウェアファイルを記憶していない記憶ブロックを予備記憶ブロックとし、
（ａ）１つの前記第１記憶ブロックに記憶された前記第１ファームウェアファイルを前記予備記憶ブロックに複製する工程と、
（ｂ）複製が完了した当該第１ファームウェアファイルを、対応する各前記第２ファームウェアファイルに更新する工程と、
（ｃ）前記工程（ｂ）において更新が完了した当該第２ファームウェアファイルが記憶される前記第２記憶ブロックに、他の前記第１記憶ブロックに記憶された前記第１ファームウェアファイルを複製する工程とを備え、
前記工程（ｂ）が、前記工程（ａ）または前記工程（ｃ）において複製が完了した前記第１ファームウェアファイルを、対応する各前記第２ファームウェアファイルに更新する工程であることを特徴とする、
ファームウェア更新方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、不揮発メモリに格納したファームウェアを更新する装置、および、不揮発メモリに格納したファームウェアを更新する方法に関するものである。
【背景技術】
【０００２】
ＣＰＵを内蔵した組み込み製品では、製品出荷後に見つかった不具合を解消する目的や、新しい機能の追加などを目的として、ファームウェア（Ｆｉｒｍｗａｒｅ）の更新機能を有するものがある。
【０００３】
また、更新後のファームウェアに不具合が含まれている場合への対策として、更新前のファームウェアに復元できる機能を有するものもある。
【０００４】
このようなファームウェアの更新や復元が可能な製品においては、不揮発メモリの書き換え中に電源断が発生しても、正しくファームウェアの更新または復元を完了できることが実用上必要となる。
【０００５】
例えば、特許文献１では、不揮発メモリが更新前のファイルを一時的に格納するための一時退避領域と、更新ファイルを格納する更新データ領域とを有するファームウェア更新装置および方法が開示されている。
【０００６】
特許文献１の方法では、演算処理部が更新前のファイルを一時退避領域に格納し、更新処理を実行した後、一時退避領域に格納した更新前のファイルを一時退避領域から削除するとともに、対応する更新ファイルと入れ換えて更新データ領域に格納するようにしている。このため、更新中に不具合が発生した場合には、一時退避領域に格納されたデータを用いて更新処理を継続することが可能である。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１０−７９４４０号公報（４頁［０００９］）
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、特許文献１に記載されるように一時退避領域を用いた場合、ファームウェアを分割した単位であるファームウェアファイルを更新するごとに一時退避領域の書き換えが必要となるため、複数のファームウェアファイルを随時更新していく場合には、一時退避領域が複数回書き換えられることになる。このため、一時退避領域には書き換え作業が集中し、結果として、一時退避領域の寿命は他の領域より短くなる。
【０００９】
これは、一般に不揮発メモリの消去単位となる記憶ブロックに消去回数の上限があるためである。さらに、一時退避領域の寿命が尽きる（消去回数の上限を超える）と、ファームウェアの更新を行うことはできなくなる。
【００１０】
したがって、特許文献１の方法では、ファームウェア更新の上限回数が制限されてしまうという問題があった。
【００１１】
本発明は、上記のような問題を解決するためになされたものであり、特定の領域の更新回数の上限に制限されることなく、良好にファームウェアの更新を繰り返すことができるファームウェア更新装置、およびファームウェア更新方法を提供することを目的とする。
【課題を解決するための手段】
【００１２】
本発明にかかるファームウェア更新装置は、第１ファームウェアの更新処理を行う処理装置と、前記第１ファームウェアを分割した単位である第１ファームウェアファイルを、複数の第１記憶ブロックにそれぞれ記憶する不揮発性の第１記憶領域と、前記第１ファームウェアを更新する第２ファームウェアを分割した単位である第２ファームウェアファイルを、複数の第２記憶ブロックの一部にそれぞれ記憶する不揮発性の第２記憶領域とを備え、前記第２記憶領域における前記第２記憶ブロックの数は、前記第１記憶領域における前記第１記憶ブロックの数より多く、各前記第２ファームウェアファイルは、各前記第１ファームウェアファイルにそれぞれ対応し、前記処理装置が、各前記第１ファームウェアファイルを対応する各前記第２ファームウェアファイルに更新することで、前記第１ファームウェアの更新処理を行うことを特徴とする。
【００１３】
本発明は、第１ファームウェアを分割した単位である第１ファームウェアファイルを、複数の第１記憶ブロックにそれぞれ記憶する不揮発性の第１記憶領域と、前記第１ファームウェアを更新する第２ファームウェアを分割した単位である第２ファームウェアファイルを、複数の第２記憶ブロックの一部にそれぞれ記憶する不揮発性の第２記憶領域とを用いるファームウェア更新方法であって、前記第２記憶領域における前記第２記憶ブロックの数は、前記第１記憶領域における前記第１記憶ブロックの数より多く、各前記第２ファームウェアファイルは、各前記第１ファームウェアファイルにそれぞれ対応し、複数の前記第２記憶ブロックのうち、前記第２ファームウェアファイルを記憶していない記憶ブロックを予備記憶ブロックとし、（ａ）１つの前記第１記憶ブロックに記憶された前記第１ファームウェアファイルを前記予備記憶ブロックに複製する工程と、（ｂ）複製が完了した当該第１ファームウェアファイルを、対応する各前記第２ファームウェアファイルに更新する工程と、（ｃ）前記工程（ｂ）において更新が完了した当該第２ファームウェアファイルが記憶される前記第２記憶ブロックに、他の前記第１記憶ブロックに記憶された前記第１ファームウェアファイルを複製する工程とを備え、前記工程（ｂ）が、前記工程（ａ）または前記工程（ｃ）において複製が完了した前記第１ファームウェアファイルを、対応する各前記第２ファームウェアファイルに更新する工程であることを特徴とする。
【発明の効果】
【００１４】
本発明にかかるファームウェア更新装置によれば、第１ファームウェアの更新処理を行う処理装置と、前記第１ファームウェアを分割した単位である第１ファームウェアファイルを、複数の第１記憶ブロックにそれぞれ記憶する不揮発性の第１記憶領域と、前記第１ファームウェアを更新する第２ファームウェアを分割した単位である第２ファームウェアファイルを、複数の第２記憶ブロックの一部にそれぞれ記憶する不揮発性の第２記憶領域とを備え、前記第２記憶領域における前記第２記憶ブロックの数は、前記第１記憶領域における前記第１記憶ブロックの数より多く、各前記第２ファームウェアファイルは、各前記第１ファームウェアファイルにそれぞれ対応し、前記処理装置が、各前記第１ファームウェアファイルを対応する各前記第２ファームウェアファイルに更新することで、前記第１ファームウェアの更新処理を行うことにより、分割した単位であるファームウェアファイルごとに異なる記憶ブロックに記憶して更新するので、特定の記憶ブロックの更新回数の上限に制限されることなく、良好にファームウェアの更新を繰り返すことができる。
【００１５】
本発明によれば、第１ファームウェアを分割した単位である第１ファームウェアファイルを、複数の第１記憶ブロックにそれぞれ記憶する不揮発性の第１記憶領域と、前記第１ファームウェアを更新する第２ファームウェアを分割した単位である第２ファームウェアファイルを、複数の第２記憶ブロックの一部にそれぞれ記憶する不揮発性の第２記憶領域とを用いるファームウェア更新方法であって、前記第２記憶領域における前記第２記憶ブロックの数は、前記第１記憶領域における前記第１記憶ブロックの数より多く、各前記第２ファームウェアファイルは、各前記第１ファームウェアファイルにそれぞれ対応し、複数の前記第２記憶ブロックのうち、前記第２ファームウェアファイルを記憶していない記憶ブロックを予備記憶ブロックとし、（ａ）１つの前記第１記憶ブロックに記憶された前記第１ファームウェアファイルを前記予備記憶ブロックに複製する工程と、（ｂ）複製が完了した当該第１ファームウェアファイルを、対応する各前記第２ファームウェアファイルに更新する工程と、（ｃ）前記工程（ｂ）において更新が完了した当該第２ファームウェアファイルが記憶される前記第２記憶ブロックに、他の前記第１記憶ブロックに記憶された前記第１ファームウェアファイルを複製する工程とを備え、前記工程（ｂ）が、前記工程（ａ）または前記工程（ｃ）において複製が完了した前記第１ファームウェアファイルを、対応する各前記第２ファームウェアファイルに更新する工程であることにより、第２記憶領域に第１ファームウェアをダウンロードした状態で、第１記憶領域における第１ファームウェアをその第２ファームウェアで更新する場合に、できるだけ少ない不揮発メモリ容量で、特定の記憶ブロックの更新回数の上限に制限されることなく、良好にファームウェアの更新を繰り返すことができる。
【図面の簡単な説明】
【００１６】
【図１】本発明の実施の形態にかかるファームウェア更新装置の構成を概念的に示す図である。
【図２】本発明の実施の形態にかかるファームウェア更新装置の動作を示すフローチャートである。
【図３】本発明の実施の形態にかかるファームウェア更新装置の動作を説明する図である。
【図４】本発明の実施の形態にかかるファームウェア更新装置の動作を説明する図である。
【図５】本発明の実施の形態にかかるファームウェア更新装置の動作を示すフローチャートである。
【図６】本発明の実施の形態にかかるファームウェア更新装置の動作を示すフローチャートである。
【図７】本発明の実施の形態にかかるファームウェア更新装置の動作を説明する図である。
【図８】本発明の実施の形態にかかるファームウェア更新装置の動作を示すフローチャートである。
【図９】本発明の実施の形態にかかるファームウェア更新装置の動作を示すフローチャートである。
【図１０】本発明の実施の形態にかかるファームウェア更新装置の動作を示すフローチャートである。
【図１１】本発明の実施の形態にかかるファームウェア更新装置の動作を示すフローチャートである。
【図１２】本発明の実施の形態にかかるファームウェア更新装置の動作を示すフローチャートである。
【図１３】本発明の実施の形態にかかるファームウェア更新装置の動作を説明する図である。
【図１４】本発明の実施の形態にかかるファームウェア更新装置の動作を示すフローチャートである。
【発明を実施するための形態】
【００１７】
＜実施の形態＞
＜構成＞
図１は、本発明におけるファームウェア更新装置の概念的な構成図である。
【００１８】
図１に示すように本実施の形態にかかるファームウェア更新装置は、処理装置としてのＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１０１と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）１０２と、不揮発メモリＡ１０９と、不揮発メモリＢ１１０とを備えている。
【００１９】
ＣＰＵ１０１は、不揮発メモリＢ１１０に格納された命令、または、ＲＡＭ１０２に格納された命令と、ＲＡＭ１０２に格納された一時データと、不揮発メモリＡ１０９に格納された永続データとを用いて、ハードウェアを制御するためのソフトウェア等のファームウェア更新処理を行う。
【００２０】
不揮発メモリＡ１０９は、ファームウェア更新処理の実行状態（進捗状況等）を格納するための状態管理領域１０３を構成要素とする。状態管理領域１０３は、ファームウェアの更新過程において頻繁に更新されることになるため、不揮発メモリＡ１０９の種類としては、比較的寿命の長いＥＥＰＲＯＭなどが適切である。
【００２１】
不揮発メモリＢ１１０は、ブートプログラム領域１０４と、第１記憶領域としての実行領域１０５と、第２記憶領域としての待機領域１０６とから構成される。
【００２２】
実行領域１０５および待機領域１０６は、それぞれがファームウェアを保持する領域であり、実行領域１０５が、運用時に実行対象となるファームウェアＡを格納している。なお、実行領域１０５の記憶サイズは、更新可能なファームウェアの上限サイズに対応する。
【００２３】
ブートプログラム領域１０４は、ファームウェアの切換えプログラムを一部として含むブートプログラムを格納しており、ＣＰＵ１０１がリセットすると、必ずはじめに実行対象とされる領域である。
【００２４】
ブートプログラムは、起動時に状態管理領域１０３を参照し、必要に応じてファームウェアの切換えプログラムを実行した後、実行領域１０５に格納されたファームウェアＡに制御を移す。
【００２５】
待機領域１０６は、保存領域１０７と予備領域１０８から構成される。
【００２６】
保存領域１０７は、実行領域１０５のファームウェアＡと交換可能なファームウェアＢを保持する領域である。また、予備領域１０８は、不揮発メモリの消去単位の例えば１記憶ブロック分のサイズの領域であり、意味のあるデータは保持していない。
【００２７】
保存領域１０７と予備領域１０８とに対する記憶ブロックの割当て方は固定ではなく、ファームウェア交換時に変化する。
【００２８】
本実施の形態では、待機領域１０６にファームウェアＢを格納した後、実行領域１０５のファームウェアＡとファームウェアＢとを交換することで、実行領域１０５のファームウェアＡの更新を行う。このファームウェア交換を実際に行う実行主体は、ブートプログラム領域１０４に格納されたファームウェアの切換えプログラムである。
【００２９】
＜動作＞
以降では、図１の構成のファームウェア更新装置が、待機領域１０６に新しいファームウェアＢを取得してから、実行領域１０５のファームウェアＡと待機領域１０６のファームウェアＢとを切換えることでファームウェアＡを更新する方法と、更新したファームウェアＡから更新前のファームウェアＡに復元する方法とを順に説明する。ここで、「復元」処理は、更新前のファームウェアに戻す処理であるが、既に実行領域に記憶されているファームウェアを交換して新たなファームウェアを記憶させるという点では、更新処理の一種であるといえる。
【００３０】
はじめに、新しいファームウェアＢを取得し、当該ファームウェアに更新するまでの処理を説明する。
【００３１】
図２は、ファームウェア更新の手順を示すフローチャートである。
【００３２】
はじめに、実行領域１０５に格納されているファームウェアＡは、ネットワークを介してファームウェアＢをダウンロードする（ステップＳ２０１）。
【００３３】
次に、ファームウェアＡは、ファームウェア切換え指示処理を行う（ステップＳ２０２）。このファームウェア切換え処理では、実行領域１０５のファームウェアＡと保存領域１０７のファームウェアＢとの切換えをブートプログラムに指示するために、状態管理領域１０３を初期化する。
【００３４】
次に、ファームウェアＡは、ブートプログラムを起動するため、ＣＰＵ１０１をリセットする（ステップＳ２０３）。
【００３５】
リセット後のＣＰＵ１０１がブートプログラムの実行を開始すると、ブートプログラムは、ファームウェア切換え処理を行い（ステップ２０４）、ステップＳ２０２で実行されたファームウェア切換え指示に従って、ファームウェアを切換える。
【００３６】
ここでは、図２の処理をファームウェアＡとブートプログラムとが分担して行ったが、ブートプログラムがすべての処理を行ってもよい。その場合、ステップＳ２０３のリセット処理は不要である。
【００３７】
また、ダウンロードするファームウェアは、ファームウェアの全体である必要はない。例えば、実行領域１０５に格納されたファームウェアＡとの差分パッチのみをダウンロードし、実行領域１０５に格納されたファームウェアＡに対して差分パッチを適用して得られるファームウェアＢを、保存領域１０７に格納してもよい。
【００３８】
さらに、ファームウェア全体または差分パッチの取得は、ネットワークを介したダウンロードである必要はなく、外部記憶装置などからの読み出しなどでも代替可能である。
【００３９】
次に、図３に、図２のステップＳ２０１でファームウェアをダウンロードした後の、不揮発メモリＢ１１０の記憶ブロック構成を示す。
【００４０】
ここで記憶ブロックとは、不揮発メモリの消去操作を行うデータの単位である。
【００４１】
実行領域１０５がＮ個の記憶ブロックから構成される場合、待機領域１０６をＮ＋１個の記憶ブロックで構成する。本文および図面では、実行領域１０５を構成するＮ個の記憶ブロックに対して０〜Ｎ−１の整数を記憶ブロック番号として一意に付与し、実行領域１０５のｉ番目の記憶ブロックを記憶ブロックＥ［ｉ］と表記するものとする。同様に、待機領域１０６のＮ＋１個の記憶ブロックに対して０〜Ｎの整数を一意に付与し、待機領域１０６のｉ番目の記憶ブロックを記憶ブロックＳ［ｉ］と表記するものとする。
【００４２】
図３では、付与された番号が連番となっている記憶ブロック同士が隣接しているが、必ずしも隣接している必要はない。
【００４３】
図２におけるステップＳ２０１では、待機領域１０６の１〜Ｎの番号の記憶ブロックＳ［ｉ］に、ダウンロードしたファームウェアＢの分割した単位であるファームウェアファイルＢをそれぞれ格納する。なお、実行領域１０５の０〜Ｎ−１の番号の記憶ブロックＥ［ｉ］には、ファームウェアＡの分割した単位であるファームウェアファイルＡがそれぞれ格納されている。
【００４４】
このとき、ファームウェア更新後に記憶ブロックＥ［ｉ］に格納されるべきファームウェアファイルＢが、記憶ブロックＳ［ｉ＋１］に格納されるようにする。
【００４５】
待機領域１０６の記憶ブロックＳ［０］は、予備領域１０８であり、ファームウェアダウンロード時には更新不要である。
【００４６】
次に、図４に状態管理領域１０３の記憶ブロック構成を示す。
【００４７】
状態管理領域１０３は、ファームウェアを格納する領域（実行領域１０５および待機領域１０６）と同様に、複数の記憶ブロックから構成され、状態番号領域４０１、予備領域ブロック番号４０２、切替えフラグ４０３、退避領域４０４を備える。
【００４８】
状態番号領域４０１は、ファームウェア切換えの進捗状況を一連の状態番号で管理するための領域であり、３つの記憶ブロックで１つの状態番号を表現する。
【００４９】
状態番号は、０からはじまり、ファームウェア切換え処理が進むごとに１ずつ増加する値である。本実施の形態では、３つの記憶ブロックのうち少なくとも２つは、常に連続する整数を保持する状態を保つように、状態番号領域４０１を更新する。このとき、状態番号領域４０１が保持する値は、連続する整数の中で最大の数である。
【００５０】
３つの記憶ブロックのうち少なくとも２つが常に連続する状態を保つように状態番号に１を加えるには、最大の数を含む記憶ブロックと最大の数より１小さい数を含む記憶ブロックとを１つずつ選択し、残った記憶ブロックに対して、最大の数に１を加えた値を書き込めばよい。
【００５１】
このように状態番号領域４０１の値を更新することで、状態番号の更新中に電源断が発生し、更新対象とした記憶ブロックが不定な値になったとしても、状態番号領域４０１が保持する値を表す残りの２つの記憶ブロックは不変であるため、更新前の値が失われることはない。
【００５２】
予備領域ブロック番号４０２は、待機領域１０６における予備領域１０８の記憶ブロック番号である。この予備領域１０８は、ファームウェア切換え（更新処理、復元処理）を行うと位置が変更される領域である。
【００５３】
切替えフラグ４０３は、ブートプログラムに対してファームウェア切換えを指示するための領域である。ブートプログラムは、切替えフラグ４０３を確認し、有効な場合のみ実行領域１０５と待機領域１０６とのファームウェアの交換処理を行う。
【００５４】
退避領域４０４は、予備領域ブロック番号４０２を更新する前に、更新前の予備領域ブロック番号４０２を退避する（格納する）領域である。
【００５５】
予備領域ブロック番号４０２の更新中に電源断が発生し、予備領域ブロック番号４０２の内容が不定値になった場合、電源投入後に退避領域４０４の値を使用することにより、予備領域ブロック番号４０２の値を正しく更新することが可能である。
【００５６】
次に、図５において、図２のステップＳ２０２のファームウェア切換え指示処理のフローチャートを示す。
【００５７】
ファームウェア切換え指示処理は、実行領域１０５と待機領域１０６とにそれぞれ格納されたファームウェアの切換えをブートプログラムに行わせるために、状態管理領域１０３を初期化する処理である。
【００５８】
実行中のファームウェアは、予備領域ブロック番号４０２に０を設定し（ステップＳ５０１）、状態番号領域４０１に初期値を書き込んだ後（ステップＳ５０２）、切替えフラグを有効化する（ステップＳ５０３）。ステップＳ５０１とステップＳ５０２との順序は任意であるが、ステップＳ５０３は最後である。
【００５９】
このようにすることで、ファームウェア切換え指示処理中の電源断で予備領域ブロック番号４０２、または、状態番号領域４０１が不定になった場合であっても、ブートプログラムによる誤ったファームウェア切換え処理は発生しない。これは、切替えフラグ４０３が有効になった時点で、予備領域ブロック番号４０２と状態番号領域４０１とが正しく初期化されていることが保証されているためである。
【００６０】
次に、図６において、図２のステップＳ２０４のファームウェア切換え処理のフローチャートを示す。
【００６１】
ファームウェア切換え処理は、図６のフローによってのみ実行されるのではなく、ブートプログラムが起動されると常に実行対象となる。
【００６２】
ファームウェア切換え処理において、ブートプログラムは切替えフラグ４０３を参照し、切替えフラグ４０３が有効か否かで切替え指示の有無を判定する（ステップＳ６０１）。そして、切替えフラグが有効でない場合（ＮＯ）、直ちに処理を終了する。
【００６３】
一方、切替えフラグ４０３が有効な場合（ＹＥＳ）、状態番号領域４０１から状態番号を取得し（ステップＳ６０２）、状態番号に応じて実行する処理を決定する（ステップＳ６０３）。
【００６４】
図２のフローから実行される場合は、状態番号０からのスタートであるが、ファームウェア切換え処理中に電源断が発生した場合は、電源断直前までに行われていた処理の状態番号が、状態番号領域４０１において格納されている。
【００６５】
ステップＳ６０３では、状態番号が０以上２Ｎ未満の場合、ファームウェア交換中であると判定し、ステップＳ６０４に進む。一方で、２Ｎの場合はステップＳ６０８へ進み、２Ｎ＋１の場合はステップＳ６１０へ進む。
【００６６】
ステップＳ６０３〜ステップＳ６０７では、実行領域１０５と待機領域１０６とのファームウェアの交換を行う。ブートプログラムは、予備領域ブロック番号を変数ａに読み出し（ステップＳ６０４）、ステップＳ６０５において、変数ａの値について判断する。
【００６７】
すなわち、変数ａの値が０であればステップＳ６０６に進み、変数ａの値がＮであればステップＳ６０７に進む。
【００６８】
予備領域１０８は、待機領域１０６の記憶ブロックＳ［０］である場合と、待機領域１０６の記憶ブロックＳ［Ｎ］である場合との２通りがあり、予備領域１０８の位置によってファームウェアの交換方法が異なる。
【００６９】
図２のステップＳ２０１でファームウェアをダウンロードした直後では、図３のとおり予備領域１０８を待機領域１０６の記憶ブロックＳ［０］に確保しているため、図３の状態からファームウェア切換え処理が行われている場合、ステップＳ６０６に進むことになる。
【００７０】
ステップＳ６０６は、状態番号を入力とする順方向ファームウェア交換処理であり、予備領域１０８の位置が記憶ブロックＳ［０］であることを前提に、実行領域１０５と待機領域１０６とのファームウェアを交換する処理である。
【００７１】
順方向ファームウェア交換処理が完了した時点で、予備領域１０８の位置は記憶ブロックＳ［０］から記憶ブロックＳ［Ｎ］に変更される。
【００７２】
ステップＳ６０７は、状態番号を入力とする逆方向ファームウェア交換処理であり、順方向ファームウェア交換処理で行ったファームウェア交換を元に戻す処理である。
【００７３】
逆方向ファームウェア交換処理では、予備領域１０８の位置が記憶ブロックＳ［Ｎ」であることを前提に、実行領域１０５と待機領域１０６とのファームウェアを交換する。
【００７４】
逆方向ファームウェア交換処理が完了した時点で、予備領域１０８の位置は記憶ブロックＳ［Ｎ］から記憶ブロックＳ［０］に変更される。
【００７５】
このため、逆方向ファームウェア交換処理で行ったファームウェア交換を、順方向ファームウェア交換処理で元に戻すことが可能である。
【００７６】
ステップＳ６０７またはステップＳ６０８の実行過程において、状態番号は０から２Ｎまで順次更新され、処理完了時点で状態番号が２Ｎとなる。ブートプログラムは、ステップＳ６０６またはステップＳ６０７の処理が完了すると、ステップＳ６０８に進む。
【００７７】
ステップＳ６０８〜ステップＳ６１５では、予備領域ブロック番号４０２を更新し、切替えフラグ４０３を無効化することで、ファームウェア切換え処理を完了させる。
【００７８】
ブートプログラムはまず、予備領域ブロック番号４０２の値を読み出して退避領域４０４に書き込み（ステップＳ６０８）、状態番号を２Ｎ＋１に更新する（ステップＳ６０９）。
【００７９】
ステップＳ６０８またはステップＳ６０９の処理中に電源断が発生した場合でも、ブートプログラムは状態番号の２Ｎを電源投入後に読み出すことで、ステップＳ６０３を経てステップＳ６０８から処理を再開することが可能である。
【００８０】
次に、ブートプログラムは、退避領域４０４に格納された予備領域ブロック番号４０２の値を変数ｂに読出し（ステップＳ６１０）、ステップＳ６１１において、変数ｂの値について判断する。
【００８１】
すなわち、変数ｂの値が０であればステップＳ６１２に進み、変数ｂの値がＮであればステップＳ６１３に進む。
【００８２】
ステップＳ６１２は、順方向ファームウェア交換を行った結果として、予備領域ブロック番号がＮになったことを予備領域ブロック番号に反映する処理である。処理が終了したら、ステップＳ６１４に進む。
【００８３】
一方、ステップＳ６１３は、逆方向ファームウェア交換を行った結果として、予備領域ブロック番号が０になったことを予備領域ブロック番号に反映する処理である。処理が終了したら、ステップＳ６１４に進む。
【００８４】
ブートプログラムは、ステップＳ６１４において状態番号を２Ｎ＋２に更新すると（１を加算）、切替えフラグを無効化することで、ファームウェア切換え処理を完了させる（ステップＳ６１５）。
【００８５】
ステップＳ６１０〜ステップＳ６１５のいずれかで電源断が発生した場合、再起動後にブートプログラムが状態番号として２Ｎ＋１を読み出すため、ステップＳ６０３を経て、ステップＳ６１０から処理を再開することが可能である。
【００８６】
仮に、予備領域ブロック番号４０２の値が不定値となってしまっていた場合でも、ステップ６１０で読み出す値は、更新前の予備領域ブロック番号４０２として退避領域４０４から読み出すため、正常に処理を継続することができる。
【００８７】
順方向ファームウェア更新処理は、入力状態番号ｉ（０≦ｉ＜２Ｎ）に基づいて、実行領域１０５と待機領域１０６とのファームウェアを交換する処理である。
【００８８】
図７と図８を用いて、順方向ファームウェア交換処理を説明する。
【００８９】
図７は、順方向ファームウェア交換処理の模式図である。
【００９０】
実行領域１０５はＮ個の記憶ブロックから構成されており、待機領域１０６はＮ＋１個の記憶ブロックから構成されている。
【００９１】
待機領域１０６における記憶ブロックＳ［０］は予備領域１０８であり、記憶ブロックＳ［１］以降にファームウェアファイルＢが格納されている（保存領域１０７）。
【００９２】
図７において、記憶ブロック同士を結ぶ辺は記憶ブロックに格納されたファームウェアファイルのコピー動作を意味しており、矢印はコピーの向きを意味する。さらに、辺のラベルは状態番号を意味する。
【００９３】
順方向ファームウェア交換処理では、状態番号ｉが偶数（０を含む）の場合、記憶ブロックＥ［ｉ／２］から記憶ブロックＳ［ｉ／２］へのファームウェアファイルＡのコピーを行い、状態番号ｉが奇数の場合、記憶ブロックＳ［ｉ／２＋１］から記憶ブロックＥ［ｉ／２］へのファームウェアファイルＢのコピーを行う。ここでは、除算／は整数の除算を意味し、商は整数である。
【００９４】
図８は、順方向ファームウェア交換処理のフローチャートである。
【００９５】
はじめにブートプログラムは、順方向ファームウェア交換処理のはじめに入力となる状態番号を変数ｋに読み出す（ステップＳ８０１）。
【００９６】
ステップＳ８０２〜ステップＳ８０７は、実行領域１０５と待機領域１０６とのファームウェアを記憶ブロックごと（ファームウェアファイルごと）に交換するためのループ処理である。
【００９７】
次に、ブートプログラムはｋが偶数か否かを判定し（ステップＳ８０２）、ｋが偶数（０を含む）であれば（ＹＥＳ）ステップＳ８０３に進み、ｋが奇数であれば（ＮＯ）ステップＳ８０４に進む。
【００９８】
ステップＳ８０３は、実行領域１０５の記憶ブロックＥ［ｋ／２］から待機領域１０６の記憶ブロックＳ［ｋ／２］へのファームウェアファイルＡのコピー処理である。
【００９９】
一方、ステップＳ８０４は、待機領域１０６の記憶ブロックＳ［ｋ／２＋１］から実行領域１０５の記憶ブロックＥ［ｋ／２］へのファームウェアファイルＢのコピー処理である。
【０１００】
ブートプログラムは、ステップＳ８０３またはステップＳ８０４が完了すると、状態番号更新処理を行うことで状態番号に１を加算し（ステップＳ８０５）、ｋの値も同様に１加算する（ステップＳ８０６）。
【０１０１】
次に、ｋの値が２Ｎ以上か否かを比較することで、全記憶ブロック分の交換が完了したか否かを判定し（ステップＳ８０７）、ｋの値が２Ｎ以上であれば（ＹＥＳ）全記憶ブロック分の交換が完了しているとして動作を終了し、ｋの値が２Ｎ未満であれば（ＮＯ）全記憶ブロック分の交換が完了していないとして、ステップＳ８０２に戻る。
【０１０２】
ファームウェアの交換処理の進捗状態を一連番号化して更新することで、進捗状態の更新中に電源断が発生したとしても、更新前の状態を保持し続けることが可能である。
【０１０３】
また、実行領域１０５と待機領域１０６との記憶ブロック単位のファームウェア交換において、同一番号同士の記憶ブロックを交換するのではなく、待機領域１０６の記憶ブロックをずらして交換することで、後述する逆方向ファームウェア更新処理と合わせて、特定の記憶ブロックにおける消去および書込みの集中を緩和して、ファームウェアの交換を行うことが可能である。
【０１０４】
次に、状態番号領域４０１に格納された値を取得する方法を図９を用いて、状態番号領域４０１に格納された値を更新する方法を図１０を用いてそれぞれ説明する。
【０１０５】
本実施の形態では、状態番号領域４０１の記憶ブロックについて、Ｂ［ｉ］＝Ｂ［（ｉ＋２）％２］＋１を満たす記憶ブロック番号ｉ∈｛０，１，２｝が少なくとも１つ存在する、すなわち、少なくとも２つの記憶ブロックは値が連続するという命題が常に成立するように、状態番号領域を初期化する。なお、「％」は剰余の演算子であり、除算を行った場合の余りの数（整数）が代入されることを示す。すなわち、「Ｂ［（ｉ＋２）％２］」の場合、（ｉ＋２）を２で割った余りの整数が、ブロックＢの番号である。
【０１０６】
図９は、状態番号取得処理のフローチャートである。
【０１０７】
状態番号取得処理では、上記命題が成立することを利用して、状態番号領域４０１から状態を読み出す。
【０１０８】
ブートプログラムは、はじめに状態番号領域４０１の３つの記憶ブロックの中から最大数を含む記憶ブロックの番号を取得して変数ｍに格納し（ステップＳ９０１）、Ｂ［ｍ］の値を変数ｘに読出し（ステップＳ９０２）、変数ｘの値を状態番号取得処理の出力とする（ステップＳ９０３）。
【０１０９】
ここで、ステップＳ９０２で取得する最大数は、状態番号領域４０１の記憶ブロックが保持する連続する数の中における最大数であり、他の記憶ブロックが保持する値と連続しない値は対象外である。
【０１１０】
図１０は、状態番号更新処理のフローチャートである。
【０１１１】
状態番号更新処理は、状態番号領域４０１が保持する値を、現在の値に１を加算した値で更新する処理である。
【０１１２】
ブートプログラムは、はじめに状態番号領域４０１の３つの記憶ブロックの中から最大数を含む記憶ブロックの番号を取得し変数ｍに格納する（ステップＳ１００１）。
【０１１３】
このときの最大数は、状態管理領域１０３の記憶ブロックが保持する連続する数の中における最大数であり、他の記憶ブロックが保持する値と連続しない値は対象外である。
【０１１４】
次にブートプログラムは更新対象の記憶ブロック番号を（ｍ＋１）％３の演算によって決定し、値を変数ｎに格納する（ステップＳ１００２）。
【０１１５】
ステップＳ１００３では、Ｂ［ｎ］の値をＢ［ｍ］＋１で更新する。
【０１１６】
このとき、Ｂ［ｎ］の更新中に電源断が発生してＢ［ｎ］の値がＢ［ｍ］＋１以外の任意の値になったとしても、他の２つの記憶ブロックの値は不変であり、ステップＳ１００１で得られる記憶ブロックの番号はｍのままである。
【０１１７】
したがって、図１０の状態更新処理の途中に電源断が発生しても、状態番号領域４０１が保持する値Ｂ［ｍ］は不変である。
【０１１８】
状態番号領域４０１が保持する値を０に初期化するときに、Ｂ［０］＝ＡＮＹ、Ｂ［１］＝−１、Ｂ［２］＝０で状態番号０を表現することで、図１０の処理を複数回数繰り返した後も、状態番号領域４０１の記憶ブロックについてＢ［ｉ］＝Ｂ［（ｉ＋２）％２］＋１を満たす記憶ブロック番号ｉ∈｛０，１，２｝が少なくとも１つ存在するという命題を成立することが可能である。
【０１１９】
次に図１１に、状態番号領域４０１に含まれる連続する数の中で最大数を含む記憶ブロックを取得するための処理を示す。
【０１２０】
ブートプログラムは、状態番号領域４０１に含まれる連続する数の中で最大数を含む記憶ブロックのみが満足する条件を全ての記憶ブロックに対してチェックすることにより、目的とする記憶ブロックの番号を取得する。
【０１２１】
図１０の状態更新処理により、状態番号領域４０１の記憶ブロックについてＢ［ｉ］＝Ｂ［（ｉ＋２）％２］＋１を満たす記憶ブロック番号ｉ∈｛０，１，２｝が少なくとも１つ存在することを前提とすると、記憶ブロックｉが連続する数の中で最大数を含む記憶ブロックであることの必要十分条件は、Ｂ［ｉ］＝Ｂ［（ｉ＋２）％３］＋１、かつ、Ｂ［ｉ］≠Ｂ［（ｉ＋１）％３］−１である。
【０１２２】
ブートプログラムは、はじめに記憶ブロック番号ｉを０で初期化し（ステップＳ１１０１）、記憶ブロック番号ｉの記憶ブロック番号が連続する数の中で最大数か否かを、Ｂ［ｉ］＝Ｂ［（ｉ＋２）％３］＋１、かつ、Ｂ［ｉ］≠Ｂ［（ｉ＋１）％３］−１の条件を満たすか否かで判定する（ステップＳ１１０２）。
【０１２３】
上記の条件を満たす場合（ＹＥＳ）、ｉを最大数を含む記憶ブロック番号として出力する（ステップＳ１１０４）。
【０１２４】
一方、上記の条件を満足しない場合（ＮＯ）、記憶ブロック番号を１だけ加算し（ステップＳ１１０３）、ステップＳ１１０２に戻る。
【０１２５】
ここまでで、ファームウェアの更新処理を示した。以降では、更新前のファームウェアに復元する方法を示す。
【０１２６】
図１２は、ファームウェア復元処理のフローチャートである。
【０１２７】
実行中のファームウェアは、状態番号領域４０１が保持する値を０で初期化し（ステップＳ１２０１）、切替えフラグを有効化する（ステップＳ１２０２）。その後、ＣＰＵをリセットする（ステップＳ１２０３）し、ブートプログラムが動作を開始する。
【０１２８】
ブートプログラムは、起動後、ファームウェア切換え処理を行い、実行領域１０５のファームウェアと待機領域の１０６のファームウェアとを切り換える（ステップＳ１２０４）。
【０１２９】
次に逆方向ファームウェア更新処理について説明する。
【０１３０】
逆方向ファームウェア更新処理は、入力状態番号ｉ（０≦ｉ＜２Ｎ）に基づいて、実行領域１０５と待機領域１０６とのファームウェアを交換する処理である。
【０１３１】
図１３と図１４を用いて、逆方向ファームウェア交換処理を説明する。
【０１３２】
図１３は、逆方向ファームウェア交換処理の模式図である。
【０１３３】
実行領域１０５はＮ個の記憶ブロックから構成されており、待機領域１０６はＮ＋１個の領域から構成されている。
【０１３４】
待機領域１０６における記憶ブロックＳ［０］は予備領域１０８であり、記憶ブロックＳ［１］以降にファームウェアファイルＡが格納されている（保存領域１０７）。
【０１３５】
図１３において、記憶ブロック同士を結ぶ辺は記憶ブロックに格納されたファームウェアファイルのコピー動作を意味しており、矢印はコピーの向きを意味する。さらに、辺のラベルは状態番号を意味する。
【０１３６】
逆方向ファームウェア交換処理では、状態番号ｉが偶数（０を含む）の場合、記憶ブロックＥ［Ｎ−ｉ／２−１］から記憶ブロックＳ［Ｎ−ｉ／２］へのファームウェアファイルＢのコピーを行い、状態番号ｉが奇数の場合、記憶ブロックＳ［Ｎ−ｉ／２−１］から記憶ブロックＥ［Ｎ−ｉ−１］へのファームウェアファイルＡのコピーを行う。ここでは、除算／は整数の除算を意味し、商は整数である。
【０１３７】
図１４は、逆方向ファームウェア交換処理のフローチャートである。
【０１３８】
はじめにブートプログラムは、逆方向ファームウェア交換処理のはじめに入力となる状態番号を変数ｋに読み出す（ステップＳ１４０１）。
【０１３９】
ステップＳ１４０２〜ステップＳ１４０７は、実行領域１０５と待機領域１０６とのファームウェアを記憶ブロックごと（ファームウェアファイルごと）に交換するためのループ処理である。変数ｋは、当該ループの制御変数としての意味も持つ。
【０１４０】
次に、ブートプログラムはｋが偶数か否かを判定し（ステップＳ１４０２）、ｋが偶数（０を含む）であれば（ＹＥＳ）ステップＳ１４０３に進み、ｋが奇数であれば（ＮＯ）ステップＳ１４０４に進む。
【０１４１】
ステップＳ１４０３は、実行領域１０５の記憶ブロックＥ［Ｎ−ｋ／２−１］から待機領域１０６の記憶ブロックＳ［Ｎ−ｋ／２］へのファームウェアファイルＢのコピー処理である。
【０１４２】
一方、ステップＳ１４０４は、待機領域１０６の記憶ブロックＳ［Ｎ−ｋ／２−１］から実行領域１０５の記憶ブロックＥ［Ｎ−ｋ／２−１］へのファームウェアファイルＡのコピー処理である。
【０１４３】
ブートプログラムは、ステップＳ１４０３またはステップＳ１４０４が完了すると、状態番号更新処理を行うことで状態番号に１を加算し（ステップＳ１４０５）、ｋの値も同様に１加算する（ステップＳ１４０６）。
【０１４４】
次に、ｋの値が２Ｎ以上か否かを比較することで、全記憶ブロック分の交換が完了したか否かを判定し（ステップＳ１４０７）、ｋの値が２Ｎ以上であれば（ＹＥＳ）全記憶ブロック分の交換が完了しているとして動作を終了し、ｋの値が２Ｎ未満であれば（ＮＯ）全記憶ブロック分の交換が完了していないとして、ステップＳ１４０２に戻る。
【０１４５】
ファームウェアの交換処理の進捗状態を一連番号化して更新することで、進捗状態の更新中に電源断が発生したとしても、更新前の状態を保持し続けることが可能である。
【０１４６】
また、実行領域１０５と待機領域１０６との記憶ブロック単位のファームウェア交換において、同一番号同士の記憶ブロックを交換するのではなく、待機領域１０６の記憶ブロックをずらして交換することで、順方向ファームウェア更新処理と合わせて、特定の記憶ブロックにおける消去および書込みの集中を緩和して、ファームウェアの交換を行うことが可能である。
【０１４７】
＜変形例＞
本実施の形態では、状態番号領域４０１を３つの記憶ブロックを用いて構成したが、４つ以上の記憶ブロックを用いて構成することも可能である。状態番号領域４０１が保持する値を更新する場合、更新に必要な記憶ブロックは、状態番号領域４０１を構成する記憶ブロックのうちの１つであるため、記憶ブロック数を増加させることで、状態番号領域４０１の更新上限回数を増加させることが可能である。
【０１４８】
また本実施の形態では、予備領域１０８として１つの記憶ブロックを割り当てたが、２つ以上の記憶ブロックを用いて構成することも可能である。複数の記憶ブロックを仮想的に１つの記憶ブロックとして扱うと、仮想的な記憶ブロック総数が減る。このため、状態番号の総数が減り、状態番号領域４０１の更新回数も減らすことが可能である。
【０１４９】
＜効果＞
本発明にかかる実施の形態によれば、ファームウェア更新装置において、第１ファームウェアとしてのファームウェアＡの更新処理を行う処理装置（ＣＰＵ１０１）と、ファームウェアＡを分割した単位である第１ファームウェアファイルとしてのファームウェアファイルＡを、複数の第１記憶ブロックとしての記憶ブロックＥ［ｉ］にそれぞれ記憶する不揮発性の第１記憶領域（実行領域１０５）と、ファームウェアＡを更新する第２ファームウェアとしてのファームウェアＢを分割した単位である第２ファームウェアファイルとしてのファームウェアファイルＢを、複数の第２記憶ブロックとしての記憶ブロックＳ［ｉ］にそれぞれ記憶する不揮発性の第２記憶領域（待機領域１０６）とを備える。
【０１５０】
待機領域１０６における記憶ブロックＳ［ｉ］の数は、予備領域１０８の分、実行領域１０５における記憶ブロックＥ［ｉ］の数より多い。
【０１５１】
各ファームウェアファイルＢは、各ファームウェアファイルＡにそれぞれ対応し、ＣＰＵ１０１が、各ファームウェアファイルＡを対応する各ファームウェアファイルＢに更新することで、ファームウェアＡの更新処理を行う。
【０１５２】
このようなファームウェア更新装置によれば、分割した単位であるファームウェアファイルごとに異なる記憶ブロックに記憶して更新するので、特定の記憶ブロックの更新回数の上限に制限されることなく、良好にファームウェアの更新を繰り返すことができる。
【０１５３】
ファームウェアＡを更新する際には、更新対象であるファームウェアファイルＡを記憶するすべての記憶ブロックＥ［ｉ］が常に不揮発メモリＢ１１０上に記憶されている状態を維持するとともに、実行領域１０５と待機領域１０６とに含まれる各記憶ブロックの消去回数を軽減することができる。
【０１５４】
また、本発明にかかる実施の形態によれば、ファームウェア更新装置において、複数の第２記憶ブロックとしての記憶ブロックＳ［ｉ］のうち、第２ファームウェアファイルとしてのファームウェアファイルＢを記憶していない記憶ブロックを予備記憶ブロック（予備領域１０８）とし、ＣＰＵ１０１が、１つの第１記憶ブロックとしての記憶ブロックＥ［ｉ］に記憶された第１ファームウェアファイルとしてのファームウェアファイルＡを予備領域１０８に複製し、複製が完了した当該ファームウェアファイルＡを、対応する各ファームウェアファイルＢに更新し、更新が完了した当該ファームウェアファイルＢが記憶される記憶ブロックＳ［ｉ］に、他の記憶ブロックＥ［ｉ］に記憶されたファームウェアファイルＡを複製する更新処理を繰り返し行う。
【０１５５】
このようなファームウェア更新装置によれば、待機領域１０６にファームウェアＢをダウンロードした状態で、実行領域１０５におけるファームウェアＡをそのファームウェアＢで更新する場合に、できるだけ少ない不揮発メモリ容量で、特定の記憶ブロックの更新回数の上限に制限されることなく、良好にファームウェアの更新を繰り返すことができる。
【０１５６】
また、本発明にかかる実施の形態によれば、ファームウェア更新装置において、予備記憶ブロックとしての予備領域１０８となる第２記憶ブロック（記憶ブロックＳ［ｉ］）が、更新処理ごとに異なる。
【０１５７】
このようなファームウェア更新装置によれば、待機領域１０６にファームウェアＢをダウンロードした状態で、実行領域１０５におけるファームウェアＡをそのファームウェアＢで更新する場合に、特定の記憶ブロックに書き換えを集中することなくファームウェアＡとファームウェアＢとを入れ換えることにより、特定の記憶ブロックの更新回数の上限による制限を緩和することができる。
【０１５８】
また、本発明にかかる実施の形態によれば、ファームウェア更新装置において、第１ファームウェアとしてのファームウェアＡの更新処理の進捗状態を管理する状態管理領域１０３をさらに備える。
【０１５９】
状態管理領域１０３は、第１記憶領域としての実行領域１０５、および、第２記憶領域としての待機領域１０６を備える不揮発性メモリＢ１１０とは異なる、不揮発性メモリＡ１０９において備えられる。
【０１６０】
このようなファームウェア更新装置によれば、更新処理の間、実行領域１０５や待機領域１０６よりも状態管理領域１０３が頻繁に書き換え動作を行う場合に、不揮発メモリＢ１１０より寿命の長い不揮発メモリＡ１０９に状態管理領域１０３を備えることにより、ファームウェア更新処理の上限回数の制限を、さらに緩和することができる。
【０１６１】
また、本発明にかかる実施の形態によれば、ファームウェア更新装置において、状態管理領域１０３が、更新処理の進捗状態を、一連番号で管理する。
【０１６２】
このようなファームウェア更新装置によれば、更新処理中に電源断が発生しても、更新前の状態番号の値を一連で保持しているため、確実に更新処理を再開することができる。また、確実に更新前の状態に復元することができる。
【０１６３】
また、本発明にかかる実施の形態によれば、ファームウェア更新装置において、状態管理領域１０３は、複数の記憶ブロックを備え、状態管理領域１０３が、一連番号を複数の記憶ブロックでそれぞれ保持することによって、更新処理の進捗状態を管理する。
【０１６４】
このようなファームウェア更新装置によれば、一連番号の更新処理中に電源断が発生しても、確実に更新処理を再開することができる。
【０１６５】
また、本発明にかかる実施の形態によれば、ファームウェア更新装置において、状態管理領域１０３は、更新処理の進捗状態を示す状態番号と、予備記憶ブロックとしての予備領域１０８に対応する第２記憶ブロック（記憶ブロックＳ［ｉ］）の位置を示す予備記憶ブロック番号４０２と、更新処理を開始できるか否かを切り替える切替えフラグ４０３とを管理する。
【０１６６】
状態管理領域１０３は、状態番号と予備記憶ブロック番号４０２とを先に初期化した後に、切替えフラグ４０３を有効にすることで、更新処理を開始させる。
【０１６７】
このようなファームウェア更新装置によれば、更新指示を出しているときに電源断が発生しても、不定な状態番号のまま誤ってファームウェアが更新されることを防ぐことができる。
【０１６８】
また、本発明にかかる実施の形態によれば、ファームウェア更新装置において、状態管理領域１０３が、更新処理が完了した場合に切替えフラグ４０３を無効にする。
【０１６９】
このようなファームウェア更新装置によれば、途中で電源断が発生しても、電源投入後に人の手を介することなく、切替え処理を継続することができる。
【０１７０】
また、本発明にかかる実施の形態によれば、ファームウェア更新方法において、第１ファームウェアとしてのファームウェアＡを分割した単位である第１ファームウェアファイル（ファームウェアファイルＡ）を、複数の第１記憶ブロックとしての記憶ブロックＥ［ｉ］にそれぞれ記憶する不揮発性の第１記憶領域（実行領域１０５）と、ファームウェアＡを更新する第２ファームウェアとしてのファームウェアＢを分割した単位である第２ファームウェアファイル（ファームウェアファイルＢ）を、複数の第２記憶ブロックとしての記憶ブロックＳ［ｉ］にそれぞれ記憶する不揮発性の第２記憶領域（待機領域１０６）とを用いる。
【０１７１】
待機領域１０６における記憶ブロックＳ［ｉ］の数は、予備領域１０８の分、実行領域１０５における記憶ブロックＥ［ｉ］の数より多い。
【０１７２】
各ファームウェアファイルＢは、各ファームウェアファイルＡにそれぞれ対応し、複数の記憶ブロックＳ［ｉ］のうち、ファームウェアファイルＢを記憶していない記憶ブロックを予備記憶ブロック（予備領域１０８）とする。
【０１７３】
そして、（ａ）１つの記憶ブロックＥ［ｉ］に記憶されたファームウェアファイルＡを予備領域１０８に複製する工程と、（ｂ）複製が完了した当該ファームウェアファイルＡを、対応する各ファームウェアファイルＢに更新する工程と、（ｃ）工程（ｂ）において更新が完了した当該ファームウェアファイルＢが記憶される記憶ブロックＳ［ｉ］に、他の記憶ブロックＥ［ｉ］に記憶されたファームウェアファイルＡを複製する工程とを備える。
【０１７４】
工程（ｂ）は、工程（ａ）または工程（ｃ）において複製が完了したファームウェアファイルＡを、対応する各ファームウェアファイルＢに更新する工程である。
【０１７５】
このようなファームウェア更新方法によれば、待機領域１０６にファームウェアＢをダウンロードした状態で、実行領域１０５におけるファームウェアＡをそのファームウェアＢで更新する場合に、できるだけ少ない不揮発メモリ容量で、特定の記憶ブロックの更新回数の上限に制限されることなく、良好にファームウェアの更新を繰り返すことができる。
【０１７６】
なお本発明は、その発明の範囲内において、本実施の形態における任意の構成要素の変形もしくは省略が可能である。
【符号の説明】
【０１７７】
１０１  ＣＰＵ、１０３  状態管理領域、１０４  ブートプログラム領域、１０５  実行領域、１０６  待機領域、１０７  保存領域、１０８  予備領域、１０９  不揮発メモリＡ、１１０  不揮発メモリＢ、４０１  状態番号領域、４０２  予備領域ブロック番号、４０３  切替えフラグ、４０４  退避領域。
【図１】
0005683518.tif 000002
【図２】
0005683518.tif 000003
【図３】
0005683518.tif 000004
【図４】
0005683518.tif 000005
【図５】
0005683518.tif 000006
【図６】
0005683518.tif 000007
【図７】
0005683518.tif 000008
【図８】
0005683518.tif 000009
【図９】
0005683518.tif 000010
【図１０】
0005683518.tif 000011
【図１１】
0005683518.tif 000012
【図１２】
0005683518.tif 000013
【図１３】
0005683518.tif 000014
【図１４】
0005683518.tif 000015