led.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /* ___DISCLAIMER___ */
  2. #include <arm/NXP/LPC17xx/LPC17xx.h>
  3. #include "bits.h"
  4. #include "timer.h"
  5. #include "led.h"
  6. #include "cli.h"
  7. static uint8_t led_bright[16] = {255, 253, 252, 251, 249, 247, 244, 239, 232, 223, 210, 191, 165, 127, 74, 0};
  8. int led_rdyledstate = 0;
  9. int led_readledstate = 0;
  10. int led_writeledstate = 0;
  11. int led_pwmstate = 0;
  12. /* LED connections (Rev.C)
  13. LED color IO PWM
  14. ---------------------------
  15. ready green P2.4 PWM1[5]
  16. read yellow P2.5 PWM1[6]
  17. write red P1.23 PWM1[4]
  18. */
  19. void rdyled( unsigned int state )
  20. {
  21. if ( led_pwmstate )
  22. {
  23. rdybright( state ? 15 : 0 );
  24. }
  25. else
  26. {
  27. BITBAND( LPC_GPIO2->FIODIR, 4 ) = state;
  28. }
  29. led_rdyledstate = state;
  30. }
  31. void readled( unsigned int state )
  32. {
  33. if ( led_pwmstate )
  34. {
  35. readbright( state ? 15 : 0 );
  36. }
  37. else
  38. {
  39. BITBAND( LPC_GPIO2->FIODIR, 5 ) = state;
  40. }
  41. led_readledstate = state;
  42. }
  43. void writeled( unsigned int state )
  44. {
  45. if ( led_pwmstate )
  46. {
  47. writebright( state ? 15 : 0 );
  48. }
  49. else
  50. {
  51. BITBAND( LPC_GPIO1->FIODIR, 23 ) = state;
  52. }
  53. led_writeledstate = state;
  54. }
  55. void rdybright( uint8_t bright )
  56. {
  57. LPC_PWM1->MR5 = led_bright[( bright & 15 )];
  58. BITBAND( LPC_PWM1->LER, 5 ) = 1;
  59. }
  60. void readbright( uint8_t bright )
  61. {
  62. LPC_PWM1->MR6 = led_bright[( bright & 15 )];
  63. BITBAND( LPC_PWM1->LER, 6 ) = 1;
  64. }
  65. void writebright( uint8_t bright )
  66. {
  67. LPC_PWM1->MR4 = led_bright[( bright & 15 )];
  68. BITBAND( LPC_PWM1->LER, 4 ) = 1;
  69. }
  70. void led_clkout32( uint32_t val )
  71. {
  72. while ( 1 )
  73. {
  74. rdyled( 1 );
  75. delay_ms( 400 );
  76. readled( ( val & BV( 31 ) ) >> 31 );
  77. rdyled( 0 );
  78. val <<= 1;
  79. delay_ms( 400 );
  80. }
  81. }
  82. void toggle_rdy_led()
  83. {
  84. rdyled( ~led_rdyledstate );
  85. }
  86. void toggle_read_led()
  87. {
  88. readled( ~led_readledstate );
  89. }
  90. void toggle_write_led()
  91. {
  92. writeled( ~led_writeledstate );
  93. }
  94. void led_panic()
  95. {
  96. led_std();
  97. while ( 1 )
  98. {
  99. rdyled( 1 );
  100. readled( 1 );
  101. writeled( 1 );
  102. delay_ms( 100 );
  103. rdyled( 0 );
  104. readled( 0 );
  105. writeled( 0 );
  106. delay_ms( 100 );
  107. cli_entrycheck();
  108. }
  109. }
  110. void led_pwm()
  111. {
  112. /* Rev.C P2.4, P2.5, P1.23 */
  113. BITBAND( LPC_PINCON->PINSEL4, 9 ) = 0;
  114. BITBAND( LPC_PINCON->PINSEL4, 8 ) = 1;
  115. BITBAND( LPC_PINCON->PINSEL4, 11 ) = 0;
  116. BITBAND( LPC_PINCON->PINSEL4, 10 ) = 1;
  117. BITBAND( LPC_PINCON->PINSEL3, 15 ) = 1;
  118. BITBAND( LPC_PINCON->PINSEL3, 14 ) = 0;
  119. BITBAND( LPC_PWM1->PCR, 12 ) = 1;
  120. BITBAND( LPC_PWM1->PCR, 13 ) = 1;
  121. BITBAND( LPC_PWM1->PCR, 14 ) = 1;
  122. led_pwmstate = 1;
  123. }
  124. void led_std()
  125. {
  126. BITBAND( LPC_PINCON->PINSEL4, 9 ) = 0;
  127. BITBAND( LPC_PINCON->PINSEL4, 8 ) = 0;
  128. BITBAND( LPC_PINCON->PINSEL4, 11 ) = 0;
  129. BITBAND( LPC_PINCON->PINSEL4, 10 ) = 0;
  130. BITBAND( LPC_PINCON->PINSEL3, 15 ) = 0;
  131. BITBAND( LPC_PINCON->PINSEL3, 14 ) = 0;
  132. BITBAND( LPC_PWM1->PCR, 12 ) = 0;
  133. BITBAND( LPC_PWM1->PCR, 13 ) = 0;
  134. BITBAND( LPC_PWM1->PCR, 14 ) = 0;
  135. led_pwmstate = 0;
  136. }
  137. void led_init()
  138. {
  139. /* power is already connected by default */
  140. /* set PCLK divider to 8 */
  141. BITBAND( LPC_SC->PCLKSEL0, 13 ) = 1;
  142. BITBAND( LPC_SC->PCLKSEL0, 12 ) = 1;
  143. LPC_PWM1->MR0 = 255;
  144. BITBAND( LPC_PWM1->LER, 0 ) = 1;
  145. BITBAND( LPC_PWM1->TCR, 0 ) = 1;
  146. BITBAND( LPC_PWM1->TCR, 3 ) = 1;
  147. BITBAND( LPC_PWM1->MCR, 1 ) = 1;
  148. }