Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2016
804
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 31.02 KB | None | 0 0
  1. #include "comm.cpp"
  2.  
  3. #ifndef ft800
  4. #define ft800
  5.  
  6.  
  7. #define LCD_WQVGA
  8. #define FT800_PD_N  GPIO_PIN_3
  9. #define FT800_CS_N  GPIO_PIN_4
  10.  
  11. #define FT_DL_SIZE            (8*1024)  //8KB Display List buffer size
  12. #define FT_CMD_FIFO_SIZE      (4*1024)  //4KB coprocessor Fifo size
  13. #define FT_CMD_SIZE           (4)       //4 byte per coprocessor command of EVE
  14.  
  15. #define FT800_VERSION         "1.9.0"
  16.  
  17. // FT800 Chip Commands - use with cmdWrite
  18. #define FT800_ACTIVE                    0x00            // Initializes FT800
  19. #define FT800_STANDBY                   0x41            // Place FT800 in Standby (clk running)
  20. #define FT800_SLEEP                     0x42            // Place FT800 in Sleep (clk off)
  21. #define FT800_PWRDOWN                   0x50            // Place FT800 in Power Down (core off)
  22. #define FT800_CLKEXT                    0x44            // Select external clock source
  23. #define FT800_CLK48M                    0x62            // Select 48MHz PLL
  24. #define FT800_CLK36M                    0x61            // Select 36MHz PLL
  25. #define FT800_CORERST                   0x68            // Reset core - all registers default
  26.  
  27. // FT800 Memory Commands - use with ft800memWritexx and ft800memReadxx
  28. #define MEM_WRITE                           0x80            // FT800 Host Memory Write
  29. #define MEM_READ                            0x00            // FT800 Host Memory Read
  30.  
  31.  
  32. // Refer to the FT800 Datasheet
  33.  
  34. // FT800 Memory Map Addresses
  35. #define RAM_CMD               0x108000UL
  36. #define RAM_DL                0x100000UL
  37. #define RAM_G                 0x000000UL
  38. #define RAM_PAL               0x102000UL
  39. #define RAM_REG               0x102400UL
  40.  
  41. // FT800 Register Addresses
  42. #define REG_CLOCK             0x102408UL
  43. #define REG_CMD_DL            0x1024ecUL
  44. #define REG_CMD_READ          0x1024e4UL
  45. #define REG_CMD_WRITE         0x1024e8UL
  46. #define REG_CPURESET          0x10241cUL
  47. #define REG_CSPREAD           0x102464UL
  48. #define REG_DITHER            0x10245cUL
  49. #define REG_DLSWAP            0x102450UL
  50. #define REG_FRAMES            0x102404UL
  51. #define REG_FREQUENCY         0x10240cUL
  52. #define REG_GPIO              0x102490UL
  53. #define REG_GPIO_DIR          0x10248cUL
  54. #define REG_HCYCLE            0x102428UL
  55. #define REG_HOFFSET           0x10242cUL
  56. #define REG_HSIZE             0x102430UL
  57. #define REG_HSYNC0            0x102434UL
  58. #define REG_HSYNC1            0x102438UL
  59. #define REG_ID                0x102400UL
  60. #define REG_INT_EN            0x10249cUL
  61. #define REG_INT_FLAGS         0x102498UL
  62. #define REG_INT_MASK          0x1024a0UL
  63. #define REG_MACRO_0           0x1024c8UL
  64. #define REG_MACRO_1           0x1024ccUL
  65. #define REG_OUTBITS           0x102458UL
  66. #define REG_PCLK              0x10246cUL
  67. #define REG_PCLK_POL          0x102468UL
  68. #define REG_PLAY              0x102488UL
  69. #define REG_PLAYBACK_FORMAT   0x1024b4UL
  70. #define REG_PLAYBACK_FREQ     0x1024b0UL
  71. #define REG_PLAYBACK_LENGTH   0x1024a8UL
  72. #define REG_PLAYBACK_LOOP     0x1024b8UL
  73. #define REG_PLAYBACK_PLAY     0x1024bcUL
  74. #define REG_PLAYBACK_READPTR  0x1024acUL
  75. #define REG_PLAYBACK_START    0x1024a4UL
  76. #define REG_PWM_DUTY          0x1024c4UL
  77. #define REG_PWM_HZ            0x1024c0UL
  78. #define REG_RENDERMODE        0x102410UL
  79. #define REG_ROTATE            0x102454UL
  80. #define REG_SNAPSHOT          0x102418UL
  81. #define REG_SNAPY             0x102414UL
  82. #define REG_SOUND             0x102484UL
  83. #define REG_SWIZZLE           0x102460UL
  84. #define REG_TAG               0x102478UL
  85. #define REG_TAG_X             0x102470UL
  86. #define REG_TAG_Y             0x102474UL
  87. #define REG_TAP_CRC           0x102420UL
  88. #define REG_TAP_MASK          0x102424UL
  89. #define REG_TOUCH_ADC_MODE    0x1024f4UL
  90. #define REG_TOUCH_CHARGE      0x1024f8UL
  91. #define REG_TOUCH_DIRECT_XY   0x102574UL
  92. #define REG_TOUCH_DIRECT_Z1Z2 0x102578UL
  93. #define REG_TOUCH_MODE        0x1024f0UL
  94. #define REG_TOUCH_OVERSAMPLE  0x102500UL
  95. #define REG_TOUCH_RAW_XY      0x102508UL
  96. #define REG_TOUCH_RZ          0x10250cUL
  97. #define REG_TOUCH_RZTHRESH    0x102504UL
  98. #define REG_TOUCH_SCREEN_XY   0x102510UL
  99. #define REG_TOUCH_SETTLE      0x1024fcUL
  100. #define REG_TOUCH_TAG         0x102518UL
  101. #define REG_TOUCH_TAG_XY      0x102514UL
  102. #define REG_TOUCH_TRANSFORM_A 0x10251cUL
  103. #define REG_TOUCH_TRANSFORM_B 0x102520UL
  104. #define REG_TOUCH_TRANSFORM_C 0x102524UL
  105. #define REG_TOUCH_TRANSFORM_D 0x102528UL
  106. #define REG_TOUCH_TRANSFORM_E 0x10252cUL
  107. #define REG_TOUCH_TRANSFORM_F 0x102530UL
  108. #define REG_TRACKER           0x109000UL
  109. #define REG_VCYCLE            0x10243cUL
  110. #define REG_VOFFSET           0x102440UL
  111. #define REG_VOL_PB            0x10247cUL
  112. #define REG_VOL_SOUND         0x102480UL
  113. #define REG_VSIZE             0x102444UL
  114. #define REG_VSYNC0            0x102448UL
  115. #define REG_VSYNC1            0x10244cUL
  116.  
  117. // Graphics Engine Commands
  118. // Refer to the FT800 Programmers Guide
  119. #define CMDBUF_SIZE           4096UL
  120. #define CMD_APPEND            0xffffff1eUL
  121. #define CMD_BGCOLOR           0xffffff09UL
  122. #define CMD_BUTTON            0xffffff0dUL
  123. #define CMD_CALIBRATE         0xffffff15UL
  124. #define CMD_CLOCK             0xffffff14UL
  125. #define CMD_COLDSTART         0xffffff32UL
  126. #define CMD_DIAL              0xffffff2dUL
  127. #define CMD_DLSTART           0xffffff00UL
  128. #define CMD_FGCOLOR           0xffffff0aUL
  129. #define CMD_GAUGE             0xffffff13UL
  130. #define CMD_GETMATRIX         0xffffff33UL
  131. #define CMD_GETPTR            0xffffff23UL
  132. #define CMD_GRADCOLOR         0xffffff34UL
  133. #define CMD_GRADIENT          0xffffff0bUL
  134. #define CMD_INFLATE           0xffffff22UL
  135. #define CMD_INTERRUPT         0xffffff02UL
  136. #define CMD_KEYS              0xffffff0eUL
  137. #define CMD_LOADIDENTITY      0xffffff26UL
  138. #define CMD_LOADIMAGE         0xffffff24UL
  139. #define CMD_LOGO              0xffffff31UL
  140. #define CMD_MEMCPY            0xffffff1dUL
  141. #define CMD_MEMCRC            0xffffff18UL
  142. #define CMD_MEMSET            0xffffff1bUL
  143. #define CMD_MEMWRITE          0xffffff1aUL
  144. #define CMD_MEMZERO           0xffffff1cUL
  145. #define CMD_NUMBER            0xffffff2eUL
  146. #define CMD_PROGRESS          0xffffff0fUL
  147. #define CMD_REGREAD           0xffffff19UL
  148. #define CMD_ROTATE            0xffffff29UL
  149. #define CMD_SCALE             0xffffff28UL
  150. #define CMD_SCREENSAVER       0xffffff2fUL
  151. #define CMD_SCROLLBAR         0xffffff11UL
  152. #define CMD_SETFONT           0xffffff2bUL
  153. #define CMD_SETMATRIX         0xffffff2aUL
  154. #define CMD_SKETCH            0xffffff30UL
  155. #define CMD_SLIDER            0xffffff10UL
  156. #define CMD_SNAPSHOT          0xffffff1fUL
  157. #define CMD_SPINNER           0xffffff16UL
  158. #define CMD_STOP              0xffffff17UL
  159. #define CMD_SWAP              0xffffff01UL
  160. #define CMD_TEXT              0xffffff0cUL
  161. #define CMD_TOGGLE            0xffffff12UL
  162. #define CMD_TRACK             0xffffff2cUL
  163. #define CMD_TRANSLATE         0xffffff27UL
  164.  
  165. // Display list commands to be embedded in Graphics Processor
  166. #define DL_ALPHA_FUNC           0x09000000UL // requires OR'd arguments
  167. #define DL_BITMAP_HANDLE        0x05000000UL // requires OR'd arguments
  168. #define DL_BITMAP_LAYOUT        0x07000000UL // requires OR'd arguments
  169. #define DL_BITMAP_SIZE          0x08000000UL // requires OR'd arguments
  170. #define DL_BITMAP_SOURCE        0x01000000UL // requires OR'd arguments
  171. #define DL_BITMAP_TFORM_A       0x15000000UL // requires OR'd arguments
  172. #define DL_BITMAP_TFORM_B       0x16000000UL // requires OR'd arguments
  173. #define DL_BITMAP_TFORM_C       0x17000000UL // requires OR'd arguments
  174. #define DL_BITMAP_TFORM_D       0x18000000UL // requires OR'd arguments
  175. #define DL_BITMAP_TFORM_E       0x19000000UL // requires OR'd arguments
  176. #define DL_BITMAP_TFORM_F       0x1A000000UL // requires OR'd arguments
  177. #define DL_BLEND_FUNC           0x0B000000UL // requires OR'd arguments
  178. #define DL_BEGIN                0x1F000000UL // requires OR'd arguments
  179. #define DL_CALL                 0x1D000000UL // requires OR'd arguments
  180. #define DL_CLEAR                0x26000000UL // requires OR'd arguments
  181. #define DL_CELL                 0x06000000UL // requires OR'd arguments
  182. #define DL_CLEAR_RGB            0x02000000UL // requires OR'd arguments
  183. #define DL_CLEAR_STENCIL        0x11000000UL // requires OR'd arguments
  184. #define DL_CLEAR_TAG            0x12000000UL // requires OR'd arguments
  185. #define DL_COLOR_A              0x0F000000UL // requires OR'd arguments
  186. #define DL_COLOR_MASK           0x20000000UL // requires OR'd arguments
  187. #define DL_COLOR_RGB            0x04000000UL // requires OR'd arguments
  188. #define DL_DISPLAY              0x00000000UL
  189. #define DL_END                  0x21000000UL
  190. #define DL_JUMP                 0x1E000000UL // requires OR'd arguments
  191. #define DL_LINE_WIDTH           0x0E000000UL // requires OR'd arguments
  192. #define DL_MACRO                0x25000000UL // requires OR'd arguments
  193. #define DL_POINT_SIZE           0x0D000000UL // requires OR'd arguments
  194. #define DL_RESTORE_CONTEXT      0x23000000UL
  195. #define DL_RETURN               0x24000000UL
  196. #define DL_SAVE_CONTEXT         0x22000000UL
  197. #define DL_SCISSOR_SIZE         0x1C000000UL // requires OR'd arguments
  198. #define DL_SCISSOR_XY           0x1B000000UL // requires OR'd arguments
  199. #define DL_STENCIL_FUNC         0x0A000000UL // requires OR'd arguments
  200. #define DL_STENCIL_MASK         0x13000000UL // requires OR'd arguments
  201. #define DL_STENCIL_OP           0x0C000000UL // requires OR'd arguments
  202. #define DL_TAG                  0x03000000UL // requires OR'd arguments
  203. #define DL_TAG_MASK             0x14000000UL // requires OR'd arguments
  204. #define DL_VERTEX2F             0x40000000UL // requires OR'd arguments
  205. #define DL_VERTEX2II            0x02000000UL // requires OR'd arguments
  206.  
  207. // Command and register value options
  208. #define CLR_COL               0x4
  209. #define CLR_STN               0x2
  210. #define CLR_TAG               0x1
  211. #define DECR                  4UL
  212. #define DECR_WRAP             7UL
  213. #define DLSWAP_DONE           0UL
  214. #define DLSWAP_FRAME          2UL
  215. #define DLSWAP_LINE           1UL
  216. #define DST_ALPHA             3UL
  217. #define EDGE_STRIP_A          7UL
  218. #define EDGE_STRIP_B          8UL
  219. #define EDGE_STRIP_L          6UL
  220. #define EDGE_STRIP_R          5UL
  221. #define EQUAL                 5UL
  222. #define GEQUAL                4UL
  223. #define GREATER               3UL
  224. #define INCR                  3UL
  225. #define INCR_WRAP             6UL
  226. #define INT_CMDEMPTY          32UL
  227. #define INT_CMDFLAG           64UL
  228. #define INT_CONVCOMPLETE      128UL
  229. #define INT_PLAYBACK          16UL
  230. #define INT_SOUND             8UL
  231. #define INT_SWAP              1UL
  232. #define INT_TAG               4UL
  233. #define INT_TOUCH             2UL
  234. #define INVERT                5UL
  235. #define KEEP                  1UL
  236. #define L1                    1UL
  237. #define L4                    2UL
  238. #define L8                    3UL
  239. #define LEQUAL                2UL
  240. #define LESS                  1UL
  241. #define LINEAR_SAMPLES        0UL
  242. #define LINES                 3UL
  243. #define LINE_STRIP            4UL
  244. #define NEAREST               0UL
  245. #define NEVER                 0UL
  246. #define NOTEQUAL              6UL
  247. #define ONE                   1UL
  248. #define ONE_MINUS_DST_ALPHA   5UL
  249. #define ONE_MINUS_SRC_ALPHA   4UL
  250. #define OPT_CENTER            1536UL    // 0x6000
  251. #define OPT_CENTERX           512UL     // 0x0200
  252. #define OPT_CENTERY           1024UL    // 0x0400
  253. #define OPT_FLAT              256UL     // 0x0100
  254. #define OPT_MONO              1UL
  255. #define OPT_NOBACK            4096UL    // 0x1000
  256. #define OPT_NODL              2UL
  257. #define OPT_NOHANDS           49152UL   // 0xC168
  258. #define OPT_NOHM              16384UL   // 0x4000
  259. #define OPT_NOPOINTER         16384UL   // 0x4000
  260. #define OPT_NOSECS            32768UL   // 0x8000
  261. #define OPT_NOTICKS           8192UL    // 0x2000
  262. #define OPT_RIGHTX            2048UL    // 0x0800
  263. #define OPT_SIGNED            256UL     // 0x0100
  264. #define PALETTED              8UL
  265. #define PLAYCOLOR             0x00a0a080
  266. #define FTPOINTS              2UL       // "POINTS" is a reserved word
  267. #define RECTS                 9UL
  268. #define REPEAT                1UL
  269. #define REPLACE               2UL
  270. #define RGB332                4UL
  271. #define RGB565                7UL
  272. #define SRC_ALPHA             2UL
  273. #define TEXT8X8               9UL
  274. #define TEXTVGA               10UL
  275. #define TOUCHMODE_CONTINUOUS  3UL
  276. #define TOUCHMODE_FRAME       2UL
  277. #define TOUCHMODE_OFF         0UL
  278. #define TOUCHMODE_ONESHOT     1UL
  279. #define ULAW_SAMPLES          1UL
  280. #define ZERO                  0UL
  281.  
  282.  
  283.  
  284. typedef struct button {
  285.     int address;
  286.     char id;
  287.     int X, Y, W, H;
  288. } button;
  289.  
  290. class ft800
  291. {
  292. public:
  293.  
  294.     unsigned int ft800irqPin;   // Interrupt from FT800 to Arduino - not used here
  295.     unsigned int ft800pwrPin;// PD_N from Arduino to FT800 - effectively FT800 reset
  296.     unsigned int ft800csPin;// SPI chip select - defined separately since it's manipulated with GPIO calls
  297.  
  298. // AN_312 LCD display parameters
  299.     unsigned int lcdWidth;                          // Active width of LCD display
  300.     unsigned int lcdHeight;                         // Active height of LCD display
  301.     unsigned int lcdHcycle;                     // Total number of clocks per line
  302.     unsigned int lcdHoffset;                                // Start of active line
  303.     unsigned int lcdHsync0;                     // Start of horizontal sync pulse
  304.     unsigned int lcdHsync1;                         // End of horizontal sync pulse
  305.     unsigned int lcdVcycle;                     // Total number of lines per screen
  306.     unsigned int lcdVoffset;                            // Start of active screen
  307.     unsigned int lcdVsync0;                         // Start of vertical sync pulse
  308.     unsigned int lcdVsync1;                         // End of vertical sync pulse
  309.     unsigned char lcdPclk;                                          // Pixel Clock
  310.     unsigned char lcdSwizzle;                           // Define RGB output pins
  311.     unsigned char lcdPclkpol;                       // Define active edge of PCLK
  312.  
  313.  
  314.  
  315.     unsigned long color;                            // Variable for chanign colors
  316.     unsigned char ft800Gpio;                        // Used for FT800 GPIO register
  317.  
  318.  
  319.  
  320.  
  321.  
  322.     button buttons[20];
  323.     int buttonPointer;
  324.     button* lastButton;
  325.  
  326.  
  327.     //ft800();
  328.     unsigned int incCMDOffset(unsigned int, unsigned char);
  329.     int X(double);
  330.     int Y(double);
  331.     void ft800_clear();
  332.  
  333.     void ft800_button_clear();
  334.  
  335.     char ft800_checkTouch();
  336.  
  337.     char ft800_currentTouch();
  338.  
  339.     void ft800_font(int, int, int);
  340.  
  341.     void ft800_dualCommand(int, int, int);
  342.  
  343.     void ft800_rectangle(int*, uint16_t, uint16_t, uint16_t, uint16_t);
  344.  
  345.     void ft800_rectangle_fill(int*, uint16_t, uint16_t, uint16_t, uint16_t);
  346.  
  347. // TEXT TOOLS
  348.     void ft800_text(int*, int, int, char*, int);
  349.  
  350.     void ft800_text_center(int*, int, int, char*, int);
  351.  
  352.  
  353.  
  354.  
  355.  
  356. //TEXT TOOLS END
  357.  
  358.     void ft800_keypad(int*, int, int, int, int);
  359.  
  360.     void ft800_button(int*, int, int, int, int, char*,int);
  361. ///////////////////////////////////// END BUTTONS //////////////////////////////
  362.  
  363.     void ft800_prepareCanvas(int*);
  364.  
  365.     void ft800_finishCanvas(int*);
  366.  
  367.     void ft800_refresh(int);
  368.  
  369.     void ft800_init();
  370.  
  371. };
  372.  
  373.  
  374.  
  375.  
  376. unsigned int ft800::incCMDOffset(unsigned int currentOffset, unsigned char commandSize)
  377. {
  378.     unsigned int newOffset;                         // Used to hold new offset
  379.     newOffset = currentOffset + commandSize;            // Calculate new offset
  380.     if (newOffset > 4095) {                 // If new offset past boundary...
  381.         newOffset = (newOffset - 4096);                 // ... roll over pointer
  382.     }
  383.     return newOffset;                                       // Return new offset
  384. };
  385.  
  386. int ft800::X(double fl)
  387. {
  388.     return fl*480;
  389. };
  390.  
  391. int ft800::Y(double fl)
  392. {
  393.     return fl*272;
  394. };
  395.  
  396. void ft800::ft800_clear()
  397. {
  398.  
  399.     for (int a = 0; a < 4096; a += 4) {
  400.         comm::ft800memWrite32(RAM_CMD + a, 0);
  401.     }
  402. };
  403.  
  404. void ft800::ft800_button_clear()
  405. {
  406.     lastButton = 0;
  407.     buttonPointer = 0;
  408.  
  409. };
  410.  
  411. char ft800::ft800_checkTouch()
  412. {
  413.     unsigned int X, Y;
  414.     unsigned int u = comm::ft800memRead32(REG_TOUCH_SCREEN_XY);
  415.     Y = u & 0xFFFF;
  416.     X = u >> 16;
  417.     if (lastButton != 0) {
  418.         comm::ft800memWrite16(RAM_CMD + lastButton->address + 14, 0);
  419.  
  420.     }
  421.  
  422.     if (X == 0x8000) {
  423.         if (lastButton != 0) {
  424.             char c = lastButton->id;
  425.             lastButton = 0;
  426.             return c;
  427.         }
  428.     }
  429.  
  430.     for (int i = 0; i < buttonPointer; i++) {
  431.         if (buttons[i].X < X && (buttons[i].X + buttons[i].W) > X
  432.                 && buttons[i].Y < Y && (buttons[i].Y + buttons[i].H) > Y) {
  433.             comm::ft800memWrite16(RAM_CMD + buttons[i].address + 14, OPT_FLAT);
  434.             lastButton = &buttons[i];
  435.             return 0;
  436.  
  437.         }
  438.  
  439.     }
  440.     lastButton = 0;
  441.     return 0;
  442.  
  443. };
  444.  
  445. char ft800::ft800_currentTouch()
  446. {
  447.     if (lastButton == 0)
  448.         return 0;
  449.     return lastButton->id;
  450. };
  451.  
  452. void ft800::ft800_font(int cmdOffset, int font, int type)
  453. {
  454.     switch (type) {
  455.         case CMD_BUTTON:
  456.             comm::ft800memWrite16(RAM_CMD + cmdOffset + 12, font);
  457.             break;
  458.         case CMD_TEXT:
  459.             comm::ft800memWrite16(RAM_CMD + cmdOffset + 8, font);
  460.             break;
  461.     }
  462.  
  463. };
  464.  
  465. void ft800::ft800_dualCommand(int *address, int first, int second)
  466. {
  467.     int cmdOffset = (*address);
  468.  
  469.     comm::ft800memWrite32(RAM_CMD + cmdOffset, first);    // End the point
  470.     comm::ft800memWrite32(RAM_CMD + cmdOffset + 4, second);   // End the point
  471.     cmdOffset = incCMDOffset(cmdOffset, 8);
  472.  
  473.     (*address) = cmdOffset;
  474. };
  475.  
  476. void ft800::ft800_rectangle(int* address, uint16_t X, uint16_t Y, uint16_t W,
  477.                             uint16_t H)
  478. {
  479.  
  480.     int cmdOffset = (*address);
  481.  
  482.     comm::ft800memWrite32(RAM_CMD + cmdOffset, (DL_BEGIN | LINE_STRIP));
  483.  
  484.     comm::ft800memWrite32(RAM_CMD + cmdOffset + 4,
  485.                           (DL_VERTEX2F | (X * 16 << 15) | Y * 16UL));
  486.     comm::ft800memWrite32(RAM_CMD + cmdOffset + 8,
  487.                           (DL_VERTEX2F | (X * 16 + W * 16 << 15) | Y * 16UL));
  488.     comm::ft800memWrite32(RAM_CMD + cmdOffset + 12,
  489.                           (DL_VERTEX2F | (X * 16 + W * 16 << 15) | H * 16 + Y * 16UL));
  490.     comm::ft800memWrite32(RAM_CMD + cmdOffset + 16,
  491.                           (DL_VERTEX2F | (X * 16 << 15) | H * 16 + Y * 16UL));
  492.     comm::ft800memWrite32(RAM_CMD + cmdOffset + 20,
  493.                           (DL_VERTEX2F | (X * 16 << 15) | Y * 16UL));
  494.  
  495.     comm::ft800memWrite32(RAM_CMD + cmdOffset + 24, (DL_END));
  496.  
  497.     (*address) = cmdOffset + 28;
  498.  
  499. };
  500.  
  501. void ft800::ft800_rectangle_fill(int* address, uint16_t X, uint16_t Y, uint16_t W,
  502.                                  uint16_t H)
  503. {
  504.  
  505.     int cmdOffset = (*address);
  506.  
  507.     comm::ft800memWrite32(RAM_CMD + cmdOffset, (DL_BEGIN | RECTS));
  508.  
  509.     comm::ft800memWrite32(RAM_CMD + cmdOffset + 4,
  510.                           (DL_VERTEX2F | (X * 16 << 15) | Y * 16UL));
  511.  
  512.     comm::ft800memWrite32(RAM_CMD + cmdOffset + 8,
  513.                           (DL_VERTEX2F | (X * 16 + W * 16 << 15) | H * 16 + Y * 16UL));
  514.  
  515.     comm::ft800memWrite32(RAM_CMD + cmdOffset + 12, (DL_END));
  516.  
  517.     (*address) = cmdOffset + 16;
  518.  
  519. };
  520.  
  521.  
  522. void ft800::ft800_text(int* address, int X, int Y, char* str, int maxsize)
  523. {
  524.     int size = strlen(str);
  525.     int cmdOffset = (*address);
  526.  
  527.     comm::ft800memWrite32(RAM_CMD + cmdOffset, (CMD_TEXT));
  528.     comm::ft800memWrite16(RAM_CMD + cmdOffset + 4, X);
  529.     comm::ft800memWrite16(RAM_CMD + cmdOffset + 6, Y);
  530.     comm::ft800memWrite16(RAM_CMD + cmdOffset + 8, 31);
  531.     comm::ft800memWrite16(RAM_CMD + cmdOffset + 10, 0);
  532.  
  533.     maxsize = ft800_text_change(cmdOffset, str, CMD_TEXT, maxsize);
  534.     (*address) = incCMDOffset(cmdOffset, 12 + maxsize);
  535. };
  536.  
  537. void ft800::ft800_text_center(int* address, int X, int Y, char* str, int maxsize)
  538. {
  539.     int cmdOffset = (*address);
  540.     ft800_text(address, X, Y, str, maxsize);
  541.     comm::ft800memWrite16(RAM_CMD + cmdOffset + 10, OPT_CENTER);
  542. };
  543.  
  544. int ft800::ft800_text_change(int cmdOffset, char* str, int type, int maxsize)
  545. {
  546.     maxsize *= 4;
  547.     int size = strlen(str);
  548.     int flag = 0;
  549.     if (maxsize == 0) {
  550.         flag = 1;
  551.     };
  552.  
  553.     maxsize = (maxsize > size ? maxsize : (size / 4 + 1) * 4);
  554.  
  555.     int i;
  556.     for (i = 0; i < maxsize; i++) {
  557.         switch (type) {
  558.             case CMD_BUTTON:
  559.                 ft800memWrite8(RAM_CMD + cmdOffset + 16 + i,
  560.                                (i < size ? str[i] : ' '));
  561.                 break;
  562.             case CMD_TEXT:
  563.                 ft800memWrite8(RAM_CMD + cmdOffset + 12 + i,
  564.                                (i < size ? str[i] : ' '));
  565.                 break;
  566.         }
  567.  
  568.     }
  569.  
  570.     switch (type) {
  571.         case CMD_BUTTON:
  572.             if (flag)
  573.                 ft800memWrite8(RAM_CMD + cmdOffset + 16 + size, 0);
  574.             else
  575.                 ft800memWrite8(RAM_CMD + cmdOffset + 16 + i - 1, 0);
  576.             break;
  577.         case CMD_TEXT:
  578.             if (flag)
  579.                 ft800memWrite8(RAM_CMD + cmdOffset + 12 + size, 0);
  580.             else
  581.                 ft800memWrite8(RAM_CMD + cmdOffset + 12 + i - 1, 0);
  582.             break;
  583.     }
  584.  
  585.     return i;
  586.  
  587. };
  588.  
  589.  
  590. void ft800::ft800_keypad(int* address, int X, int Y, int W, int H)
  591. {
  592.  
  593.     ft800_button(address, X, Y, W / 3, H / 4, "1", 0);
  594.     ft800_button(address, X + W / 3, Y, W / 3, H / 4, "2", 0);
  595.     ft800_button(address, X + W * 2 / 3, Y, W / 3, H / 4, "3", 0);
  596.  
  597.     ft800_button(address, X, Y + H / 4, W / 3, H / 4, "4", 0);
  598.     ft800_button(address, X + W / 3, Y + H / 4, W / 3, H / 4, "5", 0);
  599.     ft800_button(address, X + W * 2 / 3, Y + H / 4, W / 3, H / 4, "6", 0);
  600.  
  601.     ft800_button(address, X, Y + H * 2 / 4, W / 3, H / 4, "7", 0);
  602.     ft800_button(address, X + W / 3, Y + H * 2 / 4, W / 3, H / 4, "8", 0);
  603.     ft800_button(address, X + W * 2 / 3, Y + H * 2 / 4, W / 3, H / 4, "9", 0);
  604.  
  605.     ft800_button(address, X, Y + H * 3 / 4, W / 3, H / 4, "X", 0);
  606.     ft800_button(address, X + W / 3, Y + H * 3 / 4, W / 3, H / 4, "0", 0);
  607.     ft800_button(address, X + W * 2 / 3, Y + H * 3 / 4, W / 3, H / 4, "K", 0);
  608.  
  609. };
  610.  
  611.  
  612.  
  613. void ft800::ft800_button(int* address, int X, int Y, int W, int H, char* str,
  614.                          int maxsize)
  615. {
  616.  
  617.     int size = strlen(str);
  618.     int padde = (size / 4 + 1) * 4;
  619.     int cmdOffset = (*address);
  620.  
  621.     comm::ft800memWrite32(RAM_CMD + cmdOffset, (CMD_BUTTON));
  622.     comm::ft800memWrite16(RAM_CMD + cmdOffset + 4, X);
  623.     comm::ft800memWrite16(RAM_CMD + cmdOffset + 6, Y);
  624.     comm::ft800memWrite16(RAM_CMD + cmdOffset + 8, W);
  625.     comm::ft800memWrite16(RAM_CMD + cmdOffset + 10, H);
  626.     comm::ft800memWrite16(RAM_CMD + cmdOffset + 12, 31);
  627.     comm::ft800memWrite16(RAM_CMD + cmdOffset + 14, 0);
  628.  
  629.     maxsize = ft800_text_change(cmdOffset, str, CMD_BUTTON, maxsize);
  630.  
  631.     (*address) = incCMDOffset(cmdOffset, 16 + maxsize);
  632.  
  633.     button b;
  634.     b.X = X;
  635.     b.Y = Y;
  636.     b.W = W;
  637.     b.H = H;
  638.     b.id = str[0];
  639.     b.address = cmdOffset;
  640.     buttons[buttonPointer++] = b;
  641.  
  642. };
  643.  
  644. void ft800::ft800_prepareCanvas(int* address)
  645. {
  646.     int cmdOffset = (*address);
  647.     comm::ft800memWrite32(RAM_CMD + cmdOffset, (CMD_DLSTART));// Start the display list
  648.     cmdOffset = incCMDOffset(cmdOffset, 4);
  649.  
  650.     comm::ft800memWrite32(RAM_CMD + cmdOffset, (DL_CLEAR_RGB | 0x00ffffff));
  651.     // Set the default clear color to black
  652.     cmdOffset = incCMDOffset(cmdOffset, 4);     // Update the command pointer
  653.  
  654.     comm::ft800memWrite32(RAM_CMD + cmdOffset,
  655.                           (DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG));
  656.     // Clear the screen - this and the previous prevent artifacts between lists
  657.     // Attributes are the color, stencil and tag buffers
  658.     cmdOffset = incCMDOffset(cmdOffset, 4);     // Update the command pointer
  659.  
  660.     comm::ft800memWrite32(RAM_CMD + cmdOffset, (DL_COLOR_RGB | 0));
  661.     // Set the color of the following item(s) - toggle red/white from above
  662.     cmdOffset = incCMDOffset(cmdOffset, 4);     // Update the command pointer
  663.     //272
  664.     (*address) = cmdOffset;
  665.  
  666. };
  667.  
  668.  
  669. void ft800::ft800_finishCanvas(int* address)
  670. {
  671.     int cmdOffset = (*address);
  672.     comm::ft800memWrite32(RAM_CMD + cmdOffset, (DL_DISPLAY)); // Instruct the graphics processor to show the list
  673.     cmdOffset = incCMDOffset(cmdOffset, 4);     // Update the command pointer
  674.  
  675.     comm::ft800memWrite32(RAM_CMD + cmdOffset, (CMD_SWAP));   // Make this list active
  676.     cmdOffset = incCMDOffset(cmdOffset, 4);     // Update the command pointer
  677.  
  678.     (*address) = cmdOffset;
  679.  
  680. };
  681.  
  682.  
  683. void ft800::ft800_refresh(int address)
  684. {
  685.  
  686.     comm::ft800memWrite16(REG_CMD_READ, 0);
  687.     comm::ft800memWrite16(REG_CMD_WRITE, 0);
  688.     comm::ft800memWrite16(REG_CMD_WRITE, (address));
  689.  
  690. };
  691.  
  692. void ft800::ft800_init()
  693. {
  694.     DigitalOut dout(SPI_CS);
  695.  
  696.     HAL_GPIO_WritePin(GPIOB, FT800_PD_N, GPIO_PIN_SET); // Initial state of PD_N - high
  697.     dout=1;
  698.     HAL_Delay(20);                                                  // Wait 20ms
  699.     HAL_GPIO_WritePin(GPIOB, FT800_PD_N, GPIO_PIN_RESET); // Reset FT800
  700.     HAL_Delay(20);                                                  // Wait 20ms
  701.     HAL_GPIO_WritePin(GPIOB, FT800_PD_N, GPIO_PIN_SET);     // FT800 is awake
  702.     HAL_Delay(20);                                      // Wait 20ms - required
  703.  
  704.     comm::ft800cmdWrite(FT800_ACTIVE);                                // Start FT800
  705.     HAL_Delay(5);                                   // Give some time to process
  706.     comm::ft800cmdWrite(FT800_CLKEXT);                // Set FT800 for external clock
  707.     HAL_Delay(5);                                   // Give some time to process
  708.     comm::ft800cmdWrite(FT800_CLK48M);                    // Set FT800 for 48MHz PLL
  709.     HAL_Delay(100);
  710.  
  711.     int z = 10;
  712.     while (z-- > 0) {
  713.         dout=0;
  714.         HAL_Delay(100);
  715.         dout=1;
  716.         HAL_Delay(100);
  717.     }
  718.  
  719.     while (comm::ft800memRead8(REG_ID) != 0x7C) { // Read ID register - is it 0x7C?
  720.  
  721.     }
  722.  
  723. #ifdef LCD_QVGA                                                                                 // QVGA display parameters
  724.     this->lcdWidth = 320;                             // Active width of LCD display
  725.     this->lcdHeight = 240;// Active height of LCD display
  726.     this->lcdHcycle = 408;// Total number of clocks per line
  727.     this->lcdHoffset = 70;// Start of active line
  728.     this->lcdHsync0 = 0;  // Start of horizontal sync pulse
  729.     this->lcdHsync1 = 10; // End of horizontal sync pulse
  730.     this->lcdVcycle = 263;// Total number of lines per screen
  731.     this->lcdVoffset = 13;// Start of active screen
  732.     this->lcdVsync0 = 0;  // Start of vertical sync pulse
  733.     this->lcdVsync1 = 2;  // End of vertical sync pulse
  734.     this->lcdPclk = 8;    // Pixel Clock
  735.     this->lcdSwizzle = 2; // Define RGB output pins
  736.     this->lcdPclkpol = 0; // Define active edge of PCLK
  737. #endif
  738.  
  739. #ifdef LCD_WQVGA                                                                                // WQVGA display parameters
  740.     this->lcdWidth = 480;                             // Active width of LCD display
  741.     this->lcdHeight = 272;                            // Active height of LCD display
  742.     this->lcdHcycle = 548;                        // Total number of clocks per line
  743.     this->lcdHoffset = 43;                                // Start of active line
  744.     this->lcdHsync0 = 0;                          // Start of horizontal sync pulse
  745.     this->lcdHsync1 = 41;                             // End of horizontal sync pulse
  746.     this->lcdVcycle = 292;                        // Total number of lines per screen
  747.     this->lcdVoffset = 12;                                // Start of active screen
  748.     this->lcdVsync0 = 0;                              // Start of vertical sync pulse
  749.     this->lcdVsync1 = 10;                             // End of vertical sync pulse
  750.     this->lcdPclk = 5;                                // Pixel Clock
  751.     this->lcdSwizzle = 0;                             // Define RGB output pins
  752.     this->lcdPclkpol = 1;                             // Define active edge of PCLK
  753. #endif
  754.  
  755.     comm::ft800memWrite8(REG_PCLK, ZERO); // Set PCLK to zero - don't clock the LCD until later
  756.     comm::ft800memWrite8(REG_PWM_DUTY, ZERO);                 // Turn off backlight
  757.  
  758.     // End of Wake-up FT800
  759.  
  760.  
  761.     // Initialize Display
  762.     comm::ft800memWrite16(REG_HSIZE, lcdWidth);               // active display width
  763.     comm::ft800memWrite16(REG_HCYCLE, lcdHcycle); // total number of clocks per line, incl front/back porch
  764.     comm::ft800memWrite16(REG_HOFFSET, lcdHoffset);           // start of active line
  765.     comm::ft800memWrite16(REG_HSYNC0, lcdHsync0); // start of horizontal sync pulse
  766.     comm::ft800memWrite16(REG_HSYNC1, lcdHsync1);     // end of horizontal sync pulse
  767.     comm::ft800memWrite16(REG_VSIZE, lcdHeight);              // active display height
  768.     comm::ft800memWrite16(REG_VCYCLE, lcdVcycle); // total number of lines per screen, incl pre/post
  769.     comm::ft800memWrite16(REG_VOFFSET, lcdVoffset);       // start of active screen
  770.     comm::ft800memWrite16(REG_VSYNC0, lcdVsync0);     // start of vertical sync pulse
  771.     comm::ft800memWrite16(REG_VSYNC1, lcdVsync1);     // end of vertical sync pulse
  772.     comm::ft800memWrite8(REG_SWIZZLE, lcdSwizzle);// FT800 output to LCD - pin order
  773.     comm::ft800memWrite8(REG_PCLK_POL, lcdPclkpol);// LCD data is clocked in on this PCLK edge
  774.  
  775.     //ft800memWrite8(REG_TOUCH_MODE, ZERO);                                 // Disable touch
  776.     //ft800memWrite16(REG_TOUCH_RZTHRESH, ZERO);                        // Eliminate any false touches
  777.  
  778.     comm::ft800memWrite8(REG_VOL_PB, ZERO);       // turn recorded audio volume down
  779.     comm::ft800memWrite8(REG_VOL_SOUND, ZERO);        // turn synthesizer volume down
  780.     comm::ft800memWrite16(REG_SOUND, 0x6000);             // set synthesizer to mute
  781.  
  782.  
  783.  
  784.     int ramDisplayList = RAM_DL;                            // start of Display List
  785.     comm::ft800memWrite32(ramDisplayList, DL_CLEAR_RGB); // Clear Color RGB   00000010 RRRRRRRR GGGGGGGG BBBBBBBB  (R/G/B = Colour values) default zero / black
  786.     ramDisplayList += 4;                            // point to next location
  787.     comm::ft800memWrite32(ramDisplayList, (DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG));
  788.     // Clear 00100110 -------- -------- -----CST  (C/S/T define which parameters to clear)
  789.     ramDisplayList += 4;                            // point to next location
  790.     comm::ft800memWrite32(ramDisplayList, DL_DISPLAY);// DISPLAY command 00000000 00000000 00000000 00000000 (end of display list)
  791.  
  792.     comm::ft800memWrite32(REG_DLSWAP, DLSWAP_FRAME);// 00000000 00000000 00000000 000000SS  (SS bits define when render occurs)
  793.     // Nothing is being displayed yet... the pixel clock is still 0x00
  794.     ramDisplayList = RAM_DL;        // Reset Display List pointer for next list
  795.  
  796.     ft800Gpio = comm::ft800memRead8(REG_GPIO);// Read the FT800 GPIO register for a read/modify/write operation
  797.     ft800Gpio = ft800Gpio | 0x80;// set bit 7 of FT800 GPIO register (DISP) - others are inputs
  798.     comm::ft800memWrite8(REG_GPIO, ft800Gpio);// Enable the DISP signal to the LCD panel
  799.     comm::ft800memWrite8(REG_PCLK, lcdPclk);// Now start clocking data to the LCD panel
  800.     for (int duty = 0; duty <= 128; duty++) {
  801.         comm::ft800memWrite8(REG_PWM_DUTY, duty); // Turn on backlight - ramp up slowly to full brighness
  802.         HAL_Delay(10);
  803.     }
  804.  
  805. };
  806.  
  807. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement