driver for lcd_hx8357.

This commit is contained in:
root
2010-07-15 18:05:32 +08:00
parent abca186c26
commit 052ebff0c7
3 changed files with 379 additions and 1 deletions

View File

@@ -5,6 +5,8 @@ config LCD_NULL
bool "NULL"
config LCD_TD043MGEA1
bool "RGB TD043MGEA1"
config LCD_HX8357
bool "RGB HX8357"
config LCD_TJ048NC01CA
bool "RGB TJ048NC01CA"
config LCD_HL070VM4AU

View File

@@ -16,6 +16,6 @@ obj-$(CONFIG_LCD_NT35580) += lcd_nt35580.o
obj-$(CONFIG_HDMI_ANX7150) += hdmi_anx7150.o
obj-$(CONFIG_LCD_HX8357) += lcd_hx8357.o

View File

@@ -0,0 +1,376 @@
#include <linux/fb.h>
#include <linux/delay.h>
#include "../../rk2818_fb.h"
#include <mach/gpio.h>
#include <mach/iomux.h>
#include "screen.h"
/* Base */
#define OUT_TYPE SCREEN_RGB
#define OUT_FACE OUT_P666 /*OUT_P888*/
#define OUT_CLK 12 //***27
/* Timing */
#define H_PW 8
#define H_BP 6
#define H_VD 320 //***800
#define H_FP 6
#define V_PW 12
#define V_BP 4
#define V_VD 480 //***480
#define V_FP 4
/* Other */
#define DCLK_POL 0
#define SWAP_RB 1
int init(void);
int standby(u8 enable);
void set_lcd_info(struct rk28fb_screen *screen);
static void screen_set_iomux(u8 enable)
{
int ret=-1;
if(enable)
{
rk2818_mux_api_set(GPIOH6_IQ_SEL_NAME, 0);
ret = gpio_request(RK2818_PIN_PH6, NULL);
if(0)//(ret != 0)
{
gpio_free(RK2818_PIN_PH6);
printk(">>>>>> lcd cs gpio_request err \n ");
goto pin_err;
}
rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, 1);
ret = gpio_request(RK2818_PIN_PE5, NULL);
if(0)//(ret != 0)
{
gpio_free(RK2818_PIN_PE5);
printk(">>>>>> lcd clk gpio_request err \n ");
goto pin_err;
}
ret = gpio_request(RK2818_PIN_PE4, NULL);
if(0)//(ret != 0)
{
gpio_free(RK2818_PIN_PE4);
printk(">>>>>> lcd txd gpio_request err \n ");
goto pin_err;
}
}
else
{
gpio_free(RK2818_PIN_PH6);
// rk2818_mux_api_set(CXGPIO_HSADC_SEL_NAME, 1);
gpio_free(RK2818_PIN_PE5);
gpio_free(RK2818_PIN_PE4);
rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, 0);
}
return ;
pin_err:
return ;
}
void set_lcd_info(struct rk28fb_screen *screen)
{
printk("lcd_hx8357 set_lcd_info \n");
/* screen type & face */
screen->type = OUT_TYPE;
screen->face = OUT_FACE;
/* Screen size */
screen->x_res = H_VD;
screen->y_res = V_VD;
/* Timing */
screen->pixclock = OUT_CLK;
screen->left_margin = H_BP; /*>2*/
screen->right_margin = H_FP; /*>2*/
screen->hsync_len = H_PW; /*>2*/ //***all > 326, 4<PW+BP<15,
screen->upper_margin = V_BP; /*>2*/
screen->lower_margin = V_FP; /*>2*/
screen->vsync_len = V_PW; /*>6*/
/* Pin polarity */
screen->pin_hsync = 0;
screen->pin_vsync = 0;
screen->pin_den = 0;
screen->pin_dclk = DCLK_POL;
/* Swap rule */
screen->swap_rb = SWAP_RB;
screen->swap_rg = 0;
screen->swap_gb = 0;
screen->swap_delta = 0;
screen->swap_dumy = 0;
/* Operation function*/
screen->init = init;
screen->standby = standby;
}
void spi_screenreg_set(u32 Addr, u32 Data)
{
#define CS_OUT() gpio_direction_output(RK2818_PIN_PH6, GPIO_OUT)
#define CS_SET() gpio_set_value(RK2818_PIN_PH6, GPIO_HIGH)
#define CS_CLR() gpio_set_value(RK2818_PIN_PH6, GPIO_LOW)
#define CLK_OUT() gpio_direction_output(RK2818_PIN_PE5, GPIO_OUT) //I2C0_SCL
#define CLK_SET() gpio_set_value(RK2818_PIN_PE5, GPIO_HIGH)
#define CLK_CLR() gpio_set_value(RK2818_PIN_PE5, GPIO_LOW)
#define TXD_OUT() gpio_direction_output(RK2818_PIN_PE4, GPIO_OUT) //I2C0_SDA
#define TXD_SET() gpio_set_value(RK2818_PIN_PE4, GPIO_HIGH)
#define TXD_CLR() gpio_set_value(RK2818_PIN_PE4, GPIO_LOW)
#define DRVDelayUs(i) udelay(i*2)
u32 i;
u32 control_bit;
TXD_OUT();
CLK_OUT();
CS_OUT();
DRVDelayUs(2);
DRVDelayUs(2);
CS_SET();
TXD_SET();
CLK_SET();
DRVDelayUs(2);
CS_CLR();
control_bit = 0x70<<8;
Addr = (control_bit | Addr);
//printk("addr is 0x%x \n", Addr);
for(i = 0; i < 16; i++) //reg
{
if(Addr &(1<<(15-i)))
TXD_SET();
else
TXD_CLR();
// \u6a21\u62dfCLK
CLK_CLR();
DRVDelayUs(2);
CLK_SET();
DRVDelayUs(2);
}
CS_SET();
TXD_SET();
CLK_SET();
DRVDelayUs(2);
CS_CLR();
#if 0
TXD_CLR(); //write
// \u6a21\u62dfCLK
CLK_CLR();
DRVDelayUs(2);
CLK_SET();
DRVDelayUs(2);
TXD_SET(); //highz
// \u6a21\u62dfCLK
CLK_CLR();
DRVDelayUs(2);
CLK_SET();
DRVDelayUs(2);
#endif
control_bit = 0x72<<8;
Data = (control_bit | Data);
//printk("data is 0x%x \n", Data);
for(i = 0; i < 16; i++) //data
{
if(Data &(1<<(15-i)))
TXD_SET();
else
TXD_CLR();
// \u6a21\u62dfCLK
CLK_CLR();
DRVDelayUs(2);
CLK_SET();
DRVDelayUs(2);
}
CS_SET();
CLK_CLR();
TXD_CLR();
DRVDelayUs(2);
}
int init(void)
{
printk("lcd_hx8357 init \n");
screen_set_iomux(1);
#if 0 //***<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
spi_screenreg_set(0x02, 0x07);
spi_screenreg_set(0x03, 0x5f);
spi_screenreg_set(0x04, 0x17);
spi_screenreg_set(0x05, 0x20);
spi_screenreg_set(0x06, 0x08);
spi_screenreg_set(0x07, 0x20);
spi_screenreg_set(0x08, 0x20);
spi_screenreg_set(0x09, 0x20);
spi_screenreg_set(0x0a, 0x20);
spi_screenreg_set(0x0b, 0x22);
spi_screenreg_set(0x0c, 0x22);
spi_screenreg_set(0x0d, 0x22);
spi_screenreg_set(0x0e, 0x10);
spi_screenreg_set(0x0f, 0x10);
spi_screenreg_set(0x10, 0x10);
spi_screenreg_set(0x11, 0x15);
spi_screenreg_set(0x12, 0xAA);
spi_screenreg_set(0x13, 0xFF);
spi_screenreg_set(0x14, 0xb0);
spi_screenreg_set(0x15, 0x8e);
spi_screenreg_set(0x16, 0xd6);
spi_screenreg_set(0x17, 0xfe);
spi_screenreg_set(0x18, 0x28);
spi_screenreg_set(0x19, 0x52);
spi_screenreg_set(0x1A, 0x7c);
spi_screenreg_set(0x1B, 0xe9);
spi_screenreg_set(0x1C, 0x42);
spi_screenreg_set(0x1D, 0x88);
spi_screenreg_set(0x1E, 0xb8);
spi_screenreg_set(0x1F, 0xFF);
spi_screenreg_set(0x20, 0xF0);
spi_screenreg_set(0x21, 0xF0);
spi_screenreg_set(0x22, 0x09);
#else
spi_screenreg_set(0xff, 0x00);
spi_screenreg_set(0x16, 0x08);
spi_screenreg_set(0x01, 0x02);
spi_screenreg_set(0xe2, 0x00);
spi_screenreg_set(0xe3, 0x00);
spi_screenreg_set(0xf2, 0x00);
spi_screenreg_set(0xe4, 0x1c);
spi_screenreg_set(0xe5, 0x1c);
spi_screenreg_set(0xe6, 0x00);
spi_screenreg_set(0xe7, 0x1c);
spi_screenreg_set(0x19, 0x01);
mdelay(10);
spi_screenreg_set(0x2a, 0x00);
spi_screenreg_set(0x2b, 0x13);
spi_screenreg_set(0x2f, 0x01);
spi_screenreg_set(0x02, 0x00);
spi_screenreg_set(0x03, 0x00);
spi_screenreg_set(0x04, 0x01);
spi_screenreg_set(0x05, 0x3f);
spi_screenreg_set(0x06, 0x00);
spi_screenreg_set(0x07, 0x00);
spi_screenreg_set(0x08, 0x01);
spi_screenreg_set(0x09, 0xdf);
spi_screenreg_set(0x24, 0x91);
spi_screenreg_set(0x25, 0x8a);
spi_screenreg_set(0x29, 0x01);
spi_screenreg_set(0x18, 0x22);
spi_screenreg_set(0x1b, 0x30);
mdelay(10);
spi_screenreg_set(0x1d, 0x22);
mdelay(10);
spi_screenreg_set(0x40, 0x00);
spi_screenreg_set(0x41, 0x3c);
spi_screenreg_set(0x42, 0x38);
spi_screenreg_set(0x43, 0x34);
spi_screenreg_set(0x44, 0x2e);
spi_screenreg_set(0x45, 0x2f);
spi_screenreg_set(0x46, 0x41);
spi_screenreg_set(0x47, 0x7d);
spi_screenreg_set(0x48, 0x0b);
spi_screenreg_set(0x49, 0x05);
spi_screenreg_set(0x4a, 0x06);
spi_screenreg_set(0x4b, 0x12);
spi_screenreg_set(0x4c, 0x16);
spi_screenreg_set(0x50, 0x10);
spi_screenreg_set(0x51, 0x11);
spi_screenreg_set(0x52, 0x0b);
spi_screenreg_set(0x53, 0x07);
spi_screenreg_set(0x54, 0x03);
spi_screenreg_set(0x55, 0x3f);
spi_screenreg_set(0x56, 0x02);
spi_screenreg_set(0x57, 0x3e);
spi_screenreg_set(0x58, 0x09);
spi_screenreg_set(0x59, 0x0d);
spi_screenreg_set(0x5a, 0x19);
spi_screenreg_set(0x5b, 0x1a);
spi_screenreg_set(0x5c, 0x14);
spi_screenreg_set(0x5d, 0xc0);
spi_screenreg_set(0x1a, 0x05);
mdelay(10);
spi_screenreg_set(0x1c, 0x03);
mdelay(10);
spi_screenreg_set(0x1f, 0x90);
mdelay(10);
spi_screenreg_set(0x1f, 0xd2);
mdelay(10);
spi_screenreg_set(0x28, 0x04);
mdelay(40);
spi_screenreg_set(0x28, 0x38);
mdelay(40);
spi_screenreg_set(0x28, 0x3c);
mdelay(40);
spi_screenreg_set(0x80, 0x00);
spi_screenreg_set(0x81, 0x00);
spi_screenreg_set(0x82, 0x00);
spi_screenreg_set(0x83, 0x00);
spi_screenreg_set(0x60, 0x08);
spi_screenreg_set(0x31, 0x02);
spi_screenreg_set(0x32, 0x08 /*0x00*/);
spi_screenreg_set(0x17, 0x60); //***RGB666
spi_screenreg_set(0x2d, 0x1f);
spi_screenreg_set(0xe8, 0x90);
#endif
screen_set_iomux(0);
return 0;
}
int standby(u8 enable) //***enable =1 means suspend, 0 means resume
{
screen_set_iomux(1);
if(enable) {
printk("---------screen suspend--------------\n");
#if 0
spi_screenreg_set(0x03, 0xde);
#else
spi_screenreg_set(0x1f, 0x91);
spi_screenreg_set(0x19, 0x00);
#endif
} else {
printk("---------screen resume--------------\n ");
#if 0
spi_screenreg_set(0x03, 0x5f);
#else
spi_screenreg_set(0x19, 0x01);
spi_screenreg_set(0x1f, 0x90);
mdelay(10);
spi_screenreg_set(0x1f, 0xd2);
#endif
}
screen_set_iomux(0);
return 0;
}