PlatformIO package of the Teensy core framework compatible with GCC 10 & C++20
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

HW_SAM3X8E.h 5.5KB

3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. // *** Hardwarespecific functions ***
  2. void UTFT::_hw_special_init()
  3. {
  4. }
  5. void UTFT::LCD_Writ_Bus(char VH,char VL, byte mode)
  6. {
  7. switch (mode)
  8. {
  9. case 1:
  10. if (display_serial_mode==SERIAL_4PIN)
  11. {
  12. if (VH==1)
  13. sbi(P_SDA, B_SDA);
  14. else
  15. cbi(P_SDA, B_SDA);
  16. pulse_low(P_SCL, B_SCL);
  17. }
  18. else
  19. {
  20. if (VH==1)
  21. sbi(P_RS, B_RS);
  22. else
  23. cbi(P_RS, B_RS);
  24. }
  25. if (VL & 0x80)
  26. sbi(P_SDA, B_SDA);
  27. else
  28. cbi(P_SDA, B_SDA);
  29. pulse_low(P_SCL, B_SCL);
  30. if (VL & 0x40)
  31. sbi(P_SDA, B_SDA);
  32. else
  33. cbi(P_SDA, B_SDA);
  34. pulse_low(P_SCL, B_SCL);
  35. if (VL & 0x20)
  36. sbi(P_SDA, B_SDA);
  37. else
  38. cbi(P_SDA, B_SDA);
  39. pulse_low(P_SCL, B_SCL);
  40. if (VL & 0x10)
  41. sbi(P_SDA, B_SDA);
  42. else
  43. cbi(P_SDA, B_SDA);
  44. pulse_low(P_SCL, B_SCL);
  45. if (VL & 0x08)
  46. sbi(P_SDA, B_SDA);
  47. else
  48. cbi(P_SDA, B_SDA);
  49. pulse_low(P_SCL, B_SCL);
  50. if (VL & 0x04)
  51. sbi(P_SDA, B_SDA);
  52. else
  53. cbi(P_SDA, B_SDA);
  54. pulse_low(P_SCL, B_SCL);
  55. if (VL & 0x02)
  56. sbi(P_SDA, B_SDA);
  57. else
  58. cbi(P_SDA, B_SDA);
  59. pulse_low(P_SCL, B_SCL);
  60. if (VL & 0x01)
  61. sbi(P_SDA, B_SDA);
  62. else
  63. cbi(P_SDA, B_SDA);
  64. pulse_low(P_SCL, B_SCL);
  65. break;
  66. case 8:
  67. #ifdef CTE_DUE_SHIELD
  68. REG_PIOC_CODR=0xFF000;
  69. REG_PIOC_SODR=(VH<<12) & 0xFF000;
  70. pulse_low(P_WR, B_WR);
  71. REG_PIOC_CODR=0xFF000;
  72. REG_PIOC_SODR=(VL<<12) & 0xFF000;
  73. pulse_low(P_WR, B_WR);
  74. #else
  75. REG_PIOA_CODR=0x0000C000;
  76. REG_PIOD_CODR=0x0000064F;
  77. REG_PIOA_SODR=(VH & 0x06)<<13;
  78. (VH & 0x01) ? REG_PIOB_SODR = 0x4000000 : REG_PIOB_CODR = 0x4000000;
  79. REG_PIOD_SODR=((VH & 0x78)>>3) | ((VH & 0x80)>>1);
  80. pulse_low(P_WR, B_WR);
  81. REG_PIOA_CODR=0x0000C000;
  82. REG_PIOD_CODR=0x0000064F;
  83. REG_PIOA_SODR=(VL & 0x06)<<13;
  84. (VL & 0x01) ? REG_PIOB_SODR = 0x4000000 : REG_PIOB_CODR = 0x4000000;
  85. REG_PIOD_SODR=((VL & 0x78)>>3) | ((VL & 0x80)>>1);
  86. pulse_low(P_WR, B_WR);
  87. #endif
  88. break;
  89. case 16:
  90. #ifdef CTE_DUE_SHIELD
  91. REG_PIOC_CODR=0xFF1FE;
  92. REG_PIOC_SODR=(VL<<1) & 0x1FE;
  93. REG_PIOC_SODR=(VH<<12) & 0xFF000;
  94. #else
  95. REG_PIOA_CODR=0x0000C080;
  96. REG_PIOC_CODR=0x0000003E;
  97. REG_PIOD_CODR=0x0000064F;
  98. REG_PIOA_SODR=((VH & 0x06)<<13) | ((VL & 0x40)<<1);
  99. (VH & 0x01) ? REG_PIOB_SODR = 0x4000000 : REG_PIOB_CODR = 0x4000000;
  100. REG_PIOC_SODR=((VL & 0x01)<<5) | ((VL & 0x02)<<3) | ((VL & 0x04)<<1) | ((VL & 0x08)>>1) | ((VL & 0x10)>>3);
  101. REG_PIOD_SODR=((VH & 0x78)>>3) | ((VH & 0x80)>>1) | ((VL & 0x20)<<5) | ((VL & 0x80)<<2);
  102. #endif
  103. pulse_low(P_WR, B_WR);
  104. break;
  105. case LATCHED_16:
  106. asm("nop"); // Mode is unsupported
  107. break;
  108. }
  109. }
  110. void UTFT::_set_direction_registers(byte mode)
  111. {
  112. if (mode!=LATCHED_16)
  113. {
  114. #ifdef CTE_DUE_SHIELD
  115. if (mode==16)
  116. {
  117. REG_PIOC_OER=0x000FF1FE;
  118. }
  119. else
  120. REG_PIOC_OER=0x000FF000;
  121. #else
  122. REG_PIOA_OER=0x0000c000; //PA14,PA15 enable
  123. REG_PIOB_OER=0x04000000; //PB26 enable
  124. REG_PIOD_OER=0x0000064f; //PD0-3,PD6,PD9-10 enable
  125. if (mode==16)
  126. {
  127. REG_PIOA_OER=0x00000080; //PA7 enable
  128. REG_PIOC_OER=0x0000003e; //PC1 - PC5 enable
  129. }
  130. #endif
  131. }
  132. else
  133. {
  134. asm("nop"); // Mode is unsupported
  135. }
  136. }
  137. void UTFT::_fast_fill_16(int ch, int cl, long pix)
  138. {
  139. long blocks;
  140. #ifdef CTE_DUE_SHIELD
  141. REG_PIOC_CODR=0xFF1FE;
  142. REG_PIOC_SODR=(cl<<1) & 0x1FE;
  143. REG_PIOC_SODR=(ch<<12) & 0xFF000;
  144. #else
  145. REG_PIOA_CODR=0x0000C080;
  146. REG_PIOC_CODR=0x0000003E;
  147. REG_PIOD_CODR=0x0000064F;
  148. REG_PIOA_SODR=((ch & 0x06)<<13) | ((cl & 0x40)<<1);
  149. (ch & 0x01) ? REG_PIOB_SODR = 0x4000000 : REG_PIOB_CODR = 0x4000000;
  150. REG_PIOC_SODR=((cl & 0x01)<<5) | ((cl & 0x02)<<3) | ((cl & 0x04)<<1) | ((cl & 0x08)>>1) | ((cl & 0x10)>>3);
  151. REG_PIOD_SODR=((ch & 0x78)>>3) | ((ch & 0x80)>>1) | ((cl & 0x20)<<5) | ((cl & 0x80)<<2);
  152. #endif
  153. blocks = pix/16;
  154. for (int i=0; i<blocks; i++)
  155. {
  156. pulse_low(P_WR, B_WR);
  157. pulse_low(P_WR, B_WR);
  158. pulse_low(P_WR, B_WR);
  159. pulse_low(P_WR, B_WR);
  160. pulse_low(P_WR, B_WR);
  161. pulse_low(P_WR, B_WR);
  162. pulse_low(P_WR, B_WR);
  163. pulse_low(P_WR, B_WR);
  164. pulse_low(P_WR, B_WR);
  165. pulse_low(P_WR, B_WR);
  166. pulse_low(P_WR, B_WR);
  167. pulse_low(P_WR, B_WR);
  168. pulse_low(P_WR, B_WR);
  169. pulse_low(P_WR, B_WR);
  170. pulse_low(P_WR, B_WR);
  171. pulse_low(P_WR, B_WR);
  172. }
  173. if ((pix % 16) != 0)
  174. for (int i=0; i<(pix % 16)+1; i++)
  175. {
  176. pulse_low(P_WR, B_WR);
  177. }
  178. }
  179. void UTFT::_fast_fill_8(int ch, long pix)
  180. {
  181. long blocks;
  182. #ifdef CTE_DUE_SHIELD
  183. REG_PIOC_CODR=0xFF000;
  184. REG_PIOC_SODR=(ch<<12) & 0xFF000;
  185. #else
  186. REG_PIOA_CODR=0x0000C000;
  187. REG_PIOD_CODR=0x0000064F;
  188. REG_PIOA_SODR=(ch & 0x06)<<13;
  189. (ch & 0x01) ? REG_PIOB_SODR = 0x4000000 : REG_PIOB_CODR = 0x4000000;
  190. REG_PIOD_SODR=((ch & 0x78)>>3) | ((ch & 0x80)>>1);
  191. #endif
  192. blocks = pix/16;
  193. for (int i=0; i<blocks; i++)
  194. {
  195. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  196. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  197. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  198. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  199. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  200. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  201. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  202. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  203. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  204. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  205. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  206. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  207. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  208. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  209. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  210. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  211. }
  212. if ((pix % 16) != 0)
  213. for (int i=0; i<(pix % 16)+1; i++)
  214. {
  215. pulse_low(P_WR, B_WR);pulse_low(P_WR, B_WR);
  216. }
  217. }