touch screen handler for the microchip AR1020
ar1020.cpp@6:a6971458d612, 2011-02-24 (annotated)
- Committer:
- hlipka
- Date:
- Thu Feb 24 22:05:04 2011 +0000
- Revision:
- 6:a6971458d612
- Parent:
- 5:a5eba88e8c3e
calibration works now
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 | 5:a5eba88e8c3e | 55 | printf("power on AR1020\n"); |
hlipka | 3:b7eb3b3fe79f | 56 | _power->write(0); |
hlipka | 5:a5eba88e8c3e | 57 | wait_ms(400); |
hlipka | 5:a5eba88e8c3e | 58 | _power->write(1); |
hlipka | 3:b7eb3b3fe79f | 59 | wait_ms(200); |
hlipka | 3:b7eb3b3fe79f | 60 | int r=cmd(0x13,NULL,0); |
hlipka | 3:b7eb3b3fe79f | 61 | printf("disable touch=%i\n",r); |
hlipka | 3:b7eb3b3fe79f | 62 | if (0!=r) |
hlipka | 3:b7eb3b3fe79f | 63 | continue; |
hlipka | 3:b7eb3b3fe79f | 64 | |
hlipka | 3:b7eb3b3fe79f | 65 | int regStart=cmd(0x22,NULL,0); |
hlipka | 3:b7eb3b3fe79f | 66 | printf("reg offset=%i\n",regStart); |
hlipka | 3:b7eb3b3fe79f | 67 | |
hlipka | 3:b7eb3b3fe79f | 68 | if (regStart<0) |
hlipka | 3:b7eb3b3fe79f | 69 | continue; |
hlipka | 3:b7eb3b3fe79f | 70 | |
hlipka | 3:b7eb3b3fe79f | 71 | char cid2[4]={0x00,0x0d+regStart,0x01,0x01}; |
hlipka | 3:b7eb3b3fe79f | 72 | r=cmd(0x21,cid2,4); |
hlipka | 3:b7eb3b3fe79f | 73 | printf("set mode=1 => %i\n",r); |
hlipka | 3:b7eb3b3fe79f | 74 | if (0!=r) |
hlipka | 3:b7eb3b3fe79f | 75 | continue; |
hlipka | 5:a5eba88e8c3e | 76 | |
hlipka | 5:a5eba88e8c3e | 77 | r=cmd(0x23,NULL,0 ); |
hlipka | 5:a5eba88e8c3e | 78 | printf("save regs => %i\n",r); |
hlipka | 5:a5eba88e8c3e | 79 | if (0!=r) |
hlipka | 5:a5eba88e8c3e | 80 | continue; |
hlipka | 3:b7eb3b3fe79f | 81 | |
hlipka | 3:b7eb3b3fe79f | 82 | r=cmd(0x12,NULL,0); |
hlipka | 3:b7eb3b3fe79f | 83 | printf("enable touch=%i\n",r); |
hlipka | 3:b7eb3b3fe79f | 84 | if (0!=r) |
hlipka | 3:b7eb3b3fe79f | 85 | continue; |
hlipka | 3:b7eb3b3fe79f | 86 | ok=true; |
hlipka | 3:b7eb3b3fe79f | 87 | } |
hlipka | 0:cf4dd04052e3 | 88 | _irq->rise(this, &AR1020::read); |
hlipka | 0:cf4dd04052e3 | 89 | } |
hlipka | 0:cf4dd04052e3 | 90 | |
hlipka | 2:1a436d154c84 | 91 | int AR1020::x() { |
hlipka | 0:cf4dd04052e3 | 92 | return _x; |
hlipka | 0:cf4dd04052e3 | 93 | } |
hlipka | 0:cf4dd04052e3 | 94 | |
hlipka | 2:1a436d154c84 | 95 | int AR1020::y() { |
hlipka | 0:cf4dd04052e3 | 96 | return _y; |
hlipka | 0:cf4dd04052e3 | 97 | } |
hlipka | 0:cf4dd04052e3 | 98 | |
hlipka | 2:1a436d154c84 | 99 | int AR1020::pen() { |
hlipka | 0:cf4dd04052e3 | 100 | return _pen; |
hlipka | 0:cf4dd04052e3 | 101 | } |
hlipka | 0:cf4dd04052e3 | 102 | |
hlipka | 0:cf4dd04052e3 | 103 | |
hlipka | 2:1a436d154c84 | 104 | void AR1020::read() { |
hlipka | 4:510ea5b28a05 | 105 | while (1==_siq->read()) { |
hlipka | 2:1a436d154c84 | 106 | _led->write(1); |
hlipka | 2:1a436d154c84 | 107 | _enable->write(0); |
hlipka | 2:1a436d154c84 | 108 | wait_us(60); |
hlipka | 2:1a436d154c84 | 109 | |
hlipka | 2:1a436d154c84 | 110 | int pen=readByte(); |
hlipka | 2:1a436d154c84 | 111 | wait_us(60); |
hlipka | 2:1a436d154c84 | 112 | |
hlipka | 2:1a436d154c84 | 113 | int xlo=readByte(); |
hlipka | 2:1a436d154c84 | 114 | wait_us(60); |
hlipka | 2:1a436d154c84 | 115 | |
hlipka | 2:1a436d154c84 | 116 | int xhi=readByte(); |
hlipka | 2:1a436d154c84 | 117 | wait_us(60); |
hlipka | 2:1a436d154c84 | 118 | |
hlipka | 2:1a436d154c84 | 119 | int ylo=readByte(); |
hlipka | 2:1a436d154c84 | 120 | wait_us(60); |
hlipka | 2:1a436d154c84 | 121 | |
hlipka | 2:1a436d154c84 | 122 | int yhi=readByte(); |
hlipka | 2:1a436d154c84 | 123 | _enable->write(1); |
hlipka | 0:cf4dd04052e3 | 124 | |
hlipka | 0:cf4dd04052e3 | 125 | // printf("0x%x|0x%x|0x%x|0x%x|0x%x\n", pen,xlo,xhi,ylo,yhi); |
hlipka | 2:1a436d154c84 | 126 | if (0x4d==pen || 0==pen || 255==pen) { |
hlipka | 2:1a436d154c84 | 127 | // ignore invalid stuff, do nothing... |
hlipka | 2:1a436d154c84 | 128 | } else if (0x81!=pen&0x81) { // pen set? |
hlipka | 2:1a436d154c84 | 129 | _pen=0; |
hlipka | 2:1a436d154c84 | 130 | int x=xlo+(xhi<<7); |
hlipka | 2:1a436d154c84 | 131 | int y=ylo+(yhi<<7); |
hlipka | 2:1a436d154c84 | 132 | if (0!=x&&0!=y) { |
hlipka | 2:1a436d154c84 | 133 | _x=x; |
hlipka | 2:1a436d154c84 | 134 | _y=y; |
hlipka | 2:1a436d154c84 | 135 | } |
hlipka | 2:1a436d154c84 | 136 | } else { |
hlipka | 2:1a436d154c84 | 137 | _pen=1; |
hlipka | 2:1a436d154c84 | 138 | int x=xlo+(xhi<<7); |
hlipka | 2:1a436d154c84 | 139 | int y=ylo+(yhi<<7); |
hlipka | 2:1a436d154c84 | 140 | if (0!=x&&0!=y) { |
hlipka | 2:1a436d154c84 | 141 | _x=x; |
hlipka | 2:1a436d154c84 | 142 | _y=y; |
hlipka | 2:1a436d154c84 | 143 | } |
hlipka | 0:cf4dd04052e3 | 144 | } |
hlipka | 2:1a436d154c84 | 145 | _event.x=_x; |
hlipka | 2:1a436d154c84 | 146 | _event.y=_y; |
hlipka | 2:1a436d154c84 | 147 | _event.pen=_pen; |
hlipka | 2:1a436d154c84 | 148 | if (_pen==1 && _oldPen==false) { // pen down |
hlipka | 2:1a436d154c84 | 149 | _callbackPD.call((uint32_t)&_event); |
hlipka | 2:1a436d154c84 | 150 | } else if (_pen==1 && _oldPen==true) { // pen moved |
hlipka | 2:1a436d154c84 | 151 | _callbackPM.call((uint32_t)&_event); |
hlipka | 2:1a436d154c84 | 152 | } else if (_pen==0 && _oldPen==true) { // pen up |
hlipka | 2:1a436d154c84 | 153 | _callbackPU.call((uint32_t)&_event); |
hlipka | 2:1a436d154c84 | 154 | } else { |
hlipka | 2:1a436d154c84 | 155 | // happens on the first touch (the first report is send with pen=0). |
hlipka | 2:1a436d154c84 | 156 | } |
hlipka | 2:1a436d154c84 | 157 | _oldPen=(_pen==1); |
hlipka | 2:1a436d154c84 | 158 | _led->write(0); |
hlipka | 4:510ea5b28a05 | 159 | if (1==_siq->read()) |
hlipka | 2:1a436d154c84 | 160 | wait_ms(5); |
hlipka | 0:cf4dd04052e3 | 161 | } |
hlipka | 0:cf4dd04052e3 | 162 | } |
hlipka | 0:cf4dd04052e3 | 163 | |
hlipka | 2:1a436d154c84 | 164 | int AR1020::cmd(char cmd,char* data, int len, bool doEnable) { |
hlipka | 2:1a436d154c84 | 165 | if (doEnable) { |
hlipka | 2:1a436d154c84 | 166 | _enable->write(1); |
hlipka | 2:1a436d154c84 | 167 | wait_us(1000); |
hlipka | 2:1a436d154c84 | 168 | _enable->write(0); |
hlipka | 2:1a436d154c84 | 169 | } |
hlipka | 2:1a436d154c84 | 170 | |
hlipka | 6:a6971458d612 | 171 | wait_us(100); |
hlipka | 2:1a436d154c84 | 172 | |
hlipka | 0:cf4dd04052e3 | 173 | writeByte(0x55); |
hlipka | 0:cf4dd04052e3 | 174 | wait_us(100); |
hlipka | 2:1a436d154c84 | 175 | |
hlipka | 0:cf4dd04052e3 | 176 | writeByte(len+1); |
hlipka | 0:cf4dd04052e3 | 177 | wait_us(100); |
hlipka | 2:1a436d154c84 | 178 | |
hlipka | 0:cf4dd04052e3 | 179 | writeByte(cmd); |
hlipka | 0:cf4dd04052e3 | 180 | wait_us(100); |
hlipka | 2:1a436d154c84 | 181 | |
hlipka | 2:1a436d154c84 | 182 | for (int i=0;i<len;i++) { |
hlipka | 0:cf4dd04052e3 | 183 | writeByte(data[i]); |
hlipka | 0:cf4dd04052e3 | 184 | wait_us(100); |
hlipka | 0:cf4dd04052e3 | 185 | } |
hlipka | 0:cf4dd04052e3 | 186 | Timer t; |
hlipka | 0:cf4dd04052e3 | 187 | t.start(); |
hlipka | 2:1a436d154c84 | 188 | while (true) { |
hlipka | 2:1a436d154c84 | 189 | wait_us(100); |
hlipka | 4:510ea5b28a05 | 190 | if (1==_siq->read()) |
hlipka | 2:1a436d154c84 | 191 | break; |
hlipka | 5:a5eba88e8c3e | 192 | if (t.read_ms()>1000) |
hlipka | 5:a5eba88e8c3e | 193 | { |
hlipka | 5:a5eba88e8c3e | 194 | printf("timeout\n"); |
hlipka | 2:1a436d154c84 | 195 | break; |
hlipka | 5:a5eba88e8c3e | 196 | } |
hlipka | 0:cf4dd04052e3 | 197 | } |
hlipka | 0:cf4dd04052e3 | 198 | char rhead=readByte(); |
hlipka | 0:cf4dd04052e3 | 199 | wait_us(100); |
hlipka | 2:1a436d154c84 | 200 | if (rhead!=0x55) { |
hlipka | 2:1a436d154c84 | 201 | if (doEnable) |
hlipka | 2:1a436d154c84 | 202 | _enable->write(1); |
hlipka | 0:cf4dd04052e3 | 203 | printf("rh=0x%x\n",rhead); |
hlipka | 0:cf4dd04052e3 | 204 | return -1000; |
hlipka | 0:cf4dd04052e3 | 205 | } |
hlipka | 0:cf4dd04052e3 | 206 | char rlen=readByte(); |
hlipka | 0:cf4dd04052e3 | 207 | wait_us(100); |
hlipka | 2:1a436d154c84 | 208 | if (rlen==2) { |
hlipka | 0:cf4dd04052e3 | 209 | char r=readByte(); |
hlipka | 0:cf4dd04052e3 | 210 | wait_us(100); |
hlipka | 0:cf4dd04052e3 | 211 | char rc=readByte(); |
hlipka | 0:cf4dd04052e3 | 212 | wait_us(100); |
hlipka | 2:1a436d154c84 | 213 | if (doEnable) |
hlipka | 2:1a436d154c84 | 214 | _enable->write(1); |
hlipka | 0:cf4dd04052e3 | 215 | if (rc!=cmd) |
hlipka | 0:cf4dd04052e3 | 216 | return -2000; |
hlipka | 0:cf4dd04052e3 | 217 | return -r; |
hlipka | 2:1a436d154c84 | 218 | } else if (rlen==3) { |
hlipka | 0:cf4dd04052e3 | 219 | char r=readByte(); |
hlipka | 0:cf4dd04052e3 | 220 | wait_us(100); |
hlipka | 0:cf4dd04052e3 | 221 | char rc=readByte(); |
hlipka | 0:cf4dd04052e3 | 222 | wait_us(100); |
hlipka | 2:1a436d154c84 | 223 | if (rc!=cmd) { |
hlipka | 2:1a436d154c84 | 224 | if (doEnable) |
hlipka | 2:1a436d154c84 | 225 | _enable->write(1); |
hlipka | 0:cf4dd04052e3 | 226 | return -3000; |
hlipka | 0:cf4dd04052e3 | 227 | } |
hlipka | 0:cf4dd04052e3 | 228 | char rd=readByte(); |
hlipka | 0:cf4dd04052e3 | 229 | wait_us(100); |
hlipka | 2:1a436d154c84 | 230 | if (doEnable) |
hlipka | 2:1a436d154c84 | 231 | _enable->write(1); |
hlipka | 0:cf4dd04052e3 | 232 | if (r==0) |
hlipka | 0:cf4dd04052e3 | 233 | return rd; |
hlipka | 0:cf4dd04052e3 | 234 | return -r; |
hlipka | 2:1a436d154c84 | 235 | } else { |
hlipka | 2:1a436d154c84 | 236 | if (doEnable) |
hlipka | 2:1a436d154c84 | 237 | _enable->write(1); |
hlipka | 0:cf4dd04052e3 | 238 | return -4000; |
hlipka | 0:cf4dd04052e3 | 239 | } |
hlipka | 0:cf4dd04052e3 | 240 | } |
hlipka | 2:1a436d154c84 | 241 | void AR1020::calibrate() { |
hlipka | 0:cf4dd04052e3 | 242 | _irq->rise(NULL); |
hlipka | 0:cf4dd04052e3 | 243 | |
hlipka | 0:cf4dd04052e3 | 244 | DigitalOut led1(LED1); |
hlipka | 0:cf4dd04052e3 | 245 | DigitalOut led2(LED2); |
hlipka | 0:cf4dd04052e3 | 246 | DigitalOut led3(LED3); |
hlipka | 0:cf4dd04052e3 | 247 | DigitalOut led4(LED4); |
hlipka | 2:1a436d154c84 | 248 | led1=0; |
hlipka | 2:1a436d154c84 | 249 | led2=0; |
hlipka | 2:1a436d154c84 | 250 | led3=1; |
hlipka | 2:1a436d154c84 | 251 | led4=1; |
hlipka | 2:1a436d154c84 | 252 | |
hlipka | 2:1a436d154c84 | 253 | int r=cmd(0x13,NULL,0); |
hlipka | 0:cf4dd04052e3 | 254 | printf("disable touch=%i\n",r); |
hlipka | 0:cf4dd04052e3 | 255 | wait_ms(100); |
hlipka | 0:cf4dd04052e3 | 256 | if (r<0) |
hlipka | 0:cf4dd04052e3 | 257 | return; |
hlipka | 0:cf4dd04052e3 | 258 | led4=0; |
hlipka | 2:1a436d154c84 | 259 | |
hlipka | 0:cf4dd04052e3 | 260 | int regStart=cmd(0x22,NULL,0); |
hlipka | 0:cf4dd04052e3 | 261 | printf("reg offset=%i\n",regStart); |
hlipka | 0:cf4dd04052e3 | 262 | |
hlipka | 0:cf4dd04052e3 | 263 | char cid[3]={0x00,0x0d+regStart,0x01}; |
hlipka | 0:cf4dd04052e3 | 264 | int mode=cmd(0x20,cid,3); |
hlipka | 0:cf4dd04052e3 | 265 | printf("mode=%i\n",mode); |
hlipka | 0:cf4dd04052e3 | 266 | |
hlipka | 0:cf4dd04052e3 | 267 | if (regStart<0) |
hlipka | 0:cf4dd04052e3 | 268 | return; |
hlipka | 0:cf4dd04052e3 | 269 | printf("start calibrate\n"); |
hlipka | 2:1a436d154c84 | 270 | led3=0; |
hlipka | 0:cf4dd04052e3 | 271 | char cid2[4]={0x00,0x0e+regStart,0x01,0x19}; |
hlipka | 0:cf4dd04052e3 | 272 | r=cmd(0x21,cid2,4); |
hlipka | 0:cf4dd04052e3 | 273 | printf("set inset=%i\n",r); |
hlipka | 0:cf4dd04052e3 | 274 | if (r<0) |
hlipka | 0:cf4dd04052e3 | 275 | return; |
hlipka | 0:cf4dd04052e3 | 276 | |
hlipka | 0:cf4dd04052e3 | 277 | _enable->write(1); |
hlipka | 2:1a436d154c84 | 278 | wait_us(100); |
hlipka | 0:cf4dd04052e3 | 279 | _enable->write(0); |
hlipka | 0:cf4dd04052e3 | 280 | wait_us(10); |
hlipka | 2:1a436d154c84 | 281 | char cid3[1]={0x04}; |
hlipka | 6:a6971458d612 | 282 | r=cmd(0x14,cid3,1,false); |
hlipka | 6:a6971458d612 | 283 | printf("start calibration=%i\n",r); |
hlipka | 6:a6971458d612 | 284 | if (r<0) |
hlipka | 6:a6971458d612 | 285 | return; |
hlipka | 2:1a436d154c84 | 286 | |
hlipka | 6:a6971458d612 | 287 | printf("start OK, press upper left\n"); |
hlipka | 6:a6971458d612 | 288 | led1=1; |
hlipka | 0:cf4dd04052e3 | 289 | int resp=readCalibResponse(); |
hlipka | 0:cf4dd04052e3 | 290 | printf("status=%i\n",resp); |
hlipka | 6:a6971458d612 | 291 | printf("press upper right\n"); |
hlipka | 0:cf4dd04052e3 | 292 | led2=1; |
hlipka | 0:cf4dd04052e3 | 293 | resp=readCalibResponse(); |
hlipka | 0:cf4dd04052e3 | 294 | printf("status=%i\n",resp); |
hlipka | 6:a6971458d612 | 295 | printf("press lower right\n"); |
hlipka | 0:cf4dd04052e3 | 296 | led3=1; |
hlipka | 0:cf4dd04052e3 | 297 | resp=readCalibResponse(); |
hlipka | 0:cf4dd04052e3 | 298 | printf("status=%i\n",resp); |
hlipka | 6:a6971458d612 | 299 | printf("press lower left\n"); |
hlipka | 0:cf4dd04052e3 | 300 | led4=1; |
hlipka | 0:cf4dd04052e3 | 301 | resp=readCalibResponse(); |
hlipka | 0:cf4dd04052e3 | 302 | printf("status=%i\n",resp); |
hlipka | 6:a6971458d612 | 303 | printf("exit calibration mode\n"); |
hlipka | 6:a6971458d612 | 304 | |
hlipka | 6:a6971458d612 | 305 | led1=0; |
hlipka | 6:a6971458d612 | 306 | led2=0; |
hlipka | 6:a6971458d612 | 307 | led3=0; |
hlipka | 6:a6971458d612 | 308 | led4=0; |
hlipka | 2:1a436d154c84 | 309 | |
hlipka | 2:1a436d154c84 | 310 | _enable->write(1); |
hlipka | 6:a6971458d612 | 311 | wait_ms(1000); |
hlipka | 2:1a436d154c84 | 312 | |
hlipka | 2:1a436d154c84 | 313 | r=cmd(0x23,NULL,0); |
hlipka | 2:1a436d154c84 | 314 | printf("save registers=%i\n",r); |
hlipka | 2:1a436d154c84 | 315 | |
hlipka | 2:1a436d154c84 | 316 | r=cmd(0x12,NULL,0); |
hlipka | 0:cf4dd04052e3 | 317 | printf("enable touch=%i\n",r); |
hlipka | 2:1a436d154c84 | 318 | |
hlipka | 0:cf4dd04052e3 | 319 | _irq->rise(this, &AR1020::read); |
hlipka | 2:1a436d154c84 | 320 | |
hlipka | 0:cf4dd04052e3 | 321 | } |
hlipka | 0:cf4dd04052e3 | 322 | |
hlipka | 2:1a436d154c84 | 323 | int AR1020::readCalibResponse() { |
hlipka | 2:1a436d154c84 | 324 | while (true) { |
hlipka | 5:a5eba88e8c3e | 325 | while (true) { |
hlipka | 6:a6971458d612 | 326 | wait_us(10); |
hlipka | 5:a5eba88e8c3e | 327 | if (1==_siq->read()) |
hlipka | 5:a5eba88e8c3e | 328 | break; |
hlipka | 5:a5eba88e8c3e | 329 | } |
hlipka | 5:a5eba88e8c3e | 330 | |
hlipka | 0:cf4dd04052e3 | 331 | int r=readByte(); |
hlipka | 2:1a436d154c84 | 332 | if (r!=0x55) { |
hlipka | 2:1a436d154c84 | 333 | // printf("1=0x%x\n",r); |
hlipka | 0:cf4dd04052e3 | 334 | wait_ms(100); |
hlipka | 0:cf4dd04052e3 | 335 | continue; |
hlipka | 0:cf4dd04052e3 | 336 | } |
hlipka | 0:cf4dd04052e3 | 337 | |
hlipka | 6:a6971458d612 | 338 | wait_us(100); |
hlipka | 0:cf4dd04052e3 | 339 | r=readByte(); |
hlipka | 2:1a436d154c84 | 340 | if (r!=0x02) { |
hlipka | 0:cf4dd04052e3 | 341 | printf("2=0x%x\n",r); |
hlipka | 0:cf4dd04052e3 | 342 | continue; |
hlipka | 0:cf4dd04052e3 | 343 | } |
hlipka | 2:1a436d154c84 | 344 | |
hlipka | 6:a6971458d612 | 345 | wait_us(100); |
hlipka | 0:cf4dd04052e3 | 346 | r=readByte(); |
hlipka | 2:1a436d154c84 | 347 | if (r!=0x00) { |
hlipka | 0:cf4dd04052e3 | 348 | printf("3=0x%x\n",r); |
hlipka | 0:cf4dd04052e3 | 349 | continue; |
hlipka | 0:cf4dd04052e3 | 350 | } |
hlipka | 6:a6971458d612 | 351 | |
hlipka | 6:a6971458d612 | 352 | wait_us(100); |
hlipka | 0:cf4dd04052e3 | 353 | int rc=readByte(); |
hlipka | 2:1a436d154c84 | 354 | if (rc!=0x14) { |
hlipka | 0:cf4dd04052e3 | 355 | printf("4=0x%x\n",r); |
hlipka | 0:cf4dd04052e3 | 356 | continue; |
hlipka | 0:cf4dd04052e3 | 357 | } |
hlipka | 2:1a436d154c84 | 358 | |
hlipka | 0:cf4dd04052e3 | 359 | return r; |
hlipka | 0:cf4dd04052e3 | 360 | } |
hlipka | 0:cf4dd04052e3 | 361 | } |
hlipka | 0:cf4dd04052e3 | 362 | |
hlipka | 2:1a436d154c84 | 363 | int AR1020::readByte() { |
hlipka | 0:cf4dd04052e3 | 364 | _clk->write(0); |
hlipka | 0:cf4dd04052e3 | 365 | wait_us(10); |
hlipka | 0:cf4dd04052e3 | 366 | int r=0; |
hlipka | 2:1a436d154c84 | 367 | for (int i=0;i<8;i++) { |
hlipka | 0:cf4dd04052e3 | 368 | r=r<<1; |
hlipka | 0:cf4dd04052e3 | 369 | _clk->write(1); |
hlipka | 0:cf4dd04052e3 | 370 | wait_us(10); |
hlipka | 0:cf4dd04052e3 | 371 | _clk->write(0); |
hlipka | 0:cf4dd04052e3 | 372 | wait_us(10); |
hlipka | 0:cf4dd04052e3 | 373 | int bit=_miso->read(); |
hlipka | 0:cf4dd04052e3 | 374 | r+=bit; |
hlipka | 0:cf4dd04052e3 | 375 | } |
hlipka | 0:cf4dd04052e3 | 376 | // printf("<-%i\n",r); |
hlipka | 0:cf4dd04052e3 | 377 | return r; |
hlipka | 0:cf4dd04052e3 | 378 | } |
hlipka | 0:cf4dd04052e3 | 379 | |
hlipka | 2:1a436d154c84 | 380 | void AR1020::writeByte(char byte) { |
hlipka | 0:cf4dd04052e3 | 381 | _clk->write(0); |
hlipka | 0:cf4dd04052e3 | 382 | wait_us(10); |
hlipka | 0:cf4dd04052e3 | 383 | // printf("->0x%x\n",byte); |
hlipka | 2:1a436d154c84 | 384 | for (int i=0;i<8;i++) { |
hlipka | 0:cf4dd04052e3 | 385 | int bit=byte>127; |
hlipka | 0:cf4dd04052e3 | 386 | // printf("%i",bit); |
hlipka | 0:cf4dd04052e3 | 387 | _clk->write(1); |
hlipka | 0:cf4dd04052e3 | 388 | wait_us(10); |
hlipka | 0:cf4dd04052e3 | 389 | _mosi->write(bit); |
hlipka | 0:cf4dd04052e3 | 390 | wait_us(10); |
hlipka | 0:cf4dd04052e3 | 391 | _clk->write(0); |
hlipka | 0:cf4dd04052e3 | 392 | wait_us(10); |
hlipka | 0:cf4dd04052e3 | 393 | byte=(char)(byte<<1); |
hlipka | 0:cf4dd04052e3 | 394 | |
hlipka | 0:cf4dd04052e3 | 395 | } |
hlipka | 0:cf4dd04052e3 | 396 | // printf("\n"); |
hlipka | 0:cf4dd04052e3 | 397 | } |