timer.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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. {
  18. /* Empty function for hooking the systick handler */
  19. }
  20. /* Systick interrupt handler */
  21. void SysTick_Handler( void )
  22. {
  23. ticks++;
  24. static uint16_t sdch_state = 0;
  25. static uint16_t reset_state = 0;
  26. sdch_state = ( sdch_state << 1 ) | SDCARD_DETECT | 0xe000;
  27. if ( ( sdch_state == 0xf000 ) || ( sdch_state == 0xefff ) )
  28. {
  29. sd_changed = 1;
  30. }
  31. reset_state = ( reset_state << 1 ) | get_snes_reset() | 0xe000;
  32. if ( ( reset_state == 0xf000 ) || ( reset_state == 0xefff ) )
  33. {
  34. reset_pressed = ( reset_state == 0xf000 );
  35. reset_changed = 1;
  36. }
  37. sdn_changed();
  38. SysTick_Hook();
  39. }
  40. void __attribute__( ( weak, noinline ) ) RIT_Hook( void )
  41. {
  42. }
  43. void RIT_IRQHandler( void )
  44. {
  45. LPC_RIT->RICTRL = BV( RITINT );
  46. NVIC_ClearPendingIRQ( RIT_IRQn );
  47. wokefromrit = 1;
  48. RIT_Hook();
  49. }
  50. void timer_init( void )
  51. {
  52. /* turn on power to RIT */
  53. BITBAND( LPC_SC->PCONP, PCRIT ) = 1;
  54. /* clear RIT mask */
  55. LPC_RIT->RIMASK = 0; /*xffffffff;*/
  56. /* PCLK_RIT = CCLK */
  57. BITBAND( LPC_SC->PCLKSEL1, 27 ) = 0;
  58. BITBAND( LPC_SC->PCLKSEL1, 26 ) = 1;
  59. /* PCLK_TIMER3 = CCLK/4 */
  60. BITBAND( LPC_SC->PCLKSEL1, 15 ) = 0;
  61. BITBAND( LPC_SC->PCLKSEL1, 14 ) = 0;
  62. /* enable timer 3 */
  63. BITBAND( LPC_SC->PCLKSEL1, PCLK_TIMER3 ) = 1;
  64. /* enable SysTick */
  65. SysTick_Config( ( SysTick->CALIB & SysTick_CALIB_TENMS_Msk ) );
  66. }
  67. void delay_us( unsigned int time )
  68. {
  69. /* Prepare RIT */
  70. LPC_RIT->RICOUNTER = 0;
  71. LPC_RIT->RICOMPVAL = ( CONFIG_CPU_FREQUENCY / 1000000 ) * time;
  72. LPC_RIT->RICTRL = BV( RITEN ) | BV( RITINT );
  73. /* Wait until RIT signals an interrupt */
  74. while ( !( BITBAND( LPC_RIT->RICTRL, RITINT ) ) ) ;
  75. /* Disable RIT */
  76. LPC_RIT->RICTRL = 0;
  77. }
  78. void delay_ms( unsigned int time )
  79. {
  80. /* Prepare RIT */
  81. LPC_RIT->RICOUNTER = 0;
  82. LPC_RIT->RICOMPVAL = ( CONFIG_CPU_FREQUENCY / 1000 ) * 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 sleep_ms( unsigned int time )
  90. {
  91. wokefromrit = 0;
  92. /* Prepare RIT */
  93. LPC_RIT->RICOUNTER = 0;
  94. LPC_RIT->RICOMPVAL = ( CONFIG_CPU_FREQUENCY / 1000 ) * time;
  95. LPC_RIT->RICTRL = BV( RITEN ) | BV( RITINT );
  96. NVIC_EnableIRQ( RIT_IRQn );
  97. /* Wait until RIT signals an interrupt */
  98. //uart_putc(';');
  99. while ( !wokefromrit )
  100. {
  101. __WFI();
  102. }
  103. NVIC_DisableIRQ( RIT_IRQn );
  104. /* Disable RIT */
  105. LPC_RIT->RICTRL = BV( RITINT );
  106. }