touch screen handler for the microchip AR1020
ar1020.cpp@4:510ea5b28a05, 2011-02-24 (annotated)
- Committer:
- hlipka
- Date:
- Thu Feb 24 14:00:17 2011 +0000
- Revision:
- 4:510ea5b28a05
- Parent:
- 3:b7eb3b3fe79f
- Child:
- 5:a5eba88e8c3e
better documentation
added power handling (AR1020 is switched on by this library now)
added touch area handler for easier creation of menus and the like
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hlipka | 0:cf4dd04052e3 | 1 | /* |
hlipka | 0:cf4dd04052e3 | 2 | * mbed AR1020 library |
hlipka | 0:cf4dd04052e3 | 3 | * Copyright (c) 2010 Hendrik Lipka |
hlipka | 0:cf4dd04052e3 | 4 | * |
hlipka | 0:cf4dd04052e3 | 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
hlipka | 0:cf4dd04052e3 | 6 | * of this software and associated documentation files (the "Software"), to deal |
hlipka | 0:cf4dd04052e3 | 7 | * in the Software without restriction, including without limitation the rights |
hlipka | 0:cf4dd04052e3 | 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
hlipka | 0:cf4dd04052e3 | 9 | * copies of the Software, and to permit persons to whom the Software is |
hlipka | 0:cf4dd04052e3 | 10 | * furnished to do so, subject to the following conditions: |
hlipka | 0:cf4dd04052e3 | 11 | * |
hlipka | 0:cf4dd04052e3 | 12 | * The above copyright notice and this permission notice shall be included in |
hlipka | 0:cf4dd04052e3 | 13 | * all copies or substantial portions of the Software. |
hlipka | 0:cf4dd04052e3 | 14 | * |
hlipka | 0:cf4dd04052e3 | 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
hlipka | 0:cf4dd04052e3 | 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
hlipka | 0:cf4dd04052e3 | 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
hlipka | 0:cf4dd04052e3 | 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
hlipka | 0:cf4dd04052e3 | 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
hlipka | 0:cf4dd04052e3 | 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
hlipka | 0:cf4dd04052e3 | 21 | * THE SOFTWARE. |
hlipka | 0:cf4dd04052e3 | 22 | */ |
hlipka | 0:cf4dd04052e3 | 23 | |
hlipka | 0:cf4dd04052e3 | 24 | #include "ar1020.h" |
hlipka | 0:cf4dd04052e3 | 25 | #include "wait_api.h" |
hlipka | 0:cf4dd04052e3 | 26 | |
hlipka | 4:510ea5b28a05 | 27 | AR1020::AR1020(PinName mosi, PinName miso, PinName clk, PinName enable, PinName siq, PinName power) { |
hlipka | 0:cf4dd04052e3 | 28 | _mosi=new DigitalOut(mosi); |
hlipka | 0:cf4dd04052e3 | 29 | _miso=new DigitalIn(miso); |
hlipka | 0:cf4dd04052e3 | 30 | _clk=new DigitalOut(clk); |
hlipka | 0:cf4dd04052e3 | 31 | _clk->write(0); |
hlipka | 0:cf4dd04052e3 | 32 | |
hlipka | 0:cf4dd04052e3 | 33 | _enable=new DigitalOut(enable); |
hlipka | 0:cf4dd04052e3 | 34 | _enable->write(1); |
hlipka | 4:510ea5b28a05 | 35 | _irq=new InterruptIn(siq); |
hlipka | 4:510ea5b28a05 | 36 | _siq=new DigitalIn(siq); |
hlipka | 0:cf4dd04052e3 | 37 | _x=-1; |
hlipka | 0:cf4dd04052e3 | 38 | _y=-1; |
hlipka | 0:cf4dd04052e3 | 39 | _pen=0; |
hlipka | 0:cf4dd04052e3 | 40 | _oldPen=false; |
hlipka | 0:cf4dd04052e3 | 41 | _led=new DigitalOut(LED1); |
hlipka | 1:264ad2a00fd9 | 42 | _power=new DigitalOut(power); |
hlipka | 1:264ad2a00fd9 | 43 | _power->write(0); |
hlipka | 0:cf4dd04052e3 | 44 | } |
hlipka | 0:cf4dd04052e3 | 45 | |
hlipka | 2:1a436d154c84 | 46 | AR1020::~AR1020() { |
hlipka | 0:cf4dd04052e3 | 47 | delete _enable; |
hlipka | 0:cf4dd04052e3 | 48 | delete _irq; |
hlipka | 0:cf4dd04052e3 | 49 | } |
hlipka | 0:cf4dd04052e3 | 50 | |
hlipka | 2:1a436d154c84 | 51 | void AR1020::init() { |
hlipka | 3:b7eb3b3fe79f | 52 | bool ok=false; |
hlipka | 3:b7eb3b3fe79f | 53 | while (!ok) |
hlipka | 3:b7eb3b3fe79f | 54 | { |
hlipka | 3:b7eb3b3fe79f | 55 | _power->write(0); |
hlipka | 3:b7eb3b3fe79f | 56 | wait_ms(200); |
hlipka | 3:b7eb3b3fe79f | 57 | _power->write(1); |
hlipka | 3:b7eb3b3fe79f | 58 | wait_ms(100); |
hlipka | 3:b7eb3b3fe79f | 59 | int r=cmd(0x13,NULL,0); |
hlipka | 3:b7eb3b3fe79f | 60 | printf("disable touch=%i\n",r); |
hlipka | 3:b7eb3b3fe79f | 61 | if (0!=r) |
hlipka | 3:b7eb3b3fe79f | 62 | continue; |
hlipka | 3:b7eb3b3fe79f | 63 | |
hlipka | 3:b7eb3b3fe79f | 64 | int regStart=cmd(0x22,NULL,0); |
hlipka | 3:b7eb3b3fe79f | 65 | printf("reg offset=%i\n",regStart); |
hlipka | 3:b7eb3b3fe79f | 66 | |
hlipka | 3:b7eb3b3fe79f | 67 | if (regStart<0) |
hlipka | 3:b7eb3b3fe79f | 68 | continue; |
hlipka | 3:b7eb3b3fe79f | 69 | |
hlipka | 3:b7eb3b3fe79f | 70 | char cid2[4]={0x00,0x0d+regStart,0x01,0x01}; |
hlipka | 3:b7eb3b3fe79f | 71 | r=cmd(0x21,cid2,4); |
hlipka | 3:b7eb3b3fe79f | 72 | printf("set mode=1 => %i\n",r); |
hlipka | 3:b7eb3b3fe79f | 73 | if (0!=r) |
hlipka | 3:b7eb3b3fe79f | 74 | continue; |
hlipka | 3:b7eb3b3fe79f | 75 | |
hlipka | 3:b7eb3b3fe79f | 76 | r=cmd(0x12,NULL,0); |
hlipka | 3:b7eb3b3fe79f | 77 | printf("enable touch=%i\n",r); |
hlipka | 3:b7eb3b3fe79f | 78 | if (0!=r) |
hlipka | 3:b7eb3b3fe79f | 79 | continue; |
hlipka | 3:b7eb3b3fe79f | 80 | ok=true; |
hlipka | 3:b7eb3b3fe79f | 81 | } |
hlipka | 0:cf4dd04052e3 | 82 | _irq->rise(this, &AR1020::read); |
hlipka | 0:cf4dd04052e3 | 83 | } |
hlipka | 0:cf4dd04052e3 | 84 | |
hlipka | 2:1a436d154c84 | 85 | int AR1020::x() { |
hlipka | 0:cf4dd04052e3 | 86 | return _x; |
hlipka | 0:cf4dd04052e3 | 87 | } |
hlipka | 0:cf4dd04052e3 | 88 | |
hlipka | 2:1a436d154c84 | 89 | int AR1020::y() { |
hlipka | 0:cf4dd04052e3 | 90 | return _y; |
hlipka | 0:cf4dd04052e3 | 91 | } |
hlipka | 0:cf4dd04052e3 | 92 | |
hlipka | 2:1a436d154c84 | 93 | int AR1020::pen() { |
hlipka | 0:cf4dd04052e3 | 94 | return _pen; |
hlipka | 0:cf4dd04052e3 | 95 | } |
hlipka | 0:cf4dd04052e3 | 96 | |
hlipka | 0:cf4dd04052e3 | 97 | |
hlipka | 2:1a436d154c84 | 98 | void AR1020::read() { |
hlipka | 4:510ea5b28a05 | 99 | while (1==_siq->read()) { |
hlipka | 2:1a436d154c84 | 100 | _led->write(1); |
hlipka | 2:1a436d154c84 | 101 | _enable->write(0); |
hlipka | 2:1a436d154c84 | 102 | wait_us(60); |
hlipka | 2:1a436d154c84 | 103 | |
hlipka | 2:1a436d154c84 | 104 | int pen=readByte(); |
hlipka | 2:1a436d154c84 | 105 | wait_us(60); |
hlipka | 2:1a436d154c84 | 106 | |
hlipka | 2:1a436d154c84 | 107 | int xlo=readByte(); |
hlipka | 2:1a436d154c84 | 108 | wait_us(60); |
hlipka | 2:1a436d154c84 | 109 | |
hlipka | 2:1a436d154c84 | 110 | int xhi=readByte(); |
hlipka | 2:1a436d154c84 | 111 | wait_us(60); |
hlipka | 2:1a436d154c84 | 112 | |
hlipka | 2:1a436d154c84 | 113 | int ylo=readByte(); |
hlipka | 2:1a436d154c84 | 114 | wait_us(60); |
hlipka | 2:1a436d154c84 | 115 | |
hlipka | 2:1a436d154c84 | 116 | int yhi=readByte(); |
hlipka | 2:1a436d154c84 | 117 | _enable->write(1); |
hlipka | 0:cf4dd04052e3 | 118 | |
hlipka | 0:cf4dd04052e3 | 119 | // printf("0x%x|0x%x|0x%x|0x%x|0x%x\n", pen,xlo,xhi,ylo,yhi); |
hlipka | 2:1a436d154c84 | 120 | if (0x4d==pen || 0==pen || 255==pen) { |
hlipka | 2:1a436d154c84 | 121 | // ignore invalid stuff, do nothing... |
hlipka | 2:1a436d154c84 | 122 | } else if (0x81!=pen&0x81) { // pen set? |
hlipka | 2:1a436d154c84 | 123 | _pen=0; |
hlipka | 2:1a436d154c84 | 124 | int x=xlo+(xhi<<7); |
hlipka | 2:1a436d154c84 | 125 | int y=ylo+(yhi<<7); |
hlipka | 2:1a436d154c84 | 126 | if (0!=x&&0!=y) { |
hlipka | 2:1a436d154c84 | 127 | _x=x; |
hlipka | 2:1a436d154c84 | 128 | _y=y; |
hlipka | 2:1a436d154c84 | 129 | } |
hlipka | 2:1a436d154c84 | 130 | } else { |
hlipka | 2:1a436d154c84 | 131 | _pen=1; |
hlipka | 2:1a436d154c84 | 132 | int x=xlo+(xhi<<7); |
hlipka | 2:1a436d154c84 | 133 | int y=ylo+(yhi<<7); |
hlipka | 2:1a436d154c84 | 134 | if (0!=x&&0!=y) { |
hlipka | 2:1a436d154c84 | 135 | _x=x; |
hlipka | 2:1a436d154c84 | 136 | _y=y; |
hlipka | 2:1a436d154c84 | 137 | } |
hlipka | 0:cf4dd04052e3 | 138 | } |
hlipka | 2:1a436d154c84 | 139 | _event.x=_x; |
hlipka | 2:1a436d154c84 | 140 | _event.y=_y; |
hlipka | 2:1a436d154c84 | 141 | _event.pen=_pen; |
hlipka | 2:1a436d154c84 | 142 | if (_pen==1 && _oldPen==false) { // pen down |
hlipka | 2:1a436d154c84 | 143 | _callbackPD.call((uint32_t)&_event); |
hlipka | 2:1a436d154c84 | 144 | } else if (_pen==1 && _oldPen==true) { // pen moved |
hlipka | 2:1a436d154c84 | 145 | _callbackPM.call((uint32_t)&_event); |
hlipka | 2:1a436d154c84 | 146 | } else if (_pen==0 && _oldPen==true) { // pen up |
hlipka | 2:1a436d154c84 | 147 | _callbackPU.call((uint32_t)&_event); |
hlipka | 2:1a436d154c84 | 148 | } else { |
hlipka | 2:1a436d154c84 | 149 | // happens on the first touch (the first report is send with pen=0). |
hlipka | 2:1a436d154c84 | 150 | } |
hlipka | 2:1a436d154c84 | 151 | _oldPen=(_pen==1); |
hlipka | 2:1a436d154c84 | 152 | _led->write(0); |
hlipka | 4:510ea5b28a05 | 153 | if (1==_siq->read()) |
hlipka | 2:1a436d154c84 | 154 | wait_ms(5); |
hlipka | 0:cf4dd04052e3 | 155 | } |
hlipka | 0:cf4dd04052e3 | 156 | } |
hlipka | 0:cf4dd04052e3 | 157 | |
hlipka | 2:1a436d154c84 | 158 | int AR1020::cmd(char cmd,char* data, int len, bool doEnable) { |
hlipka | 2:1a436d154c84 | 159 | if (doEnable) { |
hlipka | 2:1a436d154c84 | 160 | _enable->write(1); |
hlipka | 2:1a436d154c84 | 161 | wait_us(1000); |
hlipka | 2:1a436d154c84 | 162 | _enable->write(0); |
hlipka | 2:1a436d154c84 | 163 | } |
hlipka | 2:1a436d154c84 | 164 | |
hlipka | 0:cf4dd04052e3 | 165 | wait_us(10); |
hlipka | 2:1a436d154c84 | 166 | |
hlipka | 0:cf4dd04052e3 | 167 | writeByte(0x55); |
hlipka | 0:cf4dd04052e3 | 168 | wait_us(100); |
hlipka | 2:1a436d154c84 | 169 | |
hlipka | 0:cf4dd04052e3 | 170 | writeByte(len+1); |
hlipka | 0:cf4dd04052e3 | 171 | wait_us(100); |
hlipka | 2:1a436d154c84 | 172 | |
hlipka | 0:cf4dd04052e3 | 173 | writeByte(cmd); |
hlipka | 0:cf4dd04052e3 | 174 | wait_us(100); |
hlipka | 2:1a436d154c84 | 175 | |
hlipka | 2:1a436d154c84 | 176 | for (int i=0;i<len;i++) { |
hlipka | 0:cf4dd04052e3 | 177 | writeByte(data[i]); |
hlipka | 0:cf4dd04052e3 | 178 | wait_us(100); |
hlipka | 0:cf4dd04052e3 | 179 | } |
hlipka | 0:cf4dd04052e3 | 180 | Timer t; |
hlipka | 0:cf4dd04052e3 | 181 | t.start(); |
hlipka | 2:1a436d154c84 | 182 | while (true) { |
hlipka | 2:1a436d154c84 | 183 | wait_us(100); |
hlipka | 4:510ea5b28a05 | 184 | if (1==_siq->read()) |
hlipka | 2:1a436d154c84 | 185 | break; |
hlipka | 2:1a436d154c84 | 186 | if (t.read_ms()>1) |
hlipka | 2:1a436d154c84 | 187 | break; |
hlipka | 0:cf4dd04052e3 | 188 | } |
hlipka | 0:cf4dd04052e3 | 189 | char rhead=readByte(); |
hlipka | 0:cf4dd04052e3 | 190 | wait_us(100); |
hlipka | 2:1a436d154c84 | 191 | if (rhead!=0x55) { |
hlipka | 2:1a436d154c84 | 192 | if (doEnable) |
hlipka | 2:1a436d154c84 | 193 | _enable->write(1); |
hlipka | 0:cf4dd04052e3 | 194 | printf("rh=0x%x\n",rhead); |
hlipka | 0:cf4dd04052e3 | 195 | return -1000; |
hlipka | 0:cf4dd04052e3 | 196 | } |
hlipka | 0:cf4dd04052e3 | 197 | char rlen=readByte(); |
hlipka | 0:cf4dd04052e3 | 198 | wait_us(100); |
hlipka | 2:1a436d154c84 | 199 | if (rlen==2) { |
hlipka | 0:cf4dd04052e3 | 200 | char r=readByte(); |
hlipka | 0:cf4dd04052e3 | 201 | wait_us(100); |
hlipka | 0:cf4dd04052e3 | 202 | char rc=readByte(); |
hlipka | 0:cf4dd04052e3 | 203 | wait_us(100); |
hlipka | 2:1a436d154c84 | 204 | if (doEnable) |
hlipka | 2:1a436d154c84 | 205 | _enable->write(1); |
hlipka | 0:cf4dd04052e3 | 206 | if (rc!=cmd) |
hlipka | 0:cf4dd04052e3 | 207 | return -2000; |
hlipka | 0:cf4dd04052e3 | 208 | return -r; |
hlipka | 2:1a436d154c84 | 209 | } else if (rlen==3) { |
hlipka | 0:cf4dd04052e3 | 210 | char r=readByte(); |
hlipka | 0:cf4dd04052e3 | 211 | wait_us(100); |
hlipka | 0:cf4dd04052e3 | 212 | char rc=readByte(); |
hlipka | 0:cf4dd04052e3 | 213 | wait_us(100); |
hlipka | 2:1a436d154c84 | 214 | if (rc!=cmd) { |
hlipka | 2:1a436d154c84 | 215 | if (doEnable) |
hlipka | 2:1a436d154c84 | 216 | _enable->write(1); |
hlipka | 0:cf4dd04052e3 | 217 | return -3000; |
hlipka | 0:cf4dd04052e3 | 218 | } |
hlipka | 0:cf4dd04052e3 | 219 | char rd=readByte(); |
hlipka | 0:cf4dd04052e3 | 220 | wait_us(100); |
hlipka | 2:1a436d154c84 | 221 | if (doEnable) |
hlipka | 2:1a436d154c84 | 222 | _enable->write(1); |
hlipka | 0:cf4dd04052e3 | 223 | if (r==0) |
hlipka | 0:cf4dd04052e3 | 224 | return rd; |
hlipka | 0:cf4dd04052e3 | 225 | return -r; |
hlipka | 2:1a436d154c84 | 226 | } else { |
hlipka | 2:1a436d154c84 | 227 | if (doEnable) |
hlipka | 2:1a436d154c84 | 228 | _enable->write(1); |
hlipka | 0:cf4dd04052e3 | 229 | return -4000; |
hlipka | 0:cf4dd04052e3 | 230 | } |
hlipka | 0:cf4dd04052e3 | 231 | } |
hlipka | 2:1a436d154c84 | 232 | void AR1020::calibrate() { |
hlipka | 0:cf4dd04052e3 | 233 | _irq->rise(NULL); |
hlipka | 0:cf4dd04052e3 | 234 | |
hlipka | 0:cf4dd04052e3 | 235 | DigitalOut led1(LED1); |
hlipka | 0:cf4dd04052e3 | 236 | DigitalOut led2(LED2); |
hlipka | 0:cf4dd04052e3 | 237 | DigitalOut led3(LED3); |
hlipka | 0:cf4dd04052e3 | 238 | DigitalOut led4(LED4); |
hlipka | 2:1a436d154c84 | 239 | led1=0; |
hlipka | 2:1a436d154c84 | 240 | led2=0; |
hlipka | 2:1a436d154c84 | 241 | led3=1; |
hlipka | 2:1a436d154c84 | 242 | led4=1; |
hlipka | 2:1a436d154c84 | 243 | |
hlipka | 2:1a436d154c84 | 244 | int r=cmd(0x13,NULL,0); |
hlipka | 0:cf4dd04052e3 | 245 | printf("disable touch=%i\n",r); |
hlipka | 0:cf4dd04052e3 | 246 | wait_ms(100); |
hlipka | 0:cf4dd04052e3 | 247 | if (r<0) |
hlipka | 0:cf4dd04052e3 | 248 | return; |
hlipka | 0:cf4dd04052e3 | 249 | led4=0; |
hlipka | 2:1a436d154c84 | 250 | |
hlipka | 0:cf4dd04052e3 | 251 | int regStart=cmd(0x22,NULL,0); |
hlipka | 0:cf4dd04052e3 | 252 | printf("reg offset=%i\n",regStart); |
hlipka | 0:cf4dd04052e3 | 253 | |
hlipka | 0:cf4dd04052e3 | 254 | char cid[3]={0x00,0x0d+regStart,0x01}; |
hlipka | 0:cf4dd04052e3 | 255 | int mode=cmd(0x20,cid,3); |
hlipka | 0:cf4dd04052e3 | 256 | printf("mode=%i\n",mode); |
hlipka | 0:cf4dd04052e3 | 257 | |
hlipka | 0:cf4dd04052e3 | 258 | if (regStart<0) |
hlipka | 0:cf4dd04052e3 | 259 | return; |
hlipka | 0:cf4dd04052e3 | 260 | printf("start calibrate\n"); |
hlipka | 2:1a436d154c84 | 261 | led3=0; |
hlipka | 0:cf4dd04052e3 | 262 | char cid2[4]={0x00,0x0e+regStart,0x01,0x19}; |
hlipka | 0:cf4dd04052e3 | 263 | r=cmd(0x21,cid2,4); |
hlipka | 0:cf4dd04052e3 | 264 | printf("set inset=%i\n",r); |
hlipka | 0:cf4dd04052e3 | 265 | if (r<0) |
hlipka | 0:cf4dd04052e3 | 266 | return; |
hlipka | 0:cf4dd04052e3 | 267 | |
hlipka | 0:cf4dd04052e3 | 268 | _enable->write(1); |
hlipka | 2:1a436d154c84 | 269 | wait_us(100); |
hlipka | 0:cf4dd04052e3 | 270 | _enable->write(0); |
hlipka | 0:cf4dd04052e3 | 271 | wait_us(10); |
hlipka | 2:1a436d154c84 | 272 | char cid3[1]={0x04}; |
hlipka | 2:1a436d154c84 | 273 | cmd(0x14,cid3,1,false); |
hlipka | 2:1a436d154c84 | 274 | |
hlipka | 2:1a436d154c84 | 275 | wait_ms(1); |
hlipka | 0:cf4dd04052e3 | 276 | |
hlipka | 0:cf4dd04052e3 | 277 | int resp=readCalibResponse(); |
hlipka | 0:cf4dd04052e3 | 278 | printf("status=%i\n",resp); |
hlipka | 0:cf4dd04052e3 | 279 | printf("start OK, press upper left"); |
hlipka | 0:cf4dd04052e3 | 280 | led1=1; |
hlipka | 0:cf4dd04052e3 | 281 | resp=readCalibResponse(); |
hlipka | 0:cf4dd04052e3 | 282 | printf("status=%i\n",resp); |
hlipka | 0:cf4dd04052e3 | 283 | printf("press upper right"); |
hlipka | 0:cf4dd04052e3 | 284 | led2=1; |
hlipka | 0:cf4dd04052e3 | 285 | resp=readCalibResponse(); |
hlipka | 0:cf4dd04052e3 | 286 | printf("status=%i\n",resp); |
hlipka | 0:cf4dd04052e3 | 287 | printf("press lower right"); |
hlipka | 0:cf4dd04052e3 | 288 | led3=1; |
hlipka | 0:cf4dd04052e3 | 289 | resp=readCalibResponse(); |
hlipka | 0:cf4dd04052e3 | 290 | printf("status=%i\n",resp); |
hlipka | 0:cf4dd04052e3 | 291 | printf("press lower left"); |
hlipka | 0:cf4dd04052e3 | 292 | led4=1; |
hlipka | 0:cf4dd04052e3 | 293 | resp=readCalibResponse(); |
hlipka | 0:cf4dd04052e3 | 294 | printf("status=%i\n",resp); |
hlipka | 2:1a436d154c84 | 295 | |
hlipka | 2:1a436d154c84 | 296 | _enable->write(1); |
hlipka | 2:1a436d154c84 | 297 | |
hlipka | 2:1a436d154c84 | 298 | r=cmd(0x23,NULL,0); |
hlipka | 2:1a436d154c84 | 299 | printf("save registers=%i\n",r); |
hlipka | 2:1a436d154c84 | 300 | |
hlipka | 2:1a436d154c84 | 301 | r=cmd(0x12,NULL,0); |
hlipka | 0:cf4dd04052e3 | 302 | printf("enable touch=%i\n",r); |
hlipka | 2:1a436d154c84 | 303 | |
hlipka | 0:cf4dd04052e3 | 304 | _irq->rise(this, &AR1020::read); |
hlipka | 2:1a436d154c84 | 305 | |
hlipka | 0:cf4dd04052e3 | 306 | } |
hlipka | 0:cf4dd04052e3 | 307 | |
hlipka | 2:1a436d154c84 | 308 | int AR1020::readCalibResponse() { |
hlipka | 2:1a436d154c84 | 309 | while (true) { |
hlipka | 0:cf4dd04052e3 | 310 | int r=readByte(); |
hlipka | 2:1a436d154c84 | 311 | if (r!=0x55) { |
hlipka | 2:1a436d154c84 | 312 | // printf("1=0x%x\n",r); |
hlipka | 0:cf4dd04052e3 | 313 | wait_ms(100); |
hlipka | 0:cf4dd04052e3 | 314 | continue; |
hlipka | 0:cf4dd04052e3 | 315 | } |
hlipka | 0:cf4dd04052e3 | 316 | |
hlipka | 0:cf4dd04052e3 | 317 | r=readByte(); |
hlipka | 0:cf4dd04052e3 | 318 | wait_us(100); |
hlipka | 2:1a436d154c84 | 319 | if (r!=0x02) { |
hlipka | 0:cf4dd04052e3 | 320 | printf("2=0x%x\n",r); |
hlipka | 0:cf4dd04052e3 | 321 | continue; |
hlipka | 0:cf4dd04052e3 | 322 | } |
hlipka | 2:1a436d154c84 | 323 | |
hlipka | 0:cf4dd04052e3 | 324 | r=readByte(); |
hlipka | 0:cf4dd04052e3 | 325 | wait_us(100); |
hlipka | 2:1a436d154c84 | 326 | if (r!=0x00) { |
hlipka | 0:cf4dd04052e3 | 327 | printf("3=0x%x\n",r); |
hlipka | 0:cf4dd04052e3 | 328 | continue; |
hlipka | 0:cf4dd04052e3 | 329 | } |
hlipka | 0:cf4dd04052e3 | 330 | int rc=readByte(); |
hlipka | 0:cf4dd04052e3 | 331 | wait_us(100); |
hlipka | 2:1a436d154c84 | 332 | if (rc!=0x14) { |
hlipka | 0:cf4dd04052e3 | 333 | printf("4=0x%x\n",r); |
hlipka | 0:cf4dd04052e3 | 334 | continue; |
hlipka | 0:cf4dd04052e3 | 335 | } |
hlipka | 2:1a436d154c84 | 336 | |
hlipka | 0:cf4dd04052e3 | 337 | return r; |
hlipka | 0:cf4dd04052e3 | 338 | } |
hlipka | 0:cf4dd04052e3 | 339 | } |
hlipka | 0:cf4dd04052e3 | 340 | |
hlipka | 2:1a436d154c84 | 341 | int AR1020::readByte() { |
hlipka | 0:cf4dd04052e3 | 342 | _clk->write(0); |
hlipka | 0:cf4dd04052e3 | 343 | wait_us(10); |
hlipka | 0:cf4dd04052e3 | 344 | int r=0; |
hlipka | 2:1a436d154c84 | 345 | for (int i=0;i<8;i++) { |
hlipka | 0:cf4dd04052e3 | 346 | r=r<<1; |
hlipka | 0:cf4dd04052e3 | 347 | _clk->write(1); |
hlipka | 0:cf4dd04052e3 | 348 | wait_us(10); |
hlipka | 0:cf4dd04052e3 | 349 | _clk->write(0); |
hlipka | 0:cf4dd04052e3 | 350 | wait_us(10); |
hlipka | 0:cf4dd04052e3 | 351 | int bit=_miso->read(); |
hlipka | 0:cf4dd04052e3 | 352 | r+=bit; |
hlipka | 0:cf4dd04052e3 | 353 | } |
hlipka | 0:cf4dd04052e3 | 354 | // printf("<-%i\n",r); |
hlipka | 0:cf4dd04052e3 | 355 | return r; |
hlipka | 0:cf4dd04052e3 | 356 | } |
hlipka | 0:cf4dd04052e3 | 357 | |
hlipka | 2:1a436d154c84 | 358 | void AR1020::writeByte(char byte) { |
hlipka | 0:cf4dd04052e3 | 359 | _clk->write(0); |
hlipka | 0:cf4dd04052e3 | 360 | wait_us(10); |
hlipka | 0:cf4dd04052e3 | 361 | // printf("->0x%x\n",byte); |
hlipka | 2:1a436d154c84 | 362 | for (int i=0;i<8;i++) { |
hlipka | 0:cf4dd04052e3 | 363 | int bit=byte>127; |
hlipka | 0:cf4dd04052e3 | 364 | // printf("%i",bit); |
hlipka | 0:cf4dd04052e3 | 365 | _clk->write(1); |
hlipka | 0:cf4dd04052e3 | 366 | wait_us(10); |
hlipka | 0:cf4dd04052e3 | 367 | _mosi->write(bit); |
hlipka | 0:cf4dd04052e3 | 368 | wait_us(10); |
hlipka | 0:cf4dd04052e3 | 369 | _clk->write(0); |
hlipka | 0:cf4dd04052e3 | 370 | wait_us(10); |
hlipka | 0:cf4dd04052e3 | 371 | byte=(char)(byte<<1); |
hlipka | 0:cf4dd04052e3 | 372 | |
hlipka | 0:cf4dd04052e3 | 373 | } |
hlipka | 0:cf4dd04052e3 | 374 | // printf("\n"); |
hlipka | 0:cf4dd04052e3 | 375 | } |