Created
April 26, 2014 17:02
-
-
Save aniruddha-adhikary/11325212 to your computer and use it in GitHub Desktop.
ILI980C Driver
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <linux/string.h> | |
#include "lcm_drv.h" | |
static LCM_UTIL_FUNCS lcm_util = {0}; | |
#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) | |
#define UDELAY(n) (lcm_util.udelay(n)) | |
#define MDELAY(n) (lcm_util.mdelay(n)) | |
// Inline functions, don't blame me :3 | |
static __inline unsigned int HIGH_BYTE(unsigned int val) | |
{ | |
return (val >> 8) & 0xFF; | |
} | |
static __inline unsigned int LOW_BYTE(unsigned int val) | |
{ | |
return (val & 0xFF); | |
} | |
static __inline void send_ctrl_cmd(unsigned int cmd) | |
{ | |
lcm_util.send_cmd((cmd& 0xFF)); | |
} | |
static __inline void send_data_cmd(unsigned int data) | |
{ | |
lcm_util.send_data((data& 0xFF)); | |
} | |
static __inline unsigned int read_data_cmd() | |
{ | |
return lcm_util.read_data(); | |
} | |
static __inline void set_lcm_register(unsigned int regIndex, | |
unsigned int regData) | |
{ | |
send_ctrl_cmd(regIndex); | |
send_data_cmd(regData); | |
} | |
static void init_lcm_registers(void) | |
{ | |
send_ctrl_cmd(0xFF); // EXTC Command Set enable register | |
send_data_cmd(0xFF); | |
send_data_cmd(0x98); | |
send_data_cmd(0x16); | |
send_ctrl_cmd(0xBA); // SPI Interface Setting | |
send_data_cmd(0x60); | |
send_ctrl_cmd(0XB0); // Interface Mode Control | |
send_data_cmd(0x01); | |
send_ctrl_cmd(0xBC); // GIP 1 | |
send_data_cmd(0x03); | |
send_data_cmd(0x0D); | |
send_data_cmd(0x61); | |
send_data_cmd(0xFF); | |
send_data_cmd(0x01); | |
send_data_cmd(0x01); | |
send_data_cmd(0x1B); | |
send_data_cmd(0x11); | |
send_data_cmd(0x38); | |
send_data_cmd(0x63); | |
send_data_cmd(0xFF); | |
send_data_cmd(0xFF); | |
send_data_cmd(0x01); | |
send_data_cmd(0x01); | |
send_data_cmd(0x10); | |
send_data_cmd(0x00); | |
send_data_cmd(0xFF); | |
send_data_cmd(0XF2); | |
send_ctrl_cmd(0xBD); // GIP 2 | |
send_data_cmd(0x02); | |
send_data_cmd(0x13); | |
send_data_cmd(0x45); | |
send_data_cmd(0x67); | |
send_data_cmd(0x45); | |
send_data_cmd(0x67); | |
send_data_cmd(0x01); | |
send_data_cmd(0x23); | |
send_ctrl_cmd(0xBE); // GIP 3 | |
send_data_cmd(0x03); | |
send_data_cmd(0x22); | |
send_data_cmd(0x22); | |
send_data_cmd(0x22); | |
send_data_cmd(0x22); | |
send_data_cmd(0xDD); | |
send_data_cmd(0xCC); | |
send_data_cmd(0xBB); | |
send_data_cmd(0xAA); | |
send_data_cmd(0x66); | |
send_data_cmd(0x77); | |
send_data_cmd(0x22); | |
send_data_cmd(0x22); | |
send_data_cmd(0x22); | |
send_data_cmd(0x22); | |
send_data_cmd(0x22); | |
send_data_cmd(0x22); | |
send_ctrl_cmd(0xED); // en_volt_reg measure VGMP | |
send_data_cmd(0x7F); | |
send_data_cmd(0x0F); | |
send_ctrl_cmd(0xF3); | |
send_data_cmd(0x70); | |
send_ctrl_cmd(0XB4); // Display Inversion Control | |
send_data_cmd(0x02); | |
send_ctrl_cmd(0XC0); // Power Control 1 | |
send_data_cmd(0x0F); | |
send_data_cmd(0x0B); | |
send_data_cmd(0x0A); | |
send_ctrl_cmd(0XC1); // Power Control 2 | |
send_data_cmd(0x17); | |
send_data_cmd(0x80); | |
send_data_cmd(0x68); | |
send_data_cmd(0x20); | |
send_ctrl_cmd(0XD8); // VGLO Selection | |
send_data_cmd(0x50); | |
send_ctrl_cmd(0XFC); // VGLO Selection | |
send_data_cmd(0x07); | |
send_ctrl_cmd(0XE0); // Positive Gamma Control | |
send_data_cmd(0x00); | |
send_data_cmd(0x04); | |
send_data_cmd(0x0C); | |
send_data_cmd(0x12); | |
send_data_cmd(0x13); | |
send_data_cmd(0x1D); | |
send_data_cmd(0XCA); | |
send_data_cmd(0x09); | |
send_data_cmd(0x04); | |
send_data_cmd(0x0B); | |
send_data_cmd(0x03); | |
send_data_cmd(0x0B); | |
send_data_cmd(0x0E); | |
send_data_cmd(0x2D); | |
send_data_cmd(0x2A); | |
send_data_cmd(0x00); | |
send_ctrl_cmd(0XE1); // Negative Gamma Control | |
send_data_cmd(0x00); | |
send_data_cmd(0x01); | |
send_data_cmd(0x04); | |
send_data_cmd(0x0A); | |
send_data_cmd(0x0E); | |
send_data_cmd(0x11); | |
send_data_cmd(0X79); | |
send_data_cmd(0x09); | |
send_data_cmd(0x04); | |
send_data_cmd(0x08); | |
send_data_cmd(0x08); | |
send_data_cmd(0x0B); | |
send_data_cmd(0x09); | |
send_data_cmd(0x34); | |
send_data_cmd(0x2E); | |
send_data_cmd(0x00); | |
send_ctrl_cmd(0XD5); // Source Timing Adjust | |
send_data_cmd(0x0D); | |
send_data_cmd(0x0A); | |
send_data_cmd(0x05); | |
send_data_cmd(0x05); | |
send_data_cmd(0xCB); | |
send_data_cmd(0XA5); | |
send_data_cmd(0x01); | |
send_data_cmd(0x04); | |
send_ctrl_cmd(0XF7); // Resolution | |
send_data_cmd(0x8A); | |
send_ctrl_cmd(0XC7); // Vcom | |
send_data_cmd(0x6F); | |
send_ctrl_cmd(0X3A); // Vcom | |
send_data_cmd(0x77); | |
send_ctrl_cmd(0X11); // Exit Sleep -> Wake up dude | |
mdelay(120) ; | |
send_ctrl_cmd(0XEE); | |
send_data_cmd(0x0A); | |
send_data_cmd(0x1B); | |
send_data_cmd(0x5F); | |
send_data_cmd(0x40); | |
send_data_cmd(0x00); | |
send_data_cmd(0X00); | |
send_data_cmd(0x10); | |
send_data_cmd(0x00); | |
send_data_cmd(0x58); | |
send_ctrl_cmd(0X29); // Display On finally -_- | |
mdelay(20); | |
} | |
static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) | |
{ | |
memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); | |
} | |
static void lcm_get_params(LCM_PARAMS *params) | |
{ | |
memset(params, 0, sizeof(LCM_PARAMS)); | |
params->type = LCM_TYPE_DBI; | |
params->ctrl = LCM_CTRL_PARALLEL_DBI; | |
params->width = 480; | |
params->height = 800; | |
params->io_select_mode = 3; | |
params->dbi.port = 1; | |
params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; | |
params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; | |
params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; | |
params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; | |
params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; | |
params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; | |
params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; | |
params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; | |
params->dbi.io_driving_current = 0; | |
params->dbi.parallel.write_setup = 1; | |
params->dbi.parallel.write_hold = 1; | |
params->dbi.parallel.write_wait = 3; | |
params->dbi.parallel.read_setup = 1; | |
params->dbi.parallel.read_latency = 31; | |
params->dbi.parallel.wait_period = 2; | |
} | |
static void lcm_init(void) | |
{ | |
SET_RESET_PIN(0); | |
MDELAY(200); | |
SET_RESET_PIN(1); | |
MDELAY(400); | |
init_lcm_registers(); | |
} | |
static void lcm_suspend(void) | |
{ | |
send_ctrl_cmd(0x0028); | |
MDELAY(20); | |
send_ctrl_cmd(0x0010); | |
MDELAY(20); | |
} | |
static void lcm_resume(void) | |
{ | |
send_ctrl_cmd(0x0011); | |
MDELAY(20); | |
send_ctrl_cmd(0x0029); | |
MDELAY(20); | |
} | |
static void lcm_update(unsigned int x, unsigned int y, | |
unsigned int width, unsigned int height) | |
{ | |
unsigned int x0 = x; | |
unsigned int y0 = y; | |
unsigned int x1 = x0 + width - 1; | |
unsigned int y1 = y0 + height - 1; | |
send_ctrl_cmd(0x2A); | |
send_data_cmd(HIGH_BYTE(x0)); | |
send_data_cmd(LOW_BYTE(x0)); | |
send_data_cmd(HIGH_BYTE(x1)); | |
send_data_cmd(LOW_BYTE(x1)); | |
send_ctrl_cmd(0x2B); | |
send_data_cmd(HIGH_BYTE(y0)); | |
send_data_cmd(LOW_BYTE(y0)); | |
send_data_cmd(HIGH_BYTE(y1)); | |
send_data_cmd(LOW_BYTE(y1)); | |
send_ctrl_cmd(0x2C); | |
} | |
LCM_DRIVER ili980c_dsi_vdo_dijing_lcm_drv = | |
{ | |
.name = "ili980c_dsi_vdo_dijing", | |
.set_util_funcs = lcm_set_util_funcs, | |
.get_params = lcm_get_params, | |
.init = lcm_init, | |
.suspend = lcm_suspend, | |
.resume = lcm_resume, | |
.update = lcm_update, | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment