Skip to content

Instantly share code, notes, and snippets.

@aniruddha-adhikary
Created April 26, 2014 17:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aniruddha-adhikary/11325212 to your computer and use it in GitHub Desktop.
Save aniruddha-adhikary/11325212 to your computer and use it in GitHub Desktop.
ILI980C Driver
#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