s5pv210 hx8369 lcd配制

来源:互联网 发布:linux mint与ubuntu 编辑:程序博客网 时间:2024/05/18 16:14

u-boot中配制hx8369,IO模拟SPI.

/**gzsd add*/#include<regs.h>#include <common.h>#include <asm/io.h>#ifdef CONFIG_GZSD210_LCDstatic void set_cs(int cs){int reg;reg = readl(GPF1DAT);reg &= ~(0x1 << 5);reg |= (cs << 5);writel(reg,GPF1DAT);}static void set_clk(int clk){int reg;reg = readl(GPF1DAT);reg &= ~(0x1 << 4);reg |= (clk << 4);writel(reg,GPF1DAT);}static void set_outdata(int outdata){int reg;#if0reg = readl(GPF0CON);reg &= ~(0xf << 20);reg |= (0x1<< 20);writel(reg,GPF0CON);reg = readl(GPF0DAT);reg &= ~(0x1 << 5);reg |= (outdata << 5);writel(reg,GPF0DAT);#elsereg = readl(GPF0DAT);reg &= ~(0x1 << 6);reg |= (outdata << 6);writel(reg,GPF0DAT);#endif}static void send_data(unsigned int data){unsigned int i;int clk_num;int clk_mask;set_cs(0);udelay(10);set_clk(1);set_outdata(1);udelay(10);clk_num = 9;clk_mask = 0x100;udelay(50);for(i = 0; i < clk_num; ++i){set_clk(0);if(data & clk_mask){set_outdata(1);}else{set_outdata(0);}udelay(100);set_clk(1);udelay(100);data <<= 1;}set_outdata(1);set_cs(1);}static void hx8369_write_cmd(unsigned int cmd){unsigned int out;out = (cmd & 0xFF);send_data(out);}static void hx8369_write_data(unsigned int data){unsigned int out = (data & 0xFF) | 0x100;send_data(out);}static void set_hx8369(void){hx8369_write_cmd(0xB9);  // SET password         hx8369_write_data(0xFF);           hx8369_write_data(0x83);           hx8369_write_data(0x69);        hx8369_write_cmd(0xB1);  //Set Power         hx8369_write_data(0x01);                                   hx8369_write_data(0x00);                                   hx8369_write_data(0x34);                                   hx8369_write_data(0x06);                                   hx8369_write_data(0x00);                                   hx8369_write_data(0x11);                                   hx8369_write_data(0x11);                                   hx8369_write_data(0x2A);                                   hx8369_write_data(0x32);                                   hx8369_write_data(0x3F);                                   hx8369_write_data(0x3F);                                   hx8369_write_data(0x07);                                   hx8369_write_data(0x23);                                   hx8369_write_data(0x01);                                   hx8369_write_data(0xE6);                                   hx8369_write_data(0xE6);                                   hx8369_write_data(0xE6);                                   hx8369_write_data(0xE6);                                   hx8369_write_data(0xE6);        hx8369_write_cmd(0xB2);  // SET Display  480x800         hx8369_write_data(0x00);           hx8369_write_data(0x2B);           hx8369_write_data(0x03);           hx8369_write_data(0x03);           hx8369_write_data(0x70);           hx8369_write_data(0x00);           hx8369_write_data(0xFF);           hx8369_write_data(0x00);           hx8369_write_data(0x00);           hx8369_write_data(0x00);           hx8369_write_data(0x00);           hx8369_write_data(0x03);           hx8369_write_data(0x03);           hx8369_write_data(0x00);           hx8369_write_data(0x01);        hx8369_write_cmd(0xB4);  // SET Display  480x800         hx8369_write_data(0x00);           hx8369_write_data(0x0C);           hx8369_write_data(0xA0);         hx8369_write_data(0x0E);           hx8369_write_data(0x06);        hx8369_write_cmd(0xB6);  // SET VCOM         hx8369_write_data(0x10);           hx8369_write_data(0x10);        hx8369_write_cmd(0xD5);  // SET GIP        hx8369_write_data(0x00);           hx8369_write_data(0x05);           hx8369_write_data(0x03);           hx8369_write_data(0x00);           hx8369_write_data(0x01);           hx8369_write_data(0x09);           hx8369_write_data(0x10);           hx8369_write_data(0x80);           hx8369_write_data(0x37);           hx8369_write_data(0x37);           hx8369_write_data(0x20);           hx8369_write_data(0x31);           hx8369_write_data(0x46);           hx8369_write_data(0x8A);           hx8369_write_data(0x57);           hx8369_write_data(0x9B);           hx8369_write_data(0x20);           hx8369_write_data(0x31);           hx8369_write_data(0x46);           hx8369_write_data(0x8A);           hx8369_write_data(0x57);           hx8369_write_data(0x9B);           hx8369_write_data(0x07);           hx8369_write_data(0x0F);           hx8369_write_data(0x02);           hx8369_write_data(0x00);        hx8369_write_cmd(0xE0); // SET Gamma        hx8369_write_data(0x00);         hx8369_write_data(0x08);         hx8369_write_data(0x0D);         hx8369_write_data(0x2D);         hx8369_write_data(0x34);         hx8369_write_data(0x3F);         hx8369_write_data(0x19);         hx8369_write_data(0x38);         hx8369_write_data(0x09);         hx8369_write_data(0x0E);         hx8369_write_data(0x0E);         hx8369_write_data(0x12);         hx8369_write_data(0x14);         hx8369_write_data(0x12);         hx8369_write_data(0x14);         hx8369_write_data(0x13);         hx8369_write_data(0x19);         hx8369_write_data(0x00);         hx8369_write_data(0x08);         hx8369_write_data(0x0D);         hx8369_write_data(0x2D);         hx8369_write_data(0x34);         hx8369_write_data(0x3F);         hx8369_write_data(0x19);         hx8369_write_data(0x38);         hx8369_write_data(0x09);         hx8369_write_data(0x0E);         hx8369_write_data(0x0E);         hx8369_write_data(0x12);         hx8369_write_data(0x14);         hx8369_write_data(0x12);         hx8369_write_data(0x14);         hx8369_write_data(0x13);         hx8369_write_data(0x19); hx8369_write_cmd(0xC1); hx8369_write_data(0x01); //enable DGC function hx8369_write_data(0x02); //SET R-GAMMA hx8369_write_data(0x08); hx8369_write_data(0x12); hx8369_write_data(0x1A); hx8369_write_data(0x22); hx8369_write_data(0x2A); hx8369_write_data(0x31); hx8369_write_data(0x36); hx8369_write_data(0x3F); hx8369_write_data(0x48); hx8369_write_data(0x51); hx8369_write_data(0x58); hx8369_write_data(0x60); hx8369_write_data(0x68); hx8369_write_data(0x70); hx8369_write_data(0x78); hx8369_write_data(0x80); hx8369_write_data(0x88); hx8369_write_data(0x90); hx8369_write_data(0x98); hx8369_write_data(0xA0); hx8369_write_data(0xA7); hx8369_write_data(0xAF); hx8369_write_data(0xB6); hx8369_write_data(0xBE); hx8369_write_data(0xC7); hx8369_write_data(0xCE); hx8369_write_data(0xD6); hx8369_write_data(0xDE); hx8369_write_data(0xE6); hx8369_write_data(0xEF); hx8369_write_data(0xF5); hx8369_write_data(0xFB); hx8369_write_data(0xFC); hx8369_write_data(0xFE); hx8369_write_data(0x8C); hx8369_write_data(0xA4); hx8369_write_data(0x19); hx8369_write_data(0xEC); hx8369_write_data(0x1B); hx8369_write_data(0x4C); hx8369_write_data(0x40);     hx8369_write_data(0x02); //SET G-Gamma hx8369_write_data(0x08); hx8369_write_data(0x12); hx8369_write_data(0x1A); hx8369_write_data(0x22); hx8369_write_data(0x2A); hx8369_write_data(0x31); hx8369_write_data(0x36); hx8369_write_data(0x3F); hx8369_write_data(0x48); hx8369_write_data(0x51); hx8369_write_data(0x58); hx8369_write_data(0x60); hx8369_write_data(0x68); hx8369_write_data(0x70); hx8369_write_data(0x78); hx8369_write_data(0x80); hx8369_write_data(0x88); hx8369_write_data(0x90); hx8369_write_data(0x98); hx8369_write_data(0xA0); hx8369_write_data(0xA7); hx8369_write_data(0xAF); hx8369_write_data(0xB6); hx8369_write_data(0xBE); hx8369_write_data(0xC7); hx8369_write_data(0xCE); hx8369_write_data(0xD6); hx8369_write_data(0xDE); hx8369_write_data(0xE6); hx8369_write_data(0xEF); hx8369_write_data(0xF5); hx8369_write_data(0xFB); hx8369_write_data(0xFC); hx8369_write_data(0xFE); hx8369_write_data(0x8C); hx8369_write_data(0xA4); hx8369_write_data(0x19); hx8369_write_data(0xEC); hx8369_write_data(0x1B); hx8369_write_data(0x4C); hx8369_write_data(0x40); hx8369_write_data(0x02); //SET B-Gamma hx8369_write_data(0x08); hx8369_write_data(0x12); hx8369_write_data(0x1A); hx8369_write_data(0x22); hx8369_write_data(0x2A); hx8369_write_data(0x31); hx8369_write_data(0x36); hx8369_write_data(0x3F); hx8369_write_data(0x48); hx8369_write_data(0x51); hx8369_write_data(0x58); hx8369_write_data(0x60); hx8369_write_data(0x68); hx8369_write_data(0x70); hx8369_write_data(0x78); hx8369_write_data(0x80); hx8369_write_data(0x88); hx8369_write_data(0x90); hx8369_write_data(0x98); hx8369_write_data(0xA0); hx8369_write_data(0xA7); hx8369_write_data(0xAF); hx8369_write_data(0xB6); hx8369_write_data(0xBE); hx8369_write_data(0xC7); hx8369_write_data(0xCE); hx8369_write_data(0xD6); hx8369_write_data(0xDE); hx8369_write_data(0xE6); hx8369_write_data(0xEF); hx8369_write_data(0xF5); hx8369_write_data(0xFB); hx8369_write_data(0xFC); hx8369_write_data(0xFE); hx8369_write_data(0x8C); hx8369_write_data(0xA4); hx8369_write_data(0x19); hx8369_write_data(0xEC); hx8369_write_data(0x1B); hx8369_write_data(0x4C); hx8369_write_data(0x40); hx8369_write_cmd(0x3A); //24 bits//hx8369_write_data(0x77);//18 bitshx8369_write_data(0x66);  hx8369_write_cmd(0x11); udelay(120000); hx8369_write_cmd(0x29);}static void lcd_reset(){int reg;reg = readl(GPF2CON);//resetreg &= ~(0xf << 16);reg |= (0x1<< 16);writel(reg,GPF2CON);reg = readl(GPF2DAT);reg |= (0x1 << 4);writel(reg,GPF2DAT);//udelay(100000);udelay(10000);reg = readl(GPF2DAT);reg &= ~(0x1 << 4);writel(reg,GPF2DAT);//udelay(200000);udelay(20000);reg = readl(GPF2DAT);reg |= (0x1 << 4);writel(reg,GPF2DAT);udelay(10000);//set_clk(1);//keep in stop state more than 6ms//set_outdata(1);//udelay(10000);}static void gpio_cfg(){int reg;reg = readl(GPF1CON);//csreg &= ~(0xf << 20);reg |= (0x1<< 20);writel(reg,GPF1CON);reg = readl(GPF1CON);//clkreg &= ~(0xf << 16);reg |= (0x1<< 16);writel(reg,GPF1CON);reg = readl(GPF0CON);// outdatareg &= ~(0xf << 24);reg |= (0x1<< 24);writel(reg,GPF0CON);set_clk(1);//keep in stop state more than 6msset_cs(1);set_outdata(1);udelay(10000);reg = readl(GPF0CON);//set 3.3vreg &= ~(0xf << 16);reg |= (0x1<< 16);writel(reg,GPF0CON);reg = readl(GPF0DAT);reg &= ~(0x1 << 4);writel(reg, GPF0DAT);}/*lcd config*/void lcd_config(){gpio_cfg();lcd_reset();set_hx8369();set_cs(1);set_clk(1);set_outdata(1);}#endif

 

内核中增加相关配制

//gzsd#ifdef CONFIG_FB_S3C_TFT480static struct s3cfb_lcd hx8369 = {        .width = 480,//480,        .height = 800,//800,        //.p_width = 52,        //.p_height = 86,        .bpp = 24,        .freq = 60,         .timing = {#if1                .h_fp = 32,                .h_bp = 32,                .h_sw = 14,                .v_fp = 12,                .v_fpe = 1,                .v_bp = 12,                .v_bpe = 1,                .v_sw = 8,#else                .h_fp = 15,                .h_bp = 4,                .h_sw = 14,                .v_fp = 3,                .v_fpe = 1,                .v_bp = 3,                .v_bpe = 1,                .v_sw = 2,#endif        },        .polarity = {                .rise_vclk      = 0, // video data fetch at DOTCLK falling edge                .inv_hsync      = 1,    // low active                .inv_vsync      = 1,    // low active                .inv_vden       = 0,    // data is vaild when DEpin is high        },};static void hx8369_cfg_gpio(struct platform_device *pdev){        int i;for (i = 0; i < 5; i++) {s3c_gpio_cfgpin(S5PV210_GPF0(i), S3C_GPIO_SFN(2));s3c_gpio_setpull(S5PV210_GPF0(i), S3C_GPIO_PULL_NONE);}s3c_gpio_cfgpin(S5PV210_GPF0(7), S3C_GPIO_SFN(2));s3c_gpio_setpull(S5PV210_GPF0(7), S3C_GPIO_PULL_NONE);for (i = 0; i < 4; i++) {s3c_gpio_cfgpin(S5PV210_GPF1(i), S3C_GPIO_SFN(2));s3c_gpio_setpull(S5PV210_GPF1(i), S3C_GPIO_PULL_NONE);}s3c_gpio_cfgpin(S5PV210_GPF1(6), S3C_GPIO_SFN(2));s3c_gpio_setpull(S5PV210_GPF1(6), S3C_GPIO_PULL_NONE);s3c_gpio_cfgpin(S5PV210_GPF1(7), S3C_GPIO_SFN(2));s3c_gpio_setpull(S5PV210_GPF1(7), S3C_GPIO_PULL_NONE);for (i = 0; i < 4; i++) {s3c_gpio_cfgpin(S5PV210_GPF2(i), S3C_GPIO_SFN(2));s3c_gpio_setpull(S5PV210_GPF2(i), S3C_GPIO_PULL_NONE);}for (i = 5; i < 8; i++) {s3c_gpio_cfgpin(S5PV210_GPF2(i), S3C_GPIO_SFN(2));s3c_gpio_setpull(S5PV210_GPF2(i), S3C_GPIO_PULL_NONE);}for (i = 0; i < 4; i++) {s3c_gpio_cfgpin(S5PV210_GPF3(i), S3C_GPIO_SFN(2));s3c_gpio_setpull(S5PV210_GPF3(i), S3C_GPIO_PULL_NONE);}/* mDNIe SEL: why we shall write 0x2 ? */writel(0x2, S5P_MDNIE_SEL);/* drive strength to max */writel(0xffffffff, S5PV210_GPF0_BASE + 0xc);writel(0xffffffff, S5PV210_GPF1_BASE + 0xc);writel(0xffffffff, S5PV210_GPF2_BASE + 0xc);writel(0x000000ff, S5PV210_GPF3_BASE + 0xc);}static int hx8369_backlight_on(struct platform_device *pdev){int err;err = gpio_request(S5PV210_GPD0(0), "GPD0");if (err) {printk(KERN_ERR "failed to request GPD0 for ""lcd backlight control\n");return err;}gpio_direction_output(S5PV210_GPD0(0), 1);//s3c_gpio_cfgpin(S5PV210_GPD0(0), S5PV210_GPD_0_0_TOUT_0);gpio_free(S5PV210_GPD0(0));return 0;}static int hx8369_backlight_off(struct platform_device *pdev, int onoff){int err;err = gpio_request(S5PV210_GPD0(0), "GPD0");if (err) {printk(KERN_ERR "failed to request GPD0 for ""lcd backlight control\n");return err;}gpio_direction_output(S5PV210_GPD0(0), 0);gpio_free(S5PV210_GPD0(0));return 0;}static int hx8369_reset_lcd(struct platform_device *pdev){/*int err;err = gpio_request(S5PV210_GPH2(4), "GPH2");if (err) {printk(KERN_ERR "failed to request GPH2 for ""lcd reset control\n");return err;}gpio_direction_output(S5PV210_GPF2(4), 1);mdelay(100);gpio_set_value(S5PV210_GPF2(4), 0);mdelay(10);gpio_set_value(S5PV210_GPF2(4), 1);mdelay(10);gpio_free(S5PV210_GPF2(4));return 0;*/}static struct s3c_platform_fb hx8369_fb_data __initdata = {.hw_ver= 0x62,.nr_wins = 5,.default_win = CONFIG_FB_S3C_DEFAULT_WINDOW,.swap = FB_SWAP_WORD | FB_SWAP_HWORD,.lcd = &hx8369,.cfg_gpio= hx8369_cfg_gpio,.backlight_on= hx8369_backlight_on,.backlight_onoff    = hx8369_backlight_off,.reset_lcd= hx8369_reset_lcd,};#endif