Driver Library with inverted screen and increased SPI speed (16MHz). You need to use this library with the sx1280

Dependents:   MSNV2-Terminal_V1-6 SX1280DevKit SX126xDevKit SX126xDevKit ... more

Fork of DmTftLibrary by Display Module

Revision:
11:264e19992620
Parent:
10:d263094e666d
Child:
14:2db7065edbec
--- a/DmTouch.cpp	Wed Jul 09 08:31:34 2014 +0000
+++ b/DmTouch.cpp	Wed Jan 21 13:56:51 2015 +0000
@@ -41,6 +41,7 @@
       _width = 240;
       _height = 320;
       _hardwareSpi = false;
+      _touch_id = IC_2046;
       break;
 
     case DmTouch::DM_TFT28_105:
@@ -52,9 +53,45 @@
       _width = 240;
       _height = 320;
       _hardwareSpi = true;
+      _touch_id = IC_2046;
       break;
 
     case DmTouch::DM_TFT35_107:
+      _cs = D4;
+      _irq = D2;
+      _clk = D13;
+      _mosi = D11;
+      _miso = D12;
+      _width = 320;
+      _height = 240;      
+      _hardwareSpi = true;
+      _touch_id = IC_2046;
+	  break;
+
+    case DmTouch::DM_TFT43_108:  // or DM_TFT43_110
+      _cs = D10;
+      _irq = D2;
+      _clk = D13;
+      _mosi = D11;
+      _miso = D12;
+      _width = 480;
+      _height = 272;
+      _hardwareSpi = true;
+      _touch_id = IC_8875;
+	  break;     
+	  
+    case DmTouch::DM_TFT50_111:  // or  DM_TFT50_112
+      _cs = D10;
+      _irq = D2;
+      _clk = D13;
+      _mosi = D11;
+      _miso = D12;
+      _width = 800;
+      _height = 480;
+      _hardwareSpi = true;
+      _touch_id = IC_8875;
+	  break;    
+	  
     default:
       _cs = D4;
       _irq = D2;
@@ -64,6 +101,7 @@
       _width = 320;
       _height = 240;
       _hardwareSpi = true;
+      _touch_id = IC_2046;
       break;
   }
 
@@ -78,7 +116,9 @@
 	_irq = -1;
   }
 #elif defined (DM_TOOLCHAIN_MBED)
-  _irq = -1;
+  if(_touch_id != IC_8875) {
+    _irq = -1;
+  }
 #endif
   
   setCalibrationMatrix(DmTouchCalibration::getDefaultCalibrationData(disp));
@@ -140,7 +180,66 @@
   cbi(_pinCS, _bitmaskCS);
   spiWrite(0x80); // Enable PENIRQ
   sbi(_pinCS, _bitmaskCS);
+#elif defined (DM_TOOLCHAIN_MBED)
+    _pinIrq = new DigitalIn((PinName)_irq);
+    _pinIrq->mode(PullUp);  
 #endif    
+    if(_touch_id == IC_8875) {
+        // enable touch panel
+        cbi(_pinCS, _bitmaskCS);
+        spiWrite(0x80);
+        spiWrite(0x70);
+        sbi(_pinCS, _bitmaskCS);
+
+        cbi(_pinCS, _bitmaskCS);
+        spiWrite(0x00);
+        spiWrite(0xB3);
+        sbi(_pinCS, _bitmaskCS);
+
+        // set auto mode
+        cbi(_pinCS, _bitmaskCS);
+        spiWrite(0x80);
+        spiWrite(0x71);
+        sbi(_pinCS, _bitmaskCS);
+
+        cbi(_pinCS, _bitmaskCS);
+        spiWrite(0x00);
+        spiWrite(0x04);
+        sbi(_pinCS, _bitmaskCS);
+
+        // enable touch panel interrupt
+        cbi(_pinCS, _bitmaskCS);
+        spiWrite(0x80);
+        spiWrite(0xF0);
+        sbi(_pinCS, _bitmaskCS);
+
+        cbi(_pinCS, _bitmaskCS);
+        uint8_t temp;
+        spiWrite(0x40);
+        temp = spiRead();
+        sbi(_pinCS, _bitmaskCS);
+
+        cbi(_pinCS, _bitmaskCS);
+        spiWrite(0x80);
+        spiWrite(0xF0);
+        sbi(_pinCS, _bitmaskCS);
+
+        cbi(_pinCS, _bitmaskCS);
+        spiWrite(0x00);
+        spiWrite(temp | 0x04);
+        sbi(_pinCS, _bitmaskCS);
+
+        // Clear TP INT Status
+        cbi(_pinCS, _bitmaskCS);
+        spiWrite(0x80);
+        spiWrite(0xF1);
+        sbi(_pinCS, _bitmaskCS);
+
+        cbi(_pinCS, _bitmaskCS);
+        spiWrite(0x00);
+        spiWrite(0x04);
+        sbi(_pinCS, _bitmaskCS);
+    } 
 }
 
 void DmTouch::spiWrite(uint8_t data) {
@@ -241,10 +340,65 @@
 }
 
 void DmTouch::readRawData(uint16_t &x, uint16_t &y) {
-  cbi(_pinCS, _bitmaskCS);
-  x = readData12(0xD0);
-  y = readData12(0x90);
-  sbi(_pinCS, _bitmaskCS);
+  if(_touch_id == IC_8875){
+    uint16_t tx, ty;
+    uint8_t temp;
+
+    cbi(_pinCS, _bitmaskCS);
+    spiWrite(0x80);
+  	spiWrite(0x72);
+	sbi(_pinCS, _bitmaskCS);
+	
+	cbi(_pinCS, _bitmaskCS);
+  	spiWrite(0x40);
+  	tx = spiRead();		
+	sbi(_pinCS, _bitmaskCS);
+
+	cbi(_pinCS, _bitmaskCS);
+	spiWrite(0x80);
+  	spiWrite(0x73);		
+	sbi(_pinCS, _bitmaskCS);
+
+	cbi(_pinCS, _bitmaskCS);
+  	spiWrite(0x40);
+  	ty = spiRead();		
+	sbi(_pinCS, _bitmaskCS);
+
+	cbi(_pinCS, _bitmaskCS);
+	spiWrite(0x80);
+  	spiWrite(0x74);	
+	sbi(_pinCS, _bitmaskCS);
+
+	cbi(_pinCS, _bitmaskCS);
+  	spiWrite(0x40);
+  	temp = spiRead();		
+	sbi(_pinCS, _bitmaskCS);
+			
+	tx <<= 2;
+	ty <<= 2;
+	tx |= temp & 0x03;				// get the bottom x bits
+	ty |= (temp >> 2) & 0x03; // get the bottom y bits
+			
+	x = tx;
+	y = ty;
+			
+	// Clear TP INT Status 
+	cbi(_pinCS, _bitmaskCS);
+	spiWrite(0x80);
+  	spiWrite(0xF1);		
+	sbi(_pinCS, _bitmaskCS);
+
+	cbi(_pinCS, _bitmaskCS);
+  	spiWrite(0x00);
+  	spiWrite(0x04);	
+	sbi(_pinCS, _bitmaskCS);			
+  }
+  else{  
+    cbi(_pinCS, _bitmaskCS);
+    x = readData12(0xD0);
+    y = readData12(0x90);
+    sbi(_pinCS, _bitmaskCS);
+  }
 }
 
 void DmTouch::readTouchData(uint16_t& posX, uint16_t& posY, bool& touching) {  
@@ -253,11 +407,15 @@
 
   posX = getDisplayCoordinateX(touchX, touchY);
   posY = getDisplayCoordinateY(touchX, touchY);
-  
 #if defined (DM_TOOLCHAIN_ARDUINO)
   touching = isTouched();
 #elif defined (DM_TOOLCHAIN_MBED)
-  touching = (posX < _width && posY < _height);
+  if(_touch_id == IC_8875) {
+    touching = isTouched() && (posX < _width && posY < _height);
+  }
+  else{
+    touching = (posX < _width && posY < _height);
+  }
 #endif
 }
 
@@ -278,11 +436,41 @@
   }
 
   if ( !gbi(_pinIrq, _bitmaskIrq) ) {
+    if(_touch_id == IC_8875){
+	  // Clear TP INT Status 
+	  cbi(_pinCS, _bitmaskCS);
+	  spiWrite(0x80);
+  	  spiWrite(0xF1);		
+	  sbi(_pinCS, _bitmaskCS);
+
+	  cbi(_pinCS, _bitmaskCS);
+  	  spiWrite(0x00);
+  	  spiWrite(0x04);	
+	  sbi(_pinCS, _bitmaskCS);			
+    }    
     return true;
   }
 
   return false;
 #elif defined (DM_TOOLCHAIN_MBED)
+    if(_touch_id == IC_8875) {
+        delay(1);
+        if (!_pinIrq->read()) {
+            // Clear TP INT Status
+            cbi(_pinCS, _bitmaskCS);
+            spiWrite(0x80);
+            spiWrite(0xF1);
+            sbi(_pinCS, _bitmaskCS);
+
+            cbi(_pinCS, _bitmaskCS);
+            spiWrite(0x00);
+            spiWrite(0x04);
+            sbi(_pinCS, _bitmaskCS);
+            return true;
+        } else {
+            return false;
+        }
+    }
   return isSampleValid();
 #endif
 }
@@ -294,11 +482,13 @@
   uint8_t nbrOfMeasurements = 0;
 
   for (int i=0; i<MEASUREMENTS; i++) {
-    getAverageXY(valuesX[i], valuesY[i]);
+    getAverageXY(valuesX[i], valuesY[i]);  
     nbrOfMeasurements++;
-    if (!isTouched()) {
-      haveAllMeasurements = false;
-      break;
+    if(_touch_id != IC_8875) {
+      if (!isTouched()) {
+        haveAllMeasurements = false;
+        break;
+      }
     }
   }
   if (haveAllMeasurements) {