drv_hsotg.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /**************************************************************************//**
  2. *
  3. * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Change Logs:
  8. * Date Author Notes
  9. * 2020-05-22 klcheng First version
  10. *
  11. ******************************************************************************/
  12. #include <rtconfig.h>
  13. #if defined(BSP_USING_HSOTG)
  14. #include <rtdevice.h>
  15. #include <rtdbg.h>
  16. #include "NuMicro.h"
  17. /* This delay must be at least 10 us */
  18. static void _usb_init_delay(void)
  19. {
  20. volatile uint32_t i = 0x1000;
  21. while (i--)
  22. __NOP();
  23. return;
  24. }
  25. /* Check current usb role */
  26. static void usb_role(void)
  27. {
  28. uint32_t status;
  29. status = (HSOTG->STATUS) & (HSOTG_STATUS_ASHOST_Msk | HSOTG_STATUS_ASPERI_Msk | HSOTG_STATUS_IDSTS_Msk);
  30. if (status == (HSOTG_STATUS_IDSTS_Msk | HSOTG_STATUS_ASPERI_Msk))
  31. rt_kprintf("usb frame acts as peripheral\n");
  32. else if (status == HSOTG_STATUS_ASHOST_Msk)
  33. rt_kprintf("usb frame acts as host\n");
  34. else
  35. rt_kprintf("usb frame is unknown state: 0x%x\n", status);
  36. return;
  37. }
  38. MSH_CMD_EXPORT_ALIAS(usb_role, usb_role, check usb role);
  39. static int hsotg_init(void)
  40. {
  41. uint32_t u32RegLockBackup = SYS_IsRegLocked();
  42. SYS_UnlockReg();
  43. /* Set HSOTG as ID dependent role */
  44. SYS->USBPHY = SYS_USBPHY_HSUSBEN_Msk | (0x2 << SYS_USBPHY_HSUSBROLE_Pos);
  45. /* user should keep HSUSB PHY at reset mode at lease 10 us before changing to active mode */
  46. _usb_init_delay();
  47. SYS->USBPHY |= SYS_USBPHY_HSUSBACT_Msk;
  48. /* Enable OTG and ID detection function */
  49. HSOTG_ENABLE_PHY();
  50. HSOTG_ENABLE_ID_DETECT();
  51. NVIC_EnableIRQ(USBOTG20_IRQn);
  52. /* clear interrupt and enable relative interrupts */
  53. HSOTG_ENABLE_INT(HSOTG_INTEN_IDCHGIEN_Msk | HSOTG_INTEN_HOSTIEN_Msk | HSOTG_INTEN_PDEVIEN_Msk |
  54. HSOTG_INTEN_BVLDCHGIEN_Msk | HSOTG_INTEN_AVLDCHGIEN_Msk);
  55. if (u32RegLockBackup)
  56. SYS_LockReg();
  57. return (int)RT_EOK;
  58. }
  59. INIT_PREV_EXPORT(hsotg_init);
  60. /* HSOTG interrupt entry */
  61. void USBOTG20_IRQHandler(void)
  62. {
  63. __IO uint32_t reg;
  64. reg = HSOTG->INTSTS;
  65. /* usb id pin status change */
  66. if (reg & HSOTG_INTSTS_IDCHGIF_Msk)
  67. {
  68. HSOTG_CLR_INT_FLAG(HSOTG_INTSTS_IDCHGIF_Msk);
  69. LOG_D("usb id change");
  70. }
  71. /* usb acts as host */
  72. if (reg & HSOTG_INTSTS_HOSTIF_Msk)
  73. {
  74. HSOTG_CLR_INT_FLAG(HSOTG_INTSTS_HOSTIF_Msk);
  75. LOG_D("usb acts as host");
  76. }
  77. /* usb acts as peripheral */
  78. if (reg & HSOTG_INTSTS_PDEVIF_Msk)
  79. {
  80. HSOTG_CLR_INT_FLAG(HSOTG_INTSTS_PDEVIF_Msk);
  81. LOG_D("usb acts as peripheral");
  82. }
  83. /* A-device session valid state change */
  84. if (reg & HSOTG_INTSTS_AVLDCHGIF_Msk)
  85. {
  86. HSOTG_CLR_INT_FLAG(HSOTG_INTSTS_AVLDCHGIF_Msk);
  87. LOG_D("usb a-device session valid state change");
  88. }
  89. /* B-device session valid state change */
  90. if (reg & HSOTG_INTSTS_BVLDCHGIF_Msk)
  91. {
  92. HSOTG_CLR_INT_FLAG(HSOTG_INTSTS_BVLDCHGIF_Msk);
  93. LOG_D("usb b-device session valid state change");
  94. }
  95. }
  96. #endif /* defined(BSP_USING_HSOTG) */