wm_cpu.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /**
  2. * @file wm_cpu.c
  3. *
  4. * @brief cpu driver module
  5. *
  6. * @author kevin
  7. *
  8. * Copyright (c) 2014 Winner Microelectronics Co., Ltd.
  9. */
  10. #include "wm_debug.h"
  11. #include "wm_regs.h"
  12. #include "wm_irq.h"
  13. #include "wm_cpu.h"
  14. #include "wm_pwm.h"
  15. /**
  16. * @brief This function is used to set cpu clock
  17. *
  18. * @param[in] clk select cpu clock
  19. * clk == CPU_CLK_80M 80M
  20. * clk == CPU_CLK_40M 40M
  21. *
  22. * @return None
  23. *
  24. * @note None
  25. */
  26. void tls_sys_clk_set(u32 clk)
  27. {
  28. #ifndef TLS_CONFIG_FPGA
  29. u32 RegValue;
  30. u8 wlanDiv, cpuDiv = clk;
  31. u8 bus2Fac;
  32. if ((clk < 2) || (clk > 240))
  33. {
  34. return;
  35. }
  36. /* Close bbp clk */
  37. tls_reg_write32(HR_CLK_BBP_CLT_CTRL, 0x0F);
  38. RegValue = tls_reg_read32(HR_CLK_DIV_CTL);
  39. wlanDiv = (RegValue>>8)&0xFF;
  40. RegValue &= 0xFF000000;
  41. RegValue |= 0x80000000;
  42. if(cpuDiv > 12)
  43. {
  44. bus2Fac = 1;
  45. wlanDiv = cpuDiv/4;
  46. }
  47. else /*wlan can run*/
  48. {
  49. wlanDiv=3;
  50. bus2Fac = (wlanDiv*4/cpuDiv)&0xFF;
  51. }
  52. RegValue |= (bus2Fac<<16) | (wlanDiv<<8) | cpuDiv;
  53. tls_reg_write32(HR_CLK_DIV_CTL, RegValue);
  54. SysTick_Config(XT806_PLL_CLK_MHZ*UNIT_MHZ/cpuDiv/HZ);
  55. #endif
  56. return;
  57. }
  58. /**
  59. * @brief This function is used to get cpu clock
  60. *
  61. * @param[out] *sysclk point to the addr for system clk output
  62. *
  63. * @return None
  64. *
  65. * @note None
  66. */
  67. void tls_sys_clk_get(tls_sys_clk *sysclk)
  68. {
  69. #ifndef TLS_CONFIG_FPGA
  70. clk_div_reg clk_div;
  71. clk_div.w = tls_reg_read32(HR_CLK_DIV_CTL);
  72. sysclk->cpuclk = XT806_PLL_CLK_MHZ/(clk_div.b.CPU);
  73. sysclk->wlanclk = XT806_PLL_CLK_MHZ/(clk_div.b.WLAN);
  74. sysclk->apbclk = sysclk->cpuclk / clk_div.b.BUS2;
  75. #else
  76. sysclk->apbclk =
  77. sysclk->cpuclk =
  78. sysclk->wlanclk = 40;
  79. #endif
  80. }