diff options
Diffstat (limited to 'drivers/staging/fbtft/fb_ili9163.c')
-rw-r--r-- | drivers/staging/fbtft/fb_ili9163.c | 189 |
1 files changed, 84 insertions, 105 deletions
diff --git a/drivers/staging/fbtft/fb_ili9163.c b/drivers/staging/fbtft/fb_ili9163.c index f31b3f4b9..6b8f8b17e 100644 --- a/drivers/staging/fbtft/fb_ili9163.c +++ b/drivers/staging/fbtft/fb_ili9163.c @@ -22,6 +22,7 @@ #include <linux/init.h> #include <linux/gpio.h> #include <linux/delay.h> +#include <video/mipi_display.h> #include "fbtft.h" @@ -38,37 +39,11 @@ #endif /* ILI9163C commands */ -#define CMD_NOP 0x00 /* Non operation*/ -#define CMD_SWRESET 0x01 /* Soft Reset */ -#define CMD_SLPIN 0x10 /* Sleep ON */ -#define CMD_SLPOUT 0x11 /* Sleep OFF */ -#define CMD_PTLON 0x12 /* Partial Mode ON */ -#define CMD_NORML 0x13 /* Normal Display ON */ -#define CMD_DINVOF 0x20 /* Display Inversion OFF */ -#define CMD_DINVON 0x21 /* Display Inversion ON */ -#define CMD_GAMMASET 0x26 /* Gamma Set (0x01[1],0x02[2],0x04[3],0x08[4]) */ -#define CMD_DISPOFF 0x28 /* Display OFF */ -#define CMD_DISPON 0x29 /* Display ON */ -#define CMD_IDLEON 0x39 /* Idle Mode ON */ -#define CMD_IDLEOF 0x38 /* Idle Mode OFF */ -#define CMD_CLMADRS 0x2A /* Column Address Set */ -#define CMD_PGEADRS 0x2B /* Page Address Set */ - -#define CMD_RAMWR 0x2C /* Memory Write */ -#define CMD_RAMRD 0x2E /* Memory Read */ -#define CMD_CLRSPACE 0x2D /* Color Space : 4K/65K/262K */ -#define CMD_PARTAREA 0x30 /* Partial Area */ -#define CMD_VSCLLDEF 0x33 /* Vertical Scroll Definition */ -#define CMD_TEFXLON 0x34 /* Tearing Effect Line ON */ -#define CMD_TEFXLOF 0x35 /* Tearing Effect Line OFF */ -#define CMD_MADCTL 0x36 /* Memory Access Control */ - -#define CMD_PIXFMT 0x3A /* Interface Pixel Format */ -#define CMD_FRMCTR1 0xB1 /* Frame Rate Control - (In normal mode/Full colors) */ +#define CMD_FRMCTR1 0xB1 /* Frame Rate Control */ + /* (In normal mode/Full colors) */ #define CMD_FRMCTR2 0xB2 /* Frame Rate Control (In Idle mode/8-colors) */ -#define CMD_FRMCTR3 0xB3 /* Frame Rate Control - (In Partial mode/full colors) */ +#define CMD_FRMCTR3 0xB3 /* Frame Rate Control */ + /* (In Partial mode/full colors) */ #define CMD_DINVCTR 0xB4 /* Display Inversion Control */ #define CMD_RGBBLK 0xB5 /* RGB Interface Blanking Porch setting */ #define CMD_DFUNCTR 0xB6 /* Display Function set 5 */ @@ -88,17 +63,18 @@ #define CMD_GAMRSEL 0xF2 /* GAM_R_SEL */ /* -This display: -http://www.ebay.com/itm/Replace-Nokia-5110-LCD-1-44-Red-Serial-128X128-SPI-Color-TFT-LCD-Display-Module-/271422122271 -This particular display has a design error! The controller has 3 pins to -configure to constrain the memory and resolution to a fixed dimension (in -that case 128x128) but they leaved those pins configured for 128x160 so -there was several pixel memory addressing problems. -I solved by setup several parameters that dinamically fix the resolution as -needit so below the parameters for this display. If you have a strain or a -correct display (can happen with chinese) you can copy those parameters and -create setup for different displays. -*/ + * This display: + * http://www.ebay.com/itm/Replace-Nokia-5110-LCD-1-44-Red-Serial-128X128-SPI- + * Color-TFT-LCD-Display-Module-/271422122271 + * This particular display has a design error! The controller has 3 pins to + * configure to constrain the memory and resolution to a fixed dimension (in + * that case 128x128) but they leaved those pins configured for 128x160 so + * there was several pixel memory addressing problems. + * I solved by setup several parameters that dinamically fix the resolution as + * needit so below the parameters for this display. If you have a strain or a + * correct display (can happen with chinese) you can copy those parameters and + * create setup for different displays. + */ #ifdef RED #define __OFFSET 32 /*see note 2 - this is the red version */ @@ -113,16 +89,17 @@ static int init_display(struct fbtft_par *par) if (par->gpio.cs != -1) gpio_set_value(par->gpio.cs, 0); /* Activate chip */ - write_reg(par, CMD_SWRESET); /* software reset */ + write_reg(par, MIPI_DCS_SOFT_RESET); /* software reset */ mdelay(500); - write_reg(par, CMD_SLPOUT); /* exit sleep */ + write_reg(par, MIPI_DCS_EXIT_SLEEP_MODE); /* exit sleep */ mdelay(5); - write_reg(par, CMD_PIXFMT, 0x05); /* Set Color Format 16bit */ - write_reg(par, CMD_GAMMASET, 0x02); /* default gamma curve 3 */ + write_reg(par, MIPI_DCS_SET_PIXEL_FORMAT, MIPI_DCS_PIXEL_FMT_16BIT); + /* default gamma curve 3 */ + write_reg(par, MIPI_DCS_SET_GAMMA_CURVE, 0x02); #ifdef GAMMA_ADJ write_reg(par, CMD_GAMRSEL, 0x01); /* Enable Gamma adj */ #endif - write_reg(par, CMD_NORML); + write_reg(par, MIPI_DCS_ENTER_NORMAL_MODE); write_reg(par, CMD_DFUNCTR, 0xff, 0x06); /* Frame Rate Control (In normal mode/Full colors) */ write_reg(par, CMD_FRMCTR1, 0x08, 0x02); @@ -135,66 +112,67 @@ static int init_display(struct fbtft_par *par) write_reg(par, CMD_VCOMCTR1, 0x50, 0x63); write_reg(par, CMD_VCOMOFFS, 0); - write_reg(par, CMD_CLMADRS, 0, 0, 0, WIDTH); /* Set Column Address */ - write_reg(par, CMD_PGEADRS, 0, 0, 0, HEIGHT); /* Set Page Address */ + write_reg(par, MIPI_DCS_SET_COLUMN_ADDRESS, 0, 0, 0, WIDTH); + write_reg(par, MIPI_DCS_SET_PAGE_ADDRESS, 0, 0, 0, HEIGHT); - write_reg(par, CMD_DISPON); /* display ON */ - write_reg(par, CMD_RAMWR); /* Memory Write */ + write_reg(par, MIPI_DCS_SET_DISPLAY_ON); /* display ON */ + write_reg(par, MIPI_DCS_WRITE_MEMORY_START); /* Memory Write */ return 0; } static void set_addr_win(struct fbtft_par *par, int xs, int ys, - int xe, int ye) + int xe, int ye) { switch (par->info->var.rotate) { case 0: - write_reg(par, CMD_CLMADRS, xs >> 8, xs & 0xff, xe >> 8, - xe & 0xff); - write_reg(par, CMD_PGEADRS, - (ys + __OFFSET) >> 8, (ys + __OFFSET) & 0xff, - (ye + __OFFSET) >> 8, (ye + __OFFSET) & 0xff); + write_reg(par, MIPI_DCS_SET_COLUMN_ADDRESS, + xs >> 8, xs & 0xff, xe >> 8, xe & 0xff); + write_reg(par, MIPI_DCS_SET_PAGE_ADDRESS, + (ys + __OFFSET) >> 8, (ys + __OFFSET) & 0xff, + (ye + __OFFSET) >> 8, (ye + __OFFSET) & 0xff); break; case 90: - write_reg(par, CMD_CLMADRS, - (xs + __OFFSET) >> 8, (xs + __OFFSET) & 0xff, - (xe + __OFFSET) >> 8, (xe + __OFFSET) & 0xff); - write_reg(par, CMD_PGEADRS, ys >> 8, ys & 0xff, ye >> 8, - ye & 0xff); + write_reg(par, MIPI_DCS_SET_COLUMN_ADDRESS, + (xs + __OFFSET) >> 8, (xs + __OFFSET) & 0xff, + (xe + __OFFSET) >> 8, (xe + __OFFSET) & 0xff); + write_reg(par, MIPI_DCS_SET_PAGE_ADDRESS, + ys >> 8, ys & 0xff, ye >> 8, ye & 0xff); break; case 180: case 270: - write_reg(par, CMD_CLMADRS, xs >> 8, xs & 0xff, xe >> 8, - xe & 0xff); - write_reg(par, CMD_PGEADRS, ys >> 8, ys & 0xff, ye >> 8, - ye & 0xff); + write_reg(par, MIPI_DCS_SET_COLUMN_ADDRESS, + xs >> 8, xs & 0xff, xe >> 8, xe & 0xff); + write_reg(par, MIPI_DCS_SET_PAGE_ADDRESS, + ys >> 8, ys & 0xff, ye >> 8, ye & 0xff); break; default: - par->info->var.rotate = 0; /* Fix incorrect setting */ + /* Fix incorrect setting */ + par->info->var.rotate = 0; } - write_reg(par, CMD_RAMWR); /* Write Data to GRAM mode */ + write_reg(par, MIPI_DCS_WRITE_MEMORY_START); } /* -7) MY: 1(bottom to top), 0(top to bottom) Row Address Order -6) MX: 1(R to L), 0(L to R) Column Address Order -5) MV: 1(Exchanged), 0(normal) Row/Column exchange -4) ML: 1(bottom to top), 0(top to bottom) Vertical Refresh Order -3) RGB: 1(BGR), 0(RGB) Color Space -2) MH: 1(R to L), 0(L to R) Horizontal Refresh Order -1) -0) - - MY, MX, MV, ML,RGB, MH, D1, D0 - 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 //normal - 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 //Y-Mirror - 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 //X-Mirror - 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 //X-Y-Mirror - 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 //X-Y Exchange - 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 //X-Y Exchange, Y-Mirror - 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 //XY exchange - 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 -*/ + * 7) MY: 1(bottom to top), 0(top to bottom) Row Address Order + * 6) MX: 1(R to L), 0(L to R) Column Address Order + * 5) MV: 1(Exchanged), 0(normal) Row/Column exchange + * 4) ML: 1(bottom to top), 0(top to bottom) Vertical Refresh Order + * 3) RGB: 1(BGR), 0(RGB) Color Space + * 2) MH: 1(R to L), 0(L to R) Horizontal Refresh Order + * 1) + * 0) + * + * MY, MX, MV, ML,RGB, MH, D1, D0 + * 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 //normal + * 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 //Y-Mirror + * 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 //X-Mirror + * 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 //X-Y-Mirror + * 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 //X-Y Exchange + * 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 //X-Y Exchange, Y-Mirror + * 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 //XY exchange + * 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 + */ static int set_var(struct fbtft_par *par) { u8 mactrl_data = 0; /* Avoid compiler warning */ @@ -217,8 +195,8 @@ static int set_var(struct fbtft_par *par) /* Colorspcae */ if (par->bgr) mactrl_data |= (1 << 2); - write_reg(par, CMD_MADCTL, mactrl_data); - write_reg(par, CMD_RAMWR); /* Write Data to GRAM mode */ + write_reg(par, MIPI_DCS_SET_ADDRESS_MODE, mactrl_data); + write_reg(par, MIPI_DCS_WRITE_MEMORY_START); return 0; } @@ -237,27 +215,28 @@ static int gamma_adj(struct fbtft_par *par, unsigned long *curves) CURVE(i, j) &= mask[i * par->gamma.num_values + j]; write_reg(par, CMD_PGAMMAC, - CURVE(0, 0), - CURVE(0, 1), - CURVE(0, 2), - CURVE(0, 3), - CURVE(0, 4), - CURVE(0, 5), - CURVE(0, 6), - (CURVE(0, 7) << 4) | CURVE(0, 8), - CURVE(0, 9), - CURVE(0, 10), - CURVE(0, 11), - CURVE(0, 12), - CURVE(0, 13), - CURVE(0, 14), - CURVE(0, 15) - ); + CURVE(0, 0), + CURVE(0, 1), + CURVE(0, 2), + CURVE(0, 3), + CURVE(0, 4), + CURVE(0, 5), + CURVE(0, 6), + (CURVE(0, 7) << 4) | CURVE(0, 8), + CURVE(0, 9), + CURVE(0, 10), + CURVE(0, 11), + CURVE(0, 12), + CURVE(0, 13), + CURVE(0, 14), + CURVE(0, 15)); - write_reg(par, CMD_RAMWR); /* Write Data to GRAM mode */ + /* Write Data to GRAM mode */ + write_reg(par, MIPI_DCS_WRITE_MEMORY_START); return 0; } + #undef CURVE #endif |