18
#include "qemu/osdep.h"
20
#include "qemu/module.h"
21
#include "qapi/error.h"
22
#include "chardev/char-fe.h"
23
#include "chardev/char-serial.h"
24
#include "migration/vmstate.h"
25
#include "hw/char/stm32l4x5_usart.h"
28
#include "hw/qdev-clock.h"
29
#include "hw/qdev-properties.h"
30
#include "hw/qdev-properties-system.h"
31
#include "hw/registerfields.h"
37
FIELD(CR1, EOBIE, 27, 1)
38
FIELD(CR1, RTOIE, 26, 1)
39
FIELD(CR1, DEAT, 21, 5)
40
FIELD(CR1, DEDT, 16, 5)
41
FIELD(CR1, OVER8, 15, 1)
42
FIELD(CR1, CMIE, 14, 1)
43
FIELD(CR1, MME, 13, 1)
45
FIELD(CR1, WAKE, 11, 1)
46
FIELD(CR1, PCE, 10, 1)
48
FIELD(CR1, PEIE, 8, 1)
49
FIELD(CR1, TXEIE, 7, 1)
50
FIELD(CR1, TCIE, 6, 1)
51
FIELD(CR1, RXNEIE, 5, 1)
52
FIELD(CR1, IDLEIE, 4, 1)
55
FIELD(CR1, UESM, 1, 1)
58
FIELD(CR2, ADD_1, 28, 4)
59
FIELD(CR2, ADD_0, 24, 4)
60
FIELD(CR2, RTOEN, 23, 1)
61
FIELD(CR2, ABRMOD, 21, 2)
62
FIELD(CR2, ABREN, 20, 1)
63
FIELD(CR2, MSBFIRST, 19, 1)
64
FIELD(CR2, DATAINV, 18, 1)
65
FIELD(CR2, TXINV, 17, 1)
66
FIELD(CR2, RXINV, 16, 1)
67
FIELD(CR2, SWAP, 15, 1)
68
FIELD(CR2, LINEN, 14, 1)
69
FIELD(CR2, STOP, 12, 2)
70
FIELD(CR2, CLKEN, 11, 1)
71
FIELD(CR2, CPOL, 10, 1)
72
FIELD(CR2, CPHA, 9, 1)
73
FIELD(CR2, LBCL, 8, 1)
74
FIELD(CR2, LBDIE, 6, 1)
75
FIELD(CR2, LBDL, 5, 1)
76
FIELD(CR2, ADDM7, 4, 1)
80
FIELD(CR3, UCESM, 23, 1)
81
FIELD(CR3, WUFIE, 22, 1)
82
FIELD(CR3, WUS, 20, 2)
83
FIELD(CR3, SCARCNT, 17, 3)
84
FIELD(CR3, DEP, 15, 1)
85
FIELD(CR3, DEM, 14, 1)
86
FIELD(CR3, DDRE, 13, 1)
87
FIELD(CR3, OVRDIS, 12, 1)
88
FIELD(CR3, ONEBIT, 11, 1)
89
FIELD(CR3, CTSIE, 10, 1)
90
FIELD(CR3, CTSE, 9, 1)
91
FIELD(CR3, RTSE, 8, 1)
92
FIELD(CR3, DMAT, 7, 1)
93
FIELD(CR3, DMAR, 6, 1)
94
FIELD(CR3, SCEN, 5, 1)
95
FIELD(CR3, NACK, 4, 1)
96
FIELD(CR3, HDSEL, 3, 1)
97
FIELD(CR3, IRLP, 2, 1)
98
FIELD(CR3, IREN, 1, 1)
101
FIELD(BRR, BRR, 0, 16)
103
FIELD(GTPR, GT, 8, 8)
104
FIELD(GTPR, PSC, 0, 8)
106
FIELD(RTOR, BLEN, 24, 8)
107
FIELD(RTOR, RTO, 0, 24)
109
FIELD(RQR, TXFRQ, 4, 1)
110
FIELD(RQR, RXFRQ, 3, 1)
111
FIELD(RQR, MMRQ, 2, 1)
112
FIELD(RQR, SBKRQ, 1, 1)
113
FIELD(RQR, ABBRRQ, 0, 1)
116
FIELD(ISR, REACK, 22, 1)
117
FIELD(ISR, TEACK, 21, 1)
118
FIELD(ISR, WUF, 20, 1)
119
FIELD(ISR, RWU, 19, 1)
120
FIELD(ISR, SBKF, 18, 1)
121
FIELD(ISR, CMF, 17, 1)
122
FIELD(ISR, BUSY, 16, 1)
123
FIELD(ISR, ABRF, 15, 1)
124
FIELD(ISR, ABRE, 14, 1)
125
FIELD(ISR, EOBF, 12, 1)
126
FIELD(ISR, RTOF, 11, 1)
127
FIELD(ISR, CTS, 10, 1)
128
FIELD(ISR, CTSIF, 9, 1)
129
FIELD(ISR, LBDF, 8, 1)
130
FIELD(ISR, TXE, 7, 1)
132
FIELD(ISR, RXNE, 5, 1)
133
FIELD(ISR, IDLE, 4, 1)
134
FIELD(ISR, ORE, 3, 1)
139
FIELD(ICR, WUCF, 20, 1)
140
FIELD(ICR, CMCF, 17, 1)
141
FIELD(ICR, EOBCF, 12, 1)
142
FIELD(ICR, RTOCF, 11, 1)
143
FIELD(ICR, CTSCF, 9, 1)
144
FIELD(ICR, LBDCF, 8, 1)
146
FIELD(ICR, TCCF, 6, 1)
147
FIELD(ICR, IDLECF, 4, 1)
148
FIELD(ICR, ORECF, 3, 1)
149
FIELD(ICR, NCF, 2, 1)
150
FIELD(ICR, FECF, 1, 1)
151
FIELD(ICR, PECF, 0, 1)
153
FIELD(RDR, RDR, 0, 9)
155
FIELD(TDR, TDR, 0, 9)
157
static void stm32l4x5_update_irq(Stm32l4x5UsartBaseState *s)
159
if (((s->isr & R_ISR_WUF_MASK) && (s->cr3 & R_CR3_WUFIE_MASK)) ||
160
((s->isr & R_ISR_CMF_MASK) && (s->cr1 & R_CR1_CMIE_MASK)) ||
161
((s->isr & R_ISR_ABRF_MASK) && (s->cr1 & R_CR1_RXNEIE_MASK)) ||
162
((s->isr & R_ISR_EOBF_MASK) && (s->cr1 & R_CR1_EOBIE_MASK)) ||
163
((s->isr & R_ISR_RTOF_MASK) && (s->cr1 & R_CR1_RTOIE_MASK)) ||
164
((s->isr & R_ISR_CTSIF_MASK) && (s->cr3 & R_CR3_CTSIE_MASK)) ||
165
((s->isr & R_ISR_LBDF_MASK) && (s->cr2 & R_CR2_LBDIE_MASK)) ||
166
((s->isr & R_ISR_TXE_MASK) && (s->cr1 & R_CR1_TXEIE_MASK)) ||
167
((s->isr & R_ISR_TC_MASK) && (s->cr1 & R_CR1_TCIE_MASK)) ||
168
((s->isr & R_ISR_RXNE_MASK) && (s->cr1 & R_CR1_RXNEIE_MASK)) ||
169
((s->isr & R_ISR_IDLE_MASK) && (s->cr1 & R_CR1_IDLEIE_MASK)) ||
170
((s->isr & R_ISR_ORE_MASK) &&
171
((s->cr1 & R_CR1_RXNEIE_MASK) || (s->cr3 & R_CR3_EIE_MASK))) ||
173
((s->isr & R_ISR_FE_MASK) && (s->cr3 & R_CR3_EIE_MASK)) ||
174
((s->isr & R_ISR_PE_MASK) && (s->cr1 & R_CR1_PEIE_MASK))) {
175
qemu_irq_raise(s->irq);
176
trace_stm32l4x5_usart_irq_raised(s->isr);
178
qemu_irq_lower(s->irq);
179
trace_stm32l4x5_usart_irq_lowered();
183
static int stm32l4x5_usart_base_can_receive(void *opaque)
185
Stm32l4x5UsartBaseState *s = opaque;
187
if (!(s->isr & R_ISR_RXNE_MASK)) {
194
static void stm32l4x5_usart_base_receive(void *opaque, const uint8_t *buf,
197
Stm32l4x5UsartBaseState *s = opaque;
199
if (!((s->cr1 & R_CR1_UE_MASK) && (s->cr1 & R_CR1_RE_MASK))) {
200
trace_stm32l4x5_usart_receiver_not_enabled(
201
FIELD_EX32(s->cr1, CR1, UE), FIELD_EX32(s->cr1, CR1, RE));
206
if (!(s->cr3 & R_CR3_OVRDIS_MASK) && (s->isr & R_ISR_RXNE_MASK)) {
211
s->isr |= R_ISR_ORE_MASK;
212
trace_stm32l4x5_usart_overrun_detected(s->rdr, *buf);
216
s->isr |= R_ISR_RXNE_MASK;
217
trace_stm32l4x5_usart_rx(s->rdr);
220
stm32l4x5_update_irq(s);
227
static gboolean usart_transmit(void *do_not_use, GIOCondition cond,
230
Stm32l4x5UsartBaseState *s = STM32L4X5_USART_BASE(opaque);
237
if (!(s->cr1 & R_CR1_TE_MASK) || (s->isr & R_ISR_TXE_MASK)) {
238
return G_SOURCE_REMOVE;
241
ret = qemu_chr_fe_write(&s->chr, &ch, 1);
243
s->watch_tag = qemu_chr_fe_add_watch(&s->chr, G_IO_OUT | G_IO_HUP,
254
trace_stm32l4x5_usart_tx_pending();
255
return G_SOURCE_REMOVE;
260
trace_stm32l4x5_usart_tx(ch);
261
s->isr |= R_ISR_TC_MASK | R_ISR_TXE_MASK;
262
stm32l4x5_update_irq(s);
263
return G_SOURCE_REMOVE;
266
static void usart_cancel_transmit(Stm32l4x5UsartBaseState *s)
269
g_source_remove(s->watch_tag);
274
static void stm32l4x5_update_params(Stm32l4x5UsartBaseState *s)
276
int speed, parity, data_bits, stop_bits;
277
uint32_t value, usart_div;
278
QEMUSerialSetParams ssp;
281
if (s->cr1 & R_CR1_PCE_MASK) {
282
if (s->cr1 & R_CR1_PS_MASK) {
292
switch (FIELD_EX32(s->cr2, CR2, STOP)) {
300
qemu_log_mask(LOG_UNIMP,
301
"UNIMPLEMENTED: fractionnal stop bits; CR2[13:12] = %u",
302
FIELD_EX32(s->cr2, CR2, STOP));
307
switch ((FIELD_EX32(s->cr1, CR1, M1) << 1) | FIELD_EX32(s->cr1, CR1, M0)) {
318
qemu_log_mask(LOG_GUEST_ERROR,
319
"UNDEFINED: invalid word length, CR1.M = 0b11");
324
value = FIELD_EX32(s->brr, BRR, BRR);
326
qemu_log_mask(LOG_GUEST_ERROR,
327
"UNDEFINED: BRR less than 16: %u", value);
331
if (FIELD_EX32(s->cr1, CR1, OVER8) == 0) {
345
usart_div = ((value & 0xFFF0) | ((value & 0x0007) << 1)) / 2;
348
speed = clock_get_hz(s->clk) / usart_div;
352
ssp.data_bits = data_bits;
353
ssp.stop_bits = stop_bits;
355
qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
357
trace_stm32l4x5_usart_update_params(speed, parity, data_bits, stop_bits);
360
static void stm32l4x5_usart_base_reset_hold(Object *obj, ResetType type)
362
Stm32l4x5UsartBaseState *s = STM32L4X5_USART_BASE(obj);
368
s->gtpr = 0x00000000;
369
s->rtor = 0x00000000;
374
usart_cancel_transmit(s);
375
stm32l4x5_update_irq(s);
378
static void usart_update_rqr(Stm32l4x5UsartBaseState *s, uint32_t value)
382
if (value & R_RQR_RXFRQ_MASK) {
383
s->isr &= ~R_ISR_RXNE_MASK;
388
stm32l4x5_update_irq(s);
391
static uint64_t stm32l4x5_usart_base_read(void *opaque, hwaddr addr,
394
Stm32l4x5UsartBaseState *s = opaque;
395
uint64_t retvalue = 0;
408
retvalue = FIELD_EX32(s->brr, BRR, BRR);
418
retvalue = 0x00000000;
425
retvalue = 0x00000000;
428
retvalue = FIELD_EX32(s->rdr, RDR, RDR);
430
s->isr &= ~R_ISR_RXNE_MASK;
431
stm32l4x5_update_irq(s);
434
retvalue = FIELD_EX32(s->tdr, TDR, TDR);
437
qemu_log_mask(LOG_GUEST_ERROR,
438
"%s: Bad offset 0x%"HWADDR_PRIx"\n", __func__, addr);
442
trace_stm32l4x5_usart_read(addr, retvalue);
447
static void stm32l4x5_usart_base_write(void *opaque, hwaddr addr,
448
uint64_t val64, unsigned int size)
450
Stm32l4x5UsartBaseState *s = opaque;
451
const uint32_t value = val64;
453
trace_stm32l4x5_usart_write(addr, value);
458
stm32l4x5_update_params(s);
459
stm32l4x5_update_irq(s);
463
stm32l4x5_update_params(s);
470
stm32l4x5_update_params(s);
479
usart_update_rqr(s, value);
482
qemu_log_mask(LOG_GUEST_ERROR,
483
"%s: ISR is read only !\n", __func__);
488
stm32l4x5_update_irq(s);
491
qemu_log_mask(LOG_GUEST_ERROR,
492
"%s: RDR is read only !\n", __func__);
496
s->isr &= ~R_ISR_TXE_MASK;
497
usart_transmit(NULL, G_IO_OUT, s);
500
qemu_log_mask(LOG_GUEST_ERROR,
501
"%s: Bad offset 0x%"HWADDR_PRIx"\n", __func__, addr);
505
static const MemoryRegionOps stm32l4x5_usart_base_ops = {
506
.read = stm32l4x5_usart_base_read,
507
.write = stm32l4x5_usart_base_write,
508
.endianness = DEVICE_NATIVE_ENDIAN,
510
.max_access_size = 4,
511
.min_access_size = 4,
515
.max_access_size = 4,
516
.min_access_size = 4,
521
static Property stm32l4x5_usart_base_properties[] = {
522
DEFINE_PROP_CHR("chardev", Stm32l4x5UsartBaseState, chr),
523
DEFINE_PROP_END_OF_LIST(),
526
static void stm32l4x5_usart_base_init(Object *obj)
528
Stm32l4x5UsartBaseState *s = STM32L4X5_USART_BASE(obj);
530
sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq);
532
memory_region_init_io(&s->mmio, obj, &stm32l4x5_usart_base_ops, s,
533
TYPE_STM32L4X5_USART_BASE, 0x400);
534
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio);
536
s->clk = qdev_init_clock_in(DEVICE(s), "clk", NULL, s, 0);
539
static int stm32l4x5_usart_base_post_load(void *opaque, int version_id)
541
Stm32l4x5UsartBaseState *s = (Stm32l4x5UsartBaseState *)opaque;
543
stm32l4x5_update_params(s);
547
static const VMStateDescription vmstate_stm32l4x5_usart_base = {
548
.name = TYPE_STM32L4X5_USART_BASE,
550
.minimum_version_id = 1,
551
.post_load = stm32l4x5_usart_base_post_load,
552
.fields = (VMStateField[]) {
553
VMSTATE_UINT32(cr1, Stm32l4x5UsartBaseState),
554
VMSTATE_UINT32(cr2, Stm32l4x5UsartBaseState),
555
VMSTATE_UINT32(cr3, Stm32l4x5UsartBaseState),
556
VMSTATE_UINT32(brr, Stm32l4x5UsartBaseState),
557
VMSTATE_UINT32(gtpr, Stm32l4x5UsartBaseState),
558
VMSTATE_UINT32(rtor, Stm32l4x5UsartBaseState),
559
VMSTATE_UINT32(isr, Stm32l4x5UsartBaseState),
560
VMSTATE_UINT32(rdr, Stm32l4x5UsartBaseState),
561
VMSTATE_UINT32(tdr, Stm32l4x5UsartBaseState),
562
VMSTATE_CLOCK(clk, Stm32l4x5UsartBaseState),
563
VMSTATE_END_OF_LIST()
568
static void stm32l4x5_usart_base_realize(DeviceState *dev, Error **errp)
571
Stm32l4x5UsartBaseState *s = STM32L4X5_USART_BASE(dev);
572
if (!clock_has_source(s->clk)) {
573
error_setg(errp, "USART clock must be wired up by SoC code");
577
qemu_chr_fe_set_handlers(&s->chr, stm32l4x5_usart_base_can_receive,
578
stm32l4x5_usart_base_receive, NULL, NULL,
582
static void stm32l4x5_usart_base_class_init(ObjectClass *klass, void *data)
584
DeviceClass *dc = DEVICE_CLASS(klass);
585
ResettableClass *rc = RESETTABLE_CLASS(klass);
587
rc->phases.hold = stm32l4x5_usart_base_reset_hold;
588
device_class_set_props(dc, stm32l4x5_usart_base_properties);
589
dc->realize = stm32l4x5_usart_base_realize;
590
dc->vmsd = &vmstate_stm32l4x5_usart_base;
593
static void stm32l4x5_usart_class_init(ObjectClass *oc, void *data)
595
Stm32l4x5UsartBaseClass *subc = STM32L4X5_USART_BASE_CLASS(oc);
597
subc->type = STM32L4x5_USART;
600
static void stm32l4x5_uart_class_init(ObjectClass *oc, void *data)
602
Stm32l4x5UsartBaseClass *subc = STM32L4X5_USART_BASE_CLASS(oc);
604
subc->type = STM32L4x5_UART;
607
static void stm32l4x5_lpuart_class_init(ObjectClass *oc, void *data)
609
Stm32l4x5UsartBaseClass *subc = STM32L4X5_USART_BASE_CLASS(oc);
611
subc->type = STM32L4x5_LPUART;
614
static const TypeInfo stm32l4x5_usart_types[] = {
616
.name = TYPE_STM32L4X5_USART_BASE,
617
.parent = TYPE_SYS_BUS_DEVICE,
618
.instance_size = sizeof(Stm32l4x5UsartBaseState),
619
.instance_init = stm32l4x5_usart_base_init,
620
.class_size = sizeof(Stm32l4x5UsartBaseClass),
621
.class_init = stm32l4x5_usart_base_class_init,
624
.name = TYPE_STM32L4X5_USART,
625
.parent = TYPE_STM32L4X5_USART_BASE,
626
.class_init = stm32l4x5_usart_class_init,
628
.name = TYPE_STM32L4X5_UART,
629
.parent = TYPE_STM32L4X5_USART_BASE,
630
.class_init = stm32l4x5_uart_class_init,
632
.name = TYPE_STM32L4X5_LPUART,
633
.parent = TYPE_STM32L4X5_USART_BASE,
634
.class_init = stm32l4x5_lpuart_class_init,
638
DEFINE_TYPES(stm32l4x5_usart_types)