Ported Version of emwin eink and modus toolbox tft for psoc 6 cy8ckit wifi bt and cy8ckit-028-tft display. Works with the WiFi-BT pioneer kit hardware.

Committer:
reedas
Date:
Fri Aug 09 23:18:24 2019 +0000
Revision:
0:4ad2c16b6e43
First Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
reedas 0:4ad2c16b6e43 1 /*********************************************************************
reedas 0:4ad2c16b6e43 2 * SEGGER Microcontroller GmbH & Co. KG *
reedas 0:4ad2c16b6e43 3 * Solutions for real time microcontroller applications *
reedas 0:4ad2c16b6e43 4 **********************************************************************
reedas 0:4ad2c16b6e43 5 * *
reedas 0:4ad2c16b6e43 6 * (c) 1996 - 2017 SEGGER Microcontroller GmbH & Co. KG *
reedas 0:4ad2c16b6e43 7 * *
reedas 0:4ad2c16b6e43 8 * Internet: www.segger.com Support: support@segger.com *
reedas 0:4ad2c16b6e43 9 * *
reedas 0:4ad2c16b6e43 10 **********************************************************************
reedas 0:4ad2c16b6e43 11
reedas 0:4ad2c16b6e43 12 ** emWin V5.46 - Graphical user interface for embedded applications **
reedas 0:4ad2c16b6e43 13 All Intellectual Property rights in the Software belongs to SEGGER.
reedas 0:4ad2c16b6e43 14 emWin is protected by international copyright laws. Knowledge of the
reedas 0:4ad2c16b6e43 15 source code may not be used to write a similar product. This file may
reedas 0:4ad2c16b6e43 16 only be used in accordance with the following terms:
reedas 0:4ad2c16b6e43 17
reedas 0:4ad2c16b6e43 18 The software has been licensed to Cypress Semiconductor Corporation,
reedas 0:4ad2c16b6e43 19 whose registered office is situated at 198 Champion Ct. San Jose, CA
reedas 0:4ad2c16b6e43 20 95134 USA solely for the purposes of creating libraries for Cypress
reedas 0:4ad2c16b6e43 21 PSoC3 and PSoC5 processor-based devices, sublicensed and distributed
reedas 0:4ad2c16b6e43 22 under the terms and conditions of the Cypress End User License
reedas 0:4ad2c16b6e43 23 Agreement.
reedas 0:4ad2c16b6e43 24 Full source code is available at: www.segger.com
reedas 0:4ad2c16b6e43 25
reedas 0:4ad2c16b6e43 26 We appreciate your understanding and fairness.
reedas 0:4ad2c16b6e43 27 ----------------------------------------------------------------------
reedas 0:4ad2c16b6e43 28 Licensing information
reedas 0:4ad2c16b6e43 29 Licensor: SEGGER Microcontroller Systems LLC
reedas 0:4ad2c16b6e43 30 Licensed to: Cypress Semiconductor Corp, 198 Champion Ct., San Jose, CA 95134, USA
reedas 0:4ad2c16b6e43 31 Licensed SEGGER software: emWin
reedas 0:4ad2c16b6e43 32 License number: GUI-00319
reedas 0:4ad2c16b6e43 33 License model: Services and License Agreement, signed June 10th, 2009
reedas 0:4ad2c16b6e43 34 Licensed platform: Any Cypress platform (Initial targets are: PSoC3, PSoC5)
reedas 0:4ad2c16b6e43 35 ----------------------------------------------------------------------
reedas 0:4ad2c16b6e43 36 Support and Update Agreement (SUA)
reedas 0:4ad2c16b6e43 37 SUA period: 2009-06-12 - 2022-07-27
reedas 0:4ad2c16b6e43 38 Contact to extend SUA: sales@segger.com
reedas 0:4ad2c16b6e43 39 ----------------------------------------------------------------------
reedas 0:4ad2c16b6e43 40 File : LCDConf.c
reedas 0:4ad2c16b6e43 41 Purpose : Display controller configuration (single layer)
reedas 0:4ad2c16b6e43 42 ---------------------------END-OF-HEADER------------------------------
reedas 0:4ad2c16b6e43 43 */
reedas 0:4ad2c16b6e43 44
reedas 0:4ad2c16b6e43 45 #include "GUI.h"
reedas 0:4ad2c16b6e43 46 #include "GUIDRV_FlexColor.h"
reedas 0:4ad2c16b6e43 47
reedas 0:4ad2c16b6e43 48 #include "cy8ckit_028_tft.h"
reedas 0:4ad2c16b6e43 49
reedas 0:4ad2c16b6e43 50
reedas 0:4ad2c16b6e43 51 /*********************************************************************
reedas 0:4ad2c16b6e43 52 *
reedas 0:4ad2c16b6e43 53 * Layer configuration (to be modified)
reedas 0:4ad2c16b6e43 54 *
reedas 0:4ad2c16b6e43 55 **********************************************************************
reedas 0:4ad2c16b6e43 56 */
reedas 0:4ad2c16b6e43 57 //
reedas 0:4ad2c16b6e43 58 // Physical display size
reedas 0:4ad2c16b6e43 59 // The display size should be adapted in order to match the size of
reedas 0:4ad2c16b6e43 60 // the target display.
reedas 0:4ad2c16b6e43 61 //
reedas 0:4ad2c16b6e43 62 #define XSIZE_PHYS 240
reedas 0:4ad2c16b6e43 63 #define YSIZE_PHYS 320
reedas 0:4ad2c16b6e43 64
reedas 0:4ad2c16b6e43 65 //
reedas 0:4ad2c16b6e43 66 // Color conversion
reedas 0:4ad2c16b6e43 67 // The color conversion functions should be selected according to
reedas 0:4ad2c16b6e43 68 // the color mode of the target display. Details can be found in
reedas 0:4ad2c16b6e43 69 // the chapter "Colors" in the emWin user manual.
reedas 0:4ad2c16b6e43 70 //
reedas 0:4ad2c16b6e43 71 #define COLOR_CONVERSION GUICC_M565
reedas 0:4ad2c16b6e43 72
reedas 0:4ad2c16b6e43 73 //
reedas 0:4ad2c16b6e43 74 // Display driver
reedas 0:4ad2c16b6e43 75 //
reedas 0:4ad2c16b6e43 76 #define DISPLAY_DRIVER GUIDRV_FLEXCOLOR
reedas 0:4ad2c16b6e43 77
reedas 0:4ad2c16b6e43 78 /*********************************************************************
reedas 0:4ad2c16b6e43 79 *
reedas 0:4ad2c16b6e43 80 * Configuration checking
reedas 0:4ad2c16b6e43 81 *
reedas 0:4ad2c16b6e43 82 **********************************************************************
reedas 0:4ad2c16b6e43 83 */
reedas 0:4ad2c16b6e43 84 #ifndef VXSIZE_PHYS
reedas 0:4ad2c16b6e43 85 #define VXSIZE_PHYS XSIZE_PHYS
reedas 0:4ad2c16b6e43 86 #endif
reedas 0:4ad2c16b6e43 87 #ifndef VYSIZE_PHYS
reedas 0:4ad2c16b6e43 88 #define VYSIZE_PHYS YSIZE_PHYS
reedas 0:4ad2c16b6e43 89 #endif
reedas 0:4ad2c16b6e43 90 #ifndef XSIZE_PHYS
reedas 0:4ad2c16b6e43 91 #error Physical X size of display is not defined!
reedas 0:4ad2c16b6e43 92 #endif
reedas 0:4ad2c16b6e43 93 #ifndef YSIZE_PHYS
reedas 0:4ad2c16b6e43 94 #error Physical Y size of display is not defined!
reedas 0:4ad2c16b6e43 95 #endif
reedas 0:4ad2c16b6e43 96 #ifndef COLOR_CONVERSION
reedas 0:4ad2c16b6e43 97 #error Color conversion not defined!
reedas 0:4ad2c16b6e43 98 #endif
reedas 0:4ad2c16b6e43 99 #ifndef DISPLAY_DRIVER
reedas 0:4ad2c16b6e43 100 #error No display driver defined!
reedas 0:4ad2c16b6e43 101 #endif
reedas 0:4ad2c16b6e43 102
reedas 0:4ad2c16b6e43 103 /********************************************************************
reedas 0:4ad2c16b6e43 104 *
reedas 0:4ad2c16b6e43 105 * CY8CKIT_028_TFT_InitController
reedas 0:4ad2c16b6e43 106 *
reedas 0:4ad2c16b6e43 107 * Purpose:
reedas 0:4ad2c16b6e43 108 * Initializes the LCD controller
reedas 0:4ad2c16b6e43 109 *
reedas 0:4ad2c16b6e43 110 */
reedas 0:4ad2c16b6e43 111 static void CY8CKIT_028_TFT_InitController(void) {
reedas 0:4ad2c16b6e43 112 /* Set up the display controller and put it into operation. If the
reedas 0:4ad2c16b6e43 113 * display controller is not initialized by any external routine
reedas 0:4ad2c16b6e43 114 * this needs to be adapted by the customer.
reedas 0:4ad2c16b6e43 115 */
reedas 0:4ad2c16b6e43 116 DisplayIntf_Init();
reedas 0:4ad2c16b6e43 117
reedas 0:4ad2c16b6e43 118 /*
reedas 0:4ad2c16b6e43 119 Cy_GPIO_Set(LCD_RESET_PORT, LCD_RESET_NUM);
reedas 0:4ad2c16b6e43 120 GUI_Delay(20);
reedas 0:4ad2c16b6e43 121 Cy_GPIO_Clr(LCD_RESET_PORT, LCD_RESET_NUM);
reedas 0:4ad2c16b6e43 122 GUI_Delay(100);
reedas 0:4ad2c16b6e43 123 Cy_GPIO_Set(LCD_RESET_PORT, LCD_RESET_NUM);
reedas 0:4ad2c16b6e43 124 GUI_Delay(100);
reedas 0:4ad2c16b6e43 125 */
reedas 0:4ad2c16b6e43 126 LCD_RESET = 1u;
reedas 0:4ad2c16b6e43 127 GUI_Delay(20);
reedas 0:4ad2c16b6e43 128 LCD_RESET = 0u;
reedas 0:4ad2c16b6e43 129 GUI_Delay(100);
reedas 0:4ad2c16b6e43 130
reedas 0:4ad2c16b6e43 131 LCD_RESET = 1u;
reedas 0:4ad2c16b6e43 132 GUI_Delay(100);
reedas 0:4ad2c16b6e43 133
reedas 0:4ad2c16b6e43 134 DisplayIntf_Write8_A0(0x28);
reedas 0:4ad2c16b6e43 135 DisplayIntf_Write8_A0(0x11); /* Exit Sleep mode */
reedas 0:4ad2c16b6e43 136 GUI_Delay(100);
reedas 0:4ad2c16b6e43 137 DisplayIntf_Write8_A0(0x36);
reedas 0:4ad2c16b6e43 138 DisplayIntf_Write8_A1(0xA0); /* MADCTL: memory data access control */
reedas 0:4ad2c16b6e43 139 DisplayIntf_Write8_A0(0x3A);
reedas 0:4ad2c16b6e43 140 DisplayIntf_Write8_A1(0x65); /* COLMOD: Interface Pixel format */
reedas 0:4ad2c16b6e43 141 DisplayIntf_Write8_A0(0xB2);
reedas 0:4ad2c16b6e43 142 DisplayIntf_Write8_A1(0x0C);
reedas 0:4ad2c16b6e43 143 DisplayIntf_Write8_A1(0x0C);
reedas 0:4ad2c16b6e43 144 DisplayIntf_Write8_A1(0x00);
reedas 0:4ad2c16b6e43 145 DisplayIntf_Write8_A1(0x33);
reedas 0:4ad2c16b6e43 146 DisplayIntf_Write8_A1(0x33); /* PORCTRK: Porch setting */
reedas 0:4ad2c16b6e43 147 DisplayIntf_Write8_A0(0xB7);
reedas 0:4ad2c16b6e43 148 DisplayIntf_Write8_A1(0x35); /* GCTRL: Gate Control */
reedas 0:4ad2c16b6e43 149 DisplayIntf_Write8_A0(0xBB);
reedas 0:4ad2c16b6e43 150 DisplayIntf_Write8_A1(0x2B); /* VCOMS: VCOM setting */
reedas 0:4ad2c16b6e43 151 DisplayIntf_Write8_A0(0xC0);
reedas 0:4ad2c16b6e43 152 DisplayIntf_Write8_A1(0x2C); /* LCMCTRL: LCM Control */
reedas 0:4ad2c16b6e43 153 DisplayIntf_Write8_A0(0xC2);
reedas 0:4ad2c16b6e43 154 DisplayIntf_Write8_A1(0x01);
reedas 0:4ad2c16b6e43 155 DisplayIntf_Write8_A1(0xFF); /* VDVVRHEN: VDV and VRH Command Enable */
reedas 0:4ad2c16b6e43 156 DisplayIntf_Write8_A0(0xC3);
reedas 0:4ad2c16b6e43 157 DisplayIntf_Write8_A1(0x11); /* VRHS: VRH Set */
reedas 0:4ad2c16b6e43 158 DisplayIntf_Write8_A0(0xC4);
reedas 0:4ad2c16b6e43 159 DisplayIntf_Write8_A1(0x20); /* VDVS: VDV Set */
reedas 0:4ad2c16b6e43 160 DisplayIntf_Write8_A0(0xC6);
reedas 0:4ad2c16b6e43 161 DisplayIntf_Write8_A1(0x0F); /* FRCTRL2: Frame Rate control in normal mode */
reedas 0:4ad2c16b6e43 162 DisplayIntf_Write8_A0(0xD0);
reedas 0:4ad2c16b6e43 163 DisplayIntf_Write8_A1(0xA4);
reedas 0:4ad2c16b6e43 164 DisplayIntf_Write8_A1(0xA1); /* PWCTRL1: Power Control 1 */
reedas 0:4ad2c16b6e43 165 DisplayIntf_Write8_A0(0xE0);
reedas 0:4ad2c16b6e43 166 DisplayIntf_Write8_A1(0xD0);
reedas 0:4ad2c16b6e43 167 DisplayIntf_Write8_A1(0x00);
reedas 0:4ad2c16b6e43 168 DisplayIntf_Write8_A1(0x05);
reedas 0:4ad2c16b6e43 169 DisplayIntf_Write8_A1(0x0E);
reedas 0:4ad2c16b6e43 170 DisplayIntf_Write8_A1(0x15);
reedas 0:4ad2c16b6e43 171 DisplayIntf_Write8_A1(0x0D);
reedas 0:4ad2c16b6e43 172 DisplayIntf_Write8_A1(0x37);
reedas 0:4ad2c16b6e43 173 DisplayIntf_Write8_A1(0x43);
reedas 0:4ad2c16b6e43 174 DisplayIntf_Write8_A1(0x47);
reedas 0:4ad2c16b6e43 175 DisplayIntf_Write8_A1(0x09);
reedas 0:4ad2c16b6e43 176 DisplayIntf_Write8_A1(0x15);
reedas 0:4ad2c16b6e43 177 DisplayIntf_Write8_A1(0x12);
reedas 0:4ad2c16b6e43 178 DisplayIntf_Write8_A1(0x16);
reedas 0:4ad2c16b6e43 179 DisplayIntf_Write8_A1(0x19); /* PVGAMCTRL: Positive Voltage Gamma control */
reedas 0:4ad2c16b6e43 180 DisplayIntf_Write8_A0(0xE1);
reedas 0:4ad2c16b6e43 181 DisplayIntf_Write8_A1(0xD0);
reedas 0:4ad2c16b6e43 182 DisplayIntf_Write8_A1(0x00);
reedas 0:4ad2c16b6e43 183 DisplayIntf_Write8_A1(0x05);
reedas 0:4ad2c16b6e43 184 DisplayIntf_Write8_A1(0x0D);
reedas 0:4ad2c16b6e43 185 DisplayIntf_Write8_A1(0x0C);
reedas 0:4ad2c16b6e43 186 DisplayIntf_Write8_A1(0x06);
reedas 0:4ad2c16b6e43 187 DisplayIntf_Write8_A1(0x2D);
reedas 0:4ad2c16b6e43 188 DisplayIntf_Write8_A1(0x44);
reedas 0:4ad2c16b6e43 189 DisplayIntf_Write8_A1(0x40);
reedas 0:4ad2c16b6e43 190 DisplayIntf_Write8_A1(0x0E);
reedas 0:4ad2c16b6e43 191 DisplayIntf_Write8_A1(0x1C);
reedas 0:4ad2c16b6e43 192 DisplayIntf_Write8_A1(0x18);
reedas 0:4ad2c16b6e43 193 DisplayIntf_Write8_A1(0x16);
reedas 0:4ad2c16b6e43 194 DisplayIntf_Write8_A1(0x19); /* NVGAMCTRL: Negative Voltage Gamma control */
reedas 0:4ad2c16b6e43 195 DisplayIntf_Write8_A0(0x2B);
reedas 0:4ad2c16b6e43 196 DisplayIntf_Write8_A1(0x00);
reedas 0:4ad2c16b6e43 197 DisplayIntf_Write8_A1(0x00);
reedas 0:4ad2c16b6e43 198 DisplayIntf_Write8_A1(0x00);
reedas 0:4ad2c16b6e43 199 DisplayIntf_Write8_A1(0xEF); /* Y address set */
reedas 0:4ad2c16b6e43 200 DisplayIntf_Write8_A0(0x2A);
reedas 0:4ad2c16b6e43 201 DisplayIntf_Write8_A1(0x00);
reedas 0:4ad2c16b6e43 202 DisplayIntf_Write8_A1(0x00);
reedas 0:4ad2c16b6e43 203 DisplayIntf_Write8_A1(0x01);
reedas 0:4ad2c16b6e43 204 DisplayIntf_Write8_A1(0x3F); /* X address set */
reedas 0:4ad2c16b6e43 205 GUI_Delay(10);
reedas 0:4ad2c16b6e43 206 DisplayIntf_Write8_A0(0x29);
reedas 0:4ad2c16b6e43 207 }
reedas 0:4ad2c16b6e43 208
reedas 0:4ad2c16b6e43 209 /*********************************************************************
reedas 0:4ad2c16b6e43 210 *
reedas 0:4ad2c16b6e43 211 * Public code
reedas 0:4ad2c16b6e43 212 *
reedas 0:4ad2c16b6e43 213 **********************************************************************
reedas 0:4ad2c16b6e43 214 */
reedas 0:4ad2c16b6e43 215 /*********************************************************************
reedas 0:4ad2c16b6e43 216 *
reedas 0:4ad2c16b6e43 217 * LCD_X_Config
reedas 0:4ad2c16b6e43 218 *
reedas 0:4ad2c16b6e43 219 * Function description
reedas 0:4ad2c16b6e43 220 * Called during the initialization process in order to set up the
reedas 0:4ad2c16b6e43 221 * display driver configuration.
reedas 0:4ad2c16b6e43 222 */
reedas 0:4ad2c16b6e43 223 void LCD_X_Config(void) {
reedas 0:4ad2c16b6e43 224 GUI_DEVICE * pDevice;
reedas 0:4ad2c16b6e43 225 CONFIG_FLEXCOLOR Config = {0};
reedas 0:4ad2c16b6e43 226 GUI_PORT_API PortAPI = {0};
reedas 0:4ad2c16b6e43 227 //
reedas 0:4ad2c16b6e43 228 // Set the display driver and color conversion
reedas 0:4ad2c16b6e43 229 //
reedas 0:4ad2c16b6e43 230 pDevice = GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0);
reedas 0:4ad2c16b6e43 231 //
reedas 0:4ad2c16b6e43 232 // Display driver configuration
reedas 0:4ad2c16b6e43 233 //
reedas 0:4ad2c16b6e43 234 LCD_SetSizeEx (0, XSIZE_PHYS, YSIZE_PHYS);
reedas 0:4ad2c16b6e43 235 LCD_SetVSizeEx (0, VXSIZE_PHYS, VYSIZE_PHYS);
reedas 0:4ad2c16b6e43 236 //
reedas 0:4ad2c16b6e43 237 // Orientation
reedas 0:4ad2c16b6e43 238 //
reedas 0:4ad2c16b6e43 239 Config.Orientation = GUI_MIRROR_Y | GUI_SWAP_XY;
reedas 0:4ad2c16b6e43 240 GUIDRV_FlexColor_Config(pDevice, &Config);
reedas 0:4ad2c16b6e43 241 //
reedas 0:4ad2c16b6e43 242 // Set controller and operation mode
reedas 0:4ad2c16b6e43 243 //
reedas 0:4ad2c16b6e43 244 PortAPI.pfWrite8_A0 = DisplayIntf_Write8_A0;
reedas 0:4ad2c16b6e43 245 PortAPI.pfWrite8_A1 = DisplayIntf_Write8_A1;
reedas 0:4ad2c16b6e43 246 PortAPI.pfWriteM8_A1 = DisplayIntf_WriteM8_A1;
reedas 0:4ad2c16b6e43 247 PortAPI.pfRead8_A1 = DisplayIntf_Read8_A1;
reedas 0:4ad2c16b6e43 248 PortAPI.pfReadM8_A1 = DisplayIntf_ReadM8_A1;
reedas 0:4ad2c16b6e43 249
reedas 0:4ad2c16b6e43 250 GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B8);
reedas 0:4ad2c16b6e43 251 }
reedas 0:4ad2c16b6e43 252
reedas 0:4ad2c16b6e43 253 /*********************************************************************
reedas 0:4ad2c16b6e43 254 *
reedas 0:4ad2c16b6e43 255 * LCD_X_DisplayDriver
reedas 0:4ad2c16b6e43 256 *
reedas 0:4ad2c16b6e43 257 * Purpose:
reedas 0:4ad2c16b6e43 258 * This function is called by the display driver for several purposes.
reedas 0:4ad2c16b6e43 259 * To support the according task, the routine needs to be adapted to
reedas 0:4ad2c16b6e43 260 * the display controller. Note that the commands marked
reedas 0:4ad2c16b6e43 261 * "optional" are not cogently required and should only be adapted if
reedas 0:4ad2c16b6e43 262 * the display controller supports these features.
reedas 0:4ad2c16b6e43 263 *
reedas 0:4ad2c16b6e43 264 * Parameter:
reedas 0:4ad2c16b6e43 265 * LayerIndex - Zero based layer index
reedas 0:4ad2c16b6e43 266 * Cmd - Command to be executed
reedas 0:4ad2c16b6e43 267 * pData - Pointer to a data structure.
reedas 0:4ad2c16b6e43 268 *
reedas 0:4ad2c16b6e43 269 * Return Value:
reedas 0:4ad2c16b6e43 270 * < -1 - Error
reedas 0:4ad2c16b6e43 271 * -1 - The command is not handled.
reedas 0:4ad2c16b6e43 272 * 0 - OK.
reedas 0:4ad2c16b6e43 273 */
reedas 0:4ad2c16b6e43 274 int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData) {
reedas 0:4ad2c16b6e43 275 int r;
reedas 0:4ad2c16b6e43 276
reedas 0:4ad2c16b6e43 277 GUI_USE_PARA(LayerIndex);
reedas 0:4ad2c16b6e43 278 GUI_USE_PARA(pData);
reedas 0:4ad2c16b6e43 279
reedas 0:4ad2c16b6e43 280 switch (Cmd) {
reedas 0:4ad2c16b6e43 281 case LCD_X_INITCONTROLLER: {
reedas 0:4ad2c16b6e43 282 //
reedas 0:4ad2c16b6e43 283 // Called during the initialization process in order to set up the
reedas 0:4ad2c16b6e43 284 // display controller and put it into operation. If the display
reedas 0:4ad2c16b6e43 285 // controller is not initialized by any external routine, this needs
reedas 0:4ad2c16b6e43 286 // to be adapted by the customer...
reedas 0:4ad2c16b6e43 287 //
reedas 0:4ad2c16b6e43 288 // ...
reedas 0:4ad2c16b6e43 289 CY8CKIT_028_TFT_InitController();
reedas 0:4ad2c16b6e43 290 return 0;
reedas 0:4ad2c16b6e43 291 }
reedas 0:4ad2c16b6e43 292 default:
reedas 0:4ad2c16b6e43 293 r = -1;
reedas 0:4ad2c16b6e43 294 }
reedas 0:4ad2c16b6e43 295 return r;
reedas 0:4ad2c16b6e43 296 }
reedas 0:4ad2c16b6e43 297
reedas 0:4ad2c16b6e43 298 /*************************** End of file ****************************/
reedas 0:4ad2c16b6e43 299