cancel
Showing results for 
Search instead for 
Did you mean: 

Knowledge Base Articles

FX3ファームウェアでバルクエンドポイントをアイソクロナスに変更 – KBA231897-Community Translated (JA)

JennaJo
Moderator
Moderator

FX3ファームウェアでバルクエンドポイントをアイソクロナスに変更 – KBA231897-Community Translated (JA)

Original KBA: Change Bulk endpoint to Isochronous in FX3 firmware – KBA231897

Translated by: Kenshow

タイトル: FX3ファームウェアでバルクエンドポイントをアイソクロナスに変更 – KBA231897

 

バージョン:**

次のようなアプリケーションでFX3ファームウェアのバルクエンドポイントをアイソクロナスエンドポイントに変更するには、次の手順を実行します。

  1. アプリケーションには、保証されたUSB帯域幅が必要です。
  2. データには時間に敏感な情報が含まれています。
  3. データ転送は、オーディオまたはビデオストリームのような継続的かつ周期的です。

これらのケースは、USB帯域幅を保証せず、大きなバーストデータを転送するために使用されるバルク転送とは異なります。

手順1ファームウェアで使用されるUSB記述子を含むソースファイルのUSBインターフェースディスクリプタに代替設定を追加します。代替設定0はエンドポイントがゼロである必要があり、代替設定1はアイソクロナスエンドポイントで追加される必要があります。コード1は、USBのディスクリプタを含むソースファイルのインターフェースディスクリプタに代替設定を追加する方法を示しています。この記事に添付されているGpifToUsbファームウェアにあるcyfxbulkdscr.cファイルは、USBディスクリプタを含むソースファイルです。この例では、代替設定0にはエンドポイントがありませんが、代替設定1には2つのエンドポイントがあります。

コード1. USBインターフェースディスクリプタの変更

/* Configuration descriptor */

0x09,                           /* Descriptor size */

CY_U3P_USB_CONFIG_DESCR,        /* Configuration descriptor type */

0x42,0x00,                      /* Length of this descriptor and all sub descriptors */

0x01,                           /* Number of interfaces */

0x01,                           /* Configuration number */

0x00,                           /* Configuration string index */

0x80,                           /* Config characteristics - Bus powered */

0x32,                           /* Max power consumption of device (in 8mA unit) : 400mA */

/* Interface descriptor: Interface 0, Alt setting 0 - No endpoints */       

0x09,                               /* Descriptor size */

CY_U3P_USB_INTRFC_DESCR,            /* Interface Descriptor type */

0x00,                               /* Interface number */

0x00,                               /* Alternate setting number */ //  - Alternate setting number should be set to 0              

0x00,                               /* Number of end points */                      //  - 0 endpoints under alternate setting 0

0xFF,                               /* Interface class */

0x00,                               /* Interface sub class */

0x00,                               /* Interface protocol code */

0x00,                               /* Interface descriptor string index */

/* Interface descriptor : Interface 0, Alt setting 1 – Two Endpoints */

0x09,                           /* Descriptor size */

CY_U3P_USB_INTRFC_DESCR,        /* Interface Descriptor type */

0x00,                           /* Interface number */                                    

0x01,                           /* Alternate setting number */                     //  - Alternate setting number should be set to 0 

0x02,                           /* Number of end points */                         // -  Two endpoints under alternate setting 0

0xFF,                           /* Interface class */

0x00,                           /* Interface sub class */

0x00,                           /* Interface protocol code */

0x00,                           /* Interface descriptor string index */

注:アイソクロナスエンドポイントを備えたインターフェースは、USBバスの帯域幅を予約します。帯域幅の制限のためにホストがエニュメレート中にアイソクロナスエンドポイントを有効にできない場合、エニュメレートは失敗する可能性があります。これは、アイソクロナスエンドポイントのないデフォルトの代替(代替設定0)を使用することで回避できます。デバイスが使用されていないとき、ドライバーは帯域幅を節約するためにデフォルト設定(代替設定0)に切り替えることができます。

手順2 USBディスクリプタを含むソースファイルのエンドポイントディスクリプタを変更します。この記事に添付GpifToUsbファームウェアにあるcyfxbulkdscr.cファイルはUSBディスクリプタを含むソースファイルです。

エンドポイントタイプをアイソクロナスエンドポイントに変更し、USBエンドポイントディスクリプタで最大パケットサイズとサービス間隔を設定します。

最大パケットサイズとサービス間隔の値は、それぞれのUSB 3.0 / USB2.0仕様の範囲内である必要があります。たとえば、USB仕様では、フルスピードアイソクロナスエンドポイントごとに最大データペイロードサイズが1023バイトに制限されています。Hi-speedおよびSuperSpeedエンドポイントは、最大1024バイトのデータペイロードを許可されます。

          

  1. USB SuperSpeedディスクリプタを使用する場合は、SuperSpeedエンドポイントコンパニオンディスクリプタで次のパラメータを設定します。 

         これらのパラメータは、USB3.0仕様によって制限される必要があります。

  • バーストあたりのパケット数
  • 間隔ごとのバースト数
  • 間隔ごとのデータ

コード2は、SuperSpeedアイソクロナスエンドポイントディスクリプタを示しています。

コード2SuperSpeedアイソクロナスエンドポイントディスクリプタ

       /* Endpoint descriptor for producer EP */

0x07,                                                  /* Descriptor size */

CY_U3P_USB_ENDPNT_DESCR,                               /* Endpoint descriptor type */

CY_FX_EP_CONSUMER,                                     /* Endpoint address and description */

CY_U3P_USB_EP_ISO,                                     /* ISO endpoint type */              // Endpoint Type Changed to Isochronous

(CY_U3P_GET_LSB(CY_FX_ISO_MAXPKT)),                    /* LS Byte of maximum packet size. */                                                                    (CY_U3P_GET_MSB(CY_FX_ISO_MAXPKT)), /* MS Byte of maximum packet size. */

0x01,                                                  /* Servicing interval for data transfers: 1 uFrame */                               // Changed the service Interval value.

/* Super speed endpoint companion descriptor for producer EP */

0x06, /* Descriptor size */

CY_U3P_SS_EP_COMPN_DESCR,                             /* SS EP companion descriptor type */

(CY_FX_ISO_BURST - 1),                                /* Number of packets per burst. */     //Configured packets per burst (MULT)

(CY_FX_ISO_PKTS - 1),                                 /* Number of bursts per interval*/     // Configured Bursts per Intervals

(CY_U3P_GET_LSB(CY_FX_ISO_MAXPKT * CY_FX_ISO_PKTS * CY_FX_ISO_BURST)),/* LS Byte: data per interval*/ //Configured Data per Interval

(CY_U3P_GET_MSB(CY_FX_ISO_MAXPKT * CY_FX_ISO_PKTS * CY_FX_ISO_BURST)),/* MS Byte: data per interval*/ //Configured Data per Interval

注:コード2で使用されるマクロの定義については、この記事に添付されているファームウェアのヘッダーファイル(cyfxgpiftousb.h)を参照してください。

手順3 USBディスクリプタを含むソースファイルのコンフィギュレーションディスクリプタのこのディスクリプタとすべてのサブディスクリプタのフィールドの長さを更新します。これは、ディスクリプタに1つの代替設定が追加されているためです。このフィールドに、以下を含むコンフィギュレーションディスクリプタの全長を入力します。

このディスクリプタとすべてのサブディスクリプタの長さ=コンフィギュレーションディスクリプタの長さ+インターフェースディスクリプタの長さ:インターフェース0、Alt設定0 +インターフェースディスクリプタ:インターフェース0、Alt設定1+エンドポイントディスクリプタの長さ/秒+Super speedエンドポイントコンパニオンディスクリプタの長さ/s

:SuperSpeedエンドポイントコンパニオンディスクリプタの長さは、USB SuperSpeedディスクリプタにのみ適用されます。

手順4以下を設定して、アプリケーションを実装するメインソースファイルでエンドポイントを設定します。

  • エンドポイントタイプ –  epType
  • バースト長 – burstLen
  • 最大パケットサイズ(MAXPKT )
  • バーストあたりのパケット数(MULT)– isoPkts

ノート:

  1. この記事に添付されているGpifToUsbファームウェアのcyfxgpiftousb.cファイルを参照してください。これは、GPIFIIからUSBへの転送を実装する添付ファームウェアファイルのメインソースファイルです。
  2. アイソクロナスデータ転送がHi-Speed USBで行われる場合は、FX3データシートのエラッタ4に記載されている既知の問題の回避策を使用してください。
  3. パケットサイズ、バーストあたりのパケット数、およびバースト長の値は、それぞれのUSB 3.0 / USB2.0仕様によって制限される必要があります。

コード3:エンドポイントの設定

 epCfg.enable   = CyTrue;

        epCfg.epType   = CY_U3P_USB_EP_ISO;

        epCfg.burstLen = (usbSpeed == CY_U3P_SUPER_SPEED) ? (CY_FX_ISO_BURST) : 1;

        epCfg.streams  = 0;

        epCfg.pcktSize = (usbSpeed == CY_U3P_FULL_SPEED) ? (CY_U3P_MIN (1023, CY_FX_ISO_MAXPKT)) : CY_FX_ISO_MAXPKT;

        epCfg.isoPkts  = (usbSpeed == CY_U3P_FULL_SPEED) ? 1 : CY_FX_ISO_PKTS;

        /* Producer endpoint configuration */

        apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER, &epCfg);

        if (apiRetStatus != CY_U3P_SUCCESS)

        {

            CyU3PDebugPrint (4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);

            CyFxAppErrorHandler (apiRetStatus);

        }

注:エンドポイント設定のisoPktsフィールドが1より大きい値で設定されている 場合、USBエンドポイント3とエンドポイント7のみをアイソクロナスエンドポイントとして使用できます。

手順5メインソースファイルのUSBイベントコールバック関数(CyFxApplnUSBEventCB)でevdata(代替設定)を0x0001としてCY_U3P_USB_EVENT_SETINTF イベントがトリガーされたら、アプリケーションを起動します。この記事に添付されているGpifToUsbファームウェアのcyfxgpiftousb.cファイルを参照してください。これは、GPIFIIからUSBへの転送を実装する添付ファームウェアファイルのメインソースファイルです。

コード4:アプリケーションの起動

case CY_U3P_USB_EVENT_SETINTF:

/* Stop the application before restarting. */

if (glIsApplnActive)

{

CyFxApplnStop ();

}

/* Start the loop back function if alternate setting 1 has been selected. */

if (evdata == 0x0001)

CyFxApplnStart ();

break;

 

このKBAに添付されているGpiftoUsbの例を参照してください。この例は、ISOCマクロが有効な場合にバルクエンドポイントをアイソクロナスエンドポイントに変更するように修正されています。

注:この記事に添付されているファームウェアでは、CY_U3P_USB_EVENT_SETINTFイベントが発生すると、アプリケーションはCyFxApplnStart()関数を呼び出します。これは、ホストアプリケーションが代替設定1のインターフェースを選択する必要があることを意味します。FX3SDKのUSB Control Centerソフトウェアを使用する場合は、デバイスツリービューで代替設定1を手動で選択する必要があります。USBコントロールセンターを使用したFX3へのデータ転送のプログラミングと実行については、AN75705:EZ-USBFX3入門を参照してください。

図1. 代替設定1の選択

   

JennaJo_0-1614314023110.png

 

USB Control Centerソフトウェアには、<FX3 SDK Installation Path>\Cypress\EZ-USB FX3SDK\1.3\application\c_sharp\controlcenter\bin\Releaseからアクセスできます

1. AN75779に接続されているUVCファームウェアでバルクエンドポイントをアイソクロナスに変更する

AN75779で提供されるようなUVCファームウェアの変更は、前のセクションで説明した変更と同様です。変更されたAN75779ファームウェアはこの記事に添付されています。アイソクロナスエンドポイントを追加するには、USE_ISOCHRONOUS_ENDPOINTマクロを有効にする必要があります。

注意:

  • UVCアプリケーションの場合、UVCドライバーがISOCエンドポイントのBURSTを1に制限するため、Windows7 / 8マシンのUSB3.0のUVCでISOC-INエンドポイントを使用して達成できる最大帯域幅は24Mbpsです。ただし、Windows 10マシンでは、BURSTを16に設定して、最大ISOC帯域幅を実現できます。

添付のAN75779ファームウェアでは、アイソクロナスエンドポイントはUSB3.0ディスクリプタにのみ追加されます。FX3でサポートされる最大USB帯域幅は最大8MBps(125 µsあたり1 KBパケット)になるため、UVCアプリケーションにUSB2.0でアイソクロナスエンドポイントを使用することはお勧めしません。これは、FX3データシートのエラッタ4に記載されているUSB 2.0 ISOCデータ転送での無効なPIDシーケンスの既知の問題を防ぐために、FX3デバイスを使用するUSB​​高速UVCアプリケーションではCY_FX_ISO_PKTS(MULT)設定を「1」として使用する必要があるためです。

0 Likes
Version history
Revision #:
1 of 1
Last update:
‎Feb 25, 2021 08:37 PM
Updated by:
 
Contributors