Skip to content

Commit a65fa1a

Browse files
author
Jenny Plunkett
committed
Fixed IRQ Handler
1 parent 0846945 commit a65fa1a

File tree

1 file changed

+135
-78
lines changed

1 file changed

+135
-78
lines changed

targets/TARGET_TI/TARGET_CC32XX/TARGET_CC3220SF/serial_api.c

Lines changed: 135 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ struct serial_global_data_s {
122122

123123
static struct serial_global_data_s uart_data[UART_NUM];
124124

125-
void serial_init(serial_t *obj, PinName tx, PinName rx) {
125+
void serial_init(serial_t *obj, PinName tx, PinName rx)
126+
{
126127
int is_stdio_uart = 0;
127128

128129
// determine the UART to use
@@ -144,23 +145,23 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
144145
obj->stopBits = UART_STOP_ONE;
145146
obj->parityType = UART_PAR_NONE;
146147

147-
switch(uart) {
148+
switch (uart) {
148149
case UART_0: {
149-
obj->index = 0;
150-
obj->baseAddr = CC3220SF_UARTA0_BASE;
151-
obj->powerMgrId = 12; /*!< Resource ID: UART 0 */
152-
obj->intNum = INT_UARTA0_IRQn;
153-
obj->peripheralId = PRCM_UARTA0;
154-
}
155-
break;
150+
obj->index = 0;
151+
obj->baseAddr = CC3220SF_UARTA0_BASE;
152+
obj->powerMgrId = 12; /*!< Resource ID: UART 0 */
153+
obj->intNum = INT_UARTA0_IRQn;
154+
obj->peripheralId = PRCM_UARTA0;
155+
}
156+
break;
156157
case UART_1: {
157-
obj->index = 1;
158-
obj->baseAddr = CC3220SF_UARTA1_BASE;
159-
obj->powerMgrId = 13; /*!< Resource ID: UART 1 */
160-
obj->intNum = INT_UARTA1_IRQn;
161-
obj->peripheralId = PRCM_UARTA1;
162-
}
163-
break;
158+
obj->index = 1;
159+
obj->baseAddr = CC3220SF_UARTA1_BASE;
160+
obj->powerMgrId = 13; /*!< Resource ID: UART 1 */
161+
obj->intNum = INT_UARTA1_IRQn;
162+
obj->peripheralId = PRCM_UARTA1;
163+
}
164+
break;
164165
}
165166

166167
PRCMPeripheralClkEnable(obj->peripheralId, PRCM_RUN_MODE_CLK);
@@ -199,87 +200,125 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
199200
}
200201
}
201202

202-
void serial_free(serial_t *obj) {
203+
void serial_free(serial_t *obj)
204+
{
203205
uart_data[obj->index].serial_irq_id = 0;
204206
}
205207

206-
void serial_baud(serial_t *obj, int baudrate) {
208+
void serial_baud(serial_t *obj, int baudrate)
209+
{
207210
obj->baudRate = baudrate;
208211

209212
MAP_UARTConfigSetExpClk(obj->baseAddr, MAP_PRCMPeripheralClockGet(obj->peripheralId),
210213
obj->baudRate, (dataLength[obj->dataLength] |
211-
stopBits[obj->stopBits] | parityType[obj->parityType]));
214+
stopBits[obj->stopBits] | parityType[obj->parityType]));
212215
}
213216

214-
void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) {
217+
void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
218+
{
215219
MBED_ASSERT((stop_bits == 1) || (stop_bits == 2)); // 0: 1 stop bits, 1: 2 stop bits
216220
MBED_ASSERT((data_bits > 4) && (data_bits < 9)); // 0: 5 data bits ... 3: 8 data bits
217221
MBED_ASSERT((parity == ParityNone) || (parity == ParityOdd) || (parity == ParityEven) ||
218-
(parity == ParityForced1) || (parity == ParityForced0));
222+
(parity == ParityForced1) || (parity == ParityForced0));
219223

220224
stop_bits -= 1;
221225
data_bits -= 5;
222226

223227
switch (parity) {
224-
case ParityNone: obj->parityType = UART_PAR_NONE; break;
225-
case ParityOdd : obj->parityType = UART_PAR_ODD; break;
226-
case ParityEven: obj->parityType = UART_PAR_EVEN; break;
227-
case ParityForced1: obj->parityType = UART_PAR_ONE; break;
228-
case ParityForced0: obj->parityType = UART_PAR_ZERO; break;
229-
default: obj->parityType = UART_PAR_NONE; break;
228+
case ParityNone:
229+
obj->parityType = UART_PAR_NONE;
230+
break;
231+
case ParityOdd :
232+
obj->parityType = UART_PAR_ODD;
233+
break;
234+
case ParityEven:
235+
obj->parityType = UART_PAR_EVEN;
236+
break;
237+
case ParityForced1:
238+
obj->parityType = UART_PAR_ONE;
239+
break;
240+
case ParityForced0:
241+
obj->parityType = UART_PAR_ZERO;
242+
break;
243+
default:
244+
obj->parityType = UART_PAR_NONE;
245+
break;
230246
}
231247

232-
switch(data_bits) {
233-
case 0: obj->dataLength = UART_LEN_5; break;
234-
case 1: obj->dataLength = UART_LEN_6; break;
235-
case 2: obj->dataLength = UART_LEN_7; break;
236-
case 3: obj->dataLength = UART_LEN_8; break;
237-
default: obj->dataLength = UART_LEN_8; break;
248+
switch (data_bits) {
249+
case 0:
250+
obj->dataLength = UART_LEN_5;
251+
break;
252+
case 1:
253+
obj->dataLength = UART_LEN_6;
254+
break;
255+
case 2:
256+
obj->dataLength = UART_LEN_7;
257+
break;
258+
case 3:
259+
obj->dataLength = UART_LEN_8;
260+
break;
261+
default:
262+
obj->dataLength = UART_LEN_8;
263+
break;
238264
}
239265

240-
switch(stop_bits) {
241-
case 0: obj->stopBits = UART_STOP_ONE; break;
242-
case 1: obj->stopBits = UART_STOP_TWO; break;
243-
default: obj->stopBits = UART_STOP_ONE; break;
266+
switch (stop_bits) {
267+
case 0:
268+
obj->stopBits = UART_STOP_ONE;
269+
break;
270+
case 1:
271+
obj->stopBits = UART_STOP_TWO;
272+
break;
273+
default:
274+
obj->stopBits = UART_STOP_ONE;
275+
break;
244276
}
245277

246278
MAP_UARTConfigSetExpClk(obj->baseAddr, MAP_PRCMPeripheralClockGet(obj->peripheralId),
247279
obj->baudRate, (dataLength[obj->dataLength] |
248-
stopBits[obj->stopBits] | parityType[obj->parityType]));
280+
stopBits[obj->stopBits] | parityType[obj->parityType]));
249281
}
250282

251283
/******************************************************************************
252284
* INTERRUPTS HANDLING
253285
******************************************************************************/
254-
static inline void uart_irq(uint32_t intstatus, uint32_t index, CC3220SF_UART_TypeDef *puart) {
255-
puart->IM &= ~(UART_INT_RX | UART_INT_RT); // disable RX interrupt
256-
(void)puart->DR;
257-
uint32_t rxErrors = puart->RSR & 0x0000000F;
258-
if (rxErrors) {
259-
puart->ECR = 0;
286+
static inline void uart_irq(uint32_t intstatus, uint32_t index, CC3220SF_UART_TypeDef *puart)
287+
{
288+
SerialIrq irq_type;
289+
if (intstatus & UART_INT_TX) {
290+
irq_type = TxIrq;
291+
} else {
292+
irq_type = RxIrq;
260293
}
261-
if (uart_data[index].serial_irq_id != 0) {
262-
if (intstatus & UART_INT_TX)
263-
irq_handler(uart_data[index].serial_irq_id, TxIrq);
264-
else
265-
irq_handler(uart_data[index].serial_irq_id, RxIrq);
294+
if ((RxIrq == irq_type) && (NC != uart_data[index].sw_rts.pin)) {
295+
gpio_write(&uart_data[index].sw_rts, 1);
296+
// Disable interrupt if it wasn't enabled by other part of the application
297+
if (!uart_data[index].rx_irq_set_api)
298+
puart->IM &= ~(UART_INT_RX | UART_INT_RT);
266299
}
267-
puart->IM |= (UART_INT_RX | UART_INT_RT); // enable RX interrupt
300+
if (uart_data[index].serial_irq_id != 0)
301+
if ((irq_type != RxIrq) || (uart_data[index].rx_irq_set_api))
302+
irq_handler(uart_data[index].serial_irq_id, irq_type);
268303
}
269304

270-
void uart0_irq() {
305+
void uart0_irq()
306+
{
271307
uart_irq(CC3220SF_UART0->MIS, 0, (CC3220SF_UART_TypeDef *)CC3220SF_UART0);
272308
}
273-
void uart1_irq() {
309+
void uart1_irq()
310+
{
274311
uart_irq(CC3220SF_UART1->MIS, 1, (CC3220SF_UART_TypeDef *)CC3220SF_UART1);
275312
}
276313

277-
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
314+
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
315+
{
278316
irq_handler = handler;
279317
uart_data[obj->index].serial_irq_id = id;
280318
}
281319

282-
void serial_irq_set_internal(serial_t *obj, SerialIrq irq, uint32_t enable) {
320+
void serial_irq_set_internal(serial_t *obj, SerialIrq irq, uint32_t enable)
321+
{
283322
IRQn_Type irq_n = (IRQn_Type)0;
284323
uint32_t vector = 0;
285324

@@ -288,8 +327,14 @@ void serial_irq_set_internal(serial_t *obj, SerialIrq irq, uint32_t enable) {
288327
MAP_UARTIntClear(obj->baseAddr, status);
289328

290329
switch ((int)obj->uart) {
291-
case UART_0: irq_n = INT_UARTA0_IRQn; vector = (uint32_t)&uart0_irq; break;
292-
case UART_1: irq_n = INT_UARTA1_IRQn; vector = (uint32_t)&uart1_irq; break;
330+
case UART_0:
331+
irq_n = INT_UARTA0_IRQn;
332+
vector = (uint32_t)&uart0_irq;
333+
break;
334+
case UART_1:
335+
irq_n = INT_UARTA1_IRQn;
336+
vector = (uint32_t)&uart1_irq;
337+
break;
293338
}
294339

295340
if (enable) {
@@ -307,54 +352,66 @@ void serial_irq_set_internal(serial_t *obj, SerialIrq irq, uint32_t enable) {
307352
}
308353
}
309354

310-
void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
355+
void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
356+
{
357+
if (RxIrq == irq) uart_data[obj->index].rx_irq_set_api = enable;
311358
serial_irq_set_internal(obj, irq, enable);
312359
}
313360

314-
static void serial_flow_irq_set(serial_t *obj, uint32_t enable) {
361+
static void serial_flow_irq_set(serial_t *obj, uint32_t enable)
362+
{
315363
uart_data[obj->index].rx_irq_set_flow = enable;
316364
serial_irq_set_internal(obj, RxIrq, enable);
317365
}
318366

319367
/******************************************************************************
320368
* READ/WRITE
321369
******************************************************************************/
322-
int serial_getc(serial_t *obj) {
323-
while (!serial_readable(obj));
324-
return obj->uart->DR;
370+
int serial_getc(serial_t *obj)
371+
{
372+
while (!serial_readable(obj));
373+
return obj->uart->DR;
325374
}
326375

327-
void serial_putc(serial_t *obj, int c) {
328-
while (!serial_writable(obj));
329-
obj->uart->DR = c;
376+
void serial_putc(serial_t *obj, int c)
377+
{
378+
while (!serial_writable(obj));
379+
obj->uart->DR = c;
330380
}
331381

332-
int serial_readable(serial_t *obj) {
333-
return ((obj->uart->FR & UART_FR_RXFE) ? 0 : 1);
382+
int serial_readable(serial_t *obj)
383+
{
384+
return ((obj->uart->FR & UART_FR_RXFE) ? 0 : 1);
334385
}
335386

336-
int serial_writable(serial_t *obj) {
337-
return ((obj->uart->FR & UART_FR_TXFF) ? 0 : 1);
387+
int serial_writable(serial_t *obj)
388+
{
389+
return ((obj->uart->FR & UART_FR_TXFF) ? 0 : 1);
338390
}
339391

340-
void serial_clear(serial_t *obj) {
341-
obj->uart->DR = 0x00;
392+
void serial_clear(serial_t *obj)
393+
{
394+
obj->uart->DR = 0x00;
342395
}
343396

344-
void serial_pinout_tx(PinName tx) {
345-
pinmap_pinout(tx, PinMap_UART_TX);
397+
void serial_pinout_tx(PinName tx)
398+
{
399+
pinmap_pinout(tx, PinMap_UART_TX);
346400
}
347401

348-
void serial_break_set(serial_t *obj) {
349-
MAP_UARTBreakCtl(obj->baseAddr, true);
402+
void serial_break_set(serial_t *obj)
403+
{
404+
MAP_UARTBreakCtl(obj->baseAddr, true);
350405
}
351406

352-
void serial_break_clear(serial_t *obj) {
353-
MAP_UARTBreakCtl(obj->baseAddr, false);
407+
void serial_break_clear(serial_t *obj)
408+
{
409+
MAP_UARTBreakCtl(obj->baseAddr, false);
354410
}
355411

356-
void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow) {
357-
switch(type) {
412+
void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
413+
{
414+
switch (type) {
358415
case FlowControlRTS:
359416
pinmap_pinout(rxflow, PinMap_UART_RTS);
360417
MAP_UARTFlowControlSet(obj->baseAddr, UART_FLOWCONTROL_RX);

0 commit comments

Comments
 (0)