timer.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /**
  3. ******************************************************************************
  4. * @file timer.c
  5. * @author StarFive Technology
  6. * @version V1.0
  7. * @date 07/24/2020
  8. * @brief
  9. ******************************************************************************
  10. * @copy
  11. *
  12. * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  13. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  14. * TIME. AS A RESULT, STARFIVE SHALL NOT BE HELD LIABLE FOR ANY
  15. * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  16. * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  17. * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  18. *
  19. * COPYRIGHT 2020 Shanghai StarFive Technology Co., Ltd.
  20. */
  21. #include <comdef.h>
  22. #include <sys.h>
  23. #include <timer.h>
  24. #include <clkgen_ctrl_macro.h>
  25. #include <uart.h>
  26. #include <div64.h>
  27. #define TIMER_RATE_HZ (TIMER_CLK_HZ /1000)
  28. #include "platform.h"
  29. unsigned long long get_ticks(void)
  30. {
  31. return readq(CLINT_CTRL_MTIME);
  32. }
  33. u32 get_timer(unsigned int base)
  34. {
  35. return lldiv(get_ticks(), TIMER_RATE_HZ) - base;
  36. }
  37. #if 0
  38. u32 usec_to_tick(u32 usec)
  39. {
  40. u32 value = usec*(timer_clk/1000000);
  41. //printf("value = 0x%x\r\n", value);
  42. return usec*(timer_clk/1000000);
  43. }
  44. int udelay(u32 usec)
  45. {
  46. UINT64 tmp;
  47. UINT64 tmo;
  48. tmo = usec_to_tick(usec);
  49. tmp = get_ticks(0) + tmo; /* get current timestamp */
  50. while (get_ticks(0) < tmp)/* loop till event */
  51. /*NOP*/
  52. {
  53. }
  54. return 0;
  55. }
  56. #endif
  57. u64 usec_to_tick(u64 usec)
  58. {
  59. u64 value;
  60. value = usec*(TIMER_CLK_HZ/1000)/1000;
  61. return value;
  62. }
  63. /* delay x useconds */
  64. int udelay(unsigned int usec)
  65. {
  66. unsigned long tmp;
  67. tmp = readq((volatile void *)CLINT_CTRL_MTIME) + usec_to_tick(usec); /* get current timestamp */
  68. while (readq((volatile void *)CLINT_CTRL_MTIME) < tmp);
  69. }
  70. void mdelay(unsigned int ms)
  71. {
  72. udelay(1000*ms);
  73. }
  74. void sdelay(unsigned int s)
  75. {
  76. mdelay(1000*s);
  77. }