usb_dc_aic_ll.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /*
  2. * Copyright (c) 2022-2024, ArtInChip Technology Co., Ltd
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <aic_core.h>
  7. #include <aic_hal.h>
  8. #include <hal_syscfg.h>
  9. #include "usbd_core.h"
  10. #include "usb_dc_aic_reg.h"
  11. extern irqreturn_t USBD_IRQHandler(int irq, void * data);
  12. uint32_t usbd_clk;
  13. static unsigned char dma_sync_buffer[CACHE_LINE_SIZE] __attribute__((aligned(CACHE_LINE_SIZE)));
  14. void usb_dc_sync_dma(void)
  15. {
  16. asm volatile("sw t0, (%0)" : : "r"(dma_sync_buffer));
  17. csi_dcache_clean_range((phy_addr_t)(ptr_t)dma_sync_buffer, CACHE_LINE_SIZE);
  18. }
  19. void usb_dc_low_level_init(void)
  20. {
  21. /* set usb0 phy switch: Host/Device */
  22. #if defined(AIC_USING_USB0_DEVICE) || defined(AIC_USING_USB0_OTG)
  23. hal_syscfg_usb_phy0_sw_host(0);
  24. #endif
  25. /* set pin-mux */
  26. /* enable clock */
  27. hal_clk_enable(CONFIG_USB_AIC_DC_PHY_CLK);
  28. hal_clk_enable(CONFIG_USB_AIC_DC_CLK);
  29. aicos_udelay(300);
  30. hal_reset_assert(CONFIG_USB_AIC_DC_PHY_RESET);
  31. hal_reset_assert(CONFIG_USB_AIC_DC_RESET);
  32. aicos_udelay(300);
  33. hal_reset_deassert(CONFIG_USB_AIC_DC_PHY_RESET);
  34. hal_reset_deassert(CONFIG_USB_AIC_DC_RESET);
  35. aicos_udelay(300);
  36. usbd_clk = hal_clk_get_freq(CONFIG_USB_AIC_DC_CLK);
  37. /* register interrupt callback */
  38. aicos_request_irq(CONFIG_USB_AIC_DC_IRQ_NUM, USBD_IRQHandler,
  39. 0, "usb_device", NULL);
  40. aicos_irq_enable(CONFIG_USB_AIC_DC_IRQ_NUM);
  41. }
  42. void usb_dc_low_level_deinit(void)
  43. {
  44. aicos_irq_disable(CONFIG_USB_AIC_DC_IRQ_NUM);
  45. hal_reset_assert(CONFIG_USB_AIC_DC_PHY_RESET);
  46. hal_reset_assert(CONFIG_USB_AIC_DC_RESET);
  47. hal_clk_disable(CONFIG_USB_AIC_DC_PHY_CLK);
  48. hal_clk_disable(CONFIG_USB_AIC_DC_CLK);
  49. }