Community Translation - Implementing Extension Unit Control in AN75779 Example Project - KBA219280

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
keni_4440091
Level 7
Level 7
500 replies posted 100 solutions authored 50 solutions authored

Hi

I want to translate KBA219280, please confirm to my work.

Regards,

Nino

0 Likes
2 Replies
JennaJo
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted

Hi, Nino-san

Confirm to work this KBA.

Thanks

Jenna

Jenna Jo
0 Likes

タイトル:AN7570サンプルプロジェクトに拡張ユニットコントロールを実装 – KBA219280

バージョン 1

content.librarian 2017/04/07 2:30 に作成。content.librarian 2017/04/07 2:39 に変更。

Version: **

質問:

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 インデックス : 不使用 */

  1.  

拡張ユニットコントロールで要求される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

1403 閲覧 カテゴリ: USB: SuperSpeed Peripherals タグ: superspeed usb hubs

0 Likes