From 16efb0f379b00a99bc6d31b3c01344babc996a28 Mon Sep 17 00:00:00 2001 From: hhb Date: Thu, 31 Mar 2011 20:37:38 +0800 Subject: [PATCH] rk29_phone: touch screen driver add four virtual keys --- arch/arm/mach-rk29/board-rk29-phonesdk.c | 69 +++++++++++++++- drivers/input/touchscreen/gt801_ts.c | 31 ++++--- .../video/display/screen/lcd_ls035y8dx02a.c | 81 +++++++++---------- 3 files changed, 125 insertions(+), 56 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29-phonesdk.c b/arch/arm/mach-rk29/board-rk29-phonesdk.c index 944f7b239579..148ab134f74c 100755 --- a/arch/arm/mach-rk29/board-rk29-phonesdk.c +++ b/arch/arm/mach-rk29/board-rk29-phonesdk.c @@ -1433,7 +1433,7 @@ struct rk29_i2c_platform_data default_i2c2_data = { .bus_num = 2, .flags = 0, .slave_addr = 0xff, - .scl_rate = 200*1000, + .scl_rate = 400*1000, .mode = I2C_MODE_IRQ, .io_init = rk29_i2c2_io_init, }; @@ -2730,10 +2730,10 @@ struct rk29xx_spi_platform_data rk29xx_spi1_platdata = { * xpt2046 touch panel * author: hhb@rock-chips.com *****************************************************************************************/ +#if defined(CONFIG_TOUCHSCREEN_XPT2046_NORMAL_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_TSLIB_SPI) #define XPT2046_GPIO_INT RK29_PIN4_PD5 //中断脚 #define DEBOUNCE_REPTIME 3 -#if defined(CONFIG_TOUCHSCREEN_XPT2046_NORMAL_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_TSLIB_SPI) static struct xpt2046_platform_data xpt2046_info = { .model = 2046, .keep_vref_on = 1, @@ -2846,6 +2846,70 @@ static struct spi_board_info board_spi_devices[] = { }; +/********************************************************************************************** + * + * The virtual keys for android "back", "home", "menu", "search", these four keys are touch key + * on the touch screen panel. (added by hhb@rock-chips.com 2011.03.31) + * + ***********************************************************************************************/ +static ssize_t rk29xx_virtual_keys_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ +#if (defined(CONFIG_TOUCHSCREEN_XPT2046_SPI) && defined(CONFIG_TOUCHSCREEN_480X800)) \ + || defined(CONFIG_TOUCHSCREEN_HX8520_IIC) || defined(CONFIG_TOUCHSCREEN_GT801_IIC) + /* center: x: home: 50, menu: 184, back: 315, search 435, y: 830*/ + /* centerx;centery;width;height; */ + return sprintf(buf, + __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":315:815:120:50" //":50:830:98:50" //":210:796:98:50" + ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":85:815:88:50" // ":184:830:120:50" // ":435:796:120:50" + ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":184:815:100:50" //":315:830:100:50" //":320:796:100:50" + ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":435:815:88:50" //":50:815:98:50" // //":85:796:88:50" + "\n"); +#endif + return 0; +} + +static struct kobj_attribute rk29xx_virtual_keys_attr = { + .attr = { +#if defined(CONFIG_TOUCHSCREEN_XPT2046_SPI) + .name = "virtualkeys.xpt2046-touchscreen", +#elif defined(CONFIG_TOUCHSCREEN_HX8520_IIC) + .name = "virtualkeys.hx8520-touchscreen", +#elif defined(CONFIG_TOUCHSCREEN_GT801_IIC) + .name = "virtualkeys.gt801-touchscreen", +#endif + + + .mode = S_IRUGO, + }, + .show = &rk29xx_virtual_keys_show, +}; + +static struct attribute *rk29xx_properties_attrs[] = { + &rk29xx_virtual_keys_attr.attr, + NULL +}; + +static struct attribute_group rk29xx_properties_attr_group = { + .attrs = rk29xx_properties_attrs, +}; +static int rk29xx_virtual_keys_init(void) +{ + int ret; + struct kobject *properties_kobj; + printk("rk29xx_virtual_keys_init \n"); + properties_kobj = kobject_create_and_add("board_properties", NULL); + if (properties_kobj) + ret = sysfs_create_group(properties_kobj, + &rk29xx_properties_attr_group); + if (!properties_kobj || ret) + { + pr_err("failed to create board_properties\n"); + } + return ret; +} + + static void __init rk29_gic_init_irq(void) { gic_dist_init(0, (void __iomem *)RK29_GICPERI_BASE, 32); @@ -2905,6 +2969,7 @@ static void __init machine_rk29_board_init(void) spi_register_board_info(board_spi_devices, ARRAY_SIZE(board_spi_devices)); rk29sdk_init_wifi_mem(); + rk29xx_virtual_keys_init(); } static void __init machine_rk29_fixup(struct machine_desc *desc, struct tag *tags, diff --git a/drivers/input/touchscreen/gt801_ts.c b/drivers/input/touchscreen/gt801_ts.c index c40fe26a50e2..b8b3a5e9cab8 100755 --- a/drivers/input/touchscreen/gt801_ts.c +++ b/drivers/input/touchscreen/gt801_ts.c @@ -46,7 +46,10 @@ #define TOUCH_REG_NUM 5 //ÿ�������Ҫ�ļĴ�����Ŀ const unsigned char GT801_RegData[GT801_REGS_NUM]={ - 0x19,0x05,0x06,0x28,0x02,0x14,0x14,0x10,0x40,0xB0,0x01,0xE0,0x03,0x4C,0x78,0x9A,0xBC,0xDE,0x65,0x43,0x20,0x11,0x00,0x00,0x00,0x00,0x05,0xCF,0x20,0x0B,0x0D,0x8D,0x32,0x3C,0x1E,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01 + 0x19,0x05,0x06,0x28,0x02,0x14,0x14,0x10,0x40,0xB0,0x01,0xE0,0x03,0x4C,0x78, + 0x9A,0xBC,0xDE,0x65,0x43,0x20,0x11,0x00,0x00,0x00,0x00,0x05,0xCF,0x20,0x0B, + 0x0D,0x8D,0x32,0x3C,0x1E,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01 }; struct gt801_ts_data { @@ -109,7 +112,6 @@ static int gt801_read_regs(struct i2c_client *client, u8 reg, u8 buf[], unsigned static int gt801_write_regs(struct i2c_client *client, u8 reg, u8 const buf[], unsigned short len) { int ret; - int i = len; ret = i2c_master_reg8_send(client,reg, buf, len, 200*1000); if (ret < 0) { printk("gt801_ts_work_func:i2c_transfer fail =%d\n",ret); @@ -207,13 +209,17 @@ static void gt801_ts_work_func(struct work_struct *work) else{ x = ((( ((unsigned short)buf[i+ptxh] )<< 8) ) | buf[i+ptxl]); y = (((((unsigned short)buf[i+ptyh] )<< 8) )| buf[i+ptyl]); + /* adjust the x and y to proper value added by hhb@rock-chips.com*/ x = 480-x; - y = 800-y; - if (ts->swap_xy) + if(y < 800){ + y = 800-y; + } + + if (ts->swap_xy){ swap(x, y); + } - if (verify_coord(ts,&x,&y)) - ;//goto out; + if (verify_coord(ts,&x,&y));//goto out; gt801printk("input_report_abs--%d-%d-(%d/%d)\n", i,touch_state_index, x, y); input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 1); //Finger Size @@ -230,12 +236,14 @@ static void gt801_ts_work_func(struct work_struct *work) #endif - if(syn_flag) + if(syn_flag){ input_sync(ts->input_dev); + } + out: - if (ts->use_irq) - enable_irq(ts->client->irq); - + if (ts->use_irq) { + enable_irq(ts->client->irq); + } return; } static enum hrtimer_restart gt801_ts_timer_func(struct hrtimer *timer) @@ -299,6 +307,7 @@ static int __devinit setup_resetPin(struct i2c_client *client, struct gt801_ts_d return 0; } + static int __devinit setup_pendown(struct i2c_client *client, struct gt801_ts_data *ts) { int err; @@ -342,6 +351,7 @@ static int __devinit setup_pendown(struct i2c_client *client, struct gt801_ts_da } return 0; } + static int gt801_chip_Init(struct i2c_client *client) { u8 i,j; @@ -384,6 +394,7 @@ static int gt801_chip_Init(struct i2c_client *client) return ret; } + static int gt801_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct gt801_ts_data *ts; diff --git a/drivers/video/display/screen/lcd_ls035y8dx02a.c b/drivers/video/display/screen/lcd_ls035y8dx02a.c index 17e4c41b841d..0116fb2ef47a 100644 --- a/drivers/video/display/screen/lcd_ls035y8dx02a.c +++ b/drivers/video/display/screen/lcd_ls035y8dx02a.c @@ -4,7 +4,9 @@ * author: hhb@rock-chips.com * creat date: 2011-03-22 * route:drivers/video/display/screen/lcd_ls035y8dx02a.c - driver for rk29 phone sdk - * station:haven't been tested in any hardware platform + * declaration: This program driver have been tested in rk29_phonesdk hardware platform at 2011.03.31. + * about migration: you need just 3 interface functions,such as lcd_init(void),lcd_standby(u8 enable), + * set_lcd_info(struct rk29fb_screen *screen, struct rk29lcd_info *lcd_info ) * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and * may be copied, distributed, and modified under those terms. @@ -28,20 +30,20 @@ #define OUT_TYPE SCREEN_RGB #define OUT_FACE OUT_P888 #define OUT_CLK (26*1000000) //***27 uint Hz -#define LCDC_ACLK 150000000 //29 lcdc axi DMA Ƶ�� //rk29 +#define LCDC_ACLK 150000000 //29 lcdc axi DMA Ƶ�� /* Timing */ -#define H_PW 8 //16 -#define H_BP 6//24 -#define H_VD 480//320 //***800 -#define H_FP 60//16 +#define H_PW 16//8 //16 +#define H_BP 24//6//24 +#define H_VD 480//320 +#define H_FP 16//60//16 #define V_PW 12//2 #define V_BP 4// 2 -#define V_VD 800//480 //***480 -#define V_FP 40//4 +#define V_VD 800//480 +#define V_FP 50//4 -#define LCD_WIDTH 800 //need modify //rk29 +#define LCD_WIDTH 800 //need modify #define LCD_HEIGHT 480 /* Other */ @@ -51,16 +53,12 @@ static struct rk29lcd_info *gLcd_info = NULL; int lcd_init(void); int lcd_standby(u8 enable); -/* -#define RXD_PORT RK2818_PIN_PB7 -#define TXD_PORT RK2818_PIN_PB6 //gLcd_info->txd_pin -#define CLK_PORT RK2818_PIN_PB5 //gLcd_info->clk_pin -#define CS_PORT RK2818_PIN_PB4 // gLcd_info->cs_pin -*/ + #define RXD_PORT RK29_PIN2_PC7 #define TXD_PORT gLcd_info->txd_pin #define CLK_PORT gLcd_info->clk_pin #define CS_PORT gLcd_info->cs_pin +#define RESET_PORT RK29_PIN6_PC6 #define CS_OUT() gpio_direction_output(CS_PORT, 1) #define CS_SET() gpio_set_value(CS_PORT, GPIO_HIGH) @@ -167,8 +165,6 @@ void spi_screenreg_set(u32 Addr, u32 Data0, u32 Data1) TXD_SET(); else TXD_CLR(); - - // \u6a21\u62dfCLK CLK_SET(); DRVDelayUs(2); CLK_CLR(); @@ -180,8 +176,9 @@ void spi_screenreg_set(u32 Addr, u32 Data0, u32 Data1) CLK_CLR(); DRVDelayUs(10); - if(0xffff == Data0) - return; + if(0xffff == Data0){ + return; + } CS_CLR(); @@ -194,8 +191,6 @@ void spi_screenreg_set(u32 Addr, u32 Data0, u32 Data1) TXD_SET(); else TXD_CLR(); - - // \u6a21\u62dfCLK CLK_SET(); DRVDelayUs(2); CLK_CLR(); @@ -221,8 +216,6 @@ void spi_screenreg_set(u32 Addr, u32 Data0, u32 Data1) TXD_SET(); else TXD_CLR(); - - // \u6a21\u62dfCLK CLK_SET(); DRVDelayUs(2); CLK_CLR(); @@ -244,11 +237,11 @@ void set_lcd_info(struct rk29fb_screen *screen, struct rk29lcd_info *lcd_info ) /* Screen size */ screen->x_res = H_VD; screen->y_res = V_VD; - screen->width = LCD_WIDTH; //rk29 - screen->height = LCD_HEIGHT; //rk29 + screen->width = LCD_WIDTH; + screen->height = LCD_HEIGHT; /* Timing */ - screen->lcdc_aclk = LCDC_ACLK; //rk29 + screen->lcdc_aclk = LCDC_ACLK; screen->pixclock = OUT_CLK; screen->left_margin = H_BP; /*>2*/ screen->right_margin = H_FP; /*>2*/ @@ -281,27 +274,26 @@ int lcd_init(void) { volatile u32 data; if(gLcd_info){ - printk("lcd init11111111111111111111111111...\n"); gLcd_info->io_init(); } - /* reset lcd to start init lcd */ - gpio_request(RK29_PIN6_PC6, NULL); - gpio_direction_output(RK29_PIN6_PC6, 0); + /* reset lcd to start init lcd by software if there is no hardware reset circuit for the lcd */ +#ifdef RESET_PORT + gpio_request(RESET_PORT, NULL); + gpio_direction_output(RESET_PORT, 0); mdelay(2); - gpio_set_value(RK29_PIN6_PC6, 1); + gpio_set_value(RESET_PORT, 1); mdelay(10); - gpio_free(RK29_PIN6_PC6); - + gpio_free(RESET_PORT); +#endif - printk("lcd init22222222222222222222222222...\n"); printk("lcd init...\n"); - spi_screenreg_set(0x29, 0xffff, 0xffff); - spi_screenreg_set(0x11, 0xffff, 0xffff); - + spi_screenreg_set(0x29, 0xffff, 0xffff); //display on + spi_screenreg_set(0x11, 0xffff, 0xffff); //sleep out mdelay(150); - spi_screenreg_set(0x36, 0x0000, 0xffff); - //while(1) + spi_screenreg_set(0x36, 0x0000, 0xffff); //set address mode + + while(0) //this code is not used here { data = spi_screenreg_get(0x0a); printk("------------liuylcd init reg 0x0a=0x%x \n", spi_screenreg_get(0x0a)); @@ -314,11 +306,12 @@ int lcd_init(void) data = spi_screenreg_get(0x0f); printk("------------liuylcd init reg 0x0f=0x%x \n", spi_screenreg_get(0x0f)); } - spi_screenreg_set(0x3a, 0x0070, 0xffff); - spi_screenreg_set(0xb0, 0x0000, 0xffff); - spi_screenreg_set(0xb8, 0x0001, 0xffff); - spi_screenreg_set(0xb9, 0x0001, 0x00ff); - spi_screenreg_set(0xb0, 0x0003, 0xffff); + + spi_screenreg_set(0x3a, 0x0070, 0xffff); //set pixel format + spi_screenreg_set(0xb0, 0x0000, 0xffff); //enable command acess + spi_screenreg_set(0xb8, 0x0001, 0xffff); //BLC setting + spi_screenreg_set(0xb9, 0x0001, 0x00ff); //LED PWM + spi_screenreg_set(0xb0, 0x0003, 0xffff); //disable command acess if(gLcd_info) gLcd_info->io_deinit(); -- 2.34.1