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

Dependents:   FLIGHT_CONTROL_AND_COMMUNICATIONS_SYSTEM

Committer:
AjK
Date:
Fri Aug 03 12:28:27 2012 +0000
Revision:
2:2a49171453d5
Parent:
1:46c8c60e744a
Add example4.h and ISR user callback code

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 2:2a49171453d5 40 _isr_user_function = NULL;
AjK 2:2a49171453d5 41 _isr_user_obj = NULL;
AjK 2:2a49171453d5 42 _isr_user_method = NULL;
AjK 2:2a49171453d5 43
AjK 0:055897ab699b 44 if (cs != NC) {
AjK 0:055897ab699b 45 _cs = new DigitalOut(cs);
AjK 0:055897ab699b 46 _cs->write( 1 );
AjK 0:055897ab699b 47 }
AjK 0:055897ab699b 48 else _cs = (DigitalOut *)NULL;
AjK 0:055897ab699b 49
AjK 0:055897ab699b 50 if (spi) {
AjK 0:055897ab699b 51 _spi = spi;
AjK 0:055897ab699b 52 }
AjK 0:055897ab699b 53 else {
AjK 0:055897ab699b 54 _spi = new SPI(mosi, miso, sclk);
AjK 0:055897ab699b 55 _spi->format(16, 0);
AjK 0:055897ab699b 56 _spi->frequency(MAX3100_SPI_FREQ);
AjK 0:055897ab699b 57 }
AjK 0:055897ab699b 58
AjK 1:46c8c60e744a 59 if (irq != NC) {
AjK 1:46c8c60e744a 60 irqMask(irq);
AjK 0:055897ab699b 61 _irq = new InterruptIn(irq);
AjK 0:055897ab699b 62 _irq->mode(PullUp);
AjK 0:055897ab699b 63 topic_1498(irq);
AjK 0:055897ab699b 64 _irq->fall(this, &MAX3100::isr);
AjK 0:055897ab699b 65 }
AjK 0:055897ab699b 66 else { _irq = (InterruptIn *)NULL; }
AjK 0:055897ab699b 67
AjK 0:055897ab699b 68 baud(10); // 9600baud by default.
AjK 0:055897ab699b 69 }
AjK 0:055897ab699b 70
AjK 0:055897ab699b 71 void
AjK 0:055897ab699b 72 MAX3100::cs_value(int i)
AjK 0:055897ab699b 73 {
AjK 0:055897ab699b 74 if (_cs != (DigitalOut *)NULL) _cs->write(i & 1);
AjK 0:055897ab699b 75 else {
AjK 0:055897ab699b 76 if (_cs_function != NULL) (*_cs_function)(_device, i & 1);
AjK 0:055897ab699b 77 else {
AjK 0:055897ab699b 78 if (_cs_obj && _cs_method) (_cs_obj->*_cs_method)(_device, i & 1);
AjK 0:055897ab699b 79 }
AjK 0:055897ab699b 80 }
AjK 0:055897ab699b 81 }
AjK 0:055897ab699b 82
AjK 0:055897ab699b 83 uint16_t
AjK 0:055897ab699b 84 MAX3100::spiwrite(uint16_t val)
AjK 0:055897ab699b 85 {
AjK 0:055897ab699b 86 cs_value(0);
AjK 0:055897ab699b 87 uint16_t r = _spi->write(val);
AjK 0:055897ab699b 88 cs_value(1);
AjK 0:055897ab699b 89 return r;
AjK 0:055897ab699b 90 }
AjK 0:055897ab699b 91
AjK 0:055897ab699b 92 uint16_t
AjK 0:055897ab699b 93 MAX3100::config_write(uint16_t val)
AjK 0:055897ab699b 94 {
AjK 0:055897ab699b 95 return spiwrite(MAX3100_CONF_WR | val);
AjK 0:055897ab699b 96 }
AjK 0:055897ab699b 97
AjK 0:055897ab699b 98 uint16_t
AjK 0:055897ab699b 99 MAX3100::config_read(void)
AjK 0:055897ab699b 100 {
AjK 0:055897ab699b 101 return spiwrite(MAX3100_CONF_RD);
AjK 0:055897ab699b 102 }
AjK 0:055897ab699b 103
AjK 0:055897ab699b 104
AjK 0:055897ab699b 105 void
AjK 0:055897ab699b 106 MAX3100::baud(int baudrate)
AjK 0:055897ab699b 107 {
AjK 1:46c8c60e744a 108 irqDisable();
AjK 0:055897ab699b 109 config &= ~(0xf);
AjK 0:055897ab699b 110 config |= (baudrate & 0xf);
AjK 0:055897ab699b 111 config_write(config);
AjK 1:46c8c60e744a 112 irqEnable();
AjK 0:055897ab699b 113 }
AjK 0:055897ab699b 114
AjK 0:055897ab699b 115 void
AjK 0:055897ab699b 116 MAX3100::enableRxIrq(void)
AjK 0:055897ab699b 117 {
AjK 1:46c8c60e744a 118 irqDisable();
AjK 0:055897ab699b 119 config &= ~MAX3100_RM(1);
AjK 0:055897ab699b 120 config |= MAX3100_RM(1);
AjK 0:055897ab699b 121 config_write(config);
AjK 1:46c8c60e744a 122 irqEnable();
AjK 0:055897ab699b 123 }
AjK 0:055897ab699b 124
AjK 0:055897ab699b 125 void
AjK 0:055897ab699b 126 MAX3100::disableRxIrq(void)
AjK 0:055897ab699b 127 {
AjK 1:46c8c60e744a 128 irqDisable();
AjK 0:055897ab699b 129 config &= ~MAX3100_RM(1);
AjK 0:055897ab699b 130 config_write(config);
AjK 1:46c8c60e744a 131 irqEnable();
AjK 0:055897ab699b 132 }
AjK 0:055897ab699b 133
AjK 0:055897ab699b 134 void
AjK 0:055897ab699b 135 MAX3100::enableTxIrq(void)
AjK 0:055897ab699b 136 {
AjK 1:46c8c60e744a 137 irqDisable();
AjK 0:055897ab699b 138 config &= ~MAX3100_TM(1);
AjK 0:055897ab699b 139 config |= MAX3100_TM(1);
AjK 0:055897ab699b 140 config_write(config);
AjK 1:46c8c60e744a 141 irqEnable();
AjK 0:055897ab699b 142 }
AjK 0:055897ab699b 143
AjK 0:055897ab699b 144 void
AjK 0:055897ab699b 145 MAX3100::disableTxIrq(void)
AjK 0:055897ab699b 146 {
AjK 1:46c8c60e744a 147 irqDisable();
AjK 0:055897ab699b 148 config &= ~MAX3100_TM(1);
AjK 0:055897ab699b 149 config_write(config);
AjK 1:46c8c60e744a 150 irqEnable();
AjK 0:055897ab699b 151 }
AjK 0:055897ab699b 152
AjK 0:055897ab699b 153 int
AjK 0:055897ab699b 154 MAX3100::putc(int c)
AjK 0:055897ab699b 155 {
AjK 0:055897ab699b 156 uint16_t data, conf;
AjK 0:055897ab699b 157
AjK 0:055897ab699b 158 // If no space return -1 as an error code.
AjK 0:055897ab699b 159 if (tx_buffer_full) return -1;
AjK 0:055897ab699b 160
AjK 0:055897ab699b 161 if (_parity) {
AjK 0:055897ab699b 162 int pBit = parityCal(c & 0xFF);
AjK 0:055897ab699b 163 if (_parity == Even && pBit == 0) { c |= (1 << 8); }
AjK 0:055897ab699b 164 if (_parity == Odd && pBit == 1) { c |= (1 << 8); }
AjK 0:055897ab699b 165 }
AjK 0:055897ab699b 166 else { c &= 0xFF; }
AjK 0:055897ab699b 167
AjK 0:055897ab699b 168 // Function is non-interruptable by the MAX3100 class
AjK 0:055897ab699b 169 // to avoid SPI bus contention between writing a byte
AjK 0:055897ab699b 170 // in user context (here) and IRQ context.
AjK 1:46c8c60e744a 171 irqDisable();
AjK 0:055897ab699b 172
AjK 0:055897ab699b 173 conf = config_read();
AjK 0:055897ab699b 174
AjK 0:055897ab699b 175 if (tx_buffer_in == tx_buffer_out && conf & MAX3100_CONF_T) {
AjK 0:055897ab699b 176 data = spiwrite(MAX3100_DATA_WR | (c & 0x1FF));
AjK 0:055897ab699b 177 // In case we get a byte while writing store it away.
AjK 0:055897ab699b 178 if (!rx_buffer_full && data & MAX3100_CONF_R) {
AjK 0:055897ab699b 179 rx_buffer[rx_buffer_in++] = (uint16_t)(data & 0xFF);
AjK 0:055897ab699b 180 if (rx_buffer_in >= MAX3100_RX_BUFFER_SIZE) rx_buffer_in = 0;
AjK 0:055897ab699b 181 if (rx_buffer_in == rx_buffer_out) rx_buffer_full = true;
AjK 0:055897ab699b 182 }
AjK 0:055897ab699b 183 }
AjK 0:055897ab699b 184 else {
AjK 0:055897ab699b 185 tx_buffer[tx_buffer_in++] = (char)(c & 0xFF);
AjK 0:055897ab699b 186 if (tx_buffer_in >= MAX3100_TX_BUFFER_SIZE) {
AjK 0:055897ab699b 187 tx_buffer_in = 0;
AjK 0:055897ab699b 188 }
AjK 0:055897ab699b 189 if (tx_buffer_in == tx_buffer_out) tx_buffer_full = true;
AjK 0:055897ab699b 190 }
AjK 0:055897ab699b 191
AjK 1:46c8c60e744a 192 irqEnable();
AjK 0:055897ab699b 193
AjK 0:055897ab699b 194 return 1;
AjK 0:055897ab699b 195 }
AjK 0:055897ab699b 196
AjK 0:055897ab699b 197 void
AjK 0:055897ab699b 198 MAX3100::puts(char *s) {
AjK 0:055897ab699b 199 char *q = s;
AjK 0:055897ab699b 200 while(*(q)) {
AjK 0:055897ab699b 201 if (putc((int)(*(q))) == -1) return;
AjK 0:055897ab699b 202 q++;
AjK 0:055897ab699b 203 }
AjK 0:055897ab699b 204 }
AjK 0:055897ab699b 205
AjK 0:055897ab699b 206 int
AjK 0:055897ab699b 207 MAX3100::getc(void) {
AjK 0:055897ab699b 208 if (!rx_buffer_full && rx_buffer_in == rx_buffer_out) return -1;
AjK 0:055897ab699b 209 int c = (int)((unsigned char)rx_buffer[rx_buffer_out++]);
AjK 0:055897ab699b 210 if (rx_buffer_out >= MAX3100_RX_BUFFER_SIZE) rx_buffer_out = 0;
AjK 0:055897ab699b 211 rx_buffer_full = false;
AjK 0:055897ab699b 212 return c;
AjK 0:055897ab699b 213 }
AjK 0:055897ab699b 214
AjK 0:055897ab699b 215 char *
AjK 0:055897ab699b 216 MAX3100::gets(char *s, int size)
AjK 0:055897ab699b 217 {
AjK 0:055897ab699b 218 int i;
AjK 0:055897ab699b 219 char *q = s;
AjK 0:055897ab699b 220 while(size) {
AjK 0:055897ab699b 221 do { i = getc(); } while (i == -1); // Blocks!
AjK 0:055897ab699b 222 *(q) = (char)i; size--;
AjK 0:055897ab699b 223 }
AjK 0:055897ab699b 224 return s;
AjK 0:055897ab699b 225 }
AjK 0:055897ab699b 226
AjK 0:055897ab699b 227 int
AjK 0:055897ab699b 228 MAX3100::peek(void) {
AjK 0:055897ab699b 229 if (!rx_buffer_full && rx_buffer_in == rx_buffer_out) return -1;
AjK 0:055897ab699b 230 return (int)((unsigned char)rx_buffer[rx_buffer_out]);
AjK 0:055897ab699b 231 }
AjK 0:055897ab699b 232
AjK 0:055897ab699b 233 void
AjK 0:055897ab699b 234 MAX3100::isr(void) {
AjK 0:055897ab699b 235 uint16_t data = spiwrite(MAX3100_DATA_RD);
AjK 0:055897ab699b 236 bool tx_ready = data & MAX3100_CONF_T ? true : false;
AjK 0:055897ab699b 237
AjK 0:055897ab699b 238 // The MAX3100 does have an RX fifo. So attempt to empty it into the RX buffer.
AjK 0:055897ab699b 239 do {
AjK 0:055897ab699b 240 if (!rx_buffer_full && data & MAX3100_CONF_R) {
AjK 0:055897ab699b 241 rx_buffer[rx_buffer_in++] = (char)(data & 0xFF);
AjK 0:055897ab699b 242 if (rx_buffer_in >= MAX3100_RX_BUFFER_SIZE) rx_buffer_in = 0;
AjK 0:055897ab699b 243 if (rx_buffer_in == rx_buffer_out) rx_buffer_full = true;
AjK 0:055897ab699b 244 }
AjK 0:055897ab699b 245 }
AjK 0:055897ab699b 246 while ((data = spiwrite(MAX3100_DATA_RD)) & MAX3100_CONF_R);
AjK 0:055897ab699b 247
AjK 0:055897ab699b 248 // The MAX3100 doesn't have a hardware TX fifo, so just test to see if it's TX buffer
AjK 0:055897ab699b 249 // is empty. If it is and we have bytes in the TX buffer then send one now.
AjK 0:055897ab699b 250 if (tx_ready && (tx_buffer_full || tx_buffer_in != tx_buffer_out)) {
AjK 0:055897ab699b 251 data = spiwrite(MAX3100_DATA_WR | (tx_buffer[tx_buffer_out++] & 0x1FF));
AjK 0:055897ab699b 252 if (tx_buffer_out >= MAX3100_TX_BUFFER_SIZE) tx_buffer_out = 0;
AjK 0:055897ab699b 253 tx_buffer_full = false;
AjK 0:055897ab699b 254 }
AjK 0:055897ab699b 255
AjK 0:055897ab699b 256 // In case we get a byte while sending then store it.
AjK 0:055897ab699b 257 if (!rx_buffer_full && data & MAX3100_CONF_R) {
AjK 0:055897ab699b 258 rx_buffer[rx_buffer_in++] = (char)(data & 0xFF);
AjK 0:055897ab699b 259 if (rx_buffer_in >= MAX3100_RX_BUFFER_SIZE) rx_buffer_in = 0;
AjK 0:055897ab699b 260 if (rx_buffer_in == rx_buffer_out) rx_buffer_full = true;
AjK 2:2a49171453d5 261 }
AjK 2:2a49171453d5 262
AjK 2:2a49171453d5 263 int isrType = MAX3100::ISR;
AjK 2:2a49171453d5 264
AjK 2:2a49171453d5 265 if ( data & MAX3100_CONF_R ) {
AjK 2:2a49171453d5 266 isrType |= MAX3100::ISR_RX;
AjK 2:2a49171453d5 267 }
AjK 2:2a49171453d5 268
AjK 2:2a49171453d5 269 if ( tx_ready ) {
AjK 2:2a49171453d5 270 isrType |= MAX3100::ISR_TX;
AjK 2:2a49171453d5 271 }
AjK 2:2a49171453d5 272
AjK 2:2a49171453d5 273
AjK 2:2a49171453d5 274 if (_isr_user_function != NULL) (*_isr_user_function)( isrType );
AjK 2:2a49171453d5 275 else {
AjK 2:2a49171453d5 276 if (_isr_user_obj && _isr_user_method) (_isr_user_obj->*_isr_user_method)( isrType );
AjK 2:2a49171453d5 277 }
AjK 0:055897ab699b 278 }
AjK 0:055897ab699b 279
AjK 0:055897ab699b 280 void
AjK 0:055897ab699b 281 MAX3100::setStopBits(int i)
AjK 0:055897ab699b 282 {
AjK 0:055897ab699b 283 switch(i) {
AjK 0:055897ab699b 284 case 1:
AjK 1:46c8c60e744a 285 irqDisable();
AjK 0:055897ab699b 286 config &= ~(1 << 6);
AjK 0:055897ab699b 287 config_write(config);
AjK 1:46c8c60e744a 288 irqEnable();
AjK 0:055897ab699b 289 break;
AjK 0:055897ab699b 290 case 2:
AjK 1:46c8c60e744a 291 irqDisable();
AjK 0:055897ab699b 292 config |= (1 << 6);
AjK 0:055897ab699b 293 config_write(config);
AjK 1:46c8c60e744a 294 irqEnable();
AjK 0:055897ab699b 295 break;
AjK 0:055897ab699b 296 }
AjK 0:055897ab699b 297 }
AjK 0:055897ab699b 298
AjK 0:055897ab699b 299 int
AjK 0:055897ab699b 300 MAX3100::parityCal(uint8_t c)
AjK 0:055897ab699b 301 {
AjK 0:055897ab699b 302 int count = 0;
AjK 0:055897ab699b 303 for (int mask = 1, i = 0; i < 8; i++, mask = mask << 1) {
AjK 0:055897ab699b 304 if (c & mask) count++;
AjK 0:055897ab699b 305 }
AjK 0:055897ab699b 306 return count & 1;
AjK 0:055897ab699b 307 }
AjK 1:46c8c60e744a 308
AjK 1:46c8c60e744a 309 void
AjK 1:46c8c60e744a 310 MAX3100::irqDisable(void)
AjK 1:46c8c60e744a 311 {
AjK 1:46c8c60e744a 312 if (_irqMask0) LPC_GPIOINT->IO0IntEnF &= ~_irqMask0;
AjK 1:46c8c60e744a 313 if (_irqMask2) LPC_GPIOINT->IO2IntEnF &= ~_irqMask2;
AjK 1:46c8c60e744a 314 }
AjK 1:46c8c60e744a 315
AjK 1:46c8c60e744a 316 void
AjK 1:46c8c60e744a 317 MAX3100::irqEnable(void)
AjK 1:46c8c60e744a 318 {
AjK 1:46c8c60e744a 319 if (_irqMask0) LPC_GPIOINT->IO0IntEnF |= _irqMask0;
AjK 1:46c8c60e744a 320 if (_irqMask2) LPC_GPIOINT->IO2IntEnF |= _irqMask2;
AjK 1:46c8c60e744a 321 }
AjK 1:46c8c60e744a 322
AjK 1:46c8c60e744a 323 void
AjK 1:46c8c60e744a 324 MAX3100::irqMask(PinName p)
AjK 1:46c8c60e744a 325 {
AjK 1:46c8c60e744a 326 _irqMask0 = _irqMask2 = 0;
AjK 1:46c8c60e744a 327
AjK 1:46c8c60e744a 328 switch( p ) {
AjK 1:46c8c60e744a 329 case p5: _irqMask0 = (1UL << 9); break;
AjK 1:46c8c60e744a 330 case p6: _irqMask0 = (1UL << 8); break;
AjK 1:46c8c60e744a 331 case p7: _irqMask0 = (1UL << 7); break;
AjK 1:46c8c60e744a 332 case p8: _irqMask0 = (1UL << 6); break;
AjK 1:46c8c60e744a 333 case p9: _irqMask0 = (1UL << 0); break;
AjK 1:46c8c60e744a 334 case p10: _irqMask0 = (1UL << 1); break;
AjK 1:46c8c60e744a 335 case p11: _irqMask0 = (1UL << 18); break;
AjK 1:46c8c60e744a 336 case p12: _irqMask0 = (1UL << 17); break;
AjK 1:46c8c60e744a 337 case p13: _irqMask0 = (1UL << 15); break;
AjK 1:46c8c60e744a 338 case p14: _irqMask0 = (1UL << 16); break;
AjK 1:46c8c60e744a 339 case p15: _irqMask0 = (1UL << 23); break;
AjK 1:46c8c60e744a 340 case p16: _irqMask0 = (1UL << 24); break;
AjK 1:46c8c60e744a 341 case p17: _irqMask0 = (1UL << 25); break;
AjK 1:46c8c60e744a 342 case p18: _irqMask0 = (1UL << 26); break;
AjK 1:46c8c60e744a 343 case p21: _irqMask2 = (1UL << 5); break;
AjK 1:46c8c60e744a 344 case p22: _irqMask2 = (1UL << 4); break;
AjK 1:46c8c60e744a 345 case p23: _irqMask2 = (1UL << 3); break;
AjK 1:46c8c60e744a 346 case p24: _irqMask2 = (1UL << 2); break;
AjK 1:46c8c60e744a 347 case p25: _irqMask2 = (1UL << 1); break;
AjK 1:46c8c60e744a 348 case p26: _irqMask2 = (1UL << 0); break;
AjK 1:46c8c60e744a 349 case p27: _irqMask0 = (1UL << 11); break;
AjK 1:46c8c60e744a 350 case p28: _irqMask0 = (1UL << 10); break;
AjK 1:46c8c60e744a 351 case p29: _irqMask0 = (1UL << 5); break;
AjK 1:46c8c60e744a 352 case p30: _irqMask0 = (1UL << 4); break;
AjK 1:46c8c60e744a 353 }
AjK 1:46c8c60e744a 354 }
AjK 0:055897ab699b 355
AjK 0:055897ab699b 356 void
AjK 0:055897ab699b 357 MAX3100::topic_1498(PinName p) {
AjK 0:055897ab699b 358 // http://mbed.org/forum/bugs-suggestions/topic/1498
AjK 0:055897ab699b 359 uint32_t clr0 = 0, clr2 = 0;
AjK 0:055897ab699b 360
AjK 0:055897ab699b 361 switch( p ) {
AjK 0:055897ab699b 362 case p5: clr0 = (1UL << 9); break;
AjK 0:055897ab699b 363 case p6: clr0 = (1UL << 8); break;
AjK 0:055897ab699b 364 case p7: clr0 = (1UL << 7); break;
AjK 0:055897ab699b 365 case p8: clr0 = (1UL << 6); break;
AjK 0:055897ab699b 366 case p9: clr0 = (1UL << 0); break;
AjK 0:055897ab699b 367 case p10: clr0 = (1UL << 1); break;
AjK 0:055897ab699b 368 case p11: clr0 = (1UL << 18); break;
AjK 0:055897ab699b 369 case p12: clr0 = (1UL << 17); break;
AjK 0:055897ab699b 370 case p13: clr0 = (1UL << 15); break;
AjK 0:055897ab699b 371 case p14: clr0 = (1UL << 16); break;
AjK 0:055897ab699b 372 case p15: clr0 = (1UL << 23); break;
AjK 0:055897ab699b 373 case p16: clr0 = (1UL << 24); break;
AjK 0:055897ab699b 374 case p17: clr0 = (1UL << 25); break;
AjK 0:055897ab699b 375 case p18: clr0 = (1UL << 26); break;
AjK 0:055897ab699b 376 case p21: clr2 = (1UL << 5); break;
AjK 0:055897ab699b 377 case p22: clr2 = (1UL << 4); break;
AjK 0:055897ab699b 378 case p23: clr2 = (1UL << 3); break;
AjK 0:055897ab699b 379 case p24: clr2 = (1UL << 2); break;
AjK 0:055897ab699b 380 case p25: clr2 = (1UL << 1); break;
AjK 0:055897ab699b 381 case p26: clr2 = (1UL << 0); break;
AjK 0:055897ab699b 382 case p27: clr0 = (1UL << 11); break;
AjK 0:055897ab699b 383 case p28: clr0 = (1UL << 10); break;
AjK 0:055897ab699b 384 case p29: clr0 = (1UL << 5); break;
AjK 0:055897ab699b 385 case p30: clr0 = (1UL << 4); break;
AjK 0:055897ab699b 386 }
AjK 0:055897ab699b 387
AjK 0:055897ab699b 388 if (clr0) LPC_GPIOINT->IO0IntClr = clr0;
AjK 0:055897ab699b 389 if (clr2) LPC_GPIOINT->IO2IntClr = clr2;
AjK 0:055897ab699b 390 }
AjK 0:055897ab699b 391
AjK 0:055897ab699b 392 }; // namespace AjK ends