
- Subscribe to RSS Feed
- Mark as New
- Mark as Read
- Bookmark
- Subscribe
- Printer Friendly Page
- Report Inappropriate Content
AN7570サンプルプロジェクトに拡張ユニットコントロールを実装 - KBA219280 - Community Translated (JA)
Community Translated by keni_4440091 Version: **
Translation - English: Implementing Extension Unit Control in AN75779 Example Project - KBA219280
質問:
AN75779と関係するサンプルプロジェクトに対する拡張ユニットコントロールの実装方法は?
質問:
拡張ユニットはベンダー特有のビルディングブロックを仕様に追加するためのUVC仕様によって提供される方法です。
AN75579に関係するサンプルプロジェクトに下記の修正を施して下さい。
- Visual Studioを使用して生成されたGUIDと共にcyfxuvcdscr.cファイルの中のExtension Unit Descriptorの16バイトGUIDフィールドを更新して下さい:Tools > Create GUIDに移動して下さい。ポップアップウィンドウで、Registry Formatを選択します。GUIDがリザルトフィールドの中で生成されています。
- 実装されるべき拡張ユニットコントロールの数によって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_CUR、GET_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