timer.c 2.7 KB

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