1 /* 2 * Copyright (c) 2020 Hubert Miś 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 /** 8 * @file 9 * @brief FT8XX display list commands 10 */ 11 12 #ifndef ZEPHYR_DRIVERS_MISC_FT8XX_FT8XX_DL_H_ 13 #define ZEPHYR_DRIVERS_MISC_FT8XX_FT8XX_DL_H_ 14 15 #include <stdint.h> 16 17 #ifdef __cplusplus 18 extern "C" { 19 #endif 20 21 /** 22 * @brief FT8xx display list commands 23 * @defgroup ft8xx_dl FT8xx display list 24 * @ingroup ft8xx_interface 25 * @{ 26 */ 27 28 /** Rectangular pixel arrays, in various color formats */ 29 #define FT8XX_BITMAPS 1U 30 /** Anti-aliased points, point radius is 1-256 pixels */ 31 #define FT8XX_POINTS 2U 32 /** 33 * Anti-aliased lines, with width from 0 to 4095 1/16th of pixel units. 34 * (width is from center of the line to boundary) 35 */ 36 #define FT8XX_LINES 3U 37 /** Anti-aliased lines, connected head-to-tail */ 38 #define FT8XX_LINE_STRIP 4U 39 /** Edge strips for right */ 40 #define FT8XX_EDGE_STRIP_R 5U 41 /** Edge strips for left */ 42 #define FT8XX_EDGE_STRIP_L 6U 43 /** Edge strips for above */ 44 #define FT8XX_EDGE_STRIP_A 7U 45 /** Edge strips for below */ 46 #define FT8XX_EDGE_STRIP_B 8U 47 /** 48 * Round-cornered rectangles, curvature of the corners can be adjusted using 49 * FT8XX_LINE_WIDTH 50 */ 51 #define FT8XX_RECTS 9U 52 53 /** 54 * @brief Begin drawing a graphics primitive 55 * 56 * The valid primitives are defined as: 57 * - @ref FT8XX_BITMAPS 58 * - @ref FT8XX_POINTS 59 * - @ref FT8XX_LINES 60 * - @ref FT8XX_LINE_STRIP 61 * - @ref FT8XX_EDGE_STRIP_R 62 * - @ref FT8XX_EDGE_STRIP_L 63 * - @ref FT8XX_EDGE_STRIP_A 64 * - @ref FT8XX_EDGE_STRIP_B 65 * - @ref FT8XX_RECTS 66 * 67 * The primitive to be drawn is selected by the @ref FT8XX_BEGIN command. Once 68 * the primitive is selected, it will be valid till the new primitive is 69 * selected by the @ref FT8XX_BEGIN command. 70 * 71 * @note The primitive drawing operation will not be performed until 72 * @ref FT8XX_VERTEX2II or @ref FT8XX_VERTEX2F is executed. 73 * 74 * @param prim Graphics primitive 75 */ 76 #define FT8XX_BEGIN(prim) (0x1f000000 | ((prim) & 0x0f)) 77 78 /** 79 * @brief Clear buffers to preset values 80 * 81 * Setting @p c to true will clear the color buffer of the FT8xx to the preset 82 * value. Setting this bit to false will maintain the color buffer of the FT8xx 83 * with an unchanged value. The preset value is defined in command 84 * @ref FT8XX_CLEAR_COLOR_RGB for RGB channel and FT8XX_CLEAR_COLOR_A for alpha 85 * channel. 86 * 87 * Setting @p s to true will clear the stencil buffer of the FT8xx to the preset 88 * value. Setting this bit to false will maintain the stencil buffer of the 89 * FT8xx with an unchanged value. The preset value is defined in command 90 * FT8XX_CLEAR_STENCIL. 91 * 92 * Setting @p t to true will clear the tag buffer of the FT8xx to the preset 93 * value. Setting this bit to false will maintain the tag buffer of the FT8xx 94 * with an unchanged value. The preset value is defined in command 95 * FT8XX_CLEAR_TAG. 96 * 97 * @param c Clear color buffer 98 * @param s Clear stencil buffer 99 * @param t Clear tag buffer 100 */ 101 #define FT8XX_CLEAR(c, s, t) (0x26000000 | \ 102 ((c) ? 0x04 : 0) | ((s) ? 0x02 : 0) | ((t) ? 0x01 : 0)) 103 104 /** 105 * @brief Specify clear values for red, green and blue channels 106 * 107 * Sets the color values used by a following @ref FT8XX_CLEAR. 108 * 109 * @param red Red value used when the color buffer is cleared 110 * @param green Green value used when the color buffer is cleared 111 * @param blue Blue value used when the color buffer is cleared 112 */ 113 #define FT8XX_CLEAR_COLOR_RGB(red, green, blue) (0x02000000 | \ 114 (((uint32_t)(red) & 0xff) << 16) | \ 115 (((uint32_t)(green) & 0xff) << 8) | \ 116 ((uint32_t)(blue) & 0xff)) 117 118 /** 119 * @brief Set the current color red, green and blue 120 * 121 * Sets red, green and blue values of the FT8xx color buffer which will be 122 * applied to the following draw operation. 123 * 124 * @param red Red value for the current color 125 * @param green Green value for the current color 126 * @param blue Blue value for the current color 127 */ 128 #define FT8XX_COLOR_RGB(red, green, blue) (0x04000000 | \ 129 (((uint32_t)(red) & 0xff) << 16) | \ 130 (((uint32_t)(green) & 0xff) << 8) | \ 131 ((uint32_t)(blue) & 0xff)) 132 133 /** 134 * @brief End the display list 135 * 136 * FT8xx will ignore all the commands following this command. 137 */ 138 #define FT8XX_DISPLAY() 0 139 140 /** 141 * @brief End drawing a graphics primitive 142 * 143 * It is recommended to have an @ref FT8XX_END for each @ref FT8XX_BEGIN. 144 * Whereas advanced users can avoid the usage of @ref FT8XX_END in order to 145 * save extra graphics instructions in the display list RAM. 146 */ 147 #define FT8XX_END() 0x21000000 148 149 /** 150 * @brief Specify the width of lines to be drawn with primitive @ref FT8XX_LINES 151 * 152 * Sets the width of drawn lines. The width is the distance from the center of 153 * the line to the outermost drawn pixel, in units of 1/16 pixel. The valid 154 * range is from 16 to 4095 in terms of 1/16th pixel units. 155 * 156 * @note The @ref FT8XX_LINE_WIDTH command will affect the @ref FT8XX_LINES, 157 * @ref FT8XX_LINE_STRIP, @ref FT8XX_RECTS, @ref FT8XX_EDGE_STRIP_A /B/R/L 158 * primitives. 159 * 160 * @param width Line width in 1/16 pixel 161 */ 162 #define FT8XX_LINE_WIDTH(width) (0x0e000000 | ((uint32_t)(width) & 0xfff)) 163 164 /** 165 * @brief Attach the tag value for the following graphics objects. 166 * 167 * The initial value of the tag buffer of the FT8xx is specified by command 168 * FT8XX_CLEAR_TAG and taken effect by command @ref FT8XX_CLEAR. @ref FT8XX_TAG 169 * command can specify the value of the tag buffer of the FT8xx that applies to 170 * the graphics objects when they are drawn on the screen. This tag value will 171 * be assigned to all the following objects, unless the FT8XX_TAG_MASK command 172 * is used to disable it. Once the following graphics objects are drawn, they 173 * are attached with the tag value successfully. When the graphics objects 174 * attached with the tag value are touched, the register 175 * @ref FT800_REG_TOUCH_TAG or @ref FT810_REG_TOUCH_TAG will be updated with the 176 * tag value of the graphics object being touched. If there is no @ref FT8XX_TAG 177 * commands in one display list, all the graphics objects rendered by the 178 * display list will report tag value as 255 in @ref FT800_REG_TOUCH_TAG or 179 * @ref FT810_REG_TOUCH_TAG when they were touched. 180 * 181 * @param s Tag value 1-255 182 */ 183 #define FT8XX_TAG(s) (0x03000000 | (uint8_t)(s)) 184 185 /** 186 * @brief Start the operation of graphics primitives at the specified coordinate 187 * 188 * The range of coordinates is from -16384 to +16383 in terms of 1/16th pixel 189 * units. The negative x coordinate value means the coordinate in the left 190 * virtual screen from (0, 0), while the negative y coordinate value means the 191 * coordinate in the upper virtual screen from (0, 0). If drawing on the 192 * negative coordinate position, the drawing operation will not be visible. 193 * 194 * @param x Signed x-coordinate in 1/16 pixel precision 195 * @param y Signed y-coordinate in 1/16 pixel precision 196 */ 197 #define FT8XX_VERTEX2F(x, y) (0x40000000 | \ 198 (((int32_t)(x) & 0x7fff) << 15) | \ 199 ((int32_t)(y) & 0x7fff)) 200 201 /** 202 * @brief Start the operation of graphics primitive at the specified coordinates 203 * 204 * The valid range of @p handle is from 0 to 31. From 16 to 31 the bitmap handle 205 * is dedicated to the FT8xx built-in font. 206 * 207 * Cell number is the index of bitmap with same bitmap layout and format. 208 * For example, for handle 31, the cell 65 means the character "A" in the 209 * largest built in font. 210 * 211 * @param x x-coordinate in pixels, from 0 to 511 212 * @param y y-coordinate in pixels, from 0 to 511 213 * @param handle Bitmap handle 214 * @param cell Cell number 215 */ 216 #define FT8XX_VERTEX2II(x, y, handle, cell) (0x80000000 | \ 217 (((uint32_t)(x) & 0x01ff) << 21) | \ 218 (((uint32_t)(y) & 0x01ff) << 12) | \ 219 (((uint32_t)(handle) & 0x1f) << 7) | \ 220 ((uint32_t)(cell) & 0x7f)) 221 222 /** 223 * @} 224 */ 225 226 #ifdef __cplusplus 227 } 228 #endif 229 230 #endif /* ZEPHYR_DRIVERS_MISC_FT8XX_FT8XX_DL_H_ */ 231