☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

ペリフェラルデータ取得関数群−拡張初期化−

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆


【0. 概要】
	従来のpdInitPeriperal()関数ではコントロールポートA〜Dのすべての
	ペリフェラルに対応していますが、それに伴い必要なワークも約96KB
	と、かなりの容量になっていました。
	本ドキュメントで解説する拡張初期化関数を使用すれば、アプリケーション
	で使用するペリフェラルを限定することにより、ワークの大幅な削減と
	ライブラリの内部処理の高速化が可能になります。


【1. 使用方法】
	標準の初期化関数pdInitPeripheral()の変わりにpdInitPeripheralEx()を
	使用してください。その際、次のようなパラメータおよびあらかじめ確保した
	ワークが必要です。

	1.Maple送信バッファ
	    Mapleハードウェアに送るコマンドを作成するためのバッファです。
	    PDM_WORK_SIZEマクロを使用して必要分確保してください。
	    ペリフェラル１つにつき2KB必要です。
	    PDM_WORK_SIZEマクロは、引数×2KBを確保するマクロです。
	    以下の例ではペリフェラル12個分のワークを確保しています。
	    また、バッファアドレスが32バイト境界でない場合は自動的にアライン
	    するため、32バイト余分に確保するのがよいでしょう。

	     Uint8 gMapleSendBuf[PDM_WORK_SIZE(12) + 32];


	2.Maple受信バッファ
	    ペリフェラルからのデータを格納するためのバッファです。
	    PDM_WORK_SIZEマクロを使用して必要分確保してください。
	    ペリフェラル１つにつき2KB必要です。
	    以下の例ではペリフェラル12個分のワークを確保しています。
	    また、バッファアドレスが32バイト境界でない場合は自動的にアライン
	    するため、32バイト余分に確保するのがよいでしょう。
	    これらのバッファは連続している必要はありません。

	     Uint8 gMapleRecvBuf[12][PDM_WORK_SIZE(1) + 32];


	3.論理モード
	    これは、PDS_PERIPHERAL構造体のデジタルボタン情報のビットの正論理、
	    負論理を選択するものです。標準のpdInitPeripheral()と同様です。


	4.使用ペリフェラルテーブル
	    どのペリフェラルを使用するかを決めるものです。ペリフェラルポート番号
	    の配列で指定します。例えば以下のような配列となります。

          const Sint32 gMapleDevs[] = {
              PDD_PORT_A0, PDD_PORT_A1, PDD_PORT_A2,	/* ポートA0/A1/A2 */
              PDD_PORT_B0, PDD_PORT_B1, PDD_PORT_B2,	/* ポートB0/B1/B2 */
              PDD_PORT_C0, PDD_PORT_C1, PDD_PORT_C2,	/* ポートC0/C1/C2 */
              PDD_PORT_D0, PDD_PORT_D1, PDD_PORT_D2,	/* ポートD0/D1/D2 */
          };

	5.受信バッファアドレステーブル
	    どのペリフェラルがどのワークを使用するかを指定するテーブルです。
	    使用ペリフェラルテーブルで指定したペリフェラルには、必ずバッファを
	    割り当ててください。そうでない場合はライブラリが正常に動作しません。

          const void* gMapleRecvBufTbl[] = {
              gMapleRecvBuf[0],			/* A0のワーク2KB */
              gMapleRecvBuf[1],			/* A1のワーク2KB */
              gMapleRecvBuf[2],			/* A2のワーク2KB */
              gMapleRecvBuf[3],			/* B0のワーク2KB */
              gMapleRecvBuf[4],			/* B1のワーク2KB */
              gMapleRecvBuf[5],			/* B2のワーク2KB */
              gMapleRecvBuf[6],			/* C0のワーク2KB */
              gMapleRecvBuf[7],			/* C1のワーク2KB */
              gMapleRecvBuf[8],			/* C2のワーク2KB */
              gMapleRecvBuf[9],			/* D0のワーク2KB */
              gMapleRecvBuf[10],			/* D1のワーク2KB */
              gMapleRecvBuf[11],			/* D2のワーク2KB */
          };

	以上のパラメータを、関数pdInitPeripheralEx()に渡してください。

          pdInitPeripheralEx(PDD_PLOGIC_ACTIVE,
                  gMapleDevs, gMapleRecvBufTbl, gMapleSendBuf,
                   sizeof(gMapleDevs) / sizeof(gMapleDevs[0]));


	初期化が終われば、後は今までと同様にペリフェラルにアクセスできます。
	振動パックや液晶、バックアップライブラリも問題なく使用できます。
	ただし、ここで使用しないようにしたペリフェラルは認識しません。未接続と
	して判断されますので注意してください。


	    ※注意事項
	      ・それぞれのポートのルートペリフェラル(A0、B0、C0、D0)を使用しない
	        設定にした場合は、そのポートの拡張ポート(A1、A2等)も使用できま
	        せん。注意してください。
	      ・釣りコントローラ(仮称)の振動に対応する場合は、拡張ポート5(A5、B5
	        等)も使用する設定にしてください。



【2. 関数仕様】

《2.1関数一覧》
+----------------------+------------------------------------+
|関数                  |機能                                |
+----------------------+------------------------------------+
|pdInitPeripheralEx    |ペリフェラルライブラリの拡張初期化  |
+----------------------+------------------------------------+
|PDM_WORK_SIZE         |ワークサイズ計算マクロ              |
+----------------------+------------------------------------+


《2.2 関数API》
［関数］void pdInitPeripheralEx(Sint32 plogic, Sint32* pertbl,
                                  void** recvbuf, void* sendbuf, Sint32 num)
［入力］plogic   論理モード    PDD_PLOGIC_ACTIVE   正論理
                               PDD_PLOGIC_NEGATIVE 負論理
        pertbl   使用ペリフェラルテーブル
        recvbuf  受信バッファアドレステーブル
        sendbuf  送信バッファアドレス
        num      使用ペリフェラル数
［出力］なし
［戻り値］なし
［機能］・ペリフェラルライブラリの拡張初期化を行います。
        ・論理モードによりPDS_PERIPHERAL構造体のデジタルボタン情報の
          ビットの正論理、負論理を選択します。
        ・受信、送信バッファは必ず必要分確保し、パラメータは矛盾のないように
          設定してください。
［参照］pdInitPeripheral()、pdExitPeripheral()、PDM_WORK_SIZE()
［使用例］
          Uint8 gMapleRecvBuf[12][PDM_WORK_SIZE(1) + 32]; /* 受信バッファ */
          Uint8 gMapleSendBuf[PDM_WORK_SIZE(12) + 32];    /* 送信バッファ */

          const Sint32 gMapleDevs[] = {
              PDD_PORT_A0, PDD_PORT_A1, PDD_PORT_A2,	/* ポートA0/A1/A2 */
              PDD_PORT_B0, PDD_PORT_B1, PDD_PORT_B2,	/* ポートB0/B1/B2 */
              PDD_PORT_C0, PDD_PORT_C1, PDD_PORT_C2,	/* ポートC0/C1/C2 */
              PDD_PORT_D0, PDD_PORT_D1, PDD_PORT_D2,	/* ポートD0/D1/D2 */
          };

          const void* gMapleRecvBufTbl[] = {
              gMapleRecvBuf[0],			/* A0のワーク2KB */
              gMapleRecvBuf[1],			/* A1のワーク2KB */
              gMapleRecvBuf[2],			/* A2のワーク2KB */
              gMapleRecvBuf[3],			/* B0のワーク2KB */
              gMapleRecvBuf[4],			/* B1のワーク2KB */
              gMapleRecvBuf[5],			/* B2のワーク2KB */
              gMapleRecvBuf[6],			/* C0のワーク2KB */
              gMapleRecvBuf[7],			/* C1のワーク2KB */
              gMapleRecvBuf[8],			/* C2のワーク2KB */
              gMapleRecvBuf[9],			/* D0のワーク2KB */
              gMapleRecvBuf[10],		/* D1のワーク2KB */
              gMapleRecvBuf[11],		/* D2のワーク2KB */
          };


          pdInitPeripheralEx(PDD_PLOGIC_ACTIVE,
                  gMapleDevs, gMapleRecvBufTbl, gMapleSendBuf,
                   sizeof(gMapleDevs) / sizeof(gMapleDevs[0]));


［マクロ］    PDM_WORK_SIZE(num)
［パラメータ］num      使用するペリフェラルの数
 [機能]       バッファサイズを計算します。
              num * 2KBがマクロの値となります。



【3. 拡張初期化サンプル】
	拡張初期化を利用したサンプルコードが、sample/peri/per1a/sbinit.cに
	収められていますので、そちらを参照してください。
	ソース中のデファインマクロ "USE_PD_INITEX"の値により、従来の初期化
	方法と切り替えられるようになっています。


[EOF]
