irsan julfikar / SC16IS752

Fork of SC16IS752 by irsan julfikar

Committer:
irsanjul
Date:
Wed Aug 10 03:40:03 2016 +0000
Revision:
0:ad254d5f94b1
Child:
1:85070c9144a6
sc16is752

Who changed what in which revision?

UserRevisionLine numberNew contents of line
irsanjul 0:ad254d5f94b1 1 #include "mbed.h"
irsanjul 0:ad254d5f94b1 2 #include "SC16IS752.h"
irsanjul 0:ad254d5f94b1 3 #include <vector>
irsanjul 0:ad254d5f94b1 4
irsanjul 0:ad254d5f94b1 5 #define ENABLE_BULK_TRANSFERS 1
irsanjul 0:ad254d5f94b1 6 #define BULK_BLOCK_LEN 16
irsanjul 0:ad254d5f94b1 7 #define MAX_BUFF 64
irsanjul 0:ad254d5f94b1 8
irsanjul 0:ad254d5f94b1 9 extern Serial dbg;
irsanjul 0:ad254d5f94b1 10
irsanjul 0:ad254d5f94b1 11 SC16IS752::SC16IS752(PinName sda, PinName scl, uint8_t deviceAddress, PinName rst, ChannelName channel) : _i2c(sda, scl), _slaveAddress(deviceAddress & 0xFE), _channel(channel)
irsanjul 0:ad254d5f94b1 12 {
irsanjul 0:ad254d5f94b1 13 _i2c.frequency(400000);
irsanjul 0:ad254d5f94b1 14 _i2c.start();
irsanjul 0:ad254d5f94b1 15 _i2c.stop();
irsanjul 0:ad254d5f94b1 16
irsanjul 0:ad254d5f94b1 17 if (_i2c.read(deviceAddress, &data[0], 1) != 0)
irsanjul 0:ad254d5f94b1 18 {
irsanjul 0:ad254d5f94b1 19 dbg.printf(RED "I2C device is not detected\r\n" DEF);
irsanjul 0:ad254d5f94b1 20 }
irsanjul 0:ad254d5f94b1 21 else
irsanjul 0:ad254d5f94b1 22 {
irsanjul 0:ad254d5f94b1 23 dbg.printf(GRE "I2C device is detected\r\n" DEF);
irsanjul 0:ad254d5f94b1 24 }
irsanjul 0:ad254d5f94b1 25
irsanjul 0:ad254d5f94b1 26 data[0]=0;
irsanjul 0:ad254d5f94b1 27 _i2c.start();
irsanjul 0:ad254d5f94b1 28 _i2c.stop();
irsanjul 0:ad254d5f94b1 29
irsanjul 0:ad254d5f94b1 30 if (rst != NC)
irsanjul 0:ad254d5f94b1 31 {
irsanjul 0:ad254d5f94b1 32 _reset = new DigitalOut(rst); //Construct new pin
irsanjul 0:ad254d5f94b1 33 _reset->write(1); //Deactivate
irsanjul 0:ad254d5f94b1 34 }
irsanjul 0:ad254d5f94b1 35 else
irsanjul 0:ad254d5f94b1 36 {
irsanjul 0:ad254d5f94b1 37 _reset = NULL; //Construct dummy pin
irsanjul 0:ad254d5f94b1 38 }
irsanjul 0:ad254d5f94b1 39 }
irsanjul 0:ad254d5f94b1 40
irsanjul 0:ad254d5f94b1 41 SC16IS752::~SC16IS752()
irsanjul 0:ad254d5f94b1 42 {
irsanjul 0:ad254d5f94b1 43 if (_reset != NULL) {delete _reset;} // Reset pin
irsanjul 0:ad254d5f94b1 44 }
irsanjul 0:ad254d5f94b1 45
irsanjul 0:ad254d5f94b1 46 bool SC16IS752::wr(char adr, char data)
irsanjul 0:ad254d5f94b1 47 {
irsanjul 0:ad254d5f94b1 48 w[0] = adr | _channel;
irsanjul 0:ad254d5f94b1 49 w[1] = data;
irsanjul 0:ad254d5f94b1 50 if (_i2c.write(_slaveAddress, w, 2) != 0) return 0;
irsanjul 0:ad254d5f94b1 51
irsanjul 0:ad254d5f94b1 52 return true;
irsanjul 0:ad254d5f94b1 53 }
irsanjul 0:ad254d5f94b1 54
irsanjul 0:ad254d5f94b1 55 void SC16IS752::wrblock(const char *data, int len )
irsanjul 0:ad254d5f94b1 56 {
irsanjul 0:ad254d5f94b1 57 int i;
irsanjul 0:ad254d5f94b1 58
irsanjul 0:ad254d5f94b1 59 _i2c.start();
irsanjul 0:ad254d5f94b1 60 _i2c.write(_slaveAddress);
irsanjul 0:ad254d5f94b1 61 _i2c.write(THR | _channel);
irsanjul 0:ad254d5f94b1 62
irsanjul 0:ad254d5f94b1 63 for (i=0; i<len; i++)
irsanjul 0:ad254d5f94b1 64 {
irsanjul 0:ad254d5f94b1 65 _i2c.write(data[i]);
irsanjul 0:ad254d5f94b1 66 wait_ms(1);
irsanjul 0:ad254d5f94b1 67 }
irsanjul 0:ad254d5f94b1 68
irsanjul 0:ad254d5f94b1 69 _i2c.stop();
irsanjul 0:ad254d5f94b1 70 }
irsanjul 0:ad254d5f94b1 71
irsanjul 0:ad254d5f94b1 72 char SC16IS752::rd(char adr)
irsanjul 0:ad254d5f94b1 73 {
irsanjul 0:ad254d5f94b1 74 char start = adr | _channel;;
irsanjul 0:ad254d5f94b1 75 if (_i2c.write(_slaveAddress, &start, 1, true) != 0) dbg.printf(RED "SPR No Ack!\r\n" DEF);
irsanjul 0:ad254d5f94b1 76 if (_i2c.read(_slaveAddress, r, 1) != 0) dbg.printf(RED "SPR No Ack!\r\n" DEF);
irsanjul 0:ad254d5f94b1 77
irsanjul 0:ad254d5f94b1 78 return r[0];
irsanjul 0:ad254d5f94b1 79 }
irsanjul 0:ad254d5f94b1 80
irsanjul 0:ad254d5f94b1 81 bool SC16IS752::swReset()
irsanjul 0:ad254d5f94b1 82 {
irsanjul 0:ad254d5f94b1 83 if(wr(IOCTRL, IOC_SW_RST))
irsanjul 0:ad254d5f94b1 84 return true;
irsanjul 0:ad254d5f94b1 85 else return 0;
irsanjul 0:ad254d5f94b1 86 }
irsanjul 0:ad254d5f94b1 87
irsanjul 0:ad254d5f94b1 88 bool SC16IS752::baud(int baudrate)
irsanjul 0:ad254d5f94b1 89 {
irsanjul 0:ad254d5f94b1 90 unsigned long divisor = SC16IS752_BAUDRATE_DIVISOR(baudrate);
irsanjul 0:ad254d5f94b1 91 char lcr_tmp;
irsanjul 0:ad254d5f94b1 92
irsanjul 0:ad254d5f94b1 93 _config.baudrate = baudrate;
irsanjul 0:ad254d5f94b1 94
irsanjul 0:ad254d5f94b1 95 lcr_tmp = rd(LCR);
irsanjul 0:ad254d5f94b1 96 if(!wr(LCR, lcr_tmp | LCR_ENABLE_DIV)) return 0;
irsanjul 0:ad254d5f94b1 97 if(!wr(DLL, ( divisor & 0xFF))) return 0;
irsanjul 0:ad254d5f94b1 98 if(!wr(DLH, ((divisor >> 8) & 0xFF))) return 0;
irsanjul 0:ad254d5f94b1 99 if(!wr(LCR, lcr_tmp)) return 0;
irsanjul 0:ad254d5f94b1 100
irsanjul 0:ad254d5f94b1 101 return true;
irsanjul 0:ad254d5f94b1 102 }
irsanjul 0:ad254d5f94b1 103
irsanjul 0:ad254d5f94b1 104 bool SC16IS752::format(int bits, Serial::Parity parity, int stop_bits)
irsanjul 0:ad254d5f94b1 105 {
irsanjul 0:ad254d5f94b1 106 char lcr_tmp = 0x00;
irsanjul 0:ad254d5f94b1 107
irsanjul 0:ad254d5f94b1 108 switch (bits)
irsanjul 0:ad254d5f94b1 109 {
irsanjul 0:ad254d5f94b1 110 case 5: lcr_tmp |= LCR_BITS5;
irsanjul 0:ad254d5f94b1 111 break;
irsanjul 0:ad254d5f94b1 112 case 6: lcr_tmp |= LCR_BITS6;
irsanjul 0:ad254d5f94b1 113 break;
irsanjul 0:ad254d5f94b1 114 case 7: lcr_tmp |= LCR_BITS7;
irsanjul 0:ad254d5f94b1 115 break;
irsanjul 0:ad254d5f94b1 116 case 8: lcr_tmp |= LCR_BITS8;
irsanjul 0:ad254d5f94b1 117 break;
irsanjul 0:ad254d5f94b1 118 default: lcr_tmp |= LCR_BITS8;
irsanjul 0:ad254d5f94b1 119 }
irsanjul 0:ad254d5f94b1 120
irsanjul 0:ad254d5f94b1 121 switch (parity)
irsanjul 0:ad254d5f94b1 122 {
irsanjul 0:ad254d5f94b1 123 case Serial::None: lcr_tmp |= LCR_NONE;
irsanjul 0:ad254d5f94b1 124 break;
irsanjul 0:ad254d5f94b1 125 case Serial::Odd: lcr_tmp |= LCR_ODD;
irsanjul 0:ad254d5f94b1 126 break;
irsanjul 0:ad254d5f94b1 127 case Serial::Even: lcr_tmp |= LCR_EVEN;
irsanjul 0:ad254d5f94b1 128 break;
irsanjul 0:ad254d5f94b1 129 case Serial::Forced1: lcr_tmp |= LCR_FORCED1;
irsanjul 0:ad254d5f94b1 130 break;
irsanjul 0:ad254d5f94b1 131 case Serial::Forced0: lcr_tmp |= LCR_FORCED0;
irsanjul 0:ad254d5f94b1 132 break;
irsanjul 0:ad254d5f94b1 133 default: lcr_tmp |= LCR_NONE;
irsanjul 0:ad254d5f94b1 134 }
irsanjul 0:ad254d5f94b1 135
irsanjul 0:ad254d5f94b1 136 switch (stop_bits)
irsanjul 0:ad254d5f94b1 137 {
irsanjul 0:ad254d5f94b1 138 case 1: lcr_tmp |= LCR_BITS1;
irsanjul 0:ad254d5f94b1 139 break;
irsanjul 0:ad254d5f94b1 140 case 2: lcr_tmp |= LCR_BITS2;
irsanjul 0:ad254d5f94b1 141 break;
irsanjul 0:ad254d5f94b1 142 default: lcr_tmp |= LCR_BITS1;
irsanjul 0:ad254d5f94b1 143 }
irsanjul 0:ad254d5f94b1 144
irsanjul 0:ad254d5f94b1 145 _config.dataformat = lcr_tmp;
irsanjul 0:ad254d5f94b1 146
irsanjul 0:ad254d5f94b1 147 if(!wr(LCR, lcr_tmp)) return 0;
irsanjul 0:ad254d5f94b1 148
irsanjul 0:ad254d5f94b1 149 return true;
irsanjul 0:ad254d5f94b1 150 }
irsanjul 0:ad254d5f94b1 151
irsanjul 0:ad254d5f94b1 152 bool SC16IS752::set_flow_control(Flow type, PinName flow1, PinName flow2)
irsanjul 0:ad254d5f94b1 153 {
irsanjul 0:ad254d5f94b1 154 char lcr_tmp;
irsanjul 0:ad254d5f94b1 155 char efr_tmp = 0x00;
irsanjul 0:ad254d5f94b1 156
irsanjul 0:ad254d5f94b1 157 switch (type)
irsanjul 0:ad254d5f94b1 158 {
irsanjul 0:ad254d5f94b1 159 case Disabled :
irsanjul 0:ad254d5f94b1 160 break;
irsanjul 0:ad254d5f94b1 161 case RTS: efr_tmp = EFR_ENABLE_RTS;
irsanjul 0:ad254d5f94b1 162 break;
irsanjul 0:ad254d5f94b1 163 case CTS: efr_tmp = EFR_ENABLE_CTS;
irsanjul 0:ad254d5f94b1 164 break;
irsanjul 0:ad254d5f94b1 165 case RTSCTS: efr_tmp = EFR_ENABLE_RTS | EFR_ENABLE_CTS;
irsanjul 0:ad254d5f94b1 166 break;
irsanjul 0:ad254d5f94b1 167 default: break;
irsanjul 0:ad254d5f94b1 168 }
irsanjul 0:ad254d5f94b1 169
irsanjul 0:ad254d5f94b1 170 _config.flowctrl = efr_tmp | EFR_ENABLE_ENHANCED_FUNCTIONS;
irsanjul 0:ad254d5f94b1 171
irsanjul 0:ad254d5f94b1 172 lcr_tmp = rd(LCR);
irsanjul 0:ad254d5f94b1 173 if(!wr(LCR, LCR_ENABLE_ENHANCED_FUNCTIONS)) return 0;
irsanjul 0:ad254d5f94b1 174 if(!wr(EFR, _config.flowctrl)) return 0;
irsanjul 0:ad254d5f94b1 175 if(!wr(LCR, lcr_tmp)) return 0;
irsanjul 0:ad254d5f94b1 176
irsanjul 0:ad254d5f94b1 177 return true;
irsanjul 0:ad254d5f94b1 178 }
irsanjul 0:ad254d5f94b1 179
irsanjul 0:ad254d5f94b1 180 bool SC16IS752::set_flow_triggers(int resume, int halt)
irsanjul 0:ad254d5f94b1 181 {
irsanjul 0:ad254d5f94b1 182 halt = halt & 0x0F;
irsanjul 0:ad254d5f94b1 183 resume = resume & 0x0F;
irsanjul 0:ad254d5f94b1 184 if (halt <= resume)
irsanjul 0:ad254d5f94b1 185 {
irsanjul 0:ad254d5f94b1 186 halt = TCR_HALT_DEFAULT;
irsanjul 0:ad254d5f94b1 187 resume = TCR_RESUME_DEFAULT;
irsanjul 0:ad254d5f94b1 188 }
irsanjul 0:ad254d5f94b1 189
irsanjul 0:ad254d5f94b1 190 if(!wr(TCR, (resume << 4) | halt)) return 0;
irsanjul 0:ad254d5f94b1 191
irsanjul 0:ad254d5f94b1 192 return true;
irsanjul 0:ad254d5f94b1 193 }
irsanjul 0:ad254d5f94b1 194
irsanjul 0:ad254d5f94b1 195 bool SC16IS752::set_modem_control()
irsanjul 0:ad254d5f94b1 196 {
irsanjul 0:ad254d5f94b1 197 if (SC16IS752_PRESCALER == SC16IS752_PRESCALER_1)
irsanjul 0:ad254d5f94b1 198 {
irsanjul 0:ad254d5f94b1 199 if(!wr(MCR, MCR_PRESCALE_1 | MCR_ENABLE_TCR_TLR)) return 0;
irsanjul 0:ad254d5f94b1 200 }
irsanjul 0:ad254d5f94b1 201 else
irsanjul 0:ad254d5f94b1 202 {
irsanjul 0:ad254d5f94b1 203 if(!wr(MCR, MCR_PRESCALE_4 | MCR_ENABLE_TCR_TLR)) return 0;
irsanjul 0:ad254d5f94b1 204 }
irsanjul 0:ad254d5f94b1 205
irsanjul 0:ad254d5f94b1 206 return true;
irsanjul 0:ad254d5f94b1 207 }
irsanjul 0:ad254d5f94b1 208
irsanjul 0:ad254d5f94b1 209 bool SC16IS752::connected()
irsanjul 0:ad254d5f94b1 210 {
irsanjul 0:ad254d5f94b1 211 char TEST_CHARACTER = 'A';
irsanjul 0:ad254d5f94b1 212
irsanjul 0:ad254d5f94b1 213 if(!wr(SPR, TEST_CHARACTER)) return 0;
irsanjul 0:ad254d5f94b1 214
irsanjul 0:ad254d5f94b1 215 char test = rd(SPR);
irsanjul 0:ad254d5f94b1 216
irsanjul 0:ad254d5f94b1 217 dbg.printf("read char: %c\r\n",test);
irsanjul 0:ad254d5f94b1 218
irsanjul 0:ad254d5f94b1 219 if(test == TEST_CHARACTER)
irsanjul 0:ad254d5f94b1 220 return true;
irsanjul 0:ad254d5f94b1 221 else return 0;
irsanjul 0:ad254d5f94b1 222 }
irsanjul 0:ad254d5f94b1 223
irsanjul 0:ad254d5f94b1 224 bool SC16IS752::set_fifo_control(bool stat)
irsanjul 0:ad254d5f94b1 225 {
irsanjul 0:ad254d5f94b1 226 _config.fifoenable = stat;
irsanjul 0:ad254d5f94b1 227
irsanjul 0:ad254d5f94b1 228 _config.fifoformat = FCR_RX_IRQ_8 | FCR_TX_IRQ_8;
irsanjul 0:ad254d5f94b1 229
irsanjul 0:ad254d5f94b1 230 if (_config.fifoenable)
irsanjul 0:ad254d5f94b1 231 if(!wr(FCR, _config.fifoformat | FCR_ENABLE_FIFO)) return 0;
irsanjul 0:ad254d5f94b1 232 else
irsanjul 0:ad254d5f94b1 233 if(!wr(FCR, _config.fifoformat)) return 0;
irsanjul 0:ad254d5f94b1 234
irsanjul 0:ad254d5f94b1 235 if(!wr(TLR, 0x00)) return 0;
irsanjul 0:ad254d5f94b1 236
irsanjul 0:ad254d5f94b1 237 return true;
irsanjul 0:ad254d5f94b1 238 }
irsanjul 0:ad254d5f94b1 239
irsanjul 0:ad254d5f94b1 240 bool SC16IS752::flush()
irsanjul 0:ad254d5f94b1 241 {
irsanjul 0:ad254d5f94b1 242 if(!wr(FCR, FCR_TX_FIFO_RST | FCR_RX_FIFO_RST)) return 0;
irsanjul 0:ad254d5f94b1 243
irsanjul 0:ad254d5f94b1 244 if (_config.fifoenable)
irsanjul 0:ad254d5f94b1 245 if(!wr(FCR, _config.fifoformat | FCR_ENABLE_FIFO)) return 0;
irsanjul 0:ad254d5f94b1 246 else
irsanjul 0:ad254d5f94b1 247 if(!wr(FCR, _config.fifoformat)) return 0;
irsanjul 0:ad254d5f94b1 248
irsanjul 0:ad254d5f94b1 249 return true;
irsanjul 0:ad254d5f94b1 250 }
irsanjul 0:ad254d5f94b1 251
irsanjul 0:ad254d5f94b1 252 bool SC16IS752::readable()
irsanjul 0:ad254d5f94b1 253 {
irsanjul 0:ad254d5f94b1 254 if (rd(LSR) & LSR_DR) // Data in Receiver Bit, at least one character waiting
irsanjul 0:ad254d5f94b1 255 {
irsanjul 0:ad254d5f94b1 256 dbg.printf(GRE "Serial is readable\r\n" DEF);
irsanjul 0:ad254d5f94b1 257 return true;
irsanjul 0:ad254d5f94b1 258 }
irsanjul 0:ad254d5f94b1 259 else
irsanjul 0:ad254d5f94b1 260 {
irsanjul 0:ad254d5f94b1 261 dbg.printf(RED "Serial is not readable\r\n" DEF);
irsanjul 0:ad254d5f94b1 262 return false;
irsanjul 0:ad254d5f94b1 263 }
irsanjul 0:ad254d5f94b1 264 }
irsanjul 0:ad254d5f94b1 265
irsanjul 0:ad254d5f94b1 266 int SC16IS752::readableCount()
irsanjul 0:ad254d5f94b1 267 {
irsanjul 0:ad254d5f94b1 268 int result = (int)rd(RXLVL);
irsanjul 0:ad254d5f94b1 269 dbg.printf("readable count = %d\r\n", result);
irsanjul 0:ad254d5f94b1 270 return result;
irsanjul 0:ad254d5f94b1 271 }
irsanjul 0:ad254d5f94b1 272
irsanjul 0:ad254d5f94b1 273 int SC16IS752::writeable()
irsanjul 0:ad254d5f94b1 274 {
irsanjul 0:ad254d5f94b1 275 if (rd(LSR) & LSR_THRE) // THR Empty, space for at least one character
irsanjul 0:ad254d5f94b1 276 {
irsanjul 0:ad254d5f94b1 277 dbg.printf(GRE "Serial is writeable\r\n" DEF);
irsanjul 0:ad254d5f94b1 278 return true;
irsanjul 0:ad254d5f94b1 279 }
irsanjul 0:ad254d5f94b1 280 else
irsanjul 0:ad254d5f94b1 281 {
irsanjul 0:ad254d5f94b1 282 dbg.printf(RED "Serial is writeable\r\n" DEF);
irsanjul 0:ad254d5f94b1 283 return false;
irsanjul 0:ad254d5f94b1 284 }
irsanjul 0:ad254d5f94b1 285 }
irsanjul 0:ad254d5f94b1 286
irsanjul 0:ad254d5f94b1 287 int SC16IS752::writeableCount()
irsanjul 0:ad254d5f94b1 288 {
irsanjul 0:ad254d5f94b1 289 int result = (int)rd(TXLVL);
irsanjul 0:ad254d5f94b1 290 dbg.printf("writeable count = %d\r\n", result);
irsanjul 0:ad254d5f94b1 291 return result;
irsanjul 0:ad254d5f94b1 292 }
irsanjul 0:ad254d5f94b1 293
irsanjul 0:ad254d5f94b1 294 int SC16IS752::get()
irsanjul 0:ad254d5f94b1 295 {
irsanjul 0:ad254d5f94b1 296 if (!readable())
irsanjul 0:ad254d5f94b1 297 {
irsanjul 0:ad254d5f94b1 298 return -1;
irsanjul 0:ad254d5f94b1 299 }
irsanjul 0:ad254d5f94b1 300 char res = rd(RHR);
irsanjul 0:ad254d5f94b1 301 return res;
irsanjul 0:ad254d5f94b1 302 }
irsanjul 0:ad254d5f94b1 303
irsanjul 0:ad254d5f94b1 304 int SC16IS752::put(int value)
irsanjul 0:ad254d5f94b1 305 {
irsanjul 0:ad254d5f94b1 306 while (writeableCount() == 0);
irsanjul 0:ad254d5f94b1 307 // {
irsanjul 0:ad254d5f94b1 308 // wait_us(1);
irsanjul 0:ad254d5f94b1 309 // };
irsanjul 0:ad254d5f94b1 310
irsanjul 0:ad254d5f94b1 311 if(!wr(THR, value)) return false;
irsanjul 0:ad254d5f94b1 312
irsanjul 0:ad254d5f94b1 313 return true;
irsanjul 0:ad254d5f94b1 314 }
irsanjul 0:ad254d5f94b1 315
irsanjul 0:ad254d5f94b1 316 void SC16IS752::writeString(const char *str)
irsanjul 0:ad254d5f94b1 317 {
irsanjul 0:ad254d5f94b1 318 int len = strlen(str);
irsanjul 0:ad254d5f94b1 319 int count = 0;
irsanjul 0:ad254d5f94b1 320
irsanjul 0:ad254d5f94b1 321 while(len)
irsanjul 0:ad254d5f94b1 322 {
irsanjul 0:ad254d5f94b1 323 int blk = MAX_BUFF;
irsanjul 0:ad254d5f94b1 324
irsanjul 0:ad254d5f94b1 325 if(len < blk)
irsanjul 0:ad254d5f94b1 326 blk = len;
irsanjul 0:ad254d5f94b1 327
irsanjul 0:ad254d5f94b1 328 if (blk > 0)
irsanjul 0:ad254d5f94b1 329 {
irsanjul 0:ad254d5f94b1 330 for(int i=0; i<blk; i++)
irsanjul 0:ad254d5f94b1 331 {
irsanjul 0:ad254d5f94b1 332 while (writeableCount() == 0)
irsanjul 0:ad254d5f94b1 333 {
irsanjul 0:ad254d5f94b1 334 wait_us(10);
irsanjul 0:ad254d5f94b1 335 };
irsanjul 0:ad254d5f94b1 336 wr(THR, str[i + (count * blk)]);
irsanjul 0:ad254d5f94b1 337 }
irsanjul 0:ad254d5f94b1 338
irsanjul 0:ad254d5f94b1 339 len = len - blk;
irsanjul 0:ad254d5f94b1 340 count++;
irsanjul 0:ad254d5f94b1 341 }
irsanjul 0:ad254d5f94b1 342 else len = 0;
irsanjul 0:ad254d5f94b1 343 }
irsanjul 0:ad254d5f94b1 344 }
irsanjul 0:ad254d5f94b1 345
irsanjul 0:ad254d5f94b1 346 void SC16IS752::writeBytes(const char *data, int len)
irsanjul 0:ad254d5f94b1 347 {
irsanjul 0:ad254d5f94b1 348 #if ENABLE_BULK_TRANSFERS
irsanjul 0:ad254d5f94b1 349 int idx;
irsanjul 0:ad254d5f94b1 350
irsanjul 0:ad254d5f94b1 351 while (len > BULK_BLOCK_LEN)
irsanjul 0:ad254d5f94b1 352 {
irsanjul 0:ad254d5f94b1 353 while(rd(TXLVL) < BULK_BLOCK_LEN)
irsanjul 0:ad254d5f94b1 354 {
irsanjul 0:ad254d5f94b1 355 wait_us(10);
irsanjul 0:ad254d5f94b1 356 };
irsanjul 0:ad254d5f94b1 357
irsanjul 0:ad254d5f94b1 358 wrblock(data, BULK_BLOCK_LEN);
irsanjul 0:ad254d5f94b1 359
irsanjul 0:ad254d5f94b1 360 len -= BULK_BLOCK_LEN;
irsanjul 0:ad254d5f94b1 361 data += BULK_BLOCK_LEN;
irsanjul 0:ad254d5f94b1 362 }
irsanjul 0:ad254d5f94b1 363
irsanjul 0:ad254d5f94b1 364 for (idx=0; idx<len; idx++)
irsanjul 0:ad254d5f94b1 365 {
irsanjul 0:ad254d5f94b1 366 while (rd(TXLVL) == 0)
irsanjul 0:ad254d5f94b1 367 {
irsanjul 0:ad254d5f94b1 368 wait_us(10);
irsanjul 0:ad254d5f94b1 369 };
irsanjul 0:ad254d5f94b1 370 wr(THR, data[idx]);
irsanjul 0:ad254d5f94b1 371 }
irsanjul 0:ad254d5f94b1 372 #else
irsanjul 0:ad254d5f94b1 373 int idx;
irsanjul 0:ad254d5f94b1 374
irsanjul 0:ad254d5f94b1 375 for (idx=0; idx<len; idx++)
irsanjul 0:ad254d5f94b1 376 {
irsanjul 0:ad254d5f94b1 377 while (rd(TXLVL) == 0)
irsanjul 0:ad254d5f94b1 378 {
irsanjul 0:ad254d5f94b1 379 wait_us(10);
irsanjul 0:ad254d5f94b1 380 };
irsanjul 0:ad254d5f94b1 381 wr(THR, str[idx]);
irsanjul 0:ad254d5f94b1 382 }
irsanjul 0:ad254d5f94b1 383 #endif
irsanjul 0:ad254d5f94b1 384 }
irsanjul 0:ad254d5f94b1 385
irsanjul 0:ad254d5f94b1 386
irsanjul 0:ad254d5f94b1 387 bool SC16IS752::init(int baudrate)
irsanjul 0:ad254d5f94b1 388 {
irsanjul 0:ad254d5f94b1 389 if(!swReset())return 0;
irsanjul 0:ad254d5f94b1 390 if(!baud(baudrate))return 0;
irsanjul 0:ad254d5f94b1 391 if(!format())return 0;
irsanjul 0:ad254d5f94b1 392 if(!set_flow_control())return 0;
irsanjul 0:ad254d5f94b1 393 if(!set_fifo_control())return 0;
irsanjul 0:ad254d5f94b1 394 if(!flush())return 0;
irsanjul 0:ad254d5f94b1 395 if(!set_modem_control())return 0;
irsanjul 0:ad254d5f94b1 396 if(!set_flow_triggers())return 0;
irsanjul 0:ad254d5f94b1 397
irsanjul 0:ad254d5f94b1 398 return true;
irsanjul 0:ad254d5f94b1 399 }