Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

USBFS v1.0 ドライバ Cy_USBFS_Dev_Drv_Disable() 関数のバグ - KBA225989 - Community Translated (JA)

USBFS v1.0 ドライバ Cy_USBFS_Dev_Drv_Disable() 関数のバグ - KBA225989 - Community Translated (JA)

GeethaP_31
Employee
Employee
50 questions asked 10 questions asked 5 questions asked

Community Translated by  Motoo Tanaka Expert         Version: **

Translation - English: Bug in Cy_USBFS_Dev_Drv_Disable() Function of USBFS v1.0 Driver - KBA225989

質問:USBFS ドライバを endpoint management mode が CPU Manual の設定で Cy_USBFS_Dev_Drv_Disable() をコールするとフォールトが発生するのはなぜですか?

回答:

Cy_USBFS_Dev_Drv_Disable() は endpoint management mode を確認せずに内部の関数で DMA チャンネルをディセーブルします。CPU Manual モードでは DMA チャネルはアロケートされていないため、DMA の関数が正しくない引数でコールされ、それがフォールトの原因になっています。

この問題を回避するためには、下記のように disable 関数を実装してください:

void Cy_USBFS_Dev_Drv_Disable_CpuMode(USBFS_Type *base, cy_stc_usbfs_dev_drv_context_t *context)

{

    /* 使用しない変数に関するウォーニングを止める */

    (void) context;

    /* D+ のプルアップをディセーブルする */

    USBFS_DEV_LPM_POWER_CTL(base) &= ~USBFS_USBLPM_POWER_CTL_DP_UP_EN_Msk;

    (void) USBFS_DEV_LPM_POWER_CTL(base);

    /* デバイスの USB トラフィックに対する応答をディセーブルする */

    USBFS_DEV_CR0(base) &= ~USBFS_USBDEV_CR0_USB_ENABLE_Msk;

}

USBFS ドライバのこの問題は Cy_USB_Dev_Disconnct() 関数が Cy_USBFS_Dev_Drv_Disable() 関数をコールしているため USB Device ミドルウェアにも影響を与えます。

この問題を回避するためには、下記のように disconnect 関数を実装してください:

void Cy_USB_Dev_Disconnect_CpuMode(cy_stc_usb_dev_context_t *context)

{

    /* D+ のプルアップをディセーブルする */

USBFS_DEV_LPM_POWER_CTL(context->drvBase) &= ~USBFS_USBLPM_POWER_CTL_DP_UP_EN_Msk;

    (void) USBFS_DEV_LPM_POWER_CTL(context->drvBase);

    /* デバイスの USB トラフィックに対する応答をディセーブルする */

    USBFS_DEV_CR0(context->drvBase) &= ~USBFS_USBDEV_CR0_USB_ENABLE_Msk;

    /* デバイスを初期状態に設定する */

    context->state   = CY_USB_DEV_DISABLED;

    context->address = 0U;

    context->configuration  = 0U;

}

この Cy_USBFS_Dev_Drv_Disable() 関数のバグは次のペリフェラルドライバライブラリ (PDL) のリリースで修正される予定です。

0 件の賞賛
172 件の閲覧回数
寄稿者