timer.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /* ___INGO___ */
  2. #include <arm/NXP/LPC17xx/LPC17xx.h>
  3. #include "bits.h"
  4. #include "config.h"
  5. #include "timer.h"
  6. #include "clock.h"
  7. #include "uart.h"
  8. #include "sdnative.h"
  9. #include "snes.h"
  10. #include "led.h"
  11. /* bit definitions */
  12. #define RITINT 0
  13. #define RITEN 3
  14. #define PCRIT 16
  15. extern volatile int sd_changed;
  16. extern volatile int reset_changed;
  17. volatile tick_t ticks;
  18. volatile int wokefromrit;
  19. void __attribute__((weak,noinline)) SysTick_Hook(void) {
  20. /* Empty function for hooking the systick handler */
  21. }
  22. /* Systick interrupt handler */
  23. void SysTick_Handler(void) {
  24. ticks++;
  25. static uint16_t sdch_state = 0;
  26. static uint16_t reset_state = 0;
  27. static uint16_t led_test_state = 0;
  28. sdch_state = (sdch_state << 1) | SDCARD_DETECT | 0xe000;
  29. if((sdch_state == 0xf000) || (sdch_state == 0xefff)) {
  30. sd_changed = 1;
  31. }
  32. reset_state = (reset_state << 1) | get_snes_reset() | 0xe000;
  33. if((reset_state == 0xf000) || (reset_state == 0xefff)) {
  34. reset_changed = 1;
  35. }
  36. switch(led_test_state&0xc0) {
  37. case 0xc0: led_test_state = 0; break;
  38. case 0x00:
  39. rdyled(1);
  40. readled(0);
  41. writeled(0);
  42. break;
  43. case 0x40:
  44. rdyled(0);
  45. readled(1);
  46. writeled(0);
  47. break;
  48. case 0x80:
  49. rdyled(0);
  50. readled(0);
  51. writeled(1);
  52. break;
  53. }
  54. // led_test_state++;
  55. sdn_changed();
  56. SysTick_Hook();
  57. }
  58. void __attribute__((weak,noinline)) RIT_Hook(void) {
  59. }
  60. void RIT_IRQHandler(void) {
  61. LPC_RIT->RICTRL = BV(RITINT);
  62. NVIC_ClearPendingIRQ(RIT_IRQn);
  63. wokefromrit = 1;
  64. RIT_Hook();
  65. }
  66. void timer_init(void)
  67. {
  68. /* turn on power to RIT */
  69. BITBAND(LPC_SC->PCONP, PCRIT) = 1;
  70. /* clear RIT mask */
  71. LPC_RIT->RIMASK = 0; /*xffffffff;*/
  72. /* PCLK = CCLK */
  73. BITBAND(LPC_SC->PCLKSEL1, 26) = 1;
  74. BITBAND(LPC_SC->PCLKSEL1, PCLK_TIMER3) = 1;
  75. /* enable SysTick */
  76. SysTick_Config((SysTick->CALIB & SysTick_CALIB_TENMS_Msk));
  77. }
  78. void delay_us(unsigned int time)
  79. {
  80. /* Prepare RIT */
  81. LPC_RIT->RICOUNTER = 0;
  82. LPC_RIT->RICOMPVAL = (CONFIG_CPU_FREQUENCY / 1000000) * time;
  83. LPC_RIT->RICTRL = BV(RITEN) | BV(RITINT);
  84. /* Wait until RIT signals an interrupt */
  85. while (!(BITBAND(LPC_RIT->RICTRL, RITINT))) ;
  86. /* Disable RIT */
  87. LPC_RIT->RICTRL = 0;
  88. }
  89. void delay_ms(unsigned int time) {
  90. /* Prepare RIT */
  91. LPC_RIT->RICOUNTER = 0;
  92. LPC_RIT->RICOMPVAL = (CONFIG_CPU_FREQUENCY / 1000) * time;
  93. LPC_RIT->RICTRL = BV(RITEN) | BV(RITINT);
  94. /* Wait until RIT signals an interrupt */
  95. while (!(BITBAND(LPC_RIT->RICTRL, RITINT))) ;
  96. /* Disable RIT */
  97. LPC_RIT->RICTRL = 0;
  98. }
  99. void sleep_ms(unsigned int time) {
  100. wokefromrit = 0;
  101. /* Prepare RIT */
  102. LPC_RIT->RICOUNTER = 0;
  103. LPC_RIT->RICOMPVAL = (CONFIG_CPU_FREQUENCY / 1000) * time;
  104. LPC_RIT->RICTRL = BV(RITEN) | BV(RITINT);
  105. NVIC_EnableIRQ(RIT_IRQn);
  106. /* Wait until RIT signals an interrupt */
  107. //uart_putc(';');
  108. while(!wokefromrit) {
  109. __WFI();
  110. }
  111. NVIC_DisableIRQ(RIT_IRQn);
  112. /* Disable RIT */
  113. LPC_RIT->RICTRL = BV(RITINT);
  114. }