/* * Copyright (c) 2020 Hubert Miś * * SPDX-License-Identifier: Apache-2.0 */ /** * @file * @brief FT8XX display list commands */ #ifndef ZEPHYR_DRIVERS_MISC_FT8XX_FT8XX_DL_H_ #define ZEPHYR_DRIVERS_MISC_FT8XX_FT8XX_DL_H_ #include #ifdef __cplusplus extern "C" { #endif /** * @brief FT8xx display list commands * @defgroup ft8xx_dl FT8xx display list * @ingroup ft8xx_interface * @{ */ /** Rectangular pixel arrays, in various color formats */ #define FT8XX_BITMAPS 1U /** Anti-aliased points, point radius is 1-256 pixels */ #define FT8XX_POINTS 2U /** * Anti-aliased lines, with width from 0 to 4095 1/16th of pixel units. * (width is from center of the line to boundary) */ #define FT8XX_LINES 3U /** Anti-aliased lines, connected head-to-tail */ #define FT8XX_LINE_STRIP 4U /** Edge strips for right */ #define FT8XX_EDGE_STRIP_R 5U /** Edge strips for left */ #define FT8XX_EDGE_STRIP_L 6U /** Edge strips for above */ #define FT8XX_EDGE_STRIP_A 7U /** Edge strips for below */ #define FT8XX_EDGE_STRIP_B 8U /** * Round-cornered rectangles, curvature of the corners can be adjusted using * FT8XX_LINE_WIDTH */ #define FT8XX_RECTS 9U /** * @brief Begin drawing a graphics primitive * * The valid primitives are defined as: * - @ref FT8XX_BITMAPS * - @ref FT8XX_POINTS * - @ref FT8XX_LINES * - @ref FT8XX_LINE_STRIP * - @ref FT8XX_EDGE_STRIP_R * - @ref FT8XX_EDGE_STRIP_L * - @ref FT8XX_EDGE_STRIP_A * - @ref FT8XX_EDGE_STRIP_B * - @ref FT8XX_RECTS * * The primitive to be drawn is selected by the @ref FT8XX_BEGIN command. Once * the primitive is selected, it will be valid till the new primitive is * selected by the @ref FT8XX_BEGIN command. * * @note The primitive drawing operation will not be performed until * @ref FT8XX_VERTEX2II or @ref FT8XX_VERTEX2F is executed. * * @param prim Graphics primitive */ #define FT8XX_BEGIN(prim) (0x1f000000 | ((prim) & 0x0f)) /** * @brief Clear buffers to preset values * * Setting @p c to true will clear the color buffer of the FT8xx to the preset * value. Setting this bit to false will maintain the color buffer of the FT8xx * with an unchanged value. The preset value is defined in command * @ref FT8XX_CLEAR_COLOR_RGB for RGB channel and FT8XX_CLEAR_COLOR_A for alpha * channel. * * Setting @p s to true will clear the stencil buffer of the FT8xx to the preset * value. Setting this bit to false will maintain the stencil buffer of the * FT8xx with an unchanged value. The preset value is defined in command * FT8XX_CLEAR_STENCIL. * * Setting @p t to true will clear the tag buffer of the FT8xx to the preset * value. Setting this bit to false will maintain the tag buffer of the FT8xx * with an unchanged value. The preset value is defined in command * FT8XX_CLEAR_TAG. * * @param c Clear color buffer * @param s Clear stencil buffer * @param t Clear tag buffer */ #define FT8XX_CLEAR(c, s, t) (0x26000000 | \ ((c) ? 0x04 : 0) | ((s) ? 0x02 : 0) | ((t) ? 0x01 : 0)) /** * @brief Specify clear values for red, green and blue channels * * Sets the color values used by a following @ref FT8XX_CLEAR. * * @param red Red value used when the color buffer is cleared * @param green Green value used when the color buffer is cleared * @param blue Blue value used when the color buffer is cleared */ #define FT8XX_CLEAR_COLOR_RGB(red, green, blue) (0x02000000 | \ (((uint32_t)(red) & 0xff) << 16) | \ (((uint32_t)(green) & 0xff) << 8) | \ ((uint32_t)(blue) & 0xff)) /** * @brief Set the current color red, green and blue * * Sets red, green and blue values of the FT8xx color buffer which will be * applied to the following draw operation. * * @param red Red value for the current color * @param green Green value for the current color * @param blue Blue value for the current color */ #define FT8XX_COLOR_RGB(red, green, blue) (0x04000000 | \ (((uint32_t)(red) & 0xff) << 16) | \ (((uint32_t)(green) & 0xff) << 8) | \ ((uint32_t)(blue) & 0xff)) /** * @brief End the display list * * FT8xx will ignore all the commands following this command. */ #define FT8XX_DISPLAY() 0 /** * @brief End drawing a graphics primitive * * It is recommended to have an @ref FT8XX_END for each @ref FT8XX_BEGIN. * Whereas advanced users can avoid the usage of @ref FT8XX_END in order to * save extra graphics instructions in the display list RAM. */ #define FT8XX_END() 0x21000000 /** * @brief Specify the width of lines to be drawn with primitive @ref FT8XX_LINES * * Sets the width of drawn lines. The width is the distance from the center of * the line to the outermost drawn pixel, in units of 1/16 pixel. The valid * range is from 16 to 4095 in terms of 1/16th pixel units. * * @note The @ref FT8XX_LINE_WIDTH command will affect the @ref FT8XX_LINES, * @ref FT8XX_LINE_STRIP, @ref FT8XX_RECTS, @ref FT8XX_EDGE_STRIP_A /B/R/L * primitives. * * @param width Line width in 1/16 pixel */ #define FT8XX_LINE_WIDTH(width) (0x0e000000 | ((uint32_t)(width) & 0xfff)) /** * @brief Attach the tag value for the following graphics objects. * * The initial value of the tag buffer of the FT8xx is specified by command * FT8XX_CLEAR_TAG and taken effect by command @ref FT8XX_CLEAR. @ref FT8XX_TAG * command can specify the value of the tag buffer of the FT8xx that applies to * the graphics objects when they are drawn on the screen. This tag value will * be assigned to all the following objects, unless the FT8XX_TAG_MASK command * is used to disable it. Once the following graphics objects are drawn, they * are attached with the tag value successfully. When the graphics objects * attached with the tag value are touched, the register * @ref FT800_REG_TOUCH_TAG or @ref FT810_REG_TOUCH_TAG will be updated with the * tag value of the graphics object being touched. If there is no @ref FT8XX_TAG * commands in one display list, all the graphics objects rendered by the * display list will report tag value as 255 in @ref FT800_REG_TOUCH_TAG or * @ref FT810_REG_TOUCH_TAG when they were touched. * * @param s Tag value 1-255 */ #define FT8XX_TAG(s) (0x03000000 | (uint8_t)(s)) /** * @brief Start the operation of graphics primitives at the specified coordinate * * The range of coordinates is from -16384 to +16383 in terms of 1/16th pixel * units. The negative x coordinate value means the coordinate in the left * virtual screen from (0, 0), while the negative y coordinate value means the * coordinate in the upper virtual screen from (0, 0). If drawing on the * negative coordinate position, the drawing operation will not be visible. * * @param x Signed x-coordinate in 1/16 pixel precision * @param y Signed y-coordinate in 1/16 pixel precision */ #define FT8XX_VERTEX2F(x, y) (0x40000000 | \ (((int32_t)(x) & 0x7fff) << 15) | \ ((int32_t)(y) & 0x7fff)) /** * @brief Start the operation of graphics primitive at the specified coordinates * * The valid range of @p handle is from 0 to 31. From 16 to 31 the bitmap handle * is dedicated to the FT8xx built-in font. * * Cell number is the index of bitmap with same bitmap layout and format. * For example, for handle 31, the cell 65 means the character "A" in the * largest built in font. * * @param x x-coordinate in pixels, from 0 to 511 * @param y y-coordinate in pixels, from 0 to 511 * @param handle Bitmap handle * @param cell Cell number */ #define FT8XX_VERTEX2II(x, y, handle, cell) (0x80000000 | \ (((uint32_t)(x) & 0x01ff) << 21) | \ (((uint32_t)(y) & 0x01ff) << 12) | \ (((uint32_t)(handle) & 0x1f) << 7) | \ ((uint32_t)(cell) & 0x7f)) /** * @} */ #ifdef __cplusplus } #endif #endif /* ZEPHYR_DRIVERS_MISC_FT8XX_FT8XX_DL_H_ */