Skip to content

Instantly share code, notes, and snippets.

@rtzui
Created July 26, 2013 15:00
Show Gist options
  • Save rtzui/6089580 to your computer and use it in GitHub Desktop.
Save rtzui/6089580 to your computer and use it in GitHub Desktop.
itdb0232wd is 3.2" wide screen display, this is absolutely untested.
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/gpio.h>
#include <linux/spi/spi.h>
#include <linux/delay.h>
#include "fbtft.h"
#define DRVNAME "itdb0232wd"
#define WIDTH 239
#define HEIGHT 399
/* Module Parameter: debug (also available through sysfs) */
MODULE_PARM_DEBUG;
static int itdb0232wd_init_display(struct fbtft_par *par)
{
fbtft_dev_dbg(DEBUG_INIT_DISPLAY, par->info->device, "%s()\n", __func__);
printk("Hello World!\n I guess the initialisation sequence should go here.");
// utft.cpp line 1055 and following
write_cmd(par,0x83);
write_data(par,0x02); //TESTM=1
write_cmd(par,0x85);
write_data(par,0x03); //VDC_SEL=011
write_cmd(par,0x8B);
write_data(par,0x01);
write_cmd(par,0x8C);
write_data(par,0x93); //STBA[7]=1,STBA[5:4]=01,STBA[1:0]=11
write_cmd(par,0x91);
write_data(par,0x01); //DCDC_SYNC=1
write_cmd(par,0x83);
write_data(par,0x00); //TESTM=0
//Gamma Setting
write_cmd(par,0x3E);
write_data(par,0xB0);
write_cmd(par,0x3F);
write_data(par,0x03);
write_cmd(par,0x40);
write_data(par,0x10);
write_cmd(par,0x41);
write_data(par,0x56);
write_cmd(par,0x42);
write_data(par,0x13);
write_cmd(par,0x43);
write_data(par,0x46);
write_cmd(par,0x44);
write_data(par,0x23);
write_cmd(par,0x45);
write_data(par,0x76);
write_cmd(par,0x46);
write_data(par,0x00);
write_cmd(par,0x47);
write_data(par,0x5E);
write_cmd(par,0x48);
write_data(par,0x4F);
write_cmd(par,0x49);
write_data(par,0x40);
//**********Power On sequence************
write_cmd(par,0x17);
write_data(par,0x91);
write_cmd(par,0x2B);
write_data(par,0xF9);
mdelay(10);
write_cmd(par,0x1B);
write_data(par,0x14);
write_cmd(par,0x1A);
write_data(par,0x11);
write_cmd(par,0x1C);
write_data(par,0x06);
write_cmd(par,0x1F);
write_data(par,0x42);
mdelay(20);
write_cmd(par,0x19);
write_data(par,0x0A);
write_cmd(par,0x19);
write_data(par,0x1A);
mdelay(40);
write_cmd(par,0x19);
write_data(par,0x12);
mdelay(40);
write_cmd(par,0x1E);
write_data(par,0x27);
mdelay(100);
//**********DISPLAY ON SETTING***********
write_cmd(par,0x24);
write_data(par,0x60);
write_cmd(par,0x3D);
write_data(par,0x40);
write_cmd(par,0x34);
write_data(par,0x38);
write_cmd(par,0x35);
write_data(par,0x38);
write_cmd(par,0x24);
write_data(par,0x38);
mdelay(40);
write_cmd(par,0x24);
write_data(par,0x3C);
write_cmd(par,0x16);
write_data(par,0x1C);
write_cmd(par,0x01);
write_data(par,0x06);
write_cmd(par,0x55);
write_data(par,0x00);
write_cmd(par,0x02);
write_data(par,0x00);
write_cmd(par,0x03);
write_data(par,0x00);
write_cmd(par,0x04);
write_data(par,0x00);
write_cmd(par,0x05);
write_data(par,0xef);
write_cmd(par,0x06);
write_data(par,0x00);
write_cmd(par,0x07);
write_data(par,0x00);
write_cmd(par,0x08);
write_data(par,0x01);
write_cmd(par,0x09);
write_data(par,0x8f);
write_cmd(par,0x22);
// init sequence end.
return 0;
}
static int itdb0232wd_write_vmem(struct fbtft_par *par)
{
u16 *vmem16 = (u16 *)par->info->screen_base;
int x, y;
char r,g,b;
fbtft_fbtft_dev_dbg(DEBUG_WRITE_VMEM, par, par->info->device, "%s()\n", __func__);
for (x=0;x<239;x++) {
for (y=0;y<399;y++) {
drawPixel(x,y,vmem16[y*399+x]);
}
}
}
// straight from the utft libary.
void drawPixel(int x, int y, u16 pixel)
{
//cbi(P_CS, B_CS);
//PORT_CS &= ~(1<<P_CS);
// pull CS to low
write_cmd(0x20)
setXY(x, y, x, y);
//setPixel(fcolorr, fcolorg, fcolorb);
//write_data(((r&248)|g>>5),((g&28)<<3|b>>3)); // rrrrrggggggbbbbb
write_data(pixel); // rrrrrggggggbbbbb ?!?!?
//sbi(P_CS, B_CS);
//PORT_CS &= ~(1<<P_CS);
// pull CS to high
write_cmd(0x21)
// clrXY();
setXY(0,0,239,399);
}
void setXY(char x1, char y1, char x2, char y2)
{
LCD_Write_COM_DATA(0x02,x1>>8);
LCD_Write_COM_DATA(0x03,x1);
LCD_Write_COM_DATA(0x04,x2>>8);
LCD_Write_COM_DATA(0x05,x2);
LCD_Write_COM_DATA(0x06,y1>>8);
LCD_Write_COM_DATA(0x07,y1);
LCD_Write_COM_DATA(0x08,y2>>8);
LCD_Write_COM_DATA(0x09,y2);
write_cmd(par,0x22);
}
void LCD_Write_COM_DATA(char com1,int dat1)
{
write_cmd(com1);
write_data(dat1);
}
struct fbtft_display itdb0232wd_display = {
.width = WIDTH,
.height = HEIGHT,
};
static int itdb0232wd_probe(struct spi_device *spi)
{
struct fb_info *info;
struct fbtft_par *par;
int ret;
fbtft_dev_dbg(DEBUG_DRIVER_INIT_FUNCTIONS, &spi->dev, "%s()\n", __func__);
info = fbtft_framebuffer_alloc(&itdb0232wd_display, &spi->dev);
if (!info)
return -ENOMEM;
par = info->par;
par->spi = spi;
fbtft_debug_init(par);
par->fbtftops.init_display = itdb0232wd_init_display;
ret = fbtft_register_framebuffer(info);
if (ret < 0)
goto out_release;
return 0;
out_release:
fbtft_framebuffer_release(info);
return ret;
}
static int itdb0232wd_remove(struct spi_device *spi)
{
struct fb_info *info = spi_get_drvdata(spi);
fbtft_dev_dbg(DEBUG_DRIVER_INIT_FUNCTIONS, &spi->dev, "%s()\n", __func__);
if (info) {
fbtft_unregister_framebuffer(info);
fbtft_framebuffer_release(info);
}
return 0;
}
static struct spi_driver itdb0232wd_driver = {
.driver = {
.name = DRVNAME,
.owner = THIS_MODULE,
},
.probe = itdb0232wd_probe,
.remove = itdb0232wd_remove,
};
static int __init itdb0232wd_init(void)
{
fbtft_pr_debug("\n\n"DRVNAME": %s()\n", __func__);
return spi_register_driver(&itdb0232wd_driver);
}
static void __exit itdb0232wd_exit(void)
{
fbtft_pr_debug(DRVNAME": %s()\n", __func__);
spi_unregister_driver(&itdb0232wd_driver);
}
/* ------------------------------------------------------------------------- */
module_init(itdb0232wd_init);
module_exit(itdb0232wd_exit);
MODULE_DESCRIPTION("First try itdb02-32wd driver");
MODULE_AUTHOR("rtzui");
MODULE_LICENSE("GPL");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment