summaryrefslogtreecommitdiffstats
path: root/libopencm3/include/libopencm3/lpc43xx/uart.h
blob: 28830e3578cec7f8fd6ca7254a861d44a5ebd1c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
/*
* This file is part of the libopencm3 project.
*
* Copyright (C) 2012 Benjamin Vernoux <titanmkd@gmail.com>
*
* This library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef LPC43XX_UART_H
#define LPC43XX_UART_H

#include <libopencm3/cm3/common.h>
#include <libopencm3/lpc43xx/memorymap.h>

/* --- Convenience macros -------------------------------------------------- */

/* UART port base addresses (for convenience) */
#define UART0                           USART0_BASE /* APB0 */
#define UART1                           UART1_BASE  /* APB0 */
#define UART2                           USART2_BASE /* APB2 */
#define UART3                           USART3_BASE /* APB2 */

/* --- UART registers ------------------------------------------------------- */

/* Receiver Buffer Register (DLAB=0) Read Only */
#define UART_RBR(port)                  MMIO32(port + 0x000) /* 8bits */

/* Transmitter Holding Register (DLAB=0) Write Only */
#define UART_THR(port)                  MMIO32(port + 0x000) /* 8bits */

/* Divisor Latch LSB Register (DLAB=1) */
#define UART_DLL(port)                  MMIO32(port + 0x000) /* 8bits */

/* Divisor Latch MSB Register (DLAB=1) */
#define UART_DLM(port)                  MMIO32(port + 0x004) /* 8bits */

/* Interrupt Enable Register (DLAB=0) */
#define UART_IER(port)                  MMIO32(port + 0x004)

/* Interrupt ID Register Read Only */
#define UART_IIR(port)                  MMIO32(port + 0x008)

/* FIFO Control Register Write Only */
#define UART_FCR(port)                  MMIO32(port + 0x008)

/* Line Control Register */
#define UART_LCR(port)                  MMIO32(port + 0x00C)

/* MCR only for UART1 */

/* Line Status Register */
#define UART_LSR(port)                  MMIO32(port + 0x014)

/* Auto Baud Control Register */
#define UART_ACR(port)                  MMIO32(port + 0x020)

/* IrDA Control Register only for UART0/2/3 */
#define UART_ICR(port)                  MMIO32(port + 0x024)

/* Fractional Divider Register */
#define UART_FDR(port)                  MMIO32(port + 0x028)

/* Oversampling Register only for UART0/2/3 */
#define UART_OSR(port)                  MMIO32(port + 0x02C)

/* Half-Duplex enable Register only for UART0/2/3 */
#define UART_HDEN(port)                 MMIO32(port + 0x040)

/* Smart card Interface Register Only for UART0/2/3 */
#define UART_SCICTRL(port)              MMIO32(port + 0x048)

/* RS-485/EIA-485 Control Register */
#define UART_RS485CTRL(port)            MMIO32(port + 0x04C)

/* RS-485/EIA-485 Address Match Register */
#define UART_RS485ADRMATCH(port)        MMIO32(port + 0x050)

/* RS-485/EIA-485 Direction Control Delay Register */
#define UART_RS485DLY(port)             MMIO32(port + 0x054)

/* Synchronous Mode Control Register only for UART0/2/3 */
#define UART_SYNCCTRL(port)             MMIO32(port + 0x058)

/* Transmit Enable Register */
#define UART_TER(port)                  MMIO32(port + 0x05C)

/* --------------------- BIT DEFINITIONS ----------------------------------- */
/***********************************************************************
* Macro defines for Macro defines for UARTn Receiver Buffer Register
**********************************************************************/
/* UART Received Buffer mask bit (8 bits) */
#define UART_RBR_MASKBIT                ((uint8_t)0xFF)

/***********************************************************************
* Macro defines for Macro defines for UARTn Transmit Holding Register
**********************************************************************/
/* UART Transmit Holding mask bit (8 bits) */
#define UART_THR_MASKBIT                ((uint8_t)0xFF)

/***********************************************************************
* Macro defines for Macro defines for UARTn Divisor Latch LSB register
**********************************************************************/
/* Macro for loading least significant halfs of divisors */
#define UART_LOAD_DLL(div)              ((div) & 0xFF)

/* Divisor latch LSB bit mask */
#define UART_DLL_MASKBIT                ((uint8_t)0xFF)

/***********************************************************************
* Macro defines for Macro defines for UARTn Divisor Latch MSB register
**********************************************************************/
/* Divisor latch MSB bit mask */
#define UART_DLM_MASKBIT                ((uint8_t)0xFF)

/* Macro for loading most significant halfs of divisors */
#define UART_LOAD_DLM(div)              (((div) >> 8) & 0xFF)

/***********************************************************************
* Macro defines for Macro defines for UART interrupt enable register
**********************************************************************/
/* RBR Interrupt enable*/
#define UART_IER_RBRINT_EN              (1 << 0)
/* THR Interrupt enable*/
#define UART_IER_THREINT_EN             (1 << 1)
/* RX line status interrupt enable*/
#define UART_IER_RLSINT_EN              (1 << 2)
/* Modem status interrupt enable */
#define UART1_IER_MSINT_EN              (1 << 3)
/* CTS1 signal transition interrupt enable */
#define UART1_IER_CTSINT_EN             (1 << 7)
/* Enables the end of auto-baud interrupt */
#define UART_IER_ABEOINT_EN             (1 << 8)
/* Enables the auto-baud time-out interrupt */
#define UART_IER_ABTOINT_EN             (1 << 9)
/* UART interrupt enable register bit mask */
#define UART_IER_BITMASK                ((uint32_t)(0x307))
/* UART1 interrupt enable register bit mask */
#define UART1_IER_BITMASK               ((uint32_t)(0x38F))

/**********************************************************************
* Macro defines for Macro defines for UART interrupt identification register
**********************************************************************/

/* Interrupt Status - Active low */
#define UART_IIR_INTSTAT_PEND           (1 << 0)
/* Interrupt identification: Modem interrupt*/
#define UART1_IIR_INTID_MODEM           (0 << 1)
/* Interrupt identification: THRE interrupt*/
#define UART_IIR_INTID_THRE             (1 << 1)
/* Interrupt identification: Receive data available*/
#define UART_IIR_INTID_RDA              (2 << 1)
/* Interrupt identification: Receive line status*/
#define UART_IIR_INTID_RLS              (3 << 1)
/* Interrupt identification: Character time-out indicator*/
#define UART_IIR_INTID_CTI              (6 << 1)
/* Interrupt identification: Interrupt ID mask */
#define UART_IIR_INTID_MASK             (7 << 1)
/* These bits are equivalent to UnFCR[0] */
#define UART_IIR_FIFO_EN                (3 << 6)
/* End of auto-baud interrupt */
#define UART_IIR_ABEO_INT               (1 << 8)
/* Auto-baud time-out interrupt */
#define UART_IIR_ABTO_INT               (1 << 9)
/* UART interrupt identification register bit mask */
#define UART_IIR_BITMASK                ((uint32_t)(0x3CF))

/**********************************************************************
* Macro defines for Macro defines for UART FIFO control register
**********************************************************************/
/* UART FIFO enable */
#define UART_FCR_FIFO_EN                (1 << 0)
/* UART FIFO RX reset */
#define UART_FCR_RX_RS                  (1 << 1)
/* UART FIFO TX reset */
#define UART_FCR_TX_RS                  (1 << 2)
/* UART DMA mode selection */
#define UART_FCR_DMAMODE_SEL            (1 << 3)
/* UART FIFO trigger level 0: 1 character */
#define UART_FCR_TRG_LEV0               (0 << 6)
/* UART FIFO trigger level 1: 4 character */
#define UART_FCR_TRG_LEV1               (1 << 6)
/* UART FIFO trigger level 2: 8 character */
#define UART_FCR_TRG_LEV2               (2 << 6)
/* UART FIFO trigger level 3: 14 character */
#define UART_FCR_TRG_LEV3               (3 << 6)
/* UART FIFO control bit mask */
#define UART_FCR_BITMASK                ((uint8_t)(0xCF))
#define UART_TX_FIFO_SIZE               (16)

/**********************************************************************
* Macro defines for Macro defines for UART line control register
**********************************************************************/
/* UART 5 bit data mode */
#define UART_LCR_WLEN5                  (0 << 0)
/* UART 6 bit data mode */
#define UART_LCR_WLEN6                  (1 << 0)
/* UART 7 bit data mode */
#define UART_LCR_WLEN7                  (2 << 0)
/* UART 8 bit data mode */
#define UART_LCR_WLEN8                  (3 << 0)
/* UART One Stop Bits */
#define UART_LCR_ONE_STOPBIT            (0 << 2)
/* UART Two Stop Bits */
#define UART_LCR_TWO_STOPBIT            (1 << 2)

/* UART Parity Disabled / No Parity */
#define UART_LCR_NO_PARITY              (0 << 3)
/* UART Parity Enable */
#define UART_LCR_PARITY_EN              (1 << 3)
/* UART Odd Parity Select */
#define UART_LCR_PARITY_ODD             (0 << 4)
/* UART Even Parity Select */
#define UART_LCR_PARITY_EVEN            (1 << 4)
/* UART force 1 stick parity */
#define UART_LCR_PARITY_SP_1            (1 << 5)
/* UART force 0 stick parity */
#define UART_LCR_PARITY_SP_0            ((1 << 5) | (1 << 4))
/* UART Transmission Break enable */
#define UART_LCR_BREAK_EN               (1 << 6)
/* UART Divisor Latches Access bit enable */
#define UART_LCR_DLAB_EN                (1 << 7)
/* UART line control bit mask */
#define UART_LCR_BITMASK                ((uint8_t)(0xFF))

/**********************************************************************
* Macro defines for Macro defines for UART line status register
**********************************************************************/
/* Line status register: Receive data ready */
#define UART_LSR_RDR                    (1 << 0)
/* Line status register: Overrun error */
#define UART_LSR_OE                     (1 << 1)
/* Line status register: Parity error */
#define UART_LSR_PE                     (1 << 2)
/* Line status register: Framing error */
#define UART_LSR_FE                     (1 << 3)
/* Line status register: Break interrupt */
#define UART_LSR_BI                     (1 << 4)
/* Line status register: Transmit holding register empty */
#define UART_LSR_THRE                   (1 << 5)
/* Line status register: Transmitter empty */
#define UART_LSR_TEMT                   (1 << 6)
/* Error in RX FIFO */
#define UART_LSR_RXFE                   (1 << 7)
/* UART Line status bit mask */
#define UART_LSR_BITMASK                ((uint8_t)(0xFF))
#define UART_LSR_ERROR_MASK \
	(UART_LSR_OE | UART_LSR_PE | UART_LSR_FE | UART_LSR_BI | UART_LSR_RXFE)

/**********************************************************************
* Macro defines for Macro defines for UART Scratch Pad Register
**********************************************************************/

/* UART Scratch Pad bit mask */
#define UART_SCR_BIMASK           ((uint8_t)(0xFF))

/***********************************************************************
* Macro defines for Macro defines for UART Auto baudrate control register
**********************************************************************/

/* UART Auto-baud start */
#define UART_ACR_START                  (1 << 0)
/* UART Auto baudrate Mode 1 */
#define UART_ACR_MODE                   (1 << 1)
/* UART Auto baudrate restart */
#define UART_ACR_AUTO_RESTART           (1 << 2)
/* UART End of auto-baud interrupt clear */
#define UART_ACR_ABEOINT_CLR            (1 << 8)
/* UART Auto-baud time-out interrupt clear */
#define UART_ACR_ABTOINT_CLR            (1 << 9)
/* UART Auto Baudrate register bit mask */
#define UART_ACR_BITMASK                ((uint32_t)(0x307))

/*********************************************************************
* Macro defines for Macro defines for UART IrDA control register
**********************************************************************/
/* IrDA mode enable */
#define UART_ICR_IRDAEN                 (1 << 0)
/* IrDA serial input inverted */
#define UART_ICR_IRDAINV                (1 << 1)
/* IrDA fixed pulse width mode */
#define UART_ICR_FIXPULSE_EN            (1 << 2)
/* PulseDiv - Configures the pulse when FixPulseEn = 1 */
#define UART_ICR_PULSEDIV(n)            ((uint32_t)((n&0x07)<<3))
/* UART IRDA bit mask */
#define UART_ICR_BITMASK                ((uint32_t)(0x3F))

/**********************************************************************
* Macro defines for Macro defines for UART half duplex register
**********************************************************************/
/* enable half-duplex mode*/
#define UART_HDEN_HDEN                  (1 << 0)

/**********************************************************************
* Macro defines for Macro defines for UART smart card interface control register
**********************************************************************/
/* enable asynchronous half-duplex smart card interface*/
#define UART_SCICTRL_SCIEN              (1 << 0)
/* NACK response is inhibited*/
#define UART_SCICTRL_NACKDIS            (1 << 1)
/* ISO7816-3 protocol T1 is selected*/
#define UART_SCICTRL_PROTSEL_T1         (1 << 2)
/* number of retransmission*/
#define UART_SCICTRL_TXRETRY(n)         ((uint32_t)((n&0x07)<<5))
/* Extra guard time*/
#define UART_SCICTRL_GUARDTIME(n)       ((uint32_t)((n&0xFF)<<8))

/*********************************************************************
* Macro defines for Macro defines for UART synchronous control register
**********************************************************************/
/* enable synchronous mode*/
#define UART_SYNCCTRL_SYNC              (1 << 0)
/* synchronous master mode*/
#define UART_SYNCCTRL_CSRC_MASTER       (1 << 1)
/* sample on falling edge*/
#define UART_SYNCCTRL_FES               (1 << 2)
/* to be defined*/
#define UART_SYNCCTRL_TSBYPASS          (1 << 3)
/* continuous running clock enable (master mode only) */
#define UART_SYNCCTRL_CSCEN             (1 << 4)
/* Do not send start/stop bit */
#define UART_SYNCCTRL_NOSTARTSTOP       (1 << 5)
/* stop continuous clock */
#define UART_SYNCCTRL_CCCLR             (1 << 6)

/*********************************************************************
* Macro defines for Macro defines for UART Fractional divider register
**********************************************************************/

/* Baud-rate generation pre-scaler divisor */
#define UART_FDR_DIVADDVAL(n)           ((uint32_t)(n&0x0F))
/* Baud-rate pre-scaler multiplier value */
#define UART_FDR_MULVAL(n)              ((uint32_t)((n<<4)&0xF0))
/* UART Fractional Divider register bit mask */
#define UART_FDR_BITMASK                ((uint32_t)(0xFF))

/*********************************************************************
* Macro defines for Macro defines for UART Tx Enable register
**********************************************************************/

#define UART_TER_TXEN                   (1 << 0)    /* Transmit enable bit */

/**********************************************************************
* Macro defines for Macro defines for UART FIFO Level register
**********************************************************************/
/* Reflects the current level of the UART receiver FIFO */
#define UART_FIFOLVL_RX(n)              ((uint32_t)(n&0x0F))
/* Reflects the current level of the UART transmitter FIFO */
#define UART_FIFOLVL_TX(n)              ((uint32_t)((n>>8)&0x0F))
/* UART FIFO Level Register bit mask */
#define UART_FIFOLVL_BITMASK            ((uint32_t)(0x0F0F))

/*********************************************************************
* UART enum
**********************************************************************/

/*
* UART Databit type definitions
*/
typedef enum {
	UART_DATABIT_5 = UART_LCR_WLEN5,/* UART 5 bit data mode */
	UART_DATABIT_6 = UART_LCR_WLEN6,/* UART 6 bit data mode */
	UART_DATABIT_7 = UART_LCR_WLEN7,/* UART 7 bit data mode */
	UART_DATABIT_8 = UART_LCR_WLEN8/* UART 8 bit data mode */
} uart_databit_t;

/*
* UART Stop bit type definitions
*/
typedef enum {
	/* UART 1 Stop Bits Select */
	UART_STOPBIT_1 = UART_LCR_ONE_STOPBIT,
	/* UART 2 Stop Bits Select */
	UART_STOPBIT_2 = UART_LCR_TWO_STOPBIT
} uart_stopbit_t;

/*
* UART Parity type definitions
*/
typedef enum {
	/* No parity */
	UART_PARITY_NONE = UART_LCR_NO_PARITY,
	/* Odd parity */
	UART_PARITY_ODD = (UART_LCR_PARITY_ODD | UART_LCR_PARITY_EN),
	/* Even parity */
	UART_PARITY_EVEN = (UART_LCR_PARITY_EVEN | UART_LCR_PARITY_EN),
	/* Forced 1 stick parity */
	UART_PARITY_SP_1 = (UART_LCR_PARITY_SP_1 | UART_LCR_PARITY_EN),
	/* Forced 0 stick parity */
	UART_PARITY_SP_0  = (UART_LCR_PARITY_SP_0 | UART_LCR_PARITY_EN)
} uart_parity_t;

typedef enum {
	UART0_NUM = UART0,
	UART1_NUM = UART1,
	UART2_NUM = UART2,
	UART3_NUM = UART3
} uart_num_t;

typedef enum {
	UART_NO_ERROR = 0,
	UART_TIMEOUT_ERROR = 1
} uart_error_t;

typedef enum {
	UART_RX_NO_DATA = 0,
	UART_RX_DATA_READY = 1,
	UART_RX_DATA_ERROR = 2
} uart_rx_data_ready_t;

/* function prototypes */

BEGIN_DECLS

/* Init UART and set PLL1 as clock source (PCLK) */
void uart_init(uart_num_t uart_num, uart_databit_t data_nb_bits,
	    uart_stopbit_t data_nb_stop, uart_parity_t data_parity,
	    uint16_t uart_divisor, uint8_t uart_divaddval, uint8_t uart_mulval);

uart_rx_data_ready_t uart_rx_data_ready(uart_num_t uart_num);
uint8_t uart_read(uart_num_t uart_num);
uint8_t uart_read_timeout(uart_num_t uart_num, uint32_t rx_timeout_nb_cycles,
	    uart_error_t *error);
void uart_write(uart_num_t uart_num, uint8_t data);

END_DECLS

#endif