Timers.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include <os.h>
  2. #include <Timers.h>
  3. #define TIMER 0x900D0000
  4. volatile unsigned *timer_ctl = (unsigned *) (TIMER + 0x08);
  5. volatile unsigned *timer_load = (unsigned *) (TIMER);
  6. volatile unsigned *timer_value = (unsigned *) (TIMER + 0x04);
  7. unsigned timer_ctl_bkp[2], timer_load_bkp[2];
  8. #define TIMERS WalrusRPG::Timers
  9. void TIMERS::init(unsigned timer)
  10. {
  11. timer_ctl_bkp[timer] = timer_ctl[8 * timer];
  12. timer_load_bkp[timer] = timer_load[8 * timer];
  13. }
  14. void TIMERS::restore(unsigned timer)
  15. {
  16. timer_ctl[8 * timer] &= ~(1 << 7);
  17. timer_ctl[8 * timer] = timer_ctl_bkp[timer] & ~(1 << 7);
  18. timer_load[8 * timer] = timer_load_bkp[timer];
  19. timer_ctl[8 * timer] = timer_ctl_bkp[timer];
  20. }
  21. void TIMERS::mode(unsigned timer, bool free_run, bool oneshot, bool interrupt,
  22. unsigned div, bool full_width_counter)
  23. {
  24. unsigned mode = 0;
  25. if (!free_run)
  26. mode |= (1 << 6);
  27. if (oneshot)
  28. mode |= (1 << 0);
  29. if (interrupt)
  30. mode |= (1 << 5);
  31. if (full_width_counter)
  32. mode |= (1 << 1);
  33. switch (div)
  34. {
  35. case 256:
  36. mode |= (1 << 3);
  37. break;
  38. case 16:
  39. mode |= (1 << 2);
  40. break;
  41. }
  42. timer_ctl[8 * timer] &= ~(1 << 7);
  43. timer_ctl[8 * timer] = mode;
  44. timer_ctl[8 * timer] |= (1 << 7);
  45. }
  46. void TIMERS::load(unsigned timer, unsigned value)
  47. {
  48. timer_load[8 * timer] = value;
  49. }
  50. unsigned TIMERS::read(unsigned timer)
  51. {
  52. return timer_value[8 * timer];
  53. }