led.S 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /****************************************************
  2. * LED1 ---- PF6 LED2 ---- PF7 *
  3. * LED3 ---- PF8 LED4 ---- PF9 *
  4. * LED5 ---- PF10 LED6 ---- PF11 *
  5. ****************************************************/
  6. #include <linux/linkage.h>
  7. #include <asm/blackfin.h>
  8. /* All functions in this file save the registers they uses.
  9. So there is no need to save any registers before calling them. */
  10. .text;
  11. /* Initialize LEDs. */
  12. ENTRY(_led_init)
  13. LINK 12;
  14. [--SP] = P0;
  15. [--SP] = R0;
  16. [--SP] = R1;
  17. [--SP] = R2;
  18. R1 = PF6|PF7|PF8|PF9|PF10|PF11 (Z);
  19. R2 = ~R1;
  20. P0.H = hi(PORTF_FER);
  21. P0.L = lo(PORTF_FER);
  22. R0 = W[P0](Z);
  23. SSYNC;
  24. R0 = R0 & R2;
  25. W[P0] = R0.L;
  26. SSYNC;
  27. P0.H = hi(PORTFIO_DIR);
  28. P0.L = lo(PORTFIO_DIR);
  29. R0 = W[P0](Z);
  30. SSYNC;
  31. R0 = R0 | R1;
  32. W[P0] = R0.L;
  33. SSYNC;
  34. P0.H = hi(PORTFIO_INEN);
  35. P0.L = lo(PORTFIO_INEN);
  36. R0 = W[P0](Z);
  37. SSYNC;
  38. R0 = R0 & R2;
  39. W[P0] = R0.L;
  40. SSYNC;
  41. R2 = [SP++];
  42. R1 = [SP++];
  43. R0 = [SP++];
  44. P0 = [SP++];
  45. UNLINK;
  46. RTS;
  47. .size _led_init, .-_led_init
  48. /* Set one LED on. Leave other LEDs unchanged.
  49. It expects the LED number passed through R0. */
  50. ENTRY(_led_on)
  51. LINK 12;
  52. [--SP] = P0;
  53. [--SP] = R1;
  54. CALL _led_init;
  55. R1 = 1;
  56. R0 += 5;
  57. R1 <<= R0;
  58. P0.H = hi(PORTFIO);
  59. P0.L = lo(PORTFIO);
  60. R0 = W[P0](Z);
  61. SSYNC;
  62. R0 = R0 | R1;
  63. W[P0] = R0.L;
  64. SSYNC;
  65. R1 = [SP++];
  66. P0 = [SP++];
  67. UNLINK;
  68. RTS;
  69. .size _led_on, .-_led_on
  70. /* Set one LED off. Leave other LEDs unchanged. */
  71. ENTRY(_led_off)
  72. LINK 12;
  73. [--SP] = P0;
  74. [--SP] = R1;
  75. CALL _led_init;
  76. R1 = 1;
  77. R0 += 5;
  78. R1 <<= R0;
  79. R1 = ~R1;
  80. P0.H = hi(PORTFIO);
  81. P0.L = lo(PORTFIO);
  82. R0 = W[P0](Z);
  83. SSYNC;
  84. R0 = R0 & R1;
  85. W[P0] = R0.L;
  86. SSYNC;
  87. R1 = [SP++];
  88. P0 = [SP++];
  89. UNLINK;
  90. RTS;
  91. .size _led_off, .-_led_off
  92. /* Toggle one LED. Leave other LEDs unchanged. */
  93. ENTRY(_led_toggle)
  94. LINK 12;
  95. [--SP] = P0;
  96. [--SP] = R1;
  97. CALL _led_init;
  98. R1 = 1;
  99. R0 += 5;
  100. R1 <<= R0;
  101. P0.H = hi(PORTFIO);
  102. P0.L = lo(PORTFIO);
  103. R0 = W[P0](Z);
  104. SSYNC;
  105. R0 = R0 ^ R1;
  106. W[P0] = R0.L;
  107. SSYNC;
  108. R1 = [SP++];
  109. P0 = [SP++];
  110. UNLINK;
  111. RTS;
  112. .size _led_toggle, .-_led_toggle
  113. /* Display the number using LEDs in binary format. */
  114. ENTRY(_led_disp_num)
  115. LINK 12;
  116. [--SP] = P0;
  117. [--SP] = R1;
  118. [--SP] = R2;
  119. CALL _led_init;
  120. R1 = 0x3f(X);
  121. R0 = R0 & R1;
  122. R2 = 6(X);
  123. R0 <<= R2;
  124. R1 <<= R2;
  125. P0.H = hi(PORTFIO);
  126. P0.L = lo(PORTFIO);
  127. R2 = W[P0](Z);
  128. SSYNC;
  129. R1 = ~R1;
  130. R2 = R2 & R1;
  131. R2 = R2 | R0;
  132. W[P0] = R2.L;
  133. SSYNC;
  134. R2 = [SP++];
  135. R1 = [SP++];
  136. P0 = [SP++];
  137. UNLINK;
  138. RTS;
  139. .size _led_disp_num, .-_led_disp_num
  140. /* Toggle the number using LEDs in binary format. */
  141. ENTRY(_led_toggle_num)
  142. LINK 12;
  143. [--SP] = P0;
  144. [--SP] = R1;
  145. [--SP] = R2;
  146. CALL _led_init;
  147. R1 = 0x3f(X);
  148. R0 = R0 & R1;
  149. R1 = 6(X);
  150. R0 <<= R1;
  151. P0.H = hi(PORTFIO);
  152. P0.L = lo(PORTFIO);
  153. R1 = W[P0](Z);
  154. SSYNC;
  155. R1 = R1 ^ R0;
  156. W[P0] = R1.L;
  157. SSYNC;
  158. R2 = [SP++];
  159. R1 = [SP++];
  160. P0 = [SP++];
  161. UNLINK;
  162. RTS;
  163. .size _led_toggle_num, .-_led_toggle_num