MAX3100, an external serial device to add additional serial ports via SPI

Dependents:   FLIGHT_CONTROL_AND_COMMUNICATIONS_SYSTEM

Committer:
AjK
Date:
Mon Jan 17 01:14:16 2011 +0000
Revision:
1:46c8c60e744a
Parent:
0:055897ab699b
Child:
2:2a49171453d5
1.1 See ChangeLog.h

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AjK 0:055897ab699b 1 /*
AjK 0:055897ab699b 2 Copyright (c) 2011 Andy Kirkham
AjK 0:055897ab699b 3
AjK 0:055897ab699b 4 Permission is hereby granted, free of charge, to any person obtaining a copy
AjK 0:055897ab699b 5 of this software and associated documentation files (the "Software"), to deal
AjK 0:055897ab699b 6 in the Software without restriction, including without limitation the rights
AjK 0:055897ab699b 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
AjK 0:055897ab699b 8 copies of the Software, and to permit persons to whom the Software is
AjK 0:055897ab699b 9 furnished to do so, subject to the following conditions:
AjK 0:055897ab699b 10
AjK 0:055897ab699b 11 The above copyright notice and this permission notice shall be included in
AjK 0:055897ab699b 12 all copies or substantial portions of the Software.
AjK 0:055897ab699b 13
AjK 0:055897ab699b 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
AjK 0:055897ab699b 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
AjK 0:055897ab699b 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AjK 0:055897ab699b 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
AjK 0:055897ab699b 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
AjK 0:055897ab699b 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
AjK 0:055897ab699b 20 THE SOFTWARE.
AjK 0:055897ab699b 21 */
AjK 0:055897ab699b 22
AjK 0:055897ab699b 23 #include "MAX3100.h"
AjK 0:055897ab699b 24
AjK 0:055897ab699b 25 namespace AjK {
AjK 0:055897ab699b 26
AjK 0:055897ab699b 27 void
AjK 0:055897ab699b 28 MAX3100::init(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName irq, SPI *spi)
AjK 0:055897ab699b 29 {
AjK 0:055897ab699b 30 config = 0;
AjK 0:055897ab699b 31 flushTxBuffer();
AjK 0:055897ab699b 32 flushRxBuffer();
AjK 0:055897ab699b 33
AjK 0:055897ab699b 34 _parity = 0;
AjK 0:055897ab699b 35
AjK 0:055897ab699b 36 _cs_function = NULL;
AjK 0:055897ab699b 37 _cs_obj = NULL;
AjK 0:055897ab699b 38 _cs_method = NULL;
AjK 0:055897ab699b 39
AjK 0:055897ab699b 40 if (cs != NC) {
AjK 0:055897ab699b 41 _cs = new DigitalOut(cs);
AjK 0:055897ab699b 42 _cs->write( 1 );
AjK 0:055897ab699b 43 }
AjK 0:055897ab699b 44 else _cs = (DigitalOut *)NULL;
AjK 0:055897ab699b 45
AjK 0:055897ab699b 46 if (spi) {
AjK 0:055897ab699b 47 _spi = spi;
AjK 0:055897ab699b 48 }
AjK 0:055897ab699b 49 else {
AjK 0:055897ab699b 50 _spi = new SPI(mosi, miso, sclk);
AjK 0:055897ab699b 51 _spi->format(16, 0);
AjK 0:055897ab699b 52 _spi->frequency(MAX3100_SPI_FREQ);
AjK 0:055897ab699b 53 }
AjK 0:055897ab699b 54
AjK 1:46c8c60e744a 55 if (irq != NC) {
AjK 1:46c8c60e744a 56 irqMask(irq);
AjK 0:055897ab699b 57 _irq = new InterruptIn(irq);
AjK 0:055897ab699b 58 _irq->mode(PullUp);
AjK 0:055897ab699b 59 topic_1498(irq);
AjK 0:055897ab699b 60 _irq->fall(this, &MAX3100::isr);
AjK 0:055897ab699b 61 }
AjK 0:055897ab699b 62 else { _irq = (InterruptIn *)NULL; }
AjK 0:055897ab699b 63
AjK 0:055897ab699b 64 baud(10); // 9600baud by default.
AjK 0:055897ab699b 65 }
AjK 0:055897ab699b 66
AjK 0:055897ab699b 67 void
AjK 0:055897ab699b 68 MAX3100::cs_value(int i)
AjK 0:055897ab699b 69 {
AjK 0:055897ab699b 70 if (_cs != (DigitalOut *)NULL) _cs->write(i & 1);
AjK 0:055897ab699b 71 else {
AjK 0:055897ab699b 72 if (_cs_function != NULL) (*_cs_function)(_device, i & 1);
AjK 0:055897ab699b 73 else {
AjK 0:055897ab699b 74 if (_cs_obj && _cs_method) (_cs_obj->*_cs_method)(_device, i & 1);
AjK 0:055897ab699b 75 }
AjK 0:055897ab699b 76 }
AjK 0:055897ab699b 77 }
AjK 0:055897ab699b 78
AjK 0:055897ab699b 79 uint16_t
AjK 0:055897ab699b 80 MAX3100::spiwrite(uint16_t val)
AjK 0:055897ab699b 81 {
AjK 0:055897ab699b 82 cs_value(0);
AjK 0:055897ab699b 83 uint16_t r = _spi->write(val);
AjK 0:055897ab699b 84 cs_value(1);
AjK 0:055897ab699b 85 return r;
AjK 0:055897ab699b 86 }
AjK 0:055897ab699b 87
AjK 0:055897ab699b 88 uint16_t
AjK 0:055897ab699b 89 MAX3100::config_write(uint16_t val)
AjK 0:055897ab699b 90 {
AjK 0:055897ab699b 91 return spiwrite(MAX3100_CONF_WR | val);
AjK 0:055897ab699b 92 }
AjK 0:055897ab699b 93
AjK 0:055897ab699b 94 uint16_t
AjK 0:055897ab699b 95 MAX3100::config_read(void)
AjK 0:055897ab699b 96 {
AjK 0:055897ab699b 97 return spiwrite(MAX3100_CONF_RD);
AjK 0:055897ab699b 98 }
AjK 0:055897ab699b 99
AjK 0:055897ab699b 100
AjK 0:055897ab699b 101 void
AjK 0:055897ab699b 102 MAX3100::baud(int baudrate)
AjK 0:055897ab699b 103 {
AjK 1:46c8c60e744a 104 irqDisable();
AjK 0:055897ab699b 105 config &= ~(0xf);
AjK 0:055897ab699b 106 config |= (baudrate & 0xf);
AjK 0:055897ab699b 107 config_write(config);
AjK 1:46c8c60e744a 108 irqEnable();
AjK 0:055897ab699b 109 }
AjK 0:055897ab699b 110
AjK 0:055897ab699b 111 void
AjK 0:055897ab699b 112 MAX3100::enableRxIrq(void)
AjK 0:055897ab699b 113 {
AjK 1:46c8c60e744a 114 irqDisable();
AjK 0:055897ab699b 115 config &= ~MAX3100_RM(1);
AjK 0:055897ab699b 116 config |= MAX3100_RM(1);
AjK 0:055897ab699b 117 config_write(config);
AjK 1:46c8c60e744a 118 irqEnable();
AjK 0:055897ab699b 119 }
AjK 0:055897ab699b 120
AjK 0:055897ab699b 121 void
AjK 0:055897ab699b 122 MAX3100::disableRxIrq(void)
AjK 0:055897ab699b 123 {
AjK 1:46c8c60e744a 124 irqDisable();
AjK 0:055897ab699b 125 config &= ~MAX3100_RM(1);
AjK 0:055897ab699b 126 config_write(config);
AjK 1:46c8c60e744a 127 irqEnable();
AjK 0:055897ab699b 128 }
AjK 0:055897ab699b 129
AjK 0:055897ab699b 130 void
AjK 0:055897ab699b 131 MAX3100::enableTxIrq(void)
AjK 0:055897ab699b 132 {
AjK 1:46c8c60e744a 133 irqDisable();
AjK 0:055897ab699b 134 config &= ~MAX3100_TM(1);
AjK 0:055897ab699b 135 config |= MAX3100_TM(1);
AjK 0:055897ab699b 136 config_write(config);
AjK 1:46c8c60e744a 137 irqEnable();
AjK 0:055897ab699b 138 }
AjK 0:055897ab699b 139
AjK 0:055897ab699b 140 void
AjK 0:055897ab699b 141 MAX3100::disableTxIrq(void)
AjK 0:055897ab699b 142 {
AjK 1:46c8c60e744a 143 irqDisable();
AjK 0:055897ab699b 144 config &= ~MAX3100_TM(1);
AjK 0:055897ab699b 145 config_write(config);
AjK 1:46c8c60e744a 146 irqEnable();
AjK 0:055897ab699b 147 }
AjK 0:055897ab699b 148
AjK 0:055897ab699b 149 int
AjK 0:055897ab699b 150 MAX3100::putc(int c)
AjK 0:055897ab699b 151 {
AjK 0:055897ab699b 152 uint16_t data, conf;
AjK 0:055897ab699b 153
AjK 0:055897ab699b 154 // If no space return -1 as an error code.
AjK 0:055897ab699b 155 if (tx_buffer_full) return -1;
AjK 0:055897ab699b 156
AjK 0:055897ab699b 157 if (_parity) {
AjK 0:055897ab699b 158 int pBit = parityCal(c & 0xFF);
AjK 0:055897ab699b 159 if (_parity == Even && pBit == 0) { c |= (1 << 8); }
AjK 0:055897ab699b 160 if (_parity == Odd && pBit == 1) { c |= (1 << 8); }
AjK 0:055897ab699b 161 }
AjK 0:055897ab699b 162 else { c &= 0xFF; }
AjK 0:055897ab699b 163
AjK 0:055897ab699b 164 // Function is non-interruptable by the MAX3100 class
AjK 0:055897ab699b 165 // to avoid SPI bus contention between writing a byte
AjK 0:055897ab699b 166 // in user context (here) and IRQ context.
AjK 1:46c8c60e744a 167 irqDisable();
AjK 0:055897ab699b 168
AjK 0:055897ab699b 169 conf = config_read();
AjK 0:055897ab699b 170
AjK 0:055897ab699b 171 if (tx_buffer_in == tx_buffer_out && conf & MAX3100_CONF_T) {
AjK 0:055897ab699b 172 data = spiwrite(MAX3100_DATA_WR | (c & 0x1FF));
AjK 0:055897ab699b 173 // In case we get a byte while writing store it away.
AjK 0:055897ab699b 174 if (!rx_buffer_full && data & MAX3100_CONF_R) {
AjK 0:055897ab699b 175 rx_buffer[rx_buffer_in++] = (uint16_t)(data & 0xFF);
AjK 0:055897ab699b 176 if (rx_buffer_in >= MAX3100_RX_BUFFER_SIZE) rx_buffer_in = 0;
AjK 0:055897ab699b 177 if (rx_buffer_in == rx_buffer_out) rx_buffer_full = true;
AjK 0:055897ab699b 178 }
AjK 0:055897ab699b 179 }
AjK 0:055897ab699b 180 else {
AjK 0:055897ab699b 181 tx_buffer[tx_buffer_in++] = (char)(c & 0xFF);
AjK 0:055897ab699b 182 if (tx_buffer_in >= MAX3100_TX_BUFFER_SIZE) {
AjK 0:055897ab699b 183 tx_buffer_in = 0;
AjK 0:055897ab699b 184 }
AjK 0:055897ab699b 185 if (tx_buffer_in == tx_buffer_out) tx_buffer_full = true;
AjK 0:055897ab699b 186 }
AjK 0:055897ab699b 187
AjK 1:46c8c60e744a 188 irqEnable();
AjK 0:055897ab699b 189
AjK 0:055897ab699b 190 return 1;
AjK 0:055897ab699b 191 }
AjK 0:055897ab699b 192
AjK 0:055897ab699b 193 void
AjK 0:055897ab699b 194 MAX3100::puts(char *s) {
AjK 0:055897ab699b 195 char *q = s;
AjK 0:055897ab699b 196 while(*(q)) {
AjK 0:055897ab699b 197 if (putc((int)(*(q))) == -1) return;
AjK 0:055897ab699b 198 q++;
AjK 0:055897ab699b 199 }
AjK 0:055897ab699b 200 }
AjK 0:055897ab699b 201
AjK 0:055897ab699b 202 int
AjK 0:055897ab699b 203 MAX3100::getc(void) {
AjK 0:055897ab699b 204 if (!rx_buffer_full && rx_buffer_in == rx_buffer_out) return -1;
AjK 0:055897ab699b 205 int c = (int)((unsigned char)rx_buffer[rx_buffer_out++]);
AjK 0:055897ab699b 206 if (rx_buffer_out >= MAX3100_RX_BUFFER_SIZE) rx_buffer_out = 0;
AjK 0:055897ab699b 207 rx_buffer_full = false;
AjK 0:055897ab699b 208 return c;
AjK 0:055897ab699b 209 }
AjK 0:055897ab699b 210
AjK 0:055897ab699b 211 char *
AjK 0:055897ab699b 212 MAX3100::gets(char *s, int size)
AjK 0:055897ab699b 213 {
AjK 0:055897ab699b 214 int i;
AjK 0:055897ab699b 215 char *q = s;
AjK 0:055897ab699b 216 while(size) {
AjK 0:055897ab699b 217 do { i = getc(); } while (i == -1); // Blocks!
AjK 0:055897ab699b 218 *(q) = (char)i; size--;
AjK 0:055897ab699b 219 }
AjK 0:055897ab699b 220 return s;
AjK 0:055897ab699b 221 }
AjK 0:055897ab699b 222
AjK 0:055897ab699b 223 int
AjK 0:055897ab699b 224 MAX3100::peek(void) {
AjK 0:055897ab699b 225 if (!rx_buffer_full && rx_buffer_in == rx_buffer_out) return -1;
AjK 0:055897ab699b 226 return (int)((unsigned char)rx_buffer[rx_buffer_out]);
AjK 0:055897ab699b 227 }
AjK 0:055897ab699b 228
AjK 0:055897ab699b 229 void
AjK 0:055897ab699b 230 MAX3100::isr(void) {
AjK 0:055897ab699b 231 uint16_t data = spiwrite(MAX3100_DATA_RD);
AjK 0:055897ab699b 232 bool tx_ready = data & MAX3100_CONF_T ? true : false;
AjK 0:055897ab699b 233
AjK 0:055897ab699b 234 // The MAX3100 does have an RX fifo. So attempt to empty it into the RX buffer.
AjK 0:055897ab699b 235 do {
AjK 0:055897ab699b 236 if (!rx_buffer_full && data & MAX3100_CONF_R) {
AjK 0:055897ab699b 237 rx_buffer[rx_buffer_in++] = (char)(data & 0xFF);
AjK 0:055897ab699b 238 if (rx_buffer_in >= MAX3100_RX_BUFFER_SIZE) rx_buffer_in = 0;
AjK 0:055897ab699b 239 if (rx_buffer_in == rx_buffer_out) rx_buffer_full = true;
AjK 0:055897ab699b 240 }
AjK 0:055897ab699b 241 }
AjK 0:055897ab699b 242 while ((data = spiwrite(MAX3100_DATA_RD)) & MAX3100_CONF_R);
AjK 0:055897ab699b 243
AjK 0:055897ab699b 244 // The MAX3100 doesn't have a hardware TX fifo, so just test to see if it's TX buffer
AjK 0:055897ab699b 245 // is empty. If it is and we have bytes in the TX buffer then send one now.
AjK 0:055897ab699b 246 if (tx_ready && (tx_buffer_full || tx_buffer_in != tx_buffer_out)) {
AjK 0:055897ab699b 247 data = spiwrite(MAX3100_DATA_WR | (tx_buffer[tx_buffer_out++] & 0x1FF));
AjK 0:055897ab699b 248 if (tx_buffer_out >= MAX3100_TX_BUFFER_SIZE) tx_buffer_out = 0;
AjK 0:055897ab699b 249 tx_buffer_full = false;
AjK 0:055897ab699b 250 }
AjK 0:055897ab699b 251
AjK 0:055897ab699b 252 // In case we get a byte while sending then store it.
AjK 0:055897ab699b 253 if (!rx_buffer_full && data & MAX3100_CONF_R) {
AjK 0:055897ab699b 254 rx_buffer[rx_buffer_in++] = (char)(data & 0xFF);
AjK 0:055897ab699b 255 if (rx_buffer_in >= MAX3100_RX_BUFFER_SIZE) rx_buffer_in = 0;
AjK 0:055897ab699b 256 if (rx_buffer_in == rx_buffer_out) rx_buffer_full = true;
AjK 0:055897ab699b 257 }
AjK 0:055897ab699b 258 }
AjK 0:055897ab699b 259
AjK 0:055897ab699b 260 void
AjK 0:055897ab699b 261 MAX3100::setStopBits(int i)
AjK 0:055897ab699b 262 {
AjK 0:055897ab699b 263 switch(i) {
AjK 0:055897ab699b 264 case 1:
AjK 1:46c8c60e744a 265 irqDisable();
AjK 0:055897ab699b 266 config &= ~(1 << 6);
AjK 0:055897ab699b 267 config_write(config);
AjK 1:46c8c60e744a 268 irqEnable();
AjK 0:055897ab699b 269 break;
AjK 0:055897ab699b 270 case 2:
AjK 1:46c8c60e744a 271 irqDisable();
AjK 0:055897ab699b 272 config |= (1 << 6);
AjK 0:055897ab699b 273 config_write(config);
AjK 1:46c8c60e744a 274 irqEnable();
AjK 0:055897ab699b 275 break;
AjK 0:055897ab699b 276 }
AjK 0:055897ab699b 277 }
AjK 0:055897ab699b 278
AjK 0:055897ab699b 279 int
AjK 0:055897ab699b 280 MAX3100::parityCal(uint8_t c)
AjK 0:055897ab699b 281 {
AjK 0:055897ab699b 282 int count = 0;
AjK 0:055897ab699b 283 for (int mask = 1, i = 0; i < 8; i++, mask = mask << 1) {
AjK 0:055897ab699b 284 if (c & mask) count++;
AjK 0:055897ab699b 285 }
AjK 0:055897ab699b 286 return count & 1;
AjK 0:055897ab699b 287 }
AjK 1:46c8c60e744a 288
AjK 1:46c8c60e744a 289 void
AjK 1:46c8c60e744a 290 MAX3100::irqDisable(void)
AjK 1:46c8c60e744a 291 {
AjK 1:46c8c60e744a 292 if (_irqMask0) LPC_GPIOINT->IO0IntEnF &= ~_irqMask0;
AjK 1:46c8c60e744a 293 if (_irqMask2) LPC_GPIOINT->IO2IntEnF &= ~_irqMask2;
AjK 1:46c8c60e744a 294 }
AjK 1:46c8c60e744a 295
AjK 1:46c8c60e744a 296 void
AjK 1:46c8c60e744a 297 MAX3100::irqEnable(void)
AjK 1:46c8c60e744a 298 {
AjK 1:46c8c60e744a 299 if (_irqMask0) LPC_GPIOINT->IO0IntEnF |= _irqMask0;
AjK 1:46c8c60e744a 300 if (_irqMask2) LPC_GPIOINT->IO2IntEnF |= _irqMask2;
AjK 1:46c8c60e744a 301 }
AjK 1:46c8c60e744a 302
AjK 1:46c8c60e744a 303 void
AjK 1:46c8c60e744a 304 MAX3100::irqMask(PinName p)
AjK 1:46c8c60e744a 305 {
AjK 1:46c8c60e744a 306 _irqMask0 = _irqMask2 = 0;
AjK 1:46c8c60e744a 307
AjK 1:46c8c60e744a 308 switch( p ) {
AjK 1:46c8c60e744a 309 case p5: _irqMask0 = (1UL << 9); break;
AjK 1:46c8c60e744a 310 case p6: _irqMask0 = (1UL << 8); break;
AjK 1:46c8c60e744a 311 case p7: _irqMask0 = (1UL << 7); break;
AjK 1:46c8c60e744a 312 case p8: _irqMask0 = (1UL << 6); break;
AjK 1:46c8c60e744a 313 case p9: _irqMask0 = (1UL << 0); break;
AjK 1:46c8c60e744a 314 case p10: _irqMask0 = (1UL << 1); break;
AjK 1:46c8c60e744a 315 case p11: _irqMask0 = (1UL << 18); break;
AjK 1:46c8c60e744a 316 case p12: _irqMask0 = (1UL << 17); break;
AjK 1:46c8c60e744a 317 case p13: _irqMask0 = (1UL << 15); break;
AjK 1:46c8c60e744a 318 case p14: _irqMask0 = (1UL << 16); break;
AjK 1:46c8c60e744a 319 case p15: _irqMask0 = (1UL << 23); break;
AjK 1:46c8c60e744a 320 case p16: _irqMask0 = (1UL << 24); break;
AjK 1:46c8c60e744a 321 case p17: _irqMask0 = (1UL << 25); break;
AjK 1:46c8c60e744a 322 case p18: _irqMask0 = (1UL << 26); break;
AjK 1:46c8c60e744a 323 case p21: _irqMask2 = (1UL << 5); break;
AjK 1:46c8c60e744a 324 case p22: _irqMask2 = (1UL << 4); break;
AjK 1:46c8c60e744a 325 case p23: _irqMask2 = (1UL << 3); break;
AjK 1:46c8c60e744a 326 case p24: _irqMask2 = (1UL << 2); break;
AjK 1:46c8c60e744a 327 case p25: _irqMask2 = (1UL << 1); break;
AjK 1:46c8c60e744a 328 case p26: _irqMask2 = (1UL << 0); break;
AjK 1:46c8c60e744a 329 case p27: _irqMask0 = (1UL << 11); break;
AjK 1:46c8c60e744a 330 case p28: _irqMask0 = (1UL << 10); break;
AjK 1:46c8c60e744a 331 case p29: _irqMask0 = (1UL << 5); break;
AjK 1:46c8c60e744a 332 case p30: _irqMask0 = (1UL << 4); break;
AjK 1:46c8c60e744a 333 }
AjK 1:46c8c60e744a 334 }
AjK 0:055897ab699b 335
AjK 0:055897ab699b 336 void
AjK 0:055897ab699b 337 MAX3100::topic_1498(PinName p) {
AjK 0:055897ab699b 338 // http://mbed.org/forum/bugs-suggestions/topic/1498
AjK 0:055897ab699b 339 uint32_t clr0 = 0, clr2 = 0;
AjK 0:055897ab699b 340
AjK 0:055897ab699b 341 switch( p ) {
AjK 0:055897ab699b 342 case p5: clr0 = (1UL << 9); break;
AjK 0:055897ab699b 343 case p6: clr0 = (1UL << 8); break;
AjK 0:055897ab699b 344 case p7: clr0 = (1UL << 7); break;
AjK 0:055897ab699b 345 case p8: clr0 = (1UL << 6); break;
AjK 0:055897ab699b 346 case p9: clr0 = (1UL << 0); break;
AjK 0:055897ab699b 347 case p10: clr0 = (1UL << 1); break;
AjK 0:055897ab699b 348 case p11: clr0 = (1UL << 18); break;
AjK 0:055897ab699b 349 case p12: clr0 = (1UL << 17); break;
AjK 0:055897ab699b 350 case p13: clr0 = (1UL << 15); break;
AjK 0:055897ab699b 351 case p14: clr0 = (1UL << 16); break;
AjK 0:055897ab699b 352 case p15: clr0 = (1UL << 23); break;
AjK 0:055897ab699b 353 case p16: clr0 = (1UL << 24); break;
AjK 0:055897ab699b 354 case p17: clr0 = (1UL << 25); break;
AjK 0:055897ab699b 355 case p18: clr0 = (1UL << 26); break;
AjK 0:055897ab699b 356 case p21: clr2 = (1UL << 5); break;
AjK 0:055897ab699b 357 case p22: clr2 = (1UL << 4); break;
AjK 0:055897ab699b 358 case p23: clr2 = (1UL << 3); break;
AjK 0:055897ab699b 359 case p24: clr2 = (1UL << 2); break;
AjK 0:055897ab699b 360 case p25: clr2 = (1UL << 1); break;
AjK 0:055897ab699b 361 case p26: clr2 = (1UL << 0); break;
AjK 0:055897ab699b 362 case p27: clr0 = (1UL << 11); break;
AjK 0:055897ab699b 363 case p28: clr0 = (1UL << 10); break;
AjK 0:055897ab699b 364 case p29: clr0 = (1UL << 5); break;
AjK 0:055897ab699b 365 case p30: clr0 = (1UL << 4); break;
AjK 0:055897ab699b 366 }
AjK 0:055897ab699b 367
AjK 0:055897ab699b 368 if (clr0) LPC_GPIOINT->IO0IntClr = clr0;
AjK 0:055897ab699b 369 if (clr2) LPC_GPIOINT->IO2IntClr = clr2;
AjK 0:055897ab699b 370 }
AjK 0:055897ab699b 371
AjK 0:055897ab699b 372 }; // namespace AjK ends