(57)【要約】【課題】データ保持期限が比較的短期の不揮発性メモリを電子機器のプログラム格納に使用する場合において、その保証されるデータ保持期間を経過した場合であっても、当該不揮発性メモリを搭載した制御ボード等の電子部品を正常に動作させる。【解決手段】演算手段と、前記演算手段を制御するためのプログラムを格納するための複数の不揮発性の記憶手段であって、第１の記憶手段と当該第１の記憶手段よりもリテンションの短い第２の記憶手段と、を備えた制御回路において、前記第２の記憶手段には、同一内容の前記プログラムが複数格納され、前記制御回路に対して電源が投入された時点で、前回の電源の投入から所定期間が経過していた場合、前記第２の記憶手段に格納された複数の前記プログラムを用いて誤りのないプログラムを生成して、当該生成されたプログラムを前記演算手段に実行させることを特徴とする。【選択図】  図7
2016157163.tif 000002
【特許請求の範囲】
【請求項１】
演算手段と、
前記演算手段を制御するためのプログラムを格納するための複数の不揮発性の記憶手段であって、第１の記憶手段と当該第１の記憶手段よりもリテンションの短い第２の記憶手段と、
を備えた制御回路において、
前記第２の記憶手段には、同一内容の前記プログラムが複数格納され、
前記制御回路に対して電源が投入された時点で、前回の電源の投入から所定期間が経過していた場合、前記第２の記憶手段に格納された複数の前記プログラムを用いて誤りのないプログラムを生成して、当該生成されたプログラムを前記演算手段に実行させる
ことを特徴とする制御回路。
【請求項２】
前記生成されたプログラムを前記演算手段が実行する際に当該プログラムを展開するための第３の記憶手段を備え、
前記第３の記憶手段に展開された前記プログラムは、前記同一のプログラムとして、前記第２の記憶手段に複数格納される
ことを特徴とする請求項１に記載の制御回路。
【請求項３】
前記所定期間は、前記リテンションに応じて決定されることを特徴とする請求項１又は２に記載の制御回路。
【請求項４】
前記誤りのないプログラムは、前記複数のプログラムのそれぞれから所定容量のデータを読み込んで比較し、比較の結果が一致する内容のデータを採用することで生成されることを特徴とする請求項１乃至３のいずれか１項に記載の制御回路。
【請求項５】
前記所定容量のデータの単位で前記誤りのないプログラムを生成できない場合、当該所定容量のデータを分割し、分割後の単位で比較を行なって、比較の結果が一致する内容のデータを採用することで、前記誤りのないプログラムが生成されることを特徴とする請求項４に記載の制御回路。
【請求項６】
前記誤りのないプログラムは、前記複数のプログラムの所定容量のデータをチェックサム方式で検証し、正しいと判定された内容のデータを採用することで生成されることを特徴とする請求項１乃至３のいずれか１項に記載の制御回路。
【請求項７】
前記所定容量のデータの単位で前記誤りのないプログラムを生成できない場合、当該所定容量のデータを分割し、分割後の単位で前記チェックサム方式の検証を行なって、正しいと判定された内容のデータを採用することで、前記誤りのないプログラムが生成されることを特徴とする請求項６に記載の制御回路。
【請求項８】
前記所定容量は、前記第２の記憶手段のアクセス単位に相当する容量であることを特徴とする請求項１乃至７のいずれか１項に記載の制御回路。
【請求項９】
請求項１乃至８のいずれか１項に記載の制御回路を備えた電子機器であって、前記プログラムは、前記電子機器を起動するためのプログラムであることを特徴とする電子機器。
【請求項１０】
演算手段と、前記演算手段を制御するためのプログラムを格納するための複数の不揮発性の記憶手段であって、第１の記憶手段と当該第１の記憶手段よりもリテンションの短い第２の記憶手段と、を備え、前記第２の記憶手段には同一内容の前記プログラムが複数格納された制御回路における制御方法であって、
前記制御回路に対して電源が投入された時点で、前回の電源の投入から所定期間が経過しているかどうかを判定するステップと、
前記第２の記憶手段に格納された複数の前記プログラムを用いて誤りのないプログラムを生成するステップと、
前記生成されたプログラムを前記演算手段に実行させるステップと
を含むことを特徴とする制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
eMMC等の不揮発性メモリにプログラムを格納する場合のbit化け対策に関する。
【背景技術】
【０００２】
従来、印刷装置などの電子機器を制御するためのプログラムを格納するための記憶手段として、不揮発性メモリであるNOR型FlashROMが使用されている。
【０００３】
そして近年では、プログラム容量の増大により、CPUを動作させるための初期設定やプログラムをダウンロードするためのダウンローダのみをNOR型FlashROMに格納し、容量の大きいアプリケーションプログラムはNAND型FlashROMやeMMC（embedded MultiMediaCard）といった別の記憶手段に別途格納されるようになってきた。例えば、eMMCの実態は、NAND型FlashROMとNAND型FlashROMコントローラで構成される大容量の不揮発性メモリである。つまり、eMMCであれば、NAND型FlashROMコントローラがNAND型FlashROMの制御を行うので、設計者はSDIO I/Fを介してeMMCにアクセスすれば良いだけということになる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００８−２０４０６５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
半導体集積回路（IC）の進化に伴い不揮発性メモリの容量が飛躍的に増大しているが、その分、従来のNAND型FlashROMやNOR型FlashROMと比較して、その保証されるデータ保持期間（リテンション）が短くなっている。
【０００６】
一般に、電子機器メーカでは製品のための保守部品という概念があり、ユーザが購入した製品で故障が発生した場合の交換部品を用意しておく必要がある。保守部品の保管期限は製品の種類やメーカにより差があるものの、各メーカが規定している保守部品の保管期限よりも短いデータ保持期限しか保証されない不揮発性メモリも登場してきている。このような不揮発性メモリを、例えば印刷装置の制御ボードに採用した場合、従来の運用方法で当該制御ボードの保守部品を管理していくと、いわゆるbit化けによって不揮発性メモリ内のデータが毀損し、保守部品としての制御ボードがユーザ先で動作しないという事態が発生し得る。
【課題を解決するための手段】
【０００７】
本発明に係る制御回路は、演算手段と、前記演算手段を制御するためのプログラムを格納するための複数の不揮発性の記憶手段であって、第１の記憶手段と当該第１の記憶手段よりもリテンションの短い第２の記憶手段と、を備えた制御回路であって、前記第２の記憶手段には、同一内容の前記プログラムが複数格納され、前記制御回路に対して電源が投入された時点で、前回の電源の投入から所定期間が経過していた場合、前記第２の記憶手段に格納された複数の前記プログラムを用いて誤りのないプログラムを生成して、当該生成されたプログラムを前記演算手段に実行させることを特徴とする。
【発明の効果】
【０００８】
データ保持期限が比較的短期の不揮発性メモリを電子機器のプログラム格納に使用する場合において、その保証されるデータ保持期間を経過した場合であっても、当該不揮発性メモリを搭載した制御ボード等の電子部品を正常に動作させることができる。
【図面の簡単な説明】
【０００９】
【図１】ＳＦＰのシステム構成の一例を示す図である。
【図２】ＳＦＰ起動時における通常処理の流れを示すフローチャートである。
【図３】eMMCのデータ保持期間を示すグラフである。
【図４】eMMCの経年変化によるビット化けの概念図である。
【図５】ＳＦＰ起動時に実行される処理の流れを示すフローチャートである。
【図６】eMMCの内部にプログラムが複数格納されている様子を模式的に示す図である。
【図７】実施例１に係る、bootable検証処理の流れを示すフローチャートである。
【図８】実施例１に係るbootable検証処理の考え方を模式的に示した図である。
【図９】実施例２に係る、bootable検証処理の流れを示すフローチャートである。
【図１０】実施例３におけるエラー処理回避の考え方を模式的に示した図である。
【図１１】実施例３におけるエラー回避処理の流れを示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下、添付の図面を参照して、本発明を実施する形態について説明する。なお、以下の実施例において示す構成は一例に過ぎず、本発明は図示された構成に限定されるものではない。
【００１１】
［実施例１］
以下では、電子機器の一例として印刷装置を例に説明するものとする。
【００１２】
図１は、本実施例に係る、比較的簡単な構造の印刷装置であるＳＦＰ（シングルファンクションプリンタ）のシステム構成の一例を示す図である。
【００１３】
ＳＦＰ１００は、印刷部１０１、印刷制御部１０２、操作部１０３で構成される。
【００１４】
印刷部１０１は、紙等の記録媒体上に電子写真方式等によって画像データに従った画像を形成する。
【００１５】
印刷制御部１０２は、一般的にはプリンタコントローラと呼ばれ、不図示のＰＣ等から送信された印刷データを印刷部１０１に適合した画像データに変換する処理を行なう。この印刷制御部１０２は、ハードウェア的には前述の制御ボード（制御回路）に相当する。印刷制御部１０２は、SOC１１０、NOR型FlashRom１２０、eMMC１３０、DDR-SDRAM（以下、DDR）１４０、PHY１５０、LAN I/F１６０、USB-D I/F１７０及び電源１８０で構成される。以下、印刷制御部１０２の各構成要素について説明する。
【００１６】
SOC１１０は、System On Chipの略称であって、演算手段であるCPU１１１を内蔵した集積回路である。SOC１１０は、メモリ制御、印刷部１０１との通信及び画像データ転送、ＰＣからの印刷データの受信、USBやLANといった外部インターフェース等の制御のすべてを1つのChipで行う。また、SOC１１０には、ＳＦＰ１００本体への電源供給が停止されても現在時刻を刻み続けるRTC（Real Time Clock）が備えられ、そのための電源がコイン電池１８０から供給される。
【００１７】
NOR型FlashROM１２０は、CPU１１１を動作させるための初期設定プログラムや、プログラムをダウンロードするための小容量のプログラム（以下、bootrom）を格納するための不揮発性メモリである。NOR型FlashROM１２０は、容量当たりのコストが比較的高価であるものの、データ保持期間は例えば約20年と長期である。
【００１８】
eMMC１３０は、印刷処理を実行するためのアプリケーションプログラム（以下、bootable）といった比較的大容量のプログラムを格納するための不揮発性メモリである。このbootableは、揮発性メモリであるDDR１４０にコピーされて、CPU１１１がDDR１４０上に展開された当該bootableプログラムを実行することで、所期の機能が実現される。eMMC１３０は、容量当たりのコストが比較的安価であるものの、データ保持期間は例えば約3年と、NOR型FlashROM１２０と較べると短期である。
【００１９】
このように印刷制御部１０２には、NOR型FlashROM１２０とeMMC１３０という、データ保持期間の異なる２種類の不揮発性メモリが存在し、SOC１１０における基本的な制御を行うためのプログラムのみをNOR型FlashROM１２０に格納するようにしている。
【００２０】
PHY１５０は、LAN等のネットワークにおけるデータ通信用のドライバーレシーバーICである。LAN I/F１６０はLANとのインターフェースであり、USB-D I/F１７０はUSBデバイスとのインターフェースである。
【００２１】
操作部１０３は、ＳＦＰ１００を使用するユーザが各種操作・指示を行うためのユーザインタフェースである。
【００２２】
図２は、ＳＦＰ１００起動時における通常処理の流れを示すフローチャートである。
【００２３】
ＳＦＰ１００本体に対し電源が入れられる（Power ON）と、ステップ２０１において、SOC１１０内のCPU１１１は、NOR型FlashROM１２０に格納されているbootromにアクセスする。
【００２４】
そして、ステップ２０２において、CPU１１１は、bootromのプログラムコードに基づきSOC１１０の初期設定を行う。
【００２５】
SOC１１０の初期設定が終了すると、ステップ２０３において、CPU１１１は、eMMC１３０にアクセスし、eMMC１３０に格納されているbootableをDDR１４０にコピーする。
【００２６】
コピーが終了すると、CPU１１１は、DDR１４０に格納された（コピーされた）bootableのプログラムコードを実行する。これによりＳＦＰ１００は印刷処理が可能な状態（Ready状態）となる。
【００２７】
以上が、ＳＦＰ１００起動時における通常処理の内容である。このように起動時の処理が正常に実行されれば、すなわち、プログラムが正しく読める状況でeMMC１３０からDDR１４０へとコピーできれば、前述したような問題は生じないことになる。
【００２８】
続いて、eMMC１３０におけるデータ保持期間（リテンション）について説明する。
【００２９】
図３は、eMMC１３０にデータが書き込まれた後、電源が入れられることがなかった（アクセスがなかった）場合の時間経過に伴うデータ保持期間を示すグラフである。eMMC１３０に書き込まれるデータは電荷の有無によってその情報が表され、電荷があると‘0’が認識され、電荷がないと‘1’が認識される。何もデータが書き込まれていない場合のeMMC１３０内のデータはAll 0xFFとなる。そして、内部の電荷は時間の経過と共に抜けていき、いわゆるbit化けを起こすことになる。図３のグラフの例では、“0”を認識することができるある電圧スレッシュレベルの下で、eMMC１３０に書き込まれたデータを正常に読み出せることのできる期間が３年であること（保証されるデータ保持期間が３年であること）を示している。もちろん、図３のグラフで示すリテンション特性のeMMC１３０であっても、データの書込み後３年経過によってすべてのデータの値が0xFFになるわけではないが、ところどころでbit化けを起こすことになる。
【００３０】
図４（ａ）〜（ｄ）は、eMMC１３０内部に書き込まれたデータが、時間の経過と共に徐々にbit化けを起こす様子を表した図であり、黒の矩形がデータ内でbit化けを起こした箇所を示している。図４（ａ）は、データの書込み時点から３年が経過するまでのデータの状態を示しておりbit化けは生じていない。これに対し、図４（ｂ）に示す４年経過時点では３箇所でbit化けが生じており、図４（ｃ）に示す５年経過時点では１０箇所に増え、図４（ｄ）に示す６年経過時点では２４箇所でbit化けが生じている。このように、リテンション特性が３年のeMMC１３０の場合、３年まではbit化けは発生しないが、4年、5年と時間が経過するにつれてbit化けが発生し、その個数は増加していくことが分かる。
【００３１】
このようなbit化けを起こしたeMMC１３０内のデータ（本実施例ではbootableプログラム）が例えば圧縮されていた場合は、伸長できずにプログラムが起動できないということが起こり得る。また、圧縮されていない場合でも、DDR１４０にコピーされたbootableの実行によってCPU１１１が誤動作を起こして暴走する等の問題が生じ、正しい印刷処理ができないという事も起こり得る。
【００３２】
これは、eMMC１３０のようなリテンション特性が短期の不揮発性メモリを制御ボード等に採用すると、保守部品として倉庫に保管された当該制御ボードは比較的短期間で、bit化けによる不具合を起こす可能性があるということである。ここで、保守部品の期限を不揮発性メモリの保証するデータ保持期間より短くするという運用方法も考えられる。しかし、そのような運用方法の変更は在庫管理が煩雑になる上、コストの増大を招くことからメーカにとって負担が増すことになり望ましくない。本発明は、そのような運用方法の変更を伴わない問題解決の手法を提案するものである。
【００３３】
上述のとおり、例えばeMMC１３０のデータ保持期間は従来のNOR型FlashROMよりも短いが、そのトレードオフとしてメモリ容量には余裕がある。そこで、本実施例では、同一内容のプログラム（bootable）を複数eMMC内に保持し、これらを相互に比較して正しいと推認される内容のプログラムが実行されるようにすることで、起動時における動作不良の発生を回避している。以下、詳しく説明する。
【００３４】
図５は、本実施例に係る、ＳＦＰ１００起動時に実行される処理の流れを示すフローチャートである。本処理の前提として、eMMC１３０のデータ保持期間は３年であるものとする。
【００３５】
ステップ５０１及び５０２は、前述の図２のフローにおけるステップ２０１及び２０２と同じである。bootromのプログラムコードに基づきSOC１１０の初期設定がなされると、ステップ５０３において、CPU１１１は、bootrom内の前回起動時に書き込まれた時刻とRTC１１２が刻んでいる現在時刻とを比較し、前回起動時からeMMC１３０が保証する所定のデータ保持期間（ここでは３年）が経過しているかを判定する。判定の結果、未だ所定期間（ここでは３年）が経過していない場合は、ステップ５０４に進む。一方、既に所定期間が経過している場合は、ステップ５０５に進む。
【００３６】
ステップ５０４において、CPU１１１は、eMMC１３０にアクセスし、eMMC１３０に格納されているbootableをDDR１４０にコピーする。
【００３７】
ステップ５０５において、CPU１１１は、bootable検証処理、すなわち、eMMC１３０に格納されている複数のbootableを比較し、正しいプログラム部分を選択してDDR１４０にコピーする処理を実行する。このbootable検証処理の詳細については後述する。
【００３８】
ステップ５０６において、CPU１１１は、DDR１４０に格納された（コピーされた）bootableのプログラムコードを実行する。これによりＳＦＰ１００は印刷処理が可能な状態（Ready状態）となる。
【００３９】
正しくプログラムが起動できReady状態となると、ステップ５０７において、CPU１１１は、bootromに現在の時刻を書き込んで、再びNOR型FlashROM１２０に格納する。これにより、次回電源が投入された時に、その時のRTC１１２が刻む時刻と今回書き込まれた時刻とを比較することで、前回起動時からどの程度の時間が経過したのかを判定することが可能になる。
【００４０】
最後に、ステップ５０８において、CPU１１１は、DDR１４０上にコピーされたbootableを、eMMC１３０内に複数個（本実施例では、３個）コピーする。図６は、eMMC１３０の内部に、同じ内容のbootableプログラムが複数格納されている様子を模式的に示す図である。図６に示すように、eMMC１３０の中には、bootabe-A、bootable-B、bootable-Cの３つの同じプログラムが格納されている。このうち、bootable-Aが起動時において基本的に使用するプログラムであり、前回起動時から３年経過していない場合は必ずこのbootable-Aが使用される。なお、eMMC１３０は大容量であるので、３つの同内容のbootableプログラムを格納しても十分な容量の空きエリアが存在することが分かる。複数コピーされた同一のbootableプログラムをどのように用いて、正しいと推認される内容のbootableが実行されるようにするのかについては後述する。
【００４１】
以上が、本実施例に係る、ＳＦＰ１００起動時に実行される処理の流れを示すフローチャートである。
【００４２】
なお、ステップ５０３の判定処理を行なうことなく、起動時には毎回ステップ５０５のbootable検証処理を行うことも考えられる。そうすると電源投入の度にbootable検証処理のプログラムが走ることになって、結果的にbit化けのリスクがないようなケースについてもReady状態となるまでの起動時間が長くなるという問題が生じてしまう。従って、本実施例では、保証されるデータ保持期間を超えて放置され、bit化けが生じている可能性が高いときにのみbootable検証処理を行なうこととしている。
【００４３】
＜bootable検証処理＞
続いて、本発明の特徴であるbootable検証処理の詳細について説明する。図７は、本実施例に係る、bootable検証処理の流れを示すフローチャートである。
【００４４】
ステップ７０１において、CPU１１１は、bootable-Aのプログラムのうちリードアドレスで指定された所定の容量のデータをeMMC１３０から読み込む。ここで、所定容量は、例えばeMMC１３０のアクセス単位であるブロック単位（例えば512Byte（128Words））とする。
【００４５】
ステップ７０２において、CPU１１１は、bootable-Bのプログラムのうちリードアドレスで指定された上記所定の容量のデータをeMMC１３０から読み込む。
【００４６】
ステップ７０３において、CPU１１１は、ステップ７０１で読み込んだbootable-Aのデータとステップ７０２で読み込んだbootable-Bのデータとを比較し、両データが一致するかを判定する。具体的には、bootable-Aの１ブロック分（512Byte）のデータの内容とbootable-Bの１ブロック分（512Byte）のデータの内容とが、同じかどうかが判定される。判定の結果、両データが一致する場合は、ステップ７０４に進む。一方、両データが一致しない場合は、ステップ７０５に進む。
【００４７】
ステップ７０４において、CPU１１１は、bootable-Aから読み込んだ所定容量のデータをDDR１４０のプログラム格納領域にコピーする。
【００４８】
ステップ７０５において、CPU１１１は、Bootable-Cのプログラムのうちリードアドレスで指定された上記所定の容量のデータをeMMC１３０から読み込む。
【００４９】
ステップ７０６において、CPU１１１は、ステップ７０１で読み込んだbootable-Aのデータとステップ７０５で読み込んだbootable-Cのデータとを比較し、両データが一致するかを判定する。具体的には、bootable-Aの１ブロック分（512Byte）のデータの内容とbootable-Cから読み込んだ１ブロック分（512Byte）のデータの内容とが、同じかどうかが判定される。判定の結果、両データが一致する場合は、ステップ７０７に進む。一方、両データが一致しない場合は、ステップ７０８に進む。
【００５０】
ステップ７０７において、CPU１１１は、Bootable-Aから読み込んだ所定容量のデータをDDR１４０のプログラム格納領域にコピーする。
【００５１】
ステップ７０８において、CPU１１１は、ステップ７０２で読み込んだbootable-Bのデータとステップ７０５で読み込んだbootable-Cのデータとを比較し、両データが一致するかを判定する。具体的には、bootable-Bの１ブロック分（512Byte）のデータの内容とbootable-Cの１ブロック分（512Byte）のデータの内容とが、同じかどうかが判定される。判定の結果、両データが一致する場合は、ステップ７１０に進む。一方、両データが一致しない場合は、ステップ７０９に進む。
【００５２】
ステップ７０９において、CPU１１１は、エラー処理を行なって、ＳＦＰ１００の起動処理を停止する。これは、本ステップに進んだ時点で、bootable-A、bootable-B、bootable-Cのすべてで特定ブロックのデータ内容が一致せず、どのbootableの内容が正しいのかが判別不能に陥ったためである。いずれのbootableについても正しい内容でない可能性があることから、本実施例では、ＳＦＰ１００の起動処理自体を停止することとしている。
【００５３】
ステップ７１０において、CPU１１１は、bootable-Bから読み込んだ所定容量のデータをDDR１４０のプログラム格納領域にコピーする。
【００５４】
ステップ７１１において、CPU１１１は、bootable-Aのプログラムのデータを最後まで読み込んだかどうかを判定する。まだ読み込んでいないデータが存在する場合は、ステップ７１２に進み、bootable-A、bootable-B、bootable-Cすべてのリードアドレスをインクリメントしてステップ７０１に戻り、次のリードアドレスのデータについての処理を続行する。
【００５５】
以上が、本実施例に係る、bootable検証処理の内容である。
【００５６】
図８は、上述した本実施例に係るbootable検証処理の考え方を模式的に示した図である。図８において、参照符号８０１が上述のbootable-Aの全データ、参照符号８０２が上述のbootable-Bの全データ、参照符号８０３が上述のbootable-Cの全データを示している。黒の矩形はbit化けが生じた箇所を示している。各bootableプログラムは、0〜７の計８つのブロック（１ブロックは512Byte）で構成されている。参照符号８０４は、DDR１４０にコピー（格納）されるbootableの全データを示しており、bootable-A〜Cと同様、0〜７の計８つのブロック（１ブロックは512Byte）で構成されている。
【００５７】
まず、先頭のブロックである0番目のブロックは、bootable-A〜Cのすべてで正常（黒の矩形なし）であるため、bootable-Aにおける0番目のブロックのデータが、DDR１４０に展開される0番目のブロックのデータとしてコピーされる。次に、1番目のブロックは、bootable-Aにおいてbit化けが生じているものの、bootable-Bとbootable-Cではbit化けが生じておらず、両データは一致している。したがって、bootabel-Bにおける1番目のブロックのデータが、DDR１４０に展開される1番目のブロックのデータとしてコピーされることになる。このような多数決方式による正しいと推認される内容の決定処理が7番目のブロックまで繰り返され、最終的にbit化けのない参照符号８０４で示されるbootableのプログラムがDDR１４０にコピーされることとなる。
【００５８】
以上述べたとおり、本実施例によれば、複数の同一のプログラムがデータ保持期間の比較的短い不揮発性メモリであるeMMC内に保持される。そして、これらを相互に比較して正しいと推認される内容のプログラムをDDR-SDRAMに展開し実行することで、起動時における動作不良の発生を回避可能にしている。
【００５９】
［実施例２］
次に、eMMCのアクセス単位であるブロック単位でチェックサム値を持たせ、それにより正しいことが確認されたプログラム部分をDDR-SDRAMに展開し実行する態様にいて、実施例２として説明する。なお、実施例１と共通する内容については説明を省略ないしは簡略化し、ここでは差異点であるbootable検証処理を中心に説明するものとする。
【００６０】
図９は、本実施例に係る、bootable検証処理の流れを示すフローチャートである。
【００６１】
ステップ９０１において、CPU１１１は、bootable-Aのプログラムのうちリードアドレスで指定された所定の容量のデータを読み込む。この場合の所定容量については、実施例１と同じである。
【００６２】
ステップ９０２において、CPU１１１は、読み込んだbootable-Aの所定容量のデータ（ここでは、１ブロック（512Byte）のデータ）についてのチェックサム値を求める。チェックサム値の計算方法については周知であり、本願の本質ではないので説明を省略する。
【００６３】
ステップ９０３において、CPU１１１は、ステップ９０２で求めたチェックサム値が正しいかどうかを判定する。具体的には、ステップ９０１で読み込んだbootable-Aのデータについて求めたチェックサム値と、予め（例えばeMMC１３０への３つのbootable格納時）用意された該データに対応するブロックのチェックサム値とを比較し、両者が一致するかどうかの判定を行なう。判定の結果、双方のチェックサム値が一致する場合は、読み込んだデータの内容は正しいものとして、ステップ９０４に進む。一方、双方のチェックサム値が一致しない場合は、読み込んだデータの内容は正しくないものとして、ステップ９０５に進む。
【００６４】
ステップ９０４において、CPU１１１は、Bootable-Aから読み込んだ所定容量のデータをDDR１４０のプログラム格納領域にコピーする。
【００６５】
ステップ９０５において、CPU１１１は、bootable-Bのプログラムのうちリードアドレスで指定された上記所定の容量のデータを読み込む。
【００６６】
ステップ９０６において、CPU１１１は、読み込んだbootable-Bの所定容量のデータについてのチェックサム値を求める。
【００６７】
ステップ９０７において、CPU１１１は、ステップ９０６で求めたチェックサム値が正しいかどうかを判定する。具体的には、ステップ９０５で読み込んだbootable-Bのデータについて求めたチェックサム値と、予め用意された該データに対応するブロックのチェックサム値とを比較し、両者が一致するかどうかの判定を行なう。判定の結果、双方のチェックサム値が一致する場合は、読み込んだデータの内容は正しいものとして、ステップ９０８に進む。一方、双方のチェックサム値が一致しない場合は、読み込んだデータの内容は正しくないものとして、ステップ９０９に進む。
【００６８】
ステップ９０８において、CPU１１１は、Bootable-Bから読み込んだ所定容量のデータをDDR１４０のプログラム格納領域にコピーする。
【００６９】
ステップ９０９において、CPU１１１は、bootable-Cのプログラムのうちリードアドレスで指定された上記所定の容量のデータを読み込む。
【００７０】
ステップ９１０において、CPU１１１は、読み込んだbootable-Cの所定容量のデータについてのチェックサム値を求める。
【００７１】
ステップ９１１において、CPU１１１は、ステップ９１０で求めたチェックサム値が正しいかどうかを判定する。具体的には、ステップ９０９で読み込んだbootable-Cのデータについて求めたチェックサム値と、予め用意された該データに対応するブロック部分のチェックサム値とを比較し、両者が一致するかどうかの判定を行なう。判定の結果、双方のチェックサム値が一致する場合は、読み込んだデータの内容は正しいものとして、ステップ９１３に進む。一方、双方のチェックサム値が一致しない場合は、読み込んだデータの内容は正しくないものとして、ステップ９１２に進む。
【００７２】
ステップ９１２において、CPU１１１は、エラー処理を行なって、ＳＦＰ１００の起動処理を停止する。これは、本ステップに進んだ時点で、bootable-A、bootable-B、bootable-Cのすべてで特定ブロックのデータ内容が一致せず、どのbootableの内容が正しいのかが判別不能に陥ったためである。いずれのbootableについても正しい内容でない可能性があることから、本実施例では、ＳＦＰ１００の起動処理自体を停止することとしている。
【００７３】
ステップ９１３において、CPU１１１は、Bootable-Cから読み込んだ所定容量のデータをDDR１４０のプログラム格納領域にコピーする。
【００７４】
ステップ９１４において、CPU９１１は、Bootable-Aのプログラムのデータを最後まで読み込んだかどうかを判定する。まだ読み込んでいないデータが存在する場合は、ステップ９１５に進み、bootable-A、bootable-B、bootable-Cすべてのリードアドレスをインクリメントしてステップ９０１に戻り、次のリードアドレスのデータについての処理を続行する。一方、全てのデータの読込みが完了している場合は、本処理を終える。
【００７５】
以上が、本実施例に係る、bootable検証処理の内容である。
【００７６】
本実施例によっても、正しいと推認される内容のプログラムをDDR-SDRAMに展開し実行することが可能となり、起動時における動作不良の発生を回避することができる。
【００７７】
［実施例３］
実施例１及び２では、eMMC内に格納しておいた複数のプログラム（bootable）のすべてでbit化けが発生している虞があると判定されると、その段階でエラー処理を行なって起動処理を停止していた。次に、仮にすべてのプログラムの特定ブロックにおいてbit化けが発生していたとしても、可能な限りエラー処理を回避し、起動処理を続行する態様について、実施例３として説明する。
【００７８】
図１０は、本実施例におけるエラー処理回避の考え方を模式的に示した図である。図１０において、参照符号１００１が前述のbootable-Aの全データ、参照符号１００２が前述のbootable-Bの全データ、参照符号１００３が前述のbootable-Cの全データを示し、黒の矩形はbit化けが生じた箇所を示している。図８の場合と同様、各bootableプログラムは、0〜７の計８つのブロック（１ブロックは512Byte）で構成されている。いま、0番目のブロックでは、３個すべてのbootableにおいてビット化けが発生している。eMMC１３０内のbootableプログラムがこのような状態の場合、実施例１や２ではエラー処理となって（図７のフローにおけるステップ７０９及び図９のフローにおけるステップ９１２を参照）、起動処理がその段階で停止してしまう。
【００７９】
そこで、本実施例では、図７のフローや図９のフローにおいてエラー処理となった場合に、それぞれのbootableプログラムにおける正常な部分を有効に活用してエラー処理を回避する処理（以下、エラー回避処理）を実行する。このエラー回避処理では、エラー処理となったブロックが、さらに複数の領域（ここでは８つの領域）に分割される。参照符号１００４〜１００６は、それぞれbootable-A〜Cの0番目のブロックを８分割した様子を示している。なお、分割数は任意であるが、分割数を多くするほどすべてのプログラムで一致しないという問題が発生しづらくなるものの、処理量が増すために起動時間が掛かることになる。一方、分割数が少ないと処理負担は軽いものの、本手法によってもエラー処理が回避できない可能性が高くなる。したがって、これらのバランスを考慮して、分割数は決定される。図１０の例では、８分割された0番目のブロックにおいて、bootable-Aについては3番目の領域に、bootable-Bについては1番目の領域に、bootable-Cについては6番目の領域に、それぞれbit化けの箇所が存在している。つまり、対応する同じ番号の領域においては、ビット化けは発生していない。そこで、８つに分割された各領域のうち、bit化けの発生していない領域のデータをDDR１４０にそれぞれコピーして１つのブロックのデータを構築する。参照符号１００７は、DDR１４０にコピー（格納）されるbootableにおける0番目のブロックを示しており、bit化けのないデータとなっている。このように、それぞれのbootableプログラムにおける正常な部分を利用することで、エラー処理となるのを回避することが可能となる。
【００８０】
図１１は、本実施例におけるエラー回避処理の流れを示すフローチャートである。
【００８１】
ステップ１１０１において、CPU１１１は、ブロック内での比較する領域を特定するための変数Ｎを初期化する。本実施例では、各ブロックを0〜7の計８つの領域に分割しており、初期値としてＮ＝0に設定される。この場合、変数Ｎの最大値は7である。
【００８２】
ステップ１１０２において、CPU１１１は、エラー処理となったbootable-A〜Cにおける各ブロックのデータをそれぞれ所定数（ここでは８つ）の領域に分割する。
【００８３】
ステップ１１０３において、CPU１１１は、bootable-AにおけるＮ番目の領域のデータと、bootable-BにおけるＮ番目の領域のデータとを比較し、両者が一致するかどうかを判定する。判定の結果、双方のデータが一致する場合は、ステップ１１０４に進む。一方、双方のデータが一致しない場合は、ステップ１１０５に進む。
【００８４】
ステップ１１０４において、CPU１１１は、bootable-AにおけるＮ番目の領域のデータを、DDR１４０に展開されるプログラムの対象ブロックにおけるＮ番目の領域のデータとしてコピーする。
【００８５】
ステップ１１０５において、CPU１１１は、bootable-AにおけるＮ番目の領域のデータと、bootable-CにおけるＮ番目の領域のデータとを比較し、両者が一致するかどうかを判定する。判定の結果、双方のデータが一致する場合は、ステップ１１０６に進む。一方、双方のデータが一致しない場合は、ステップ１１０７に進む。
【００８６】
ステップ１１０６において、CPU１１１は、bootable-AにおけるＮ番目の領域のデータを、DDR１４０に展開されるプログラムの対象ブロックにおけるＮ番目の領域のデータとしてコピーする。
【００８７】
ステップ１１０７において、CPU１１１は、bootable-BにおけるＮ番目の領域のデータと、bootable-CにおけるＮ番目の領域のデータとを比較し、両者が一致するかどうかを判定する。判定の結果、双方のデータが一致する場合は、ステップ１１０９に進む。一方、双方のデータが一致しない場合は、ステップ１１０８に進む。
【００８８】
ステップ１１０８において、CPU１１１は、エラー処理を行なって、ＳＦＰ１００の起動処理を停止する。このステップは、図７のフローにおけるステップ７０９及び図９のフローにおけるステップ９１２に相当する。
【００８９】
ステップ１１０９において、CPU１１１は、bootable-BにおけるＮ番目の領域のデータを、DDR１４０に展開されるプログラムの対象ブロックにおけるＮ番目の領域のデータとしてコピーする。
【００９０】
ステップ１１１０において、CPU９１１は、変数Ｎが最大値に達したかどうか（本実施例ではＮ＝7に達したか）を判定する。まだ最大値に到達していない場合は、ステップ１１１１に進み、変数Ｎの値をインクリメント（＋１）してステップ１１０３に戻り、次の領域のデータについての処理を続行する。一方、最大値に到達していれば、本処理を終える。
【００９１】
以上が、本実施例に係る、エラー回避処理の内容である。
【００９２】
なお、ここでは実施例１を前提に説明を行なったが、実施例２におけるチェックサム方式によってデータの正しさを検証する場合にも本実施例は適用可能である。この場合、分割後の各領域についてのチェックサム値を予め用意しておき、チェックサムの結果がＯＫとなった領域のデータをＤＤＲにコピーするようにすればよい。
【００９３】
このように一旦はエラー処理の対象と判定された場合でも、ブロックをさらに分割して正しい内容と推認される領域のデータを採用していくことにより、誤りのないプログラムを生成し、DDRに展開することができる。
【００９４】
（その他の実施例）
本発明は、上述の実施形態の１以上の機能を実現するプログラムを、ネットワーク又は記憶媒体を介してシステム又は装置に供給し、そのシステム又は装置のコンピュータにおける１つ以上のプロセッサーがプログラムを読出し実行する処理でも実現可能である。また、１以上の機能を実現する回路（例えば、ＡＳＩＣ）によっても実現可能である。
【図１】
2016157163.tif 000003
【図２】
2016157163.tif 000004
【図３】
2016157163.tif 000005
【図４】
2016157163.tif 000006
【図５】
2016157163.tif 000007
【図６】
2016157163.tif 000008
【図７】
2016157163.tif 000009
【図８】
2016157163.tif 000010
【図９】
2016157163.tif 000011
【図１０】
2016157163.tif 000012
【図１１】
2016157163.tif 000013