Search by Tags

Resistive Touch Screen on WinCE

 

Article updated at 06 Jul 2021
Compare with Revision




Resistive Touch Screen

The Colibri and Apalis modules come with an interface for a 4-wire resistive and 5-wire Resistive Touch Screen. The driver for this interface is already included in our pre-installed Win CE standard image.

Following table shows the availability of touch interface:

Colibri Module 4-Wire Touch 5-Wire Touch
PXA270 V2.2 and newer Yes Yes
PXA300 No No
PXA300 XT Yes Yes
PXA310 Yes Yes
PXA320 Yes No
PXA320(IT) V2.0 and newer Yes Yes
T20 Yes Yes
T30 Yes No
iMX6 Yes No
VFxx Yes No
iMX7 Yes No

This article focuses on the resistive touch interface, however it is also very easy to integrate capacitive devices.

4 Wire Resistive Touch Interface

This kind of touch screen interface connects to the touch screen by four wires in two pairs: (TSPX and TSMX), (TSPY and TSMY). A 4-wire resistive touch screen consists of two conductive film layers which are laminated to a solid base material or directly to the TFT screen. Each layer has two electrodes. One layer has an electrode on the left and one on the right edge. The other layer has one on the top and one on the bottom edge. When connecting the touch screen it is important to connect one signal pair to one layer.

For example:

  • TSPX to the left electrode and TSMX to the right electrode
  • TSPY to the upper electrode and TSMY to the lower electrode

As long as each wire pair is connected to one layer, every combination will work.

After proper connection the touch screen needs to be calibrated.

For in-depth information on how the 4-wire touch interface is implemented on the Colibri Module see the UCB1400 or WM9715 datasheet.

5 Wire Resistive Touch Interface

On the Colibri T20, Colibri PXA300 XT, Colibri PXA310, Colibri PXA270 V2.2 and newer, and Colibri PXA320(IT) V2.0 and newer, it is possible to directly connect a 5-wire touch screen.

The signals can be found on at the following locations:

Colibri Pin Evalboard Iris Orchid 4-Wire 5-Wire
SODIMM 14 X16 Pin5 X19 Pin5 X1 Pin36 TSPX(X+) BR
SODIMM 16 X16 Pin3 X19 Pin4 X1 Pin34 TSMX(X-) TL
SODIMM 18 X16 Pin4 X19 Pin3 X1 Pin35 TSPY(Y+) TR
SODIMM 20 X16 Pin2 X19 Pin2 X1 Pin33 TSMY(Y-) BL
SODIMM 2 X16 Pin6 X19 Pin6 X3 Pin7 - WIPER

The 5-wire feature is an option of the Wolfson Audio/Touch controller used on the modules mentioned above. For more information about the 5-wire feature see also the Wolfson WM9715 datasheet.

Driver Support

To activate the support for the 5-wire touch interface you need to set the TouchType=1 in the registry

[HKLM\HARDWARE\DEVICEMAP\TOUCH]
 TouchType=1   ; 0: 4-wire (default), 1: 5-wire

Hardware

Colibri PXAxxx, Colibri T20

Touch, ADC and Audio functionality are realized with the audio codec chip. Depending on module type and version, we use a codec from NXP UCB1400 or Wolfson Micro WM9715.

The chip requires power on VDDA_AUDIO. It must be powered even if you don't need Touch, ADC or Audio functionality.

Colibri T30, Colibri iMX6, Apalis iMX6

On the Colibri T30, Colibri iMX6, and Apalis iMX6 touch is realized with STMPE811 resistive touchscreen controller. The STMPE811 is integrated with a hard-wired touchscreen controller for 4-wire resistive type touchscreen.

Colibri Vybrid

On VF50 module touch screen is connected directly to the processor's internal ADC converter, on VF61 the Wolfson Micro WM9715 is used to support audio and touch screen.

Registry Settings

For the Colibri PXAxxx and Colibri T20, you can also use the Touch Tweak tool to make the settings for the touch screen driver. Colibri T30, VF50 and VF61 are not supported by the Touch Tweak tool yet.

Most settings are only supported in BSP version 3.2 and onwards for UCB codec and in BSP version 3.7 and onwards for Wolfson codec. You can reload the registry settings without rebooting the system. Just create an event named TouchSettingsChanged and set it. For an overview about the touch or audio codec, have a look here. The event mechanism is currently not supported on Vybrid modules.

Registry settings supported by all codecs used on Colibri PXAxxx and Colibri T20

[HKLM\HardWare\DeviceMap\Touch]
 
"Events"=0             ;Defines the events to set: 0=no Events(default), 1=TouchPenDown, 2=TouchPenUp (3=TouchPenDown and TouchPenUp)
"MouseEmulation"=0     ;any value beside 0 enables the sending of mouse events 
 
"SamplingInterval"=100 ;Interval between 2 touch measurements (X,Y,Pressure) in milliseconds
"WaitSample"=0         ;Wait before each (sub)sample
"DummySamples"=0       ;Samples to throw away (can normally be set to 0)
"Samples"=4            ;Samples to process (they will be averaged)
"TouchType"=0          ;Type of touch Screen. 0-> 4 wire, 1 -> 5 wire 

;Wait Times (n large touch panels or when using large filter capacitors higher values must be set to let the touch settle into the right measurement mode) O
"WaitX"=300            ;Time to wait before starting the sampling of X [us]. (Replaced by "Wait" key for Txx)
"WaitY"=300            ;Time to wait before starting the sampling of Y [us]. (Replaced by "Wait" key for Txx)
"WaitZ"=300            ;Time to wait before starting the sampling of Z [us]. (Replaced by "Wait" key for Txx)
"Wait"=300             ;For Txx modules only. Time to wait before starting sampling. (Added in 1.3beta3).
"PenUpTimeout"=25      ;For Txx modules only. Time (ms) to wait before triggering a penup event. (Added in 1.3beta3)

;The Driver will sample many values for each measurement (X/Y/Pressure) and if one of these values is too far apart from the others, 
;the whole measurement is invalidated. The Max Variance defines this maximum difference between all samples.
"MaxXVariance"=50      ;
"MaxYVariance"=50      ;
"MaxZVariance"=100     ;
"MinZValue"=0          ;Minimum pressure needed to validate all measurements. If the pressure is below this level, all X/Y measurement will be discarded.
 
"BitDepth"=10          ;ADC Bit Depth

Codec specific settings


;Supported by UCB codec only
"VRefByp"=0            ;VREFbypass. If 1 ,the internal reference voltage is connected to VREFBYP pin (UCB1400).
"Filter"=1             ;This will enable an ADC internal Analog LowPass filter. (Available since image 1.6.) (UCB1400)

;Supported by Wolfson codec only:
"Sensitivity"=32       ;Sensitivity setting for Wolfson codecs (1 to 63, 1=most sensitive) (Wolfson codec register 0x78 RPU bits) 

;Supported by Wolfson codec up to BSP V3.6 (obsolete):
"SettlingTime"=4       ;Settling time according to codec datasheet (supported )
"MaxPressure"=150      ;Maximal pressure

Registry settings supported by STMPE811 used on Colibri/Apalis T30 and Colibri/Apalis IMX6

The settings for the STMPE811 is supported in the Tegra BSP 1.2.


;Minimum pressure 
;If the pressure is below this level, the X/Y measurement will be discarded. If STMPE811_Min_Pressure=0 then all touches cause a X/Y measurement.
"STMPE811_Min_Pressure"=20	;default value 

;Movement tracking
;The "Tracking Index" in the TSC_CTRL register specifies a value, which determines the distance between the current touch position and the previous touch position. If the distance  is shorter than the tracking index, it is discarded.
;The tracking is calculated by summation of the horizontal and vertical movement. Movement is only reported if: (Current X - Previously Reported X) + (Current Y - Previously Reported Y) > Tracking Index.
;An increase in pressure override the movement tracking and report the new data set, even if X/Y is within the previous tracking index. This is to ensure that a slow touch is not discarded.
"STMPE811_Track"=0			;No tracking
"STMPE811_Track"=1			;Tranking index 4
"STMPE811_Track"=2			;Tranking index 8
"STMPE811_Track"=3			;Tranking index 16 
"STMPE811_Track"=4			;Tranking index 32 (default)
"STMPE811_Track"=5			;Tranking index 64 
"STMPE811_Track"=6			;Tranking index 92 
"STMPE811_Track"=7			;Tranking index 127

;Average control
;The STMPE811 touchscreen controller can be configured to oversample by 2/4/8 times and provide the averaged value as final output. This feature helps to reduce the effect of surrounding noise.
"STMPE811_Ave_Ctrl"=0		;1 samples
"STMPE811_Ave_Ctrl"=1		;2 samples
"STMPE811_Ave_Ctrl"=2		;4 samples
"STMPE811_Ave_Ctrl"=3		;8 samples (default)

;Touch detect delay
;The delay between two measurements are influenced many parameters like I2C communication etc. With the "Touch detect delay" this delay can changed but only values between 4 and 7 makes sense (the measured delay and the given delay in the datasheet (..) are not inline).
;Pleas note if STMPE811_Det_Delay is set to 6 or 7 then STMPE811_Pen_Up_Timeout must be to a higher value.  
"STMPE811_Det_Delay"=0		;[10 us]
"STMPE811_Det_Delay"=1		;[50 us]
"STMPE811_Det_Delay"=2		;[100 us]
"STMPE811_Det_Delay"=3		;[500 us]
"STMPE811_Det_Delay"=4		;8 ms  [1ms]
"STMPE811_Det_Delay"=5		;16 ms  [5ms] (default)
"STMPE811_Det_Delay"=6		;32 ms  [10ms] 
"STMPE811_Det_Delay"=7		;160 ms	[50ms] 

;Touch pen up detect delay
;After a pen down is detected the next pen down must be detected during this time otherwise a pen up is generated.
"STMPE811_Pen_Up_Timeout"=25	;delay in ms

;Touch settling delay
The delay between the driver X or Y and the ADC takes X or Y reading ist the settling time. 
;For large panels (> 6”), a capacitor of 10 nF is recommended at the touchscreen terminals for noise filtering. In this case, settling time of 1 ms or more is recommended.
"STMPE811_Settling"=0		;10 us
"STMPE811_Settling"=1		;100 us
"STMPE811_Settling"=2		;500 us (default)
"STMPE811_Settling"=3		;1 ms
"STMPE811_Settling"=4		;5 ms
"STMPE811_Settling"=5		;10 ms
"STMPE811_Settling"=6		;50 ms
"STMPE811_Settling"=7		;100 ms

;Driver control unit 
; The touchscreen drivers can be configured with 2 current ratings: 20 mA or 50 mA. In the case where multiple touch-down on the screen is causing a short, the current from the driver  is limited to these values. Tolerance of these current setting is +/- 25%.
"STMPE811_I_Drive"=0		;20 mA typical, 35 mA max
"STMPE811_I_Drive"=1		;50 mA typical, 80 mA max (default)

;Shield
;Writing each bit would ground the corresponding touchscreen wire
;Bit 3 Bit 2  Bit 1  Bit 0
;X+    X-     Y+     Y-
"STMPE811_Shield"=0x00		;no wire is shielded (default)

;Enables the sending of mouse events
"MouseEmulation"=0		;disable mouse events (default)
"MouseEmulation"=1		;any value beside 0 enables mouse events

;Defines the events to send
"Events"=0			;no Events(default)
"Events"=1			;TouchPenDown
"Events"=2			;TouchPenUp
"Events"=3			;TouchPenDown and TouchPenUp

Registry settings supported by Colibri VF50

[HKLM\HardWare\DeviceMap\Touch]
"MinZValue"=1050        ;(1...4095) Minimum pressure needed to validate all measurements. Highest value means lowest pressure.
"SettlingTime"=1        ;Settling time in ms

Registry settings supported by Colibri VF61

[HKLM\HardWare\DeviceMap\Touch]
"TouchType"=0          ;Type of touch Screen. 0-> 4 wire, 1 -> 5 wire 
 
"MinZValue"=0          ;Minimum pressure needed to validate all measurements. If the pressure is below this level, all X/Y measurement will be discarded.
"Sensitivity"=32       ;Sensitivity setting for Wolfson codecs (1 to 63, 1=most sensitive) (Wolfson codec register 0x78 RPU bits) 
"SettlingTime"=4       ;Settling time according to codec datasheet (supported )

Registry settings supported by Colibri IMX7

[HKLM\HardWare\DeviceMap\Touch]
"FirstConversionDelay"=dword:3 ;Range is 0-15
                               ;Configures the time that the controller wait before start sampling the touch screen, 
                               ;this will give the internal ADC some time to power-up and screen time to settle.
                               ;0=128 microseconds
                               ;3=512 microseconds
                               ;15=4096 microseconds
 
"AcquisitionTime"=dword:1 ;Range is 0-3
                          ;Sample acquisition time
                          ;0=2 microseconds
                          ;1=4 microseconds
                          ;2=8 microseconds
                          ;3=16 microseconds
 
"MedianFilterSize"=dword:2 ;Range is 0-3
                           ;Sets the number of samples taken for every measurement 
                           ;0=disabled
                           ;1=4 measurements
                           ;2=8 measurements
                           ;3=16 measurements
                           ;A subset of those samples is then used for averaging
 
"Averaging"=dword:1 ;Range is 0-3
                    ;Sets the number of valid samples that are taken to calculate the returned value, 
                    ;should be less or equal than MedianFilterSize.
                    ;0=2 samples
                    ;1=4 samples
                    ;2=8 samples
                    ;3=16 samples
 
"SamplingInterval"=100 ;Interval between 2 touch measurements (X,Y,Pressure) in milliseconds From image 1.1b4
"DummySamples"=0       ;Samples to throw away (can normally be set to 0) From image 1.1b4
"Samples"=4            ;Samples to process (they will be averaged) From image 1.1b4

;The Driver will sample many values for each measurement (X/Y) and if one of these values is too far apart from the others, 
;the whole measurement is invalidated. The Max Variance defines this maximum difference between all samples.
"MaxXVariance"=50      ; From image 1.1b4
"MaxYVariance"=50      ; From image 1.1b4
 

Events

The registry setting Events defines the events to be generated by the touch driver. Available named events are

  • TouchPenDown
  • TouchPenUp

If one or more of these events are enabled in the registry, the driver generates this events which can be caught by SW using WaitForSingleObject() or WaitForMultipleObject().

This Feature is available in Toradex WinCE BSP V3.7b1 and onwards.

Enable / Disable Touch Dynamically

The touch screen can be enabled and disabled by an application by following the steps mentioned below.

The following registry entry needs to be created or updated:

	 [HKLM\HardWare\DeviceMap\Touch]
	 "Disabled"=1     ; 0=enable touch     1=disable touch   

This can be achieved by using the code snipplet below:

	 {...
	 HKEY   hKey;
	 DWORD  dwDisabled = 1;
	 RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\TOUCH",
	              0, KEY_ALL_ACCESS, &hKey);
	 RegSetValueEx(hKey, L"Disabled", 0, REG_DWORD,
	               (LPBYTE)&dwDisabled, sizeof(DWORD));
	 RegCloseKey (hKey);
	 ...}

Create and set an event to inform the touch driver about the changed configuration.

	 {...
	 hEvent=CreateEvent(NULL, FALSE, FALSE, L"TouchSettingsChanged");
	 SetEvent(hEvent);
	 CloseHandle(hEvent);
	 ...}

Touch Screen Calibration

  • Please refer this article for Touch screen calibration in WinCE.
  • Please refer this article for Touch screen calibration in Linux.

USB Touch

In addition to the 4-wire resistive touch screen driver, there is also a USB touch screen driver (from TouchKit) in the standard Win CE image. The driver is compatible with various USB Touch Screens but you can also use your own driver. For USB HID driver check here.