.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,
};
* 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,
};
+/**********************************************************************************************
+ *
+ * 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);
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,
#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 {
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);
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
#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)
return 0;
}
+
static int __devinit setup_pendown(struct i2c_client *client, struct gt801_ts_data *ts)
{
int err;
}
return 0;
}
+
static int gt801_chip_Init(struct i2c_client *client)
{
u8 i,j;
return ret;
}
+
static int gt801_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
struct gt801_ts_data *ts;
* 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.
#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 */
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)
TXD_SET();
else
TXD_CLR();
-
- // \u6a21\u62dfCLK
CLK_SET();
DRVDelayUs(2);
CLK_CLR();
CLK_CLR();
DRVDelayUs(10);
- if(0xffff == Data0)
- return;
+ if(0xffff == Data0){
+ return;
+ }
CS_CLR();
TXD_SET();
else
TXD_CLR();
-
- // \u6a21\u62dfCLK
CLK_SET();
DRVDelayUs(2);
CLK_CLR();
TXD_SET();
else
TXD_CLR();
-
- // \u6a21\u62dfCLK
CLK_SET();
DRVDelayUs(2);
CLK_CLR();
/* 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*/
{
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));
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();