|
S3C6410 Google Android 进阶
[复制链接]
转自:www.embed-training.com/
触摸屏篇:
Samsung-2.6.28 Patch:
S3C6410 Android 触摸屏校准可以在应用层用tslib来触准,生成校准文件,也可以将校准数据直接写到内核触摸屏驱动里面。
下面我将XXXX6410 2.6.28的android的触摸屏patch以及我的2.6.24 BSP 代码补丁列出来,这里主要是借鉴了Openmoko ben的patch !
- ---samsung-ap-2.6.28/drivers/input/touchscreen/s3c-ts.c 2009-06-13 17:39:57.000000000 +0800
- +++ s3c-ts.c 2009-08-17 15:38:22.000000000 +0800
- @@ -62,6 +62,9 @@
- #define CONFIG_TOUCHSCREEN_S3C_DEBUG
- #undef CONFIG_TOUCHSCREEN_S3C_DEBUG
- +#define CONFIG_ANDROID_TOUCHSCREEN_S3C_DEBUG
- +#undef CONFIG_ANDROID_TOUCHSCREEN_S3C_DEBUG
- +
- /* For ts->dev.id.version */
- #define S3C_TSVERSION 0x0101
- @@ -75,13 +78,20 @@
- #define DEBUG_LVL KERN_DEBUG
- +#ifdef CONFIG_S3CTS_ANDROID
- + #ifdef CONFIG_MACH_XXXX6410
- + #define ANDROID_TS_RESOLUTION_X 320
- + #define ANDROID_TS_RESOLUTION_Y 480
- + static int pointercal[7]={2701, 7, -12500804, -7, 3326, -11336568, 65536}; // For XXXXS3C6410
- + #endif
- +#endif
- /* Touchscreen default configuration */
- struct s3c_ts_mach_info s3c_ts_default_cfg __initdata = {
- .delay = 10000,
- .presc = 49,
- .oversampling_shift = 2,
- - .resol_bit = 10
- + .resol_bit = 10,
- };
- /*
- @@ -100,6 +110,11 @@
- unsigned long data1;
- int updown;
- +#ifdef CONFIG_S3CTS_ANDROID
- + unsigned long xtemp, ytemp;
- + unsigned long x, y;
- +#endif
- +
- data0 = readl(ts_base+S3C_ADCDAT0);
- data1 = readl(ts_base+S3C_ADCDAT1);
- @@ -115,13 +130,46 @@
- printk(KERN_INFO "T: %06d, X: %03ld, Y: %03ld\n", (int)tv.tv_usec, ts->xp, ts->yp);
- }
- #endif
- +#ifdef CONFIG_S3CTS_ANDROID
- + xtemp = ts->xp;
- + ytemp = ts->yp;
- +
- + x = ( pointercal[2] + pointercal[0]*xtemp + pointercal[1]*ytemp ) / pointercal[6];
- + y = ( pointercal[5] + pointercal[3]*xtemp + pointercal[4]*ytemp ) / pointercal[6];
- +#ifdef CONFIG_ANDROID_TOUCHSCREEN_S3C_DEBUG
- + printk("pre: x, y = %d, %d\n", x, y);
- +#endif
- + if( x>ANDROID_TS_RESOLUTION_X )
- + x = ANDROID_TS_RESOLUTION_X;
- + else if(x < 0)
- + x = 0;
- +
- + if( y>ANDROID_TS_RESOLUTION_Y )
- + y = ANDROID_TS_RESOLUTION_Y;
- + else if(y < 0)
- + y = 0;
- +
- + if( (x<=ANDROID_TS_RESOLUTION_X) && (x>=0) )
- + {
- + input_report_abs(ts->dev, ABS_X, x);
- + input_report_abs(ts->dev, ABS_Y, y);
- +
- + input_report_key(ts->dev, BTN_TOUCH, 1); /* 向上层应用报告校准数据*/
- + input_report_abs(ts->dev, ABS_PRESSURE, 1);
- + input_sync(ts->dev);
- +#ifdef CONFIG_ANDROID_TOUCHSCREEN_S3C_DEBUG
- + printk("x, y = %d, %d\n", x, y);
- +#endif
- + }
- +#else // For X-Windows
- input_report_abs(ts->dev, ABS_X, ts->xp);
- input_report_abs(ts->dev, ABS_Y, ts->yp);
- input_report_key(ts->dev, BTN_TOUCH, 1);
- input_report_abs(ts->dev, ABS_PRESSURE, 1);
- input_sync(ts->dev);
- +#endif
- }
- ts->xp = 0;
- @@ -318,6 +366,12 @@
- ts->dev->evbit[0] = ts->dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
- ts->dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
- +#ifdef CONFIG_S3CTS_ANDROID
- + ts->dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y); // for android
- + input_set_abs_params(ts->dev, ABS_X, 0, ANDROID_TS_RESOLUTION_X, 0, 0);
- + input_set_abs_params(ts->dev, ABS_Y, 0, ANDROID_TS_RESOLUTION_Y, 0, 0);
- + input_set_abs_params(ts->dev, ABS_PRESSURE, 0, 1, 0, 0);
- +#else
- if (s3c_ts_cfg->resol_bit==12) {
- input_set_abs_params(ts->dev, ABS_X, 0, 0xFFF, 0, 0);
- input_set_abs_params(ts->dev, ABS_Y, 0, 0xFFF, 0, 0);
- @@ -328,7 +382,7 @@
- }
- input_set_abs_params(ts->dev, ABS_PRESSURE, 0, 1, 0, 0);
- -
- +#endif
- sprintf(ts->phys, "input(ts)");
- ts->dev->name = s3c_ts_name;
- Samsung-ap-2.6.24 BSP Patch
- --- drivers/input/touchscreen/s3c-ts.c 2009-08-17 15:46:41.000000000 +0800
- +++ /work2/project_study/samsung-ap-2.6.24-6410/drivers/input/touchscreen/s3c-ts.c 2009-05-18 22:20:15.000000000 +0800
- @@ -61,11 +61,8 @@
- #include
- #include
- -/*add by tommy for Samsung 6410 Android touchscreen*/
- -int axis_table[] = {5025, -18, -14593120, 0, -5132, 56919216, 16}; // from /etc/pointercal by ts_calibrate
- -/*end add*/
- -//#define CONFIG_TOUCHSCREEN_S3C_DEBUG
- +#define CONFIG_TOUCHSCREEN_S3C_DEBUG
- #undef CONFIG_TOUCHSCREEN_S3C_DEBUG
- /* For ts->dev.id.version */
- @@ -117,39 +114,18 @@
- #ifdef CONFIG_TOUCHSCREEN_S3C_DEBUG
- {
- - //struct timeval tv;
- - //do_gettimeofday(&tv);
- - //printk(KERN_INFO "T: %06d, X: %03ld, Y: %03ld\n", (int)tv.tv_usec, ts->xp, ts->yp);
- + struct timeval tv;
- + do_gettimeofday(&tv);
- + printk(KERN_INFO "T: %06d, X: %03ld, Y: %03ld\n", (int)tv.tv_usec, ts->xp, ts->yp);
- }
- #endif
- -#if 0
- - int tmpy;
- input_report_abs(ts->dev, ABS_X, ts->xp);
- input_report_abs(ts->dev, ABS_Y, ts->yp);
- - printk(KERN_ERR "x:%d , y:%d \n", ts->xp, ts->yp);
- input_report_key(ts->dev, BTN_TOUCH, 1);
- input_report_abs(ts->dev, ABS_PRESSURE, 1);
- input_sync(ts->dev);
- -#else
- - int xraw, yraw, xtmp, ytmp;
- - xraw=ts->xp;
- - yraw=ts->yp;
- - xtmp = (axis_table[2] + axis_table[0]*xraw + axis_table[1]*yraw ) >> axis_table[6];
- - ytmp = (axis_table[5] + axis_table[3]*xraw + axis_table[4]*yraw ) >> axis_table[6];
- -
- - //printk(KERN_ERR "x:%d , y:%d \n", xtmp, ytmp);
- -
- - //report button touch
- - input_report_key(ts->dev, BTN_TOUCH, 1);
- -
- - input_report_abs(ts->dev, ABS_X, xtmp);
- - input_report_abs(ts->dev, ABS_Y, ytmp);
- - input_report_abs(ts->dev, ABS_PRESSURE, 1);
- - input_sync(ts->dev);
- -#endif
- -
- }
- ts->xp = 0;
- @@ -163,7 +139,6 @@
- ts->count = 0;
- - // printk(KERN_ERR "pen up \n");
- input_report_key(ts->dev, BTN_TOUCH, 0);
- input_report_abs(ts->dev, ABS_PRESSURE, 0);
- input_sync(ts->dev);
- @@ -328,16 +303,10 @@
- ts->dev->evbit[0] = ts->dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
- ts->dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
- - bitmap_fill(ts->dev->absbit, ABS_MAX);
- -
- +
- #if defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C6410) || defined(CONFIG_CPU_S3C2416)
- - input_set_abs_params(ts->dev, ABS_X, 0, 800, 0, 0);
- - input_set_abs_params(ts->dev, ABS_Y, 0, 480, 0, 0);
- -
- - //input_set_abs_params(ts->dev, ABS_X, 0, 0xFFF, 0, 0);
- - //input_set_abs_params(ts->dev, ABS_Y, 0, 0xFFF, 0, 0);
- + input_set_abs_params(ts->dev, ABS_X, 0, 0xFFF, 0, 0);
- + input_set_abs_params(ts->dev, ABS_Y, 0, 0xFFF, 0, 0);
- #else
- input_set_abs_params(ts->dev, ABS_X, 0, 0x3FF, 0, 0);
- input_set_abs_params(ts->dev, ABS_Y, 0, 0x3FF, 0, 0);
- Linux will make your life easier
复制代码
|
|