AN7570サンプルプロジェクトに拡張ユニットコントロールを実装 - KBA219280 - Community Translated (JA)

Version 1

    Community Translated by keni_4440091 Expert        Version: **

     

    Translation - English: Implementing Extension Unit Control in AN75779 Example Project - KBA219280

     

    質問:

    AN75779と関係するサンプルプロジェクトに対する拡張ユニットコントロールの実装方法は?

     

    質問:

    拡張ユニットはベンダー特有のビルディングブロックを仕様に追加するためのUVC仕様によって提供される方法です。

    AN75579に関係するサンプルプロジェクトに下記の修正を施して下さい。

    1. Visual Studioを使用して生成されたGUIDと共にcyfxuvcdscr.cファイルの中のExtension Unit Descriptor16バイトGUIDフィールドを更新して下さい:Tools  > Create GUIDに移動して下さい。ポップアップウィンドウで、Registry Formatを選択します。GUIDがリザルトフィールドの中で生成されています。
    2. 実装されるべき拡張ユニットコントロールの数によってcyfxuvcdscr.cファイルの中の拡張ユニット記述子のこのターミナルフィールドのコントロール数を更新して下さい。従って、実装された拡張ユニットコントロールのビットマップであるbmControlsフィールドを更新します。例として、4つの拡張ユニットコントロールを実装するためには、下記が拡張ユニット記述子になります:

    /* Extension Unit Descriptor */        
         0x1C,                             /*
    記述子サイズ */
            
         0x24,                             /*
    クラス特有インターフェースdescタイプ */
            
         0x06,                             /*
    拡張ユニット記述子タイプ */
            
         0x03,                             /*
    このターミナルのID */
            
         0xB8,0x19,0x77,0x02                    /* 16
    バイトGUID. Visual Studioを使用して生成した特別なGUIDはこのフィールドで更新される必要があります*/
                    0x7F,0xB0,0x67,0x45,         
         0x88,0xB1,0x20,0x34,               0x36,0xAD,0xBE,0x5D,        
         0x04,                             /*
    このターミナルのコントロール数 */
            
         0x01,                             /*
    このターミナルの入力ピン数 */
            
         0x02,                             /*
    セキュアID : 2 : Procユニットに接続 */
            
         0x03,                             /*
    このターミナル用コントロールフィールド数 : 3バイト */
            
         0x0F,0x00,0x00,             /* bmControls */
            
         0x00,                             /*
    ストリング desc インデックス : 不使用 */

    拡張ユニットコントロールで要求されるSET_CURGET_CUR uvc.cファイルのUVCHandleExtensionUnitRqts()関数で処理される必要があります。

     

    例:

     

         #define CONTROL_IN_EXTENSION_UNIT (uint16_t) (0x0100)

     

         static uint8_t current_value_extension_unit_control;

     

              
              /*
    拡張ユニットにアドレス指定された制御要求のハンドラー */

     

         static void UVCHandleExtensionUnitRqts (void)

     

         {

     

              CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;

      

                   uint16_t readCount;

     

                      switch(wValue) {

     

                       case CONTROL_IN_EXTENSION_UNIT:

     
                        switch(bRequest) {

     
                             case CY_FX_USB_UVC_GET_DEF_REQ:


                             case CY_FX_USB_UVC_GET_MIN_REQ:

     
                                  glEp0Buffer[0] = 1;

     
                                  CyU3PUsbSendEP0Data (1, (uint8_t *)glEp0Buffer);

     
                                break;

     
                                case CY_FX_USB_UVC_GET_RES_REQ:

     
                             glEp0Buffer[0] = 1;

     
                             CyU3PUsbSendEP0Data (1, (uint8_t *)glEp0Buffer);

     
                              break;

     
                              case CY_FX_USB_UVC_GET_MAX_REQ:

     
                           glEp0Buffer[0] = 50;

     
                           CyU3PUsbSendEP0Data (1, (uint8_t *)glEp0Buffer);

     
                           break;

     
                           case CY_FX_USB_UVC_GET_CUR_REQ:

     

                                     glEp0Buffer[0] = current_value_extension_unit_control;

     
                           CyU3PUsbSendEP0Data (1, (uint8_t *)glEp0Buffer);

     
                           break;


                           case CY_FX_USB_UVC_GET_LEN_REQ:

     
                           glEp0Buffer[0] = 0x01;

     
                           glEp0Buffer[1] = 0x00;

     
                           CyU3PUsbSendEP0Data (2, (uint8_t *)glEp0Buffer);

     
                           break;

     
                           case CY_FX_USB_UVC_GET_INFO_REQ:

     
                         glEp0Buffer[0] = 3;                    /* GET/SET
    要求はサポートされています。 */

     
                        CyU3PUsbSendEP0Data (1, (uint8_t *)glEp0Buffer);


                        break;


                        case CY_FX_USB_UVC_SET_CUR_REQ:

     
                           apiRetStatus = CyU3PUsbGetEP0Data (CY_FX_UVC_MAX_PROBE_SETTING_ALIGNED,

     
                                   glEp0Buffer, &readCount);

     
                           if (apiRetStatus == CY_U3P_SUCCESS) {

     
                               current_value_extension_unit_control = glEp0Buffer[0];


                           }

     
                             break;

     

                         default:


                       CyU3PUsbStall (0, CyTrue, CyFalse);


                              break;


                         }

     

                            break;

     

                         default:

     
                        CyU3PUsbStall (0, CyTrue, CyFalse);

     

                         break;

     

                         }

     

              }

     

    これらのファームウェア変更に加えて、ホストアプリケーションコードを修正する必要があります。

    UVC拡張ユニットに実装するホストアプリケーションコードに関しては、マイクロソフトから下記のリンクを参照して下さい:

     

    https://msdn.microsoft.com/en-us/windows/hardware/drivers/stream/uvc-extension-unit-code-samples