rtcaccess.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #ifndef RTC_ACCESS_H
  2. #define RTC_ACCESS_H
  3. #include <stdint.h>
  4. #define RTC_MMIO_BASE 0x60000700
  5. #define RTC_USER_MEM_BASE 0x60001200
  6. #define RTC_USER_MEM_NUM_DWORDS 128
  7. #define RTC_TARGET_ADDR 0x04
  8. #define RTC_COUNTER_ADDR 0x1c
  9. static inline uint32_t rtc_mem_read(uint32_t addr)
  10. {
  11. return ((uint32_t*)RTC_USER_MEM_BASE)[addr];
  12. }
  13. static inline void rtc_mem_write(uint32_t addr, uint32_t val)
  14. {
  15. ((uint32_t*)RTC_USER_MEM_BASE)[addr]=val;
  16. }
  17. static inline uint64_t rtc_make64(uint32_t high, uint32_t low)
  18. {
  19. return (((uint64_t)high)<<32)|low;
  20. }
  21. static inline uint64_t rtc_mem_read64(uint32_t addr)
  22. {
  23. return rtc_make64(rtc_mem_read(addr+1),rtc_mem_read(addr));
  24. }
  25. static inline void rtc_mem_write64(uint32_t addr, uint64_t val)
  26. {
  27. rtc_mem_write(addr+1,val>>32);
  28. rtc_mem_write(addr,val&0xffffffff);
  29. }
  30. static inline void rtc_memw(void)
  31. {
  32. asm volatile ("memw");
  33. }
  34. static inline void rtc_reg_write(uint32_t addr, uint32_t val)
  35. {
  36. rtc_memw();
  37. addr+=RTC_MMIO_BASE;
  38. *((volatile uint32_t*)addr)=val;
  39. rtc_memw();
  40. }
  41. static inline uint32_t rtc_reg_read(uint32_t addr)
  42. {
  43. addr+=RTC_MMIO_BASE;
  44. rtc_memw();
  45. return *((volatile uint32_t*)addr);
  46. }
  47. static inline void rtc_reg_write_and_loop(uint32_t addr, uint32_t val)
  48. {
  49. addr+=RTC_MMIO_BASE;
  50. rtc_memw();
  51. asm("j 1f\n"
  52. ".align 32\n"
  53. "1:\n"
  54. "s32i.n %1,%0,0\n"
  55. "2:\n"
  56. "j 2b\n"::"r"(addr),"r"(val):);
  57. }
  58. #endif