cputimer.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-07-10 xqyjlj The first version.
  9. */
  10. #include "gtimer.h"
  11. #include <drivers/clock_time.h>
  12. static volatile unsigned long _init_cnt = 0;
  13. static rt_bool_t _aarch64_clock_registered = RT_FALSE;
  14. static struct rt_clock_time_device _aarch64_clock_dev;
  15. static rt_uint64_t _aarch64_clock_get_freq(struct rt_clock_time_device *dev)
  16. {
  17. RT_UNUSED(dev);
  18. return rt_hw_get_gtimer_frq();
  19. }
  20. static rt_uint64_t _aarch64_clock_get_counter(struct rt_clock_time_device *dev)
  21. {
  22. RT_UNUSED(dev);
  23. return (rt_uint64_t)(rt_hw_get_cntpct_val() - _init_cnt);
  24. }
  25. static rt_err_t _aarch64_clock_set_timeout(struct rt_clock_time_device *dev, rt_uint64_t delta)
  26. {
  27. RT_UNUSED(dev);
  28. RT_UNUSED(delta);
  29. return -RT_ENOSYS;
  30. }
  31. static const struct rt_clock_time_ops _aarch64_clock_ops =
  32. {
  33. _aarch64_clock_get_freq,
  34. _aarch64_clock_get_counter,
  35. _aarch64_clock_set_timeout,
  36. };
  37. void rt_clock_time_source_init(void)
  38. {
  39. _init_cnt = rt_hw_get_cntpct_val();
  40. if (!_aarch64_clock_registered)
  41. {
  42. rt_uint8_t caps = RT_CLOCK_TIME_CAP_SOURCE;
  43. _aarch64_clock_dev.ops = &_aarch64_clock_ops;
  44. _aarch64_clock_dev.res_scale = RT_CLOCK_TIME_RESMUL;
  45. _aarch64_clock_dev.caps = caps;
  46. rt_clock_time_device_register(&_aarch64_clock_dev, "clock_time_gtimer", caps);
  47. rt_clock_time_set_default_source(&_aarch64_clock_dev);
  48. _aarch64_clock_registered = RT_TRUE;
  49. }
  50. }