Kernel patch for 3-10 point multi-touch

Search This thread

tchebb

Inactive Recognized Developer
Jul 28, 2010
189
242
tchebb.me
I've had this patch for a while now, but I decided to finally post it here in the hope it might help someone. I kept hearing about how much better the Incredible's touchscreen is compared to the Nexus One's, so I wondered why it could only handle a maximum of 2 touches. It seems that the Incredible uses the Atmel mXT224 as its touch controller. The summary from Atmel clearly states "True 12-bit multiple touch with independent XY tracking for up to 10 concurrent touches in real time with touch size reporting." It turns out, it's actually quite a simple kernel mod to enable all 10 touches (although I've noticed the tracking quality start to degrade above 5). I've been running this on my Incredible for a month or so, and I've noticed no ill effects from it.

All you need to do is edit arch/arm/mach-msm/board-incrediblec.c, and replace
Code:
struct atmel_i2c_platform_data incrediblec_atmel_ts_data[] = {
	{
		.version = 0x016,
		.abs_x_min = 1,
		.abs_x_max = 1023,
		.abs_y_min = 2,
		.abs_y_max = 966,
		.abs_pressure_min = 0,
		.abs_pressure_max = 255,
		.abs_width_min = 0,
		.abs_width_max = 20,
		.gpio_irq = INCREDIBLEC_GPIO_TP_INT_N,
		.power = incrediblec_atmel_ts_power,
		.config_T6 = {0, 0, 0, 0, 0, 0},
		.config_T7 = {50, 15, 25},
		.config_T8 = {10, 0, 20, 10, 0, 0, 5, 15},
		.config_T9 = {139, 0, 0, 18, 12, 0, 16, 38, 3, 7, 0, 5, 2, 15, 2, 10, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 159, 47, 149, 81, 40},
		.config_T15 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T19 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T20 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T22 = {15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 0, 7, 18, 25, 30, 0},
		.config_T23 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T24 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T25 = {3, 0, 200, 50, 64, 31, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T27 = {0, 0, 0, 0, 0, 0, 0},
		.config_T28 = {0, 0, 2, 4, 8, 60},
		.object_crc = {0xDB, 0xBF, 0x60},
		.cable_config = {35, 30, 8, 16},
		.GCAF_level = {20, 24, 28, 40, 63},
		.filter_level = {15, 60, 963, 1008},
	},
	{
		.version = 0x015,
		.abs_x_min = 13,
		.abs_x_max = 1009,
		.abs_y_min = 15,
		.abs_y_max = 960,
		.abs_pressure_min = 0,
		.abs_pressure_max = 255,
		.abs_width_min = 0,
		.abs_width_max = 20,
		.gpio_irq = INCREDIBLEC_GPIO_TP_INT_N,
		.power = incrediblec_atmel_ts_power,
		.config_T6 = {0, 0, 0, 0, 0, 0},
		.config_T7 = {50, 15, 25},
		.config_T8 = {12, 0, 20, 20, 0, 0, 20, 0},
		.config_T9 = {139, 0, 0, 18, 12, 0, 32, 40, 2, 7, 0, 5, 2, 0, 2, 10, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 47, 149, 81},
		.config_T15 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T19 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T20 = {7, 0, 0, 0, 0, 0, 0, 30, 20, 4, 15, 5},
		.config_T22 = {7, 0, 0, 25, 0, -25, 255, 4, 50, 0, 1, 10, 15, 20, 25, 30, 4},
		.config_T23 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T24 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T25 = {3, 0, 200, 50, 64, 31, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T27 = {0, 0, 0, 0, 0, 0, 0},
		.config_T28 = {0, 0, 2, 4, 8, 60},
		.object_crc = {0x19, 0x87, 0x7E},
	},
	{
		.version = 0x014,
		.abs_x_min = 13,
		.abs_x_max = 1009,
		.abs_y_min = 15,
		.abs_y_max = 960,
		.abs_pressure_min = 0,
		.abs_pressure_max = 255,
		.abs_width_min = 0,
		.abs_width_max = 20,
		.gpio_irq = INCREDIBLEC_GPIO_TP_INT_N,
		.power = incrediblec_atmel_ts_power,
		.config_T6 = {0, 0, 0, 0, 0, 0},
		.config_T7 = {50, 15, 25},
		.config_T8 = {12, 0, 20, 20, 0, 0, 10, 15},
		.config_T9 = {3, 0, 0, 18, 12, 0, 48, 45, 2, 7, 0, 0, 0, 0, 2, 10, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 47, 143, 81},
		.config_T15 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T19 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T20 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T22 = {5, 0, 0, 25, 0, -25, 255, 4, 50, 0, 1, 10, 15, 20, 25, 30, 4},
		.config_T23 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T24 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T25 = {3, 0, 200, 50, 64, 31, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T27 = {0, 0, 0, 0, 0, 0, 0},
		.config_T28 = {0, 0, 2, 4, 8, 60},
	}
};
with
Code:
struct atmel_i2c_platform_data incrediblec_atmel_ts_data[] = {
	{
		.version = 0x016,
		.abs_x_min = 1,
		.abs_x_max = 1023,
		.abs_y_min = 2,
		.abs_y_max = 966,
		.abs_pressure_min = 0,
		.abs_pressure_max = 255,
		.abs_width_min = 0,
		.abs_width_max = 20,
		.gpio_irq = INCREDIBLEC_GPIO_TP_INT_N,
		.power = incrediblec_atmel_ts_power,
		.config_T6 = {0, 0, 0, 0, 0, 0},
		.config_T7 = {50, 15, 25},
		.config_T8 = {10, 0, 20, 10, 0, 0, 5, 15},
		.config_T9 = {139, 0, 0, 18, 12, 0, 16, 38, 3, 7, 0, 5, 2, 15, [B]10[/B], 10, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 159, 47, 149, 81, 40},
		.config_T15 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T19 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T20 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T22 = {15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 0, 7, 18, 25, 30, 0},
		.config_T23 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T24 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T25 = {3, 0, 200, 50, 64, 31, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T27 = {0, 0, 0, 0, 0, 0, 0},
		.config_T28 = {0, 0, 2, 4, 8, 60},
		.object_crc = {0xDB, 0xBF, 0x60},
		.cable_config = {35, 30, 8, 16},
		.GCAF_level = {20, 24, 28, 40, 63},
		.filter_level = {15, 60, 963, 1008},
	},
	{
		.version = 0x015,
		.abs_x_min = 13,
		.abs_x_max = 1009,
		.abs_y_min = 15,
		.abs_y_max = 960,
		.abs_pressure_min = 0,
		.abs_pressure_max = 255,
		.abs_width_min = 0,
		.abs_width_max = 20,
		.gpio_irq = INCREDIBLEC_GPIO_TP_INT_N,
		.power = incrediblec_atmel_ts_power,
		.config_T6 = {0, 0, 0, 0, 0, 0},
		.config_T7 = {50, 15, 25},
		.config_T8 = {12, 0, 20, 20, 0, 0, 20, 0},
		.config_T9 = {139, 0, 0, 18, 12, 0, 32, 40, 2, 7, 0, 5, 2, 0, [B]10[/B], 10, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 47, 149, 81},
		.config_T15 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T19 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T20 = {7, 0, 0, 0, 0, 0, 0, 30, 20, 4, 15, 5},
		.config_T22 = {7, 0, 0, 25, 0, -25, 255, 4, 50, 0, 1, 10, 15, 20, 25, 30, 4},
		.config_T23 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T24 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T25 = {3, 0, 200, 50, 64, 31, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T27 = {0, 0, 0, 0, 0, 0, 0},
		.config_T28 = {0, 0, 2, 4, 8, 60},
		.object_crc = {0x19, 0x87, 0x7E},
	},
	{
		.version = 0x014,
		.abs_x_min = 13,
		.abs_x_max = 1009,
		.abs_y_min = 15,
		.abs_y_max = 960,
		.abs_pressure_min = 0,
		.abs_pressure_max = 255,
		.abs_width_min = 0,
		.abs_width_max = 20,
		.gpio_irq = INCREDIBLEC_GPIO_TP_INT_N,
		.power = incrediblec_atmel_ts_power,
		.config_T6 = {0, 0, 0, 0, 0, 0},
		.config_T7 = {50, 15, 25},
		.config_T8 = {12, 0, 20, 20, 0, 0, 10, 15},
		.config_T9 = {3, 0, 0, 18, 12, 0, 48, 45, 2, 7, 0, 0, 0, 0, [B]10[/B], 10, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 47, 143, 81},
		.config_T15 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T19 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T20 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T22 = {5, 0, 0, 25, 0, -25, 255, 4, 50, 0, 1, 10, 15, 20, 25, 30, 4},
		.config_T23 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T24 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T25 = {3, 0, 200, 50, 64, 31, 0, 0, 0, 0, 0, 0, 0, 0},
		.config_T27 = {0, 0, 0, 0, 0, 0, 0},
		.config_T28 = {0, 0, 2, 4, 8, 60},
	}
};

For those who didn't spot the change, it's in config_t9 (highlighted in bold). You can, of course, change the 10 to anything you want (I've only tested with between 2 and 10, though) and that will be set as the maximum number of touches.

I hope this helps someone.
 
Last edited:

xShin

Senior Member
Oct 22, 2010
384
31
This actually seems quite useful and I wasn't even aware this was possible! Two quick questions if you don't mind - first of all, did you mean that enabling above 5 touch points would cause tracking to degrade, or just using it (having 5 or more fingers on the screen would cause tracking to degrade)? Also, howdy I go about editing this file in the first place? Thanks!
 

mikeymop

Senior Member
Aug 15, 2010
565
50
I'm not savvy enough to change it without a .zip flash. However, it'll be nice to see this incorporated into some custom kernels soon
 

igknighted

Senior Member
Oct 26, 2010
79
4
Boston
I'm not savvy enough to change it without a .zip flash. However, it'll be nice to see this incorporated into some custom kernels soon

These are changes applied to the kernel source, so not a file on your phone that is to be edited. Someone would need to make the changes to the source code files and then recompile the kernel (which you could then flash)... perhaps invisiblek can add it to his next kernel release?
 

tchebb

Inactive Recognized Developer
Jul 28, 2010
189
242
tchebb.me
This actually seems quite useful and I wasn't even aware this was possible! Two quick questions if you don't mind - first of all, did you mean that enabling above 5 touch points would cause tracking to degrade, or just using it (having 5 or more fingers on the screen would cause tracking to degrade)? Also, howdy I go about editing this file in the first place? Thanks!

I haven't done extensive testing, but the tracking at up to 5 points seems to be about the same quality no matter how many you have enabled. As for editing the file, you need to recompile the kernel and flash an update.zip with the new one. I'll patch the stock HTC Sense kernel and post a pre-compiled update.zip tomorrow. If you use a different kernel, you can either download and patch the source yourself, or send a request to the kernel author that this patch be included by default.
 

Grooby97

Senior Member
Oct 12, 2009
298
24
I haven't done extensive testing, but the tracking at up to 5 points seems to be about the same quality no matter how many you have enabled. As for editing the file, you need to recompile the kernel and flash an update.zip with the new one. I'll patch the stock HTC Sense kernel and post a pre-compiled update.zip tomorrow. If you use a different kernel, you can either download and patch the source yourself, or send a request to the kernel author that this patch be included by default.

How do you do the test?
 

tchebb

Inactive Recognized Developer
Jul 28, 2010
189
242
tchebb.me
weird, I am using the InvisibleK #21 kernel, which should have the fix and also the multitouch test from the market place and I am only getting 2 points.

I've been following the discussion in the invisiblek thread. It seems it's not working for a lot of people. Can you run "adb shell cat /sys/android_touch/vendor" and paste the output?
 

ziggy471

Senior Member
Nov 5, 2006
194
350
St. Pete
www.ziggy471.com
Nothing new about this, it's the same thing the Evo guys have been doing for awhile now. I've even had it in my kernels for some time, but it doesn't appear to work on our phones. I've tried with Myn's, ID's Z Port, and a few others, still no luck.

Personally, I don't like changing the board-incredible to do this mod, I prefer ffolks method, mod the atmel.c file instead. This way, you can detect which version of the touchscreen your using.

And before you ask which one I have, mine is x80, which should support 10 points, not the x4f which only supports 3.

If anyone wants to see NetArchy's version of ffolks patch, which is what I've been using for awhile, just slightly modified:
https://github.com/netarchy/Supersonic-2.6.32/commit/da528adc5063723f8847baebeca4a27a8ff0f55b

And here's the write-up on htc-linux:
http://htc-linux.org/wiki/index.php?title=Amtel_MXT224

Z
 

aauussttiinn88

Senior Member
Feb 12, 2010
538
0
TOLEDO
Nothing new about this, it's the same thing the Evo guys have been doing for awhile now. I've even had it in my kernels for some time, but it doesn't appear to work on our phones. I've tried with Myn's, ID's Z Port, and a few others, still no luck.

Personally, I don't like changing the board-incredible to do this mod, I prefer ffolks method, mod the atmel.c file instead. This way, you can detect which version of the touchscreen your using.

And before you ask which one I have, mine is x80, which should support 10 points, not the x4f which only supports 3.

If anyone wants to see NetArchy's version of ffolks patch, which is what I've been using for awhile, just slightly modified:
https://github.com/netarchy/Supersonic-2.6.32/commit/da528adc5063723f8847baebeca4a27a8ff0f55b

And here's the write-up on htc-linux:
http://htc-linux.org/wiki/index.php?title=Amtel_MXT224

Z

What would you say is the biggest benefit to having the patch that enables the ten point reconition? I am one of those people that cannot get it to work on the INC, but im wondering if its even going to benefit the cause.. seeing that you dont really care for it yourself
 

ziggy471

Senior Member
Nov 5, 2006
194
350
St. Pete
www.ziggy471.com
What would you say is the biggest benefit to having the patch that enables the ten point reconition? I am one of those people that cannot get it to work on the INC, but im wondering if its even going to benefit the cause.. seeing that you dont really care for it yourself

I really don't see more than maybe 4 as a viable option, try putting more than 4 fingers on the screen at one time, can you even see it anymore? The Evo guys have either 3 or 5, depending on which sensor they have, so that's why I patched mine that way. But I've been playing with this since around the beginning of Oct, and can't seem to figure out why it's not working, except that it maybe something to do with the ROM itself, but I don't do ROM work, just kernels.


Z
 

Top Liked Posts

  • There are no posts matching your filters.
  • 8
    I've had this patch for a while now, but I decided to finally post it here in the hope it might help someone. I kept hearing about how much better the Incredible's touchscreen is compared to the Nexus One's, so I wondered why it could only handle a maximum of 2 touches. It seems that the Incredible uses the Atmel mXT224 as its touch controller. The summary from Atmel clearly states "True 12-bit multiple touch with independent XY tracking for up to 10 concurrent touches in real time with touch size reporting." It turns out, it's actually quite a simple kernel mod to enable all 10 touches (although I've noticed the tracking quality start to degrade above 5). I've been running this on my Incredible for a month or so, and I've noticed no ill effects from it.

    All you need to do is edit arch/arm/mach-msm/board-incrediblec.c, and replace
    Code:
    struct atmel_i2c_platform_data incrediblec_atmel_ts_data[] = {
    	{
    		.version = 0x016,
    		.abs_x_min = 1,
    		.abs_x_max = 1023,
    		.abs_y_min = 2,
    		.abs_y_max = 966,
    		.abs_pressure_min = 0,
    		.abs_pressure_max = 255,
    		.abs_width_min = 0,
    		.abs_width_max = 20,
    		.gpio_irq = INCREDIBLEC_GPIO_TP_INT_N,
    		.power = incrediblec_atmel_ts_power,
    		.config_T6 = {0, 0, 0, 0, 0, 0},
    		.config_T7 = {50, 15, 25},
    		.config_T8 = {10, 0, 20, 10, 0, 0, 5, 15},
    		.config_T9 = {139, 0, 0, 18, 12, 0, 16, 38, 3, 7, 0, 5, 2, 15, 2, 10, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 159, 47, 149, 81, 40},
    		.config_T15 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T19 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T20 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T22 = {15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 0, 7, 18, 25, 30, 0},
    		.config_T23 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T24 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T25 = {3, 0, 200, 50, 64, 31, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T27 = {0, 0, 0, 0, 0, 0, 0},
    		.config_T28 = {0, 0, 2, 4, 8, 60},
    		.object_crc = {0xDB, 0xBF, 0x60},
    		.cable_config = {35, 30, 8, 16},
    		.GCAF_level = {20, 24, 28, 40, 63},
    		.filter_level = {15, 60, 963, 1008},
    	},
    	{
    		.version = 0x015,
    		.abs_x_min = 13,
    		.abs_x_max = 1009,
    		.abs_y_min = 15,
    		.abs_y_max = 960,
    		.abs_pressure_min = 0,
    		.abs_pressure_max = 255,
    		.abs_width_min = 0,
    		.abs_width_max = 20,
    		.gpio_irq = INCREDIBLEC_GPIO_TP_INT_N,
    		.power = incrediblec_atmel_ts_power,
    		.config_T6 = {0, 0, 0, 0, 0, 0},
    		.config_T7 = {50, 15, 25},
    		.config_T8 = {12, 0, 20, 20, 0, 0, 20, 0},
    		.config_T9 = {139, 0, 0, 18, 12, 0, 32, 40, 2, 7, 0, 5, 2, 0, 2, 10, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 47, 149, 81},
    		.config_T15 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T19 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T20 = {7, 0, 0, 0, 0, 0, 0, 30, 20, 4, 15, 5},
    		.config_T22 = {7, 0, 0, 25, 0, -25, 255, 4, 50, 0, 1, 10, 15, 20, 25, 30, 4},
    		.config_T23 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T24 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T25 = {3, 0, 200, 50, 64, 31, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T27 = {0, 0, 0, 0, 0, 0, 0},
    		.config_T28 = {0, 0, 2, 4, 8, 60},
    		.object_crc = {0x19, 0x87, 0x7E},
    	},
    	{
    		.version = 0x014,
    		.abs_x_min = 13,
    		.abs_x_max = 1009,
    		.abs_y_min = 15,
    		.abs_y_max = 960,
    		.abs_pressure_min = 0,
    		.abs_pressure_max = 255,
    		.abs_width_min = 0,
    		.abs_width_max = 20,
    		.gpio_irq = INCREDIBLEC_GPIO_TP_INT_N,
    		.power = incrediblec_atmel_ts_power,
    		.config_T6 = {0, 0, 0, 0, 0, 0},
    		.config_T7 = {50, 15, 25},
    		.config_T8 = {12, 0, 20, 20, 0, 0, 10, 15},
    		.config_T9 = {3, 0, 0, 18, 12, 0, 48, 45, 2, 7, 0, 0, 0, 0, 2, 10, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 47, 143, 81},
    		.config_T15 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T19 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T20 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T22 = {5, 0, 0, 25, 0, -25, 255, 4, 50, 0, 1, 10, 15, 20, 25, 30, 4},
    		.config_T23 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T24 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T25 = {3, 0, 200, 50, 64, 31, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T27 = {0, 0, 0, 0, 0, 0, 0},
    		.config_T28 = {0, 0, 2, 4, 8, 60},
    	}
    };
    with
    Code:
    struct atmel_i2c_platform_data incrediblec_atmel_ts_data[] = {
    	{
    		.version = 0x016,
    		.abs_x_min = 1,
    		.abs_x_max = 1023,
    		.abs_y_min = 2,
    		.abs_y_max = 966,
    		.abs_pressure_min = 0,
    		.abs_pressure_max = 255,
    		.abs_width_min = 0,
    		.abs_width_max = 20,
    		.gpio_irq = INCREDIBLEC_GPIO_TP_INT_N,
    		.power = incrediblec_atmel_ts_power,
    		.config_T6 = {0, 0, 0, 0, 0, 0},
    		.config_T7 = {50, 15, 25},
    		.config_T8 = {10, 0, 20, 10, 0, 0, 5, 15},
    		.config_T9 = {139, 0, 0, 18, 12, 0, 16, 38, 3, 7, 0, 5, 2, 15, [B]10[/B], 10, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 159, 47, 149, 81, 40},
    		.config_T15 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T19 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T20 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T22 = {15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 0, 7, 18, 25, 30, 0},
    		.config_T23 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T24 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T25 = {3, 0, 200, 50, 64, 31, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T27 = {0, 0, 0, 0, 0, 0, 0},
    		.config_T28 = {0, 0, 2, 4, 8, 60},
    		.object_crc = {0xDB, 0xBF, 0x60},
    		.cable_config = {35, 30, 8, 16},
    		.GCAF_level = {20, 24, 28, 40, 63},
    		.filter_level = {15, 60, 963, 1008},
    	},
    	{
    		.version = 0x015,
    		.abs_x_min = 13,
    		.abs_x_max = 1009,
    		.abs_y_min = 15,
    		.abs_y_max = 960,
    		.abs_pressure_min = 0,
    		.abs_pressure_max = 255,
    		.abs_width_min = 0,
    		.abs_width_max = 20,
    		.gpio_irq = INCREDIBLEC_GPIO_TP_INT_N,
    		.power = incrediblec_atmel_ts_power,
    		.config_T6 = {0, 0, 0, 0, 0, 0},
    		.config_T7 = {50, 15, 25},
    		.config_T8 = {12, 0, 20, 20, 0, 0, 20, 0},
    		.config_T9 = {139, 0, 0, 18, 12, 0, 32, 40, 2, 7, 0, 5, 2, 0, [B]10[/B], 10, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 47, 149, 81},
    		.config_T15 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T19 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T20 = {7, 0, 0, 0, 0, 0, 0, 30, 20, 4, 15, 5},
    		.config_T22 = {7, 0, 0, 25, 0, -25, 255, 4, 50, 0, 1, 10, 15, 20, 25, 30, 4},
    		.config_T23 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T24 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T25 = {3, 0, 200, 50, 64, 31, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T27 = {0, 0, 0, 0, 0, 0, 0},
    		.config_T28 = {0, 0, 2, 4, 8, 60},
    		.object_crc = {0x19, 0x87, 0x7E},
    	},
    	{
    		.version = 0x014,
    		.abs_x_min = 13,
    		.abs_x_max = 1009,
    		.abs_y_min = 15,
    		.abs_y_max = 960,
    		.abs_pressure_min = 0,
    		.abs_pressure_max = 255,
    		.abs_width_min = 0,
    		.abs_width_max = 20,
    		.gpio_irq = INCREDIBLEC_GPIO_TP_INT_N,
    		.power = incrediblec_atmel_ts_power,
    		.config_T6 = {0, 0, 0, 0, 0, 0},
    		.config_T7 = {50, 15, 25},
    		.config_T8 = {12, 0, 20, 20, 0, 0, 10, 15},
    		.config_T9 = {3, 0, 0, 18, 12, 0, 48, 45, 2, 7, 0, 0, 0, 0, [B]10[/B], 10, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 47, 143, 81},
    		.config_T15 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T19 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T20 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T22 = {5, 0, 0, 25, 0, -25, 255, 4, 50, 0, 1, 10, 15, 20, 25, 30, 4},
    		.config_T23 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T24 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T25 = {3, 0, 200, 50, 64, 31, 0, 0, 0, 0, 0, 0, 0, 0},
    		.config_T27 = {0, 0, 0, 0, 0, 0, 0},
    		.config_T28 = {0, 0, 2, 4, 8, 60},
    	}
    };

    For those who didn't spot the change, it's in config_t9 (highlighted in bold). You can, of course, change the 10 to anything you want (I've only tested with between 2 and 10, though) and that will be set as the maximum number of touches.

    I hope this helps someone.