00001
00038 #include <clk/sys.h>
00039 #include <gpio.h>
00040 #include <stdint.h>
00041 #include <stdbool.h>
00042 #include <stddef.h>
00043 #include <delay.h>
00044 #include <assert.h>
00045 #include <gfx/gfx.h>
00046
00047 #include "hx8347a_regs.h"
00048
00049 #if defined(CONFIG_CPU_XMEGA)
00050 # include "hx8347a_xmega.h"
00051 #elif defined(CONFIG_CPU_UC3)
00052 # include "hx8347a_ebi.h"
00053 #endif
00054
00055 #ifdef CONFIG_GFX_USE_CLIPPING
00056 gfx_coord_t gfx_min_x;
00057 gfx_coord_t gfx_min_y;
00058 gfx_coord_t gfx_max_x;
00059 gfx_coord_t gfx_max_y;
00060 #endif
00061
00062 gfx_coord_t gfx_width;
00063 gfx_coord_t gfx_height;
00064
00065
00066 #define GFX_PANELWIDTH 240
00067 #define GFX_PANELHEIGHT 320
00068
00070 static void gfx_set_register(uint8_t address, uint8_t bitmask)
00071 {
00072 uint8_t value;
00073
00074 value = gfx_read_register(address);
00075 value |= bitmask;
00076 gfx_write_register(address, value);
00077 }
00078
00080 static void gfx_clear_register(uint8_t address, uint8_t bitmask)
00081 {
00082 uint8_t value;
00083
00084 value = gfx_read_register(address);
00085 value &= ~bitmask;
00086 gfx_write_register(address, value);
00087 }
00088
00090 static void gfx_reset_display(void)
00091 {
00092 gpio_set_value(GFX_RESET_PIN, false);
00093 udelay(50);
00094 gpio_set_value(GFX_RESET_PIN, true);
00095 udelay(5000);
00096 }
00097
00098
00100 static void gfx_exit_standby(void)
00101 {
00102 gfx_set_register(HX8347A_OSCCTRL1, 0x3A | (1 << HX8347A_OSC_EN));
00103 udelay(50000);
00104 gfx_clear_register(HX8347A_POWERCTRL1, (1 << HX8347A_STB));
00105 }
00106
00107
00109 static void gfx_display_init_all(void)
00110 {
00111
00112 gfx_write_register(HX8347A_GAMMACTRL1, 0x94);
00113 gfx_write_register(HX8347A_GAMMACTRL2, 0x41);
00114 gfx_write_register(HX8347A_GAMMACTRL3, 0x00);
00115 gfx_write_register(HX8347A_GAMMACTRL4, 0x33);
00116 gfx_write_register(HX8347A_GAMMACTRL5, 0x23);
00117 gfx_write_register(HX8347A_GAMMACTRL6, 0x45);
00118 gfx_write_register(HX8347A_GAMMACTRL7, 0x44);
00119 gfx_write_register(HX8347A_GAMMACTRL8, 0x77);
00120 gfx_write_register(HX8347A_GAMMACTRL9, 0x12);
00121 gfx_write_register(HX8347A_GAMMACTRL10, 0xCC);
00122 gfx_write_register(HX8347A_GAMMACTRL11, 0x46);
00123 gfx_write_register(HX8347A_GAMMACTRL12, 0x82);
00124
00125 gfx_write_register(HX8347A_DISPMODECTRL, 0x06);
00126
00127
00128
00129 gfx_write_register(HX8347A_CYCLECTRL1, 0x01);
00130 gfx_write_register(HX8347A_CYCLECTRL2, 0x01);
00131 gfx_write_register(HX8347A_CYCLECTRL3, 0xF0);
00132 gfx_write_register(HX8347A_CYCLECTRL4, 0x00);
00133 gfx_write_register(HX8347A_CYCLECTRL5, 0x38);
00134 gfx_write_register(HX8347A_CYCLECTRL6, 0x0F);
00135 gfx_write_register(HX8347A_CYCLECTRL7, 0xF0);
00136
00137 gfx_write_register(HX8347A_DISPCTRL2, 0x02);
00138 gfx_write_register(HX8347A_DISPCTRL3, 0x02);
00139 gfx_write_register(HX8347A_DISPCTRL4, 0x02);
00140 gfx_write_register(HX8347A_DISPCTRL5, 0x02);
00141 gfx_write_register(HX8347A_DISPCTRL6, 0x02);
00142 gfx_write_register(HX8347A_DISPCTRL7, 0x02);
00143
00144 gfx_write_register(HX8347A_INTERNAL28, 0x0E);
00145 gfx_write_register(HX8347A_OSCCTRL1, 0x49);
00146
00147 gfx_write_register(HX8347A_COLSTARTHIGH, 0x00);
00148 gfx_write_register(HX8347A_COLSTARTLOW, 0x00);
00149 gfx_write_register(HX8347A_COLENDHIGH, 0x00);
00150 gfx_write_register(HX8347A_COLENDLOW, 0xEF);
00151 gfx_write_register(HX8347A_ROWSTARTHIGH, 0x00);
00152 gfx_write_register(HX8347A_ROWSTARTLOW, 0x00);
00153 gfx_write_register(HX8347A_ROWENDHIGH, 0x01);
00154 gfx_write_register(HX8347A_ROWENDLOW, 0x3F);
00155
00156 gfx_write_register(HX8347A_MEMACCESSCTRL, 0x08);
00157
00158 gfx_write_register(HX8347A_CYCLECTRL1_X, 0x95);
00159 gfx_write_register(HX8347A_CYCLECTRL2_X, 0x95);
00160 gfx_write_register(HX8347A_CYCLECTRL3_X, 0xFF);
00161 gfx_write_register(HX8347A_DISPCTRL8, 0x7F);
00162 gfx_write_register(HX8347A_DISPCTRL9, 0x38);
00163 gfx_write_register(HX8347A_DISPCTRL10, 0x78);
00164
00165 gfx_write_register(HX8347A_POWERCTRL3, 0x07);
00166 gfx_write_register(HX8347A_POWERCTRL4, 0x00);
00167 gfx_write_register(HX8347A_POWERCTRL5, 0x04);
00168 gfx_write_register(HX8347A_POWERCTRL6, 0x40);
00169 gfx_write_register(HX8347A_VCOMCTRL2, 0x38);
00170 gfx_write_register(HX8347A_VCOMCTRL3, 0x12);
00171
00172 udelay(10000);
00173 gfx_write_register(HX8347A_POWERCTRL2, 0x04);
00174 udelay(20000);
00175 gfx_write_register(HX8347A_VCOMCTRL1, 0x80);
00176 udelay(5000);
00177 gfx_write_register(HX8347A_POWERCTRL1, 0x08);
00178 udelay(40000);
00179 gfx_write_register(HX8347A_POWERCTRL1, 0x10);
00180 udelay(40000);
00181 gfx_write_register(HX8347A_DISPCTRL1, 0x04);
00182 udelay(40000);
00183 gfx_write_register(HX8347A_DISPCTRL1, 0x24);
00184 gfx_write_register(HX8347A_DISPCTRL1, 0x2C);
00185 udelay(40000);
00186 gfx_write_register(HX8347A_DISPCTRL1, 0x3C);
00187 }
00188
00189
00190 void gfx_init(void)
00191 {
00192
00193 gfx_init_comms();
00194
00195
00196 gfx_setup_interface();
00197 gfx_reset_display();
00198 gfx_exit_standby();
00199
00200
00201 gfx_display_init_all();
00202
00203
00204 gfx_set_orientation(GFX_DEFAULT_ORIENTATION);
00205 }
00206
00207 void gfx_sync(void)
00208 {
00209
00210 }
00211
00212 void gfx_set_clipping(gfx_coord_t min_x, gfx_coord_t min_y,
00213 gfx_coord_t max_x, gfx_coord_t max_y)
00214 {
00215 #ifdef CONFIG_GFX_USE_CLIPPING
00216
00217 if (min_x < 0)
00218 min_x = 0;
00219 if (min_y < 0)
00220 min_y = 0;
00221 if (max_x >= gfx_width)
00222 max_x = gfx_width - 1;
00223 if (max_y >= gfx_height)
00224 max_y = gfx_height - 1;
00225
00226 gfx_min_x = min_x;
00227 gfx_min_y = min_y;
00228 gfx_max_x = max_x;
00229 gfx_max_y = max_y;
00230 #endif
00231 }
00232
00233 void gfx_set_orientation(uint8_t flags)
00234 {
00235 uint8_t setting = 0;
00236 uint8_t regval;
00237
00238 setting |= (flags & GFX_FLIP_X ? GFX_HX_FLIP_X : 0);
00239 setting |= (flags & GFX_FLIP_Y ? GFX_HX_FLIP_Y : 0);
00240 setting |= (flags & GFX_SWITCH_XY ? GFX_HX_SWITCH_XY : 0);
00241
00242
00243 regval = gfx_read_register(HX8347A_MEMACCESSCTRL);
00244 regval &= ~(GFX_HX_FLIP_X | GFX_HX_FLIP_Y | GFX_HX_SWITCH_XY);
00245 regval |= setting;
00246 gfx_write_register(HX8347A_MEMACCESSCTRL, regval);
00247
00248
00249 if ((setting & GFX_HX_SWITCH_XY) != 0x00) {
00250 gfx_width = GFX_PANELHEIGHT;
00251 gfx_height = GFX_PANELWIDTH;
00252 } else {
00253 gfx_width = GFX_PANELWIDTH;
00254 gfx_height = GFX_PANELHEIGHT;
00255 }
00256
00257 #ifdef CONFIG_GFX_USE_CLIPPING
00258
00259 gfx_set_clipping(0, 0, gfx_width - 1, gfx_height - 1);
00260 #endif
00261 }
00262
00263 gfx_coord_t gfx_get_width(void)
00264 {
00265 return gfx_width;
00266 }
00267
00268 gfx_coord_t gfx_get_height(void)
00269 {
00270 return gfx_height;
00271 }
00272
00273 gfx_color_t gfx_color(uint8_t r, uint8_t g, uint8_t b)
00274 {
00275 gfx_color_t color;
00276 uint16_t red = r >> 3;
00277 uint16_t green = g >> 2;
00278 uint16_t blue = b >> 3;
00279
00280
00281 red <<= (5 + 6);
00282 green <<= 5;
00283 color = red | green | blue;
00284
00285
00286 color = (color >> 8) | (color << 8);
00287
00288 return color;
00289 }
00290
00291 gfx_color_t gfx_get_pixel(gfx_coord_t x, gfx_coord_t y)
00292 {
00293 gfx_color_t color;
00294
00295 #ifdef CONFIG_GFX_USE_CLIPPING
00296 if ((x < gfx_min_x) || (x > gfx_max_x)
00297 || (y < gfx_min_y) || (y > gfx_max_y))
00298 return GFX_COLOR_INVALID;
00299 #endif
00300
00301
00302 gfx_set_limits(x, y, x, y);
00303 color = gfx_read_gram();
00304
00305 return color;
00306 }
00307
00308 void gfx_draw_pixel(gfx_coord_t x, gfx_coord_t y, gfx_color_t color)
00309 {
00310 #ifdef CONFIG_GFX_USE_CLIPPING
00311 if ((x < gfx_min_x) || (x > gfx_max_x)
00312 || (y < gfx_min_y) || (y > gfx_max_y))
00313 return;
00314 #endif
00315
00316
00317 gfx_set_limits(x, y, x, y);
00318 gfx_write_gram(color);
00319 }
00320
00321 void gfx_draw_line_pixel(gfx_coord_t x, gfx_coord_t y, gfx_color_t color)
00322 {
00323 #ifdef CONFIG_GFX_USE_CLIPPING
00324 if ((x < gfx_min_x) || (x > gfx_max_x)
00325 || (y < gfx_min_y) || (y > gfx_max_y))
00326 return;
00327 #endif
00328
00329
00330
00331 gfx_set_top_left_limit(x, y);
00332 gfx_write_gram(color);
00333 }
00334
00335 void gfx_set_top_left_limit(gfx_coord_t x, gfx_coord_t y)
00336 {
00337 gfx_write_register(HX8347A_COLSTARTHIGH, (x >> 8));
00338 gfx_write_register(HX8347A_COLSTARTLOW, (x & 0xff));
00339 gfx_write_register(HX8347A_ROWSTARTHIGH, (y >> 8));
00340 gfx_write_register(HX8347A_ROWSTARTLOW, (y & 0xff));
00341 }
00342
00343 void gfx_set_bottom_right_limit(gfx_coord_t x, gfx_coord_t y)
00344 {
00345 gfx_write_register(HX8347A_COLENDHIGH, (x >> 8));
00346 gfx_write_register(HX8347A_COLENDLOW, (x & 0xff));
00347 gfx_write_register(HX8347A_ROWENDHIGH, (y >> 8));
00348 gfx_write_register(HX8347A_ROWENDLOW, (y & 0xff));
00349 }
00350
00351 void gfx_set_limits(gfx_coord_t x1, gfx_coord_t y1,
00352 gfx_coord_t x2, gfx_coord_t y2)
00353 {
00354 gfx_set_top_left_limit(x1, y1);
00355 gfx_set_bottom_right_limit(x2, y2);
00356 }