VBUS
ファンクション電力管理要件に基づいて
VBUS
のステートを変更するために、各コントローラはVBUS
マネージャ を搭載する必要があります。このファンクションは通常、VBUSのオン/オフ切り替えのみを実行しま す。コントローラの起動と停止
通常の
USB
実装とは異なり、OTG ではロールを変更するときに、ホストスタックとデバイススタック(またはそのいずれか)をアクティブ/非アクティブ化する必要があります。
USB
ロールマネージャUSB
ロールマネージャは、USBのステートを変更するためのコマンドを受信します。遷移を必要とす るステートが、次のようにいくつかあります。ステート 値 説明
//
グループ名UX_OTG_IDLE 0
デバイスはアイドル。通常は、何にも接続していない。UX_OTG_IDLE_TO_HOST 1
デバイスがタイプA
コネクタに接続している。UX_OTG_IDLE_TO_SLAVE 2
デバイスがタイプB
コネクタに接続している。UX_OTG_HOST_TO_IDLE 3
ホストデバイスが切断された。UX_OTG_HOST_TO_SLAVE 4
ホストからスレーブへのロール切り替えUX_OTG_SLAVE_TO_IDLE 5
スレーブデバイスが切断しているUX_OTG_SLAVE_TO_HOST 6
スレーブからへホストのロール切り替えインタラプトハンドラ
OTG
用のホストコントローラドライバとデバイスコントローラドライバには、従来のUSB
インタラプトを 超えた信号(特にSRP
やVBUS
による信号)をモニタするために、別種のインタラプトハンドラが必 要です。USB OTG
コントローラを初期化する方法として、ここではNXP LPC3131
を例に説明します。/* Initialize the LPC3131 OTG controller. */
status = ux_otg_lpc3131_initialize(0x19000000, lpc3131_vbus_function, tx_demo_change_mode_callback);
この例では、VBUS ファンクションとモード変更用コールバックを(ホストからスレーブ、またはその逆 に)渡すことで、
LPC3131
をOTG
モードで初期化します。コールバックファンクションでは、単に新しいモードを記録し、保留中のスレッドをウェイクアップして 新しいステートを取らせるようにします。
void tx_demo_change_mode_callback(ULONG mode) {
/* Simply save the otg mode. */
otg_mode = mode;
/* Wake up the thread that is waiting. */
ux_utility_semaphore_put(&mode_change_semaphore);
}
渡されるモード値としては、以下の値が可能です。
• UX_OTG_MODE_IDLE
• UX_OTG_MODE_SLAVE
• UX_OTG_MODE_HOST
アプリケーションは次の変数を調べて、デバイスが何であるかを常に確認することができます。
ux_system_otg -> ux_system_otg_device_type
この値としては、次のものが可能です。
• UX_OTG_DEVICE_A
• UX_OTG_DEVICE_B
• UX_OTG_DEVICE_IDLE
USB OTG
ホストデバイスは、次のコマンドを発行することで、いつでもロールの切り替えを要求できます。
/* Ask the stack to perform a HNP swap with the device. We relinquish the host role to A device.*/
ux_host_stack_role_swap(storage -> ux_host_class_storage_device);
スレーブデバイスから発行するコマンドはありませんが、スレーブデバイスではロールを変更するよ うにステートを設定することができます。すなわち、ホストが
GET_STATUS
を発行したときに変更後 のロールがホストによりピックアップされ、切り替えが実行されます。/* We are a B device, ask for role swap. The next GET_STATUS from the host will get the status change and do the HNP.*/
ux_system_otg -> ux_system_otg_slave_role_swap_flag =
UX_OTG_HOST_REQUEST_FLAG;