カーネル1.18 から1.20への主な変更点です。 ●不具合修正 ・pceHeapAlloc()がヒープを破壊する不具合を修正しました。 ・アラームAPIおよび内部処理の、ビット指定間違いを修正しました。 ・pceTimerAdjustPrecisionCount()が稀に誤った値を返す問題を修正しました。 ・アプリケーション起動の度に、液晶濃度がばらつく問題を修正しました。 ●その他 ・待機時および動作時の消費電力を低減しました。  個別のアプリケーションに省電力スタンバイを組み込む必要がなくなりました。  既に省電力スタンバイを組み込んであるアプリケーションは、そのままでも大丈夫です。 ・pceLCDDrawObject()を高速化しました。 ・スタンバイ状態でUSBケーブルを接続すると、自動的にスタンバイ復帰するようにしました。 ・2MB版P/ECEに対応しました。  カーネル起動時に自動判別しますので、単一カーネルで512KB/2MB両対応となっています。 ・今後のカーネル機能拡張に備えて、カーネル容量の削減を行いました。 以下、作業履歴です。 ----------------------------------------------------------------------------- 2003.04.03 今回は、バージョン番号変更と、ソース中の説明文修正のみです。 プログラムには手をつけていません。 ●バージョン pcekn.c - 1.19→1.20に変更しました。 ●サウンド snd.c - pceWaveDataOut()の説明文を修正しました。(pwave開放に関する文を削除) ----------------------------------------------------------------------------- 2003.03.31 ●USBコントローラ powerman.c - 静電気によるUSB給電ウェークアップを防止しました。 runapp.c,mainloop.c - 2003.02.27に変更した、ProcUSB()と割り込み内のデバイスリクエスト応答を元に戻しました。 割り込み内で応答すると、通信準備完了前にデバイスが認識されてしまうことがあるようです。 ◎カーネル終了アドレス:00c0b048(48バイト増加)  BSS終了アドレス :00000d30 ----------------------------------------------------------------------------- 2003.03.29 ●描画 draw.c - pceLCDDrawObject()に転送元クリッピングを復元しました。 ●バージョン piece.h - APPSYSVER VERSIONを1.19に変更していたのを、1.18に戻しました。 (API仕様は1.18から変わっていないので、互換性維持のために) ◎カーネル終了アドレス:00c0b018(224バイト増加)  BSS終了アドレス :00000d30 ----------------------------------------------------------------------------- 2003.03.02 ●サウンド snd.c - 2003.03.02のpfEndProcの不正参照修正を、元に戻しました。 予測できないタイミングでpfEndProcを書き換えるアプリケーションがあったためです。 BIOS1.19の挙動もBIOS1.18と同じに戻りましたので、PCEWAVEINFOはスタティックに確保する必要があります。 ●バージョン piece.h - APPSYSVER VERSIONを1.18=>1.19に変更 ◎カーネル終了アドレス:00c0af38(4バイト減少)  BSS終了アドレス :00000d30 ----------------------------------------------------------------------------- 2003.02.27 ●USBコントローラ runapp.c,mainloop.c - ProcUSB()を削除し、デバイスリクエスト応答を割り込み内(ep0_rxdone())へ移動しました。 ◎カーネル終了アドレス:00c0af3c(76バイト減少)  BSS終了アドレス :00000d30 ----------------------------------------------------------------------------- 2003.02.26 ●USBコントローラ mainloop.c - メインエンドポイントのダブルバッファに2つのコマンドが溜まると、 まとめて壊れたコマンドとして破棄されてしまっていた不具合を修正しました。 mainloop.c - ダブルバッファのまとめ読みがなくなったので、usbcmdbuff[]サイズを128->64に変更しました。 chap_9.cからも、デバイスリクエストやインタラプト転送の応答のために利用されていますが、 いずれも64バイトで足りています。 d12ci.c - ダブルバッファのまとめ読みがなくなったので、D12_ReadMainEndpoint()を削除しました。 ◎カーネル終了アドレス:00c0af68(128バイト減少)  BSS終了アドレス :00000d30(64バイト減少) ----------------------------------------------------------------------------- 2003.02.25 ●フラッシュメモリ(512KB/2MB両対応) file.c - すぐ下で述べた問題(512KB版P/ECE本体+カーネル1.19(2003.02.25)+512KB版isd.exe/pieceif.dllでの不正動作)に対応。 この組み合わせで使った場合に、FAT後半が未初期化のままでも、終端を超えたファイル作成は起こらなくなりました。 ◎カーネル終了アドレス:00c0afe8(20バイト増加)  BSS終了アドレス :00000d70 ----------------------------------------------------------------------------- 2003.02.25 ●フラッシュメモリ(512KB/2MB両対応) piece.h - 2MB版カーネルのpiece.hから差分を移植しました。 512KB時も、MAXFATは2MB時と同じ496固定とします。(元は256) pcekn.h - PFFSENDを可変としました。SRAMENDと同様に、system_infoのメンバを参照します。 初期化時にフラッシュメモリの容量を検出し、sram_info.pffs_endに格納します。 fmacc3.c - 起動時にフラッシュメモリの容量を検出するための、subFlashSize()関数を追加。 高速RAMに転送して実行するために、fmacc3.cモジュールを新設しました。 Makefile - fmacc3.oをOBJSに追加。 pcekn.cm - fmacc3.oをリンク対象に追加。また、FRAM4エリアへの配置対象にも追加しました。 pcekn.c - system_info00.pffs_endは初期化時に検出するので、初期値を0としました。 フラッシュメモリの終わりを自動検出し、PFFSENDに格納する処理を追加しました。 fmacc1.c - フラッシュメモリ終端アドレスとの比較検査を、可変アドレス対応にしました。 fmacc2.c - フラッシュメモリ終端アドレスとの比較検査を、可変アドレス対応にしました。 ◎カーネル終了アドレス:00c0afd4(132バイト増加。v1.18からは合計2152バイト減少)  BSS終了アドレス :00000d70 ★重要☆重要★重要☆重要★重要☆重要★重要☆重要★重要☆重要★重要☆重要★重要☆重要★重要☆重要★ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ※PC側のツールは、2MB版P/ECEの「isd.exe」「pieceif.dll」をそのまま使ってください。          〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 ※標準P/ECE(512KB版)の「isd.exe」「pieceif.dll」は使わないで下さい。  〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜  次のような組み合わせも★不可★です。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃512KB版P/ECE本体 + カーネル1.19(2003.02.25) + 512KB版isd.exe/pieceif.dll ⇒ 不可!!┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  上述の組み合わせで使うと、pceFileCreate()が正しく動きません。  以下に、なぜ正しく動かないのかを説明します。  カーネル1.19(2003.02.25)では、管理ブロックのFATエントリ数を496個固定としています。(piece.h参照)  P/ECE本体が512KB版か2MB版かに関らず、常に496個のエントリがあるものと想定しています。  496個のエントリのうち、使えない部分は「0xdd=無効」とマークされていなければいけません。  ---------- まず、2MB版isd.exeを使った場合の、正しく動く状況を説明します ----------  2MB版isd.exeを使ってファイルシステムを初期化すると、FATは次のように初期化されます。 512KB本体の場合 ┌────┐ │cccc│FAT#0(システム) ├────┤ │    │ │ffff│FAT#1〜87(空き) │    │ ├────┤←ここに対応するセクタが、フラッシュメモリの末尾になります │    │ │    │ │    │ │dddd│FAT#88〜495(無効) │    │ │    │ │    │ └────┘ 2MB版本体の場合 ┌────┐ │cccc│FAT#0(システム) ├────┤ │    │ │    │ │    │ │    │ │ffff│FAT#1〜471(空き) │    │ │    │ │    │ │    │ ├────┤←ここに対応するセクタが、フラッシュメモリの末尾になります │dddd│FAT#472〜495(無効) └────┘  pceFileCreate()は有効なFATエントリ数を知らなくても、無効エントリにきちんと0xddddがマークされていれば、  単純に496個のFATエントリ全部を走査して、空きエントリを順次割り当てていけばいいのです。  従ってpceFileCreate()は、512KB版/2MB版の違いを意識しなくても正しく動作します。  ---------- 次に、512KB版isd.exeを使った場合の、正しく動かない状況を説明します ----------  512KB版isd.exeでは、FATエントリ数を256個固定と想定しています。  512KB版isd.exeを使ってファイルシステムを初期化すると、FATは次のように初期化されます。 512KB本体の場合 ┌────┐ │cccc│FAT#0(システム) ├────┤ │    │ │ffff│FAT#1〜87(空き) │    │ ├────┤←ここに対応するセクタが、フラッシュメモリの末尾になります │    │ │dddd│FAT#88〜255(無効) │    │ ├────┤ │    │ │ffff│FAT#256〜495(未初期化!) │    │ └────┘  後半のFATエントリが未初期化で、pceFileCreate()から見ると「空き」に見えてしまいます。  FAT#1〜87に収まらないファイルを作成しようとすると、FAT#256〜495に割り当てられてしまいます。 ┌────┐ │cccc│FAT#0(システム) ├────┤ │■■■■│ │■■■■│FAT#1〜87(空き) │■■■■│ ├────┤←ここに対応するセクタが、フラッシュメモリの末尾になります │    │ │dddd│FAT#88〜255(無効) │    │ ├────┤ │■■■■│←ここにも割り当てられてしまう!! │ffff│FAT#256〜495(未初期化!) │    │ └────┘  pceFileCreate()はセクタの書き込みを行わないので、pceFileCreate()は成功してしまうのですが、  実際にセクタ書き込みを行おうとしたときに、フラッシュメモリ終端アドレスの検査にひっかかって失敗します。  すなわち、ファイルは作れるのに書き込みができない、という状況になってしまうわけです。  このような状況を避けるためには、FAT#495まできっちり無効セクタがマークされていなければいけません。  以上の理由により、P/ECE本体が512KB版か2MB版かに関らず、2MB版のisd.exeを使ってください。 ※同様の理由により、512KB版isd.exeで初期化したP/ECEに、カーネル1.19のpcekn.imgだけを転送しないで下さい。           〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜  この問題が起きやすいのは、次のような手順でカーネルアップデートを行った場合です。 1.「WinPku.exe」を使って、標準カーネル1.18のall.binをインストール。   ⇒標準カーネル1.18のall.binは、512KB版isd.exeで初期化したファイルシステムイメージを含んでいるので、    FAT後半は未初期化となります。 2.「make bios」を使って、カーネル1.19のpcekn.imgをインストール。   ⇒管理ブロックは書き換えられないので、FAT後半は未初期化のままです。 3.前述の問題が発生します!  問題を回避するには、カーネル1.19転送後に、2MB版isd.exeを使ってファイルシステムを再初期化するか、  または、カーネル1.19のpcekn.imgだけを転送するのではなく、all.binをインストールしてください。 ----------------------------------------------------------------------------- 2003.02.24 ●スタンバイ powerman.c - USB接続によるスタンバイ復帰対応 スタンバイ状態でUSBケーブルを接続し、USB給電が開始されると、 自動的にスタンバイ復帰するようにしてみました。 ◎カーネル終了アドレス:00c0af50(112バイト増加)  BSS終了アドレス :00000d70 ----------------------------------------------------------------------------- 2003.02.24 ●サウンド snd.c - 開放済みPCEWAVEINFOのpfEndProcが参照されていた不具合を修正。※未検証→検証済み(test/snd1) ◎カーネル終了アドレス:00c0aee0(4バイト増加)  BSS終了アドレス :00000d70 ----------------------------------------------------------------------------- 2003.02.24 ●高精度タイマ timer.c - pceTimerAdjustPrecisionCount()の不具合修正。※未検証 (例えばst=0x4e520808;ed=0xb02a085d;のときに、pceTimerAdjustPrecisionCount(st,ed)だと正の値だが、 pceTimerAdjustPrecisionCount(ed,st)だとalが負になって返し値がまずくなる。 この現象はclockticksがまたぐときだけなので、計測中にまたいで、かつ65秒に1回だけ起こる。) ◎カーネル終了アドレス:00c0aedc  BSS終了アドレス :00000d70 ----------------------------------------------------------------------------- 2003.02.24 ●USBコントローラ d12ci.c - 使われていない関数を削除して、容量削減しました。 ◎カーネル終了アドレス:00c0aedc(112バイト減少)  BSS終了アドレス :00000d70 ----------------------------------------------------------------------------- 2003.02.24 ●LCD lcd.c - pceLCDSetOrientation()内のハードリセット後に、リセット前の画面表示ON/OFFを復元するように変更。※未検証 ◎カーネル終了アドレス:00c0af4c(20バイト増加)  BSS終了アドレス :00000d70 ----------------------------------------------------------------------------- 2003.02.24 ●LCD lcd.c - すぐ下↓の修正でCSBは上げっぱなしにしましたが、万一、アプリケーションから下げられた場合に備えて、 転送直前、TxLCDAsync()でのCSB上げだけを復活させました。→検証済み ◎カーネル終了アドレス:00c0af30(4バイト増加)  BSS終了アドレス :00000d70 ----------------------------------------------------------------------------- 2003.02.16 ●LCD lcd.c - CSBは上げっぱなしで大丈夫だと思うので、CSB制御部分を削除しました。→検証済み ※ただし、もしかしたらスタンバイ時の消費電流に影響する可能性があるので、測定必要。→影響ないようです。 ◎カーネル終了アドレス:00c0af2c(40バイト減少)  BSS終了アドレス :00000d70 ----------------------------------------------------------------------------- 2003.02.16 ●サウンドAPI snd.c - 描画タイミングが変わったことで、一部のアプリケーションがハングアップする問題の対策 pceWaveDataOut()で、同じチャネルに同じバッファを二重登録しようとした場合、 先に登録したバッファが鳴り終わるまで待つようにしました。 ◎カーネル終了アドレス:00c0af54(24バイト増加)  BSS終了アドレス :00000d70 ----------------------------------------------------------------------------- 2003.02.15 ●USBコントローラ d12ci.c - 容量削減 「if(bEPPflags.bits.in_isr == 0) DISABLE/DISABLE;」という処理が頻出します。 グローバル変数のビットテストはC33ではサイズコストが高いので関数にまとめて容量削減しました。 USBCへのアクセス時に関数呼び出しが2回増えても、性能にはほとんど影響ないと思います。たぶん。 ◎カーネル終了アドレス:00c0af3c(この変更による容量削減効果は164バイトです)  BSS終了アドレス :00000d70 ----------------------------------------------------------------------------- 2003.02.15 ●USBコントローラ mainloop.c,mainloop.h - P/ECEには関係ない処理・使われていない処理を省いて容量削減。※未検証→動作確認OK ・bus_reset P/ECEはバスリセット時に何もしていない ・suspend_change P/ECEはUSBCのサスペンド状態変更時に何もしていない(そもそもこれが来るタイミングがいまいち不明…) ・setup_dma P/ECEはDMA転送を使っていない ・その他、使っていないフラグなど まだ完全に削除し尽くしていないと思うので、今後も気が付いた時点で削ることにします。 ◎カーネル終了アドレス:00c0afe0(556バイト減少。2/13からは合計520バイト減少。v1.18からは合計2140バイト減少)  BSS終了アドレス :00000d70 ----------------------------------------------------------------------------- 2003.02.15 lcd.c - LCD濃度ばらつき修正のため、ソフトリセットからハードリセットに変更。検証済み ※ハードリセットではDisplay ON/OFFの状態が維持されずOFFに戻ってしまうため、  ハードリセット後は常にDisplay ONを発行するように変更しました。  リセット前にOFFだった場合は、予期せずONになってしまう場合があります。  例えば、電源投入直後、黒い画面が一瞬表示されてしまいます。  対処するには、lcd.c内にDisplay ON/OFF状態を保持する変数を増設する必要があります。    <<<<<要検討>>>>>  です。 ◎カーネル終了アドレス:00c0b20c(24バイト増加。2/13からは合計36バイト増加)  BSS終了アドレス :00000d70 ----------------------------------------------------------------------------- 2003.02.14 メモリ割当て項目の検証を行いました。→test/heap1 1.18では「API ERROR #20」、1.19では正常動作を確認しました。 ----------------------------------------------------------------------------- 2003.02.14 省電力項目(A/D変換器とUSBコントローラ)について、検証を行いました。 あいにく手元には、かなり消耗した電池しか残っていなかったため、 電流値が高めに出てしまっていますが、通常カーネルとの比較で目安までに。            ==1.18=  ==1.19= 標準メニュー動作時  125  mA   80  mA スタンバイ時      12.5mA    7.5mA やっぱり、D12_NOLAZYCLOCKとD12_CLOCKRUNNINGを外しておけば、 通常動作時の電流も減らせるみたいです。 ファイル転送なども何度か試してみましたが、まだ問題は出ていませんので、 たぶん、D12_NOLAZYCLOCKとD12_CLOCKRUNNINGは外したままで大丈夫だと思います。 →追記:消耗していない電池での測定結果を頂きました。 v1.18 v1.19(25日) ------------------------- ----- ----------- スタンバイ(OFF) 5.1 2.3 (mA) 動作中1(システムメニュー) 71 48 動作中2(おじょ魔女Play中) 170 145 ----------------------------------------------------------------------------- 2003.02.14 ●\usr\PIECE\sysdev\pcekn\makefileを変更しました。 ・CFLAGSに「-b」「-I..\..\include」オプションを追加、「-g」オプションを削除。 ・clean擬似ターゲットの削除対象に、「*.$$(実際は*.$)」「pcekn.img」を追加。 ☆☆☆最終リリース前に、元のmakefileに戻してください。☆☆☆ ●メモリ割当て heapman.c - AllocHEAPMEM()の不具合修正。※未検証→動作確認OK 参考資料:P/ECEハンドブック、P/ECEのメーリングリスト ●アラーム piece.h - ALM_EVERYHOURとALM_EVERYDAYが逆だったのを修正。※未検証 rtc.c - pceTimeSetAlarm()、日条件のビット判定間違いを修正。※未検証 参考資料:P/ECE開発者掲示板 2002/02/13 「アラーム」(DINNAさん) ●A/D変換器 powerman.c - 省電力のため、スタンバイ前にA/D変換器をディセーブル。※未検証→スタンバイ電流が減っていること確認OK タイマ割り込みが戻れば勝手に再開するので、保存/復元は不要です。 ●USBコントローラ mainloop.c - 省電力のため、connect_USB()とdisconnect_USB()を修正。※未検証→スタンバイ電流が減っていること確認OK D12_NOLAZYCLOCKとD12_CLOCKRUNNINGは常に不要と思われます。 PDIUSBD12のマニュアルでは少々説明不足なかんじですが、 D12_NOLAZYCLOCK: USBケーブルはつながっているが、有効な通信が行われていない場合に、外部出力クロック速度を下げる。 USBコントローラからクロック供給を得て動作するCPU等のための省電力サポート機能。 このフラグを「指定すると」機能がOFFになり、出力クロックは常にフルスピードとなる。 D12_CLOCKRUNNING: USBケーブルがつながっていないときに、USBC自体のクロックを止める。 このフラグを「指定すると」機能がOFFになり、USBコントローラは常に動きつづける。 USBコントローラが停止すると外部出力クロックも停止してしまうので、 USBコントローラからのクロック供給を得て常に動きつづけたい(USBケーブルがつながっているか どうかには関係なく)ようなCPUがある場合は、このフラグを指定する。 という意味だと思います。 ですので、P/ECEの動作状態によらず、これらの設定は常に不要だと思います。 マニュアルからも、これらのフラグは指定しないのが普通、みたいなニュアンスを受けますし… サンプルファームウェアでは指定されちゃってますが(^^; ●USBコントローラ powerman.c - 自動スタンバイからの復元時、USBの再接続はアプリケーション任せになっていたようです。 確実に再接続されるよう、pcePowerEnterStandby()の最後にpceUSBReconnect()を追加しました。※未検証→W2Kでは効果無し biapp.c - 上の修正に伴い、go_sandby()の中のpceUSBReconnect()をpcePowerEnterStandby()の中に共通化。 (システムメニューからSELECT+Bでスタンバイした場合は、これまでもちゃんと再接続されてます) ●フラッシュメモリ pcekn.c - BootEntry()にInitFlashAcc()呼び出しを追加。 これまで無効ベクタのままだった、pceFlashErase()とpceFlashWrite()が使えるようになりました。※未検証 pcekn.h - InitFlashAcc()の宣言を追加しました。 ●その他 lcd.c - レジスタ割り当て決め打ちでasm("mirror")が使われていた部分を、拡張asm構文に変更。 ついこのあいだ、2ch掲示板のP/ECEスレッドを読んでいて知った方法です(^^; 実際に生成されるコードは、これまでと全く変わりません。(lcd.psで確認しました) ◎現時点でのカーネル終了アドレス:00c0b1f4(昨日より12バイト増加) ----------------------------------------------------------------------------- 2003.02.13 ====== 使い方 ====== ・sysdevフォルダで「make bios」を行うか、または  updateフォルダの「all.bin」をwinpkuで転送してください。 ======================== 通常カーネルとの見分け方 ======================== STARTボタン長押しでPIECE System Menuを表示し、 更新日が「2003.02.13」となっていれば今回変更したカーネルです。 通常カーネルでは「2002.02.16」と表示されます。 ====== 変更点 ====== ・本物のカーネルと区別するために、pcekn.cのBIOS更新日を変更しました。  本物は「2002.02.16」ですが、変更後は「2003.02.13」となっています。  PIECE System Menuの表示で確認できます。 ・draw.cを大幅に変更しました。  変更したのはpceLCDDrawObject()と、そこから呼ばれる内部関数だけです。  pceLCDDrawLine()のクリッピングは未修正です。  参考資料:ryukの薫製工房さんによる高速化バージョン ==== 注意 ==== 今回のカーネルは通常の512KB版カーネルを基に変更を加えています。 2MB版P/ECEにインストールすると、512K版P/ECEになってしまうので、 ご注意ください。 ==== 情報 ==== pcekn.mapを見ると、容量削減効果は次のとおりです。 通常カーネルの終了アドレス:00c0b83c 今回、変更後の終了アドレス:00c0b1e8 …1620バイト減