Lines Matching refs:sci
74 RSCIState *sci = RSCI(opaque); in can_receive() local
75 if (sci->rx_next > qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)) { in can_receive()
78 return FIELD_EX8(sci->scr, SCR, RE); in can_receive()
84 RSCIState *sci = RSCI(opaque); in receive() local
85 sci->rx_next = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + sci->trtime; in receive()
86 if (FIELD_EX8(sci->ssr, SSR, RDRF) || size > 1) { in receive()
87 sci->ssr = FIELD_DP8(sci->ssr, SSR, ORER, 1); in receive()
88 if (FIELD_EX8(sci->scr, SCR, RIE)) { in receive()
89 qemu_set_irq(sci->irq[ERI], 1); in receive()
92 sci->rdr = buf[0]; in receive()
93 sci->ssr = FIELD_DP8(sci->ssr, SSR, RDRF, 1); in receive()
94 if (FIELD_EX8(sci->scr, SCR, RIE)) { in receive()
95 qemu_irq_pulse(sci->irq[RXI]); in receive()
100 static void send_byte(RSCIState *sci) in send_byte() argument
102 if (qemu_chr_fe_backend_connected(&sci->chr)) { in send_byte()
103 qemu_chr_fe_write_all(&sci->chr, &sci->tdr, 1); in send_byte()
105 timer_mod(&sci->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + sci->trtime); in send_byte()
106 sci->ssr = FIELD_DP8(sci->ssr, SSR, TEND, 0); in send_byte()
107 sci->ssr = FIELD_DP8(sci->ssr, SSR, TDRE, 1); in send_byte()
108 qemu_set_irq(sci->irq[TEI], 0); in send_byte()
109 if (FIELD_EX8(sci->scr, SCR, TIE)) { in send_byte()
110 qemu_irq_pulse(sci->irq[TXI]); in send_byte()
116 RSCIState *sci = RSCI(opaque); in txend() local
117 if (!FIELD_EX8(sci->ssr, SSR, TDRE)) { in txend()
118 send_byte(sci); in txend()
120 sci->ssr = FIELD_DP8(sci->ssr, SSR, TEND, 1); in txend()
121 if (FIELD_EX8(sci->scr, SCR, TEIE)) { in txend()
122 qemu_set_irq(sci->irq[TEI], 1); in txend()
127 static void update_trtime(RSCIState *sci) in update_trtime() argument
130 sci->trtime = 8 - FIELD_EX8(sci->smr, SMR, CHR); in update_trtime()
131 sci->trtime += FIELD_EX8(sci->smr, SMR, PE); in update_trtime()
132 sci->trtime += FIELD_EX8(sci->smr, SMR, STOP) + 1; in update_trtime()
134 sci->trtime *= 32 * sci->brr; in update_trtime()
135 sci->trtime *= 1 << (2 * FIELD_EX8(sci->smr, SMR, CKS)); in update_trtime()
136 sci->trtime *= NANOSECONDS_PER_SECOND; in update_trtime()
137 sci->trtime /= sci->input_freq; in update_trtime()
140 static bool sci_is_tr_enabled(RSCIState *sci) in sci_is_tr_enabled() argument
142 return FIELD_EX8(sci->scr, SCR, TE) || FIELD_EX8(sci->scr, SCR, RE); in sci_is_tr_enabled()
147 RSCIState *sci = RSCI(opaque); in sci_write() local
151 if (!sci_is_tr_enabled(sci)) { in sci_write()
152 sci->smr = val; in sci_write()
153 update_trtime(sci); in sci_write()
157 if (!sci_is_tr_enabled(sci)) { in sci_write()
158 sci->brr = val; in sci_write()
159 update_trtime(sci); in sci_write()
163 sci->scr = val; in sci_write()
164 if (FIELD_EX8(sci->scr, SCR, TE)) { in sci_write()
165 sci->ssr = FIELD_DP8(sci->ssr, SSR, TDRE, 1); in sci_write()
166 sci->ssr = FIELD_DP8(sci->ssr, SSR, TEND, 1); in sci_write()
167 if (FIELD_EX8(sci->scr, SCR, TIE)) { in sci_write()
168 qemu_irq_pulse(sci->irq[TXI]); in sci_write()
171 if (!FIELD_EX8(sci->scr, SCR, TEIE)) { in sci_write()
172 qemu_set_irq(sci->irq[TEI], 0); in sci_write()
174 if (!FIELD_EX8(sci->scr, SCR, RIE)) { in sci_write()
175 qemu_set_irq(sci->irq[ERI], 0); in sci_write()
179 sci->tdr = val; in sci_write()
180 if (FIELD_EX8(sci->ssr, SSR, TEND)) { in sci_write()
181 send_byte(sci); in sci_write()
183 sci->ssr = FIELD_DP8(sci->ssr, SSR, TDRE, 0); in sci_write()
187 sci->ssr = FIELD_DP8(sci->ssr, SSR, MPBT, in sci_write()
189 sci->ssr = FIELD_DP8(sci->ssr, SSR, ERR, in sci_write()
191 if (FIELD_EX8(sci->read_ssr, SSR, ERR) && in sci_write()
192 FIELD_EX8(sci->ssr, SSR, ERR) == 0) { in sci_write()
193 qemu_set_irq(sci->irq[ERI], 0); in sci_write()
200 sci->scmr = val; break; in sci_write()
202 sci->semr = val; break; in sci_write()
212 RSCIState *sci = RSCI(opaque); in sci_read() local
216 return sci->smr; in sci_read()
218 return sci->brr; in sci_read()
220 return sci->scr; in sci_read()
222 return sci->tdr; in sci_read()
224 sci->read_ssr = sci->ssr; in sci_read()
225 return sci->ssr; in sci_read()
227 sci->ssr = FIELD_DP8(sci->ssr, SSR, RDRF, 0); in sci_read()
228 return sci->rdr; in sci_read()
230 return sci->scmr; in sci_read()
232 return sci->semr; in sci_read()
250 RSCIState *sci = RSCI(dev); in rsci_reset() local
251 sci->smr = sci->scr = 0x00; in rsci_reset()
252 sci->brr = 0xff; in rsci_reset()
253 sci->tdr = 0xff; in rsci_reset()
254 sci->rdr = 0x00; in rsci_reset()
255 sci->ssr = 0x84; in rsci_reset()
256 sci->scmr = 0x00; in rsci_reset()
257 sci->semr = 0x00; in rsci_reset()
258 sci->rx_next = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); in rsci_reset()
263 RSCIState *sci = RSCI(opaque); in sci_event() local
265 sci->ssr = FIELD_DP8(sci->ssr, SSR, FER, 1); in sci_event()
266 if (FIELD_EX8(sci->scr, SCR, RIE)) { in sci_event()
267 qemu_set_irq(sci->irq[ERI], 1); in sci_event()
274 RSCIState *sci = RSCI(dev); in rsci_realize() local
276 if (sci->input_freq == 0) { in rsci_realize()
281 qemu_chr_fe_set_handlers(&sci->chr, can_receive, receive, in rsci_realize()
282 sci_event, NULL, sci, NULL, true); in rsci_realize()
288 RSCIState *sci = RSCI(obj); in rsci_init() local
291 memory_region_init_io(&sci->memory, OBJECT(sci), &sci_ops, in rsci_init()
292 sci, "renesas-sci", 0x8); in rsci_init()
293 sysbus_init_mmio(d, &sci->memory); in rsci_init()
296 sysbus_init_irq(d, &sci->irq[i]); in rsci_init()
298 timer_init_ns(&sci->timer, QEMU_CLOCK_VIRTUAL, txend, sci); in rsci_init()