]> git.proxmox.com Git - mirror_qemu.git/blob - hw/net/can/can_sja1000.c
Include migration/vmstate.h less
[mirror_qemu.git] / hw / net / can / can_sja1000.c
1 /*
2 * CAN device - SJA1000 chip emulation for QEMU
3 *
4 * Copyright (c) 2013-2014 Jin Yang
5 * Copyright (c) 2014-2018 Pavel Pisa
6 *
7 * Initial development supported by Google GSoC 2013 from RTEMS project slot
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a copy
10 * of this software and associated documentation files (the "Software"), to deal
11 * in the Software without restriction, including without limitation the rights
12 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 * copies of the Software, and to permit persons to whom the Software is
14 * furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included in
17 * all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 * THE SOFTWARE.
26 */
27
28 #include "qemu/osdep.h"
29 #include "qemu/log.h"
30 #include "chardev/char.h"
31 #include "hw/hw.h"
32 #include "hw/irq.h"
33 #include "migration/vmstate.h"
34 #include "net/can_emu.h"
35
36 #include "can_sja1000.h"
37
38 #ifndef DEBUG_FILTER
39 #define DEBUG_FILTER 0
40 #endif /*DEBUG_FILTER*/
41
42 #ifndef DEBUG_CAN
43 #define DEBUG_CAN 0
44 #endif /*DEBUG_CAN*/
45
46 #define DPRINTF(fmt, ...) \
47 do { \
48 if (DEBUG_CAN) { \
49 qemu_log("[cansja]: " fmt , ## __VA_ARGS__); \
50 } \
51 } while (0)
52
53 static void can_sja_software_reset(CanSJA1000State *s)
54 {
55 s->mode &= ~0x31;
56 s->mode |= 0x01;
57 s->status_pel &= ~0x37;
58 s->status_pel |= 0x34;
59
60 s->rxbuf_start = 0x00;
61 s->rxmsg_cnt = 0x00;
62 s->rx_cnt = 0x00;
63 }
64
65 void can_sja_hardware_reset(CanSJA1000State *s)
66 {
67 /* Reset by hardware, p10 */
68 s->mode = 0x01;
69 s->status_pel = 0x3c;
70 s->interrupt_pel = 0x00;
71 s->clock = 0x00;
72 s->rxbuf_start = 0x00;
73 s->rxmsg_cnt = 0x00;
74 s->rx_cnt = 0x00;
75
76 s->control = 0x01;
77 s->status_bas = 0x0c;
78 s->interrupt_bas = 0x00;
79
80 qemu_irq_lower(s->irq);
81 }
82
83 static
84 void can_sja_single_filter(struct qemu_can_filter *filter,
85 const uint8_t *acr, const uint8_t *amr, int extended)
86 {
87 if (extended) {
88 filter->can_id = (uint32_t)acr[0] << 21;
89 filter->can_id |= (uint32_t)acr[1] << 13;
90 filter->can_id |= (uint32_t)acr[2] << 5;
91 filter->can_id |= (uint32_t)acr[3] >> 3;
92 if (acr[3] & 4) {
93 filter->can_id |= QEMU_CAN_RTR_FLAG;
94 }
95
96 filter->can_mask = (uint32_t)amr[0] << 21;
97 filter->can_mask |= (uint32_t)amr[1] << 13;
98 filter->can_mask |= (uint32_t)amr[2] << 5;
99 filter->can_mask |= (uint32_t)amr[3] >> 3;
100 filter->can_mask = ~filter->can_mask & QEMU_CAN_EFF_MASK;
101 if (!(amr[3] & 4)) {
102 filter->can_mask |= QEMU_CAN_RTR_FLAG;
103 }
104 } else {
105 filter->can_id = (uint32_t)acr[0] << 3;
106 filter->can_id |= (uint32_t)acr[1] >> 5;
107 if (acr[1] & 0x10) {
108 filter->can_id |= QEMU_CAN_RTR_FLAG;
109 }
110
111 filter->can_mask = (uint32_t)amr[0] << 3;
112 filter->can_mask |= (uint32_t)amr[1] << 5;
113 filter->can_mask = ~filter->can_mask & QEMU_CAN_SFF_MASK;
114 if (!(amr[1] & 0x10)) {
115 filter->can_mask |= QEMU_CAN_RTR_FLAG;
116 }
117 }
118 }
119
120 static
121 void can_sja_dual_filter(struct qemu_can_filter *filter,
122 const uint8_t *acr, const uint8_t *amr, int extended)
123 {
124 if (extended) {
125 filter->can_id = (uint32_t)acr[0] << 21;
126 filter->can_id |= (uint32_t)acr[1] << 13;
127
128 filter->can_mask = (uint32_t)amr[0] << 21;
129 filter->can_mask |= (uint32_t)amr[1] << 13;
130 filter->can_mask = ~filter->can_mask & QEMU_CAN_EFF_MASK & ~0x1fff;
131 } else {
132 filter->can_id = (uint32_t)acr[0] << 3;
133 filter->can_id |= (uint32_t)acr[1] >> 5;
134 if (acr[1] & 0x10) {
135 filter->can_id |= QEMU_CAN_RTR_FLAG;
136 }
137
138 filter->can_mask = (uint32_t)amr[0] << 3;
139 filter->can_mask |= (uint32_t)amr[1] >> 5;
140 filter->can_mask = ~filter->can_mask & QEMU_CAN_SFF_MASK;
141 if (!(amr[1] & 0x10)) {
142 filter->can_mask |= QEMU_CAN_RTR_FLAG;
143 }
144 }
145 }
146
147 /* Details in DS-p22, what we need to do here is to test the data. */
148 static
149 int can_sja_accept_filter(CanSJA1000State *s,
150 const qemu_can_frame *frame)
151 {
152
153 struct qemu_can_filter filter;
154
155 if (s->clock & 0x80) { /* PeliCAN Mode */
156 if (s->mode & (1 << 3)) { /* Single mode. */
157 if (frame->can_id & QEMU_CAN_EFF_FLAG) { /* EFF */
158 can_sja_single_filter(&filter,
159 s->code_mask + 0, s->code_mask + 4, 1);
160
161 if (!can_bus_filter_match(&filter, frame->can_id)) {
162 return 0;
163 }
164 } else { /* SFF */
165 can_sja_single_filter(&filter,
166 s->code_mask + 0, s->code_mask + 4, 0);
167
168 if (!can_bus_filter_match(&filter, frame->can_id)) {
169 return 0;
170 }
171
172 if (frame->can_id & QEMU_CAN_RTR_FLAG) { /* RTR */
173 return 1;
174 }
175
176 if (frame->can_dlc == 0) {
177 return 1;
178 }
179
180 if ((frame->data[0] & ~(s->code_mask[6])) !=
181 (s->code_mask[2] & ~(s->code_mask[6]))) {
182 return 0;
183 }
184
185 if (frame->can_dlc < 2) {
186 return 1;
187 }
188
189 if ((frame->data[1] & ~(s->code_mask[7])) ==
190 (s->code_mask[3] & ~(s->code_mask[7]))) {
191 return 1;
192 }
193
194 return 0;
195 }
196 } else { /* Dual mode */
197 if (frame->can_id & QEMU_CAN_EFF_FLAG) { /* EFF */
198 can_sja_dual_filter(&filter,
199 s->code_mask + 0, s->code_mask + 4, 1);
200
201 if (can_bus_filter_match(&filter, frame->can_id)) {
202 return 1;
203 }
204
205 can_sja_dual_filter(&filter,
206 s->code_mask + 2, s->code_mask + 6, 1);
207
208 if (can_bus_filter_match(&filter, frame->can_id)) {
209 return 1;
210 }
211
212 return 0;
213 } else {
214 can_sja_dual_filter(&filter,
215 s->code_mask + 0, s->code_mask + 4, 0);
216
217 if (can_bus_filter_match(&filter, frame->can_id)) {
218 uint8_t expect;
219 uint8_t mask;
220 expect = s->code_mask[1] << 4;
221 expect |= s->code_mask[3] & 0x0f;
222
223 mask = s->code_mask[5] << 4;
224 mask |= s->code_mask[7] & 0x0f;
225 mask = ~mask & 0xff;
226
227 if ((frame->data[0] & mask) ==
228 (expect & mask)) {
229 return 1;
230 }
231 }
232
233 can_sja_dual_filter(&filter,
234 s->code_mask + 2, s->code_mask + 6, 0);
235
236 if (can_bus_filter_match(&filter, frame->can_id)) {
237 return 1;
238 }
239
240 return 0;
241 }
242 }
243 }
244
245 return 1;
246 }
247
248 static void can_display_msg(const char *prefix, const qemu_can_frame *msg)
249 {
250 int i;
251
252 qemu_log_lock();
253 qemu_log("%s%03X [%01d] %s %s",
254 prefix,
255 msg->can_id & QEMU_CAN_EFF_MASK,
256 msg->can_dlc,
257 msg->can_id & QEMU_CAN_EFF_FLAG ? "EFF" : "SFF",
258 msg->can_id & QEMU_CAN_RTR_FLAG ? "RTR" : "DAT");
259
260 for (i = 0; i < msg->can_dlc; i++) {
261 qemu_log(" %02X", msg->data[i]);
262 }
263 qemu_log("\n");
264 qemu_log_flush();
265 qemu_log_unlock();
266 }
267
268 static void buff2frame_pel(const uint8_t *buff, qemu_can_frame *frame)
269 {
270 uint8_t i;
271
272 frame->can_id = 0;
273 if (buff[0] & 0x40) { /* RTR */
274 frame->can_id = QEMU_CAN_RTR_FLAG;
275 }
276 frame->can_dlc = buff[0] & 0x0f;
277
278 if (buff[0] & 0x80) { /* Extended */
279 frame->can_id |= QEMU_CAN_EFF_FLAG;
280 frame->can_id |= buff[1] << 21; /* ID.28~ID.21 */
281 frame->can_id |= buff[2] << 13; /* ID.20~ID.13 */
282 frame->can_id |= buff[3] << 5;
283 frame->can_id |= buff[4] >> 3;
284 for (i = 0; i < frame->can_dlc; i++) {
285 frame->data[i] = buff[5 + i];
286 }
287 for (; i < 8; i++) {
288 frame->data[i] = 0;
289 }
290 } else {
291 frame->can_id |= buff[1] << 3;
292 frame->can_id |= buff[2] >> 5;
293 for (i = 0; i < frame->can_dlc; i++) {
294 frame->data[i] = buff[3 + i];
295 }
296 for (; i < 8; i++) {
297 frame->data[i] = 0;
298 }
299 }
300 }
301
302
303 static void buff2frame_bas(const uint8_t *buff, qemu_can_frame *frame)
304 {
305 uint8_t i;
306
307 frame->can_id = ((buff[0] << 3) & (0xff << 3)) + ((buff[1] >> 5) & 0x07);
308 if (buff[1] & 0x10) { /* RTR */
309 frame->can_id = QEMU_CAN_RTR_FLAG;
310 }
311 frame->can_dlc = buff[1] & 0x0f;
312
313 for (i = 0; i < frame->can_dlc; i++) {
314 frame->data[i] = buff[2 + i];
315 }
316 for (; i < 8; i++) {
317 frame->data[i] = 0;
318 }
319 }
320
321
322 static int frame2buff_pel(const qemu_can_frame *frame, uint8_t *buff)
323 {
324 int i;
325
326 if (frame->can_id & QEMU_CAN_ERR_FLAG) { /* error frame, NOT support now. */
327 return -1;
328 }
329
330 buff[0] = 0x0f & frame->can_dlc; /* DLC */
331 if (frame->can_id & QEMU_CAN_RTR_FLAG) { /* RTR */
332 buff[0] |= (1 << 6);
333 }
334 if (frame->can_id & QEMU_CAN_EFF_FLAG) { /* EFF */
335 buff[0] |= (1 << 7);
336 buff[1] = extract32(frame->can_id, 21, 8); /* ID.28~ID.21 */
337 buff[2] = extract32(frame->can_id, 13, 8); /* ID.20~ID.13 */
338 buff[3] = extract32(frame->can_id, 5, 8); /* ID.12~ID.05 */
339 buff[4] = extract32(frame->can_id, 0, 5) << 3; /* ID.04~ID.00,xxx */
340 for (i = 0; i < frame->can_dlc; i++) {
341 buff[5 + i] = frame->data[i];
342 }
343 return frame->can_dlc + 5;
344 } else { /* SFF */
345 buff[1] = extract32(frame->can_id, 3, 8); /* ID.10~ID.03 */
346 buff[2] = extract32(frame->can_id, 0, 3) << 5; /* ID.02~ID.00,xxxxx */
347 for (i = 0; i < frame->can_dlc; i++) {
348 buff[3 + i] = frame->data[i];
349 }
350
351 return frame->can_dlc + 3;
352 }
353
354 return -1;
355 }
356
357 static int frame2buff_bas(const qemu_can_frame *frame, uint8_t *buff)
358 {
359 int i;
360
361 /*
362 * EFF, no support for BasicMode
363 * No use for Error frames now,
364 * they could be used in future to update SJA1000 error state
365 */
366 if ((frame->can_id & QEMU_CAN_EFF_FLAG) ||
367 (frame->can_id & QEMU_CAN_ERR_FLAG)) {
368 return -1;
369 }
370
371 buff[0] = extract32(frame->can_id, 3, 8); /* ID.10~ID.03 */
372 buff[1] = extract32(frame->can_id, 0, 3) << 5; /* ID.02~ID.00,xxxxx */
373 if (frame->can_id & QEMU_CAN_RTR_FLAG) { /* RTR */
374 buff[1] |= (1 << 4);
375 }
376 buff[1] |= frame->can_dlc & 0x0f;
377 for (i = 0; i < frame->can_dlc; i++) {
378 buff[2 + i] = frame->data[i];
379 }
380
381 return frame->can_dlc + 2;
382 }
383
384 static void can_sja_update_pel_irq(CanSJA1000State *s)
385 {
386 if (s->interrupt_en & s->interrupt_pel) {
387 qemu_irq_raise(s->irq);
388 } else {
389 qemu_irq_lower(s->irq);
390 }
391 }
392
393 static void can_sja_update_bas_irq(CanSJA1000State *s)
394 {
395 if ((s->control >> 1) & s->interrupt_bas) {
396 qemu_irq_raise(s->irq);
397 } else {
398 qemu_irq_lower(s->irq);
399 }
400 }
401
402 void can_sja_mem_write(CanSJA1000State *s, hwaddr addr, uint64_t val,
403 unsigned size)
404 {
405 qemu_can_frame frame;
406 uint32_t tmp;
407 uint8_t tmp8, count;
408
409
410 DPRINTF("write 0x%02llx addr 0x%02x\n",
411 (unsigned long long)val, (unsigned int)addr);
412
413 if (addr > CAN_SJA_MEM_SIZE) {
414 return ;
415 }
416
417 if (s->clock & 0x80) { /* PeliCAN Mode */
418 switch (addr) {
419 case SJA_MOD: /* Mode register */
420 s->mode = 0x1f & val;
421 if ((s->mode & 0x01) && ((val & 0x01) == 0)) {
422 /* Go to operation mode from reset mode. */
423 if (s->mode & (1 << 3)) { /* Single mode. */
424 /* For EFF */
425 can_sja_single_filter(&s->filter[0],
426 s->code_mask + 0, s->code_mask + 4, 1);
427
428 /* For SFF */
429 can_sja_single_filter(&s->filter[1],
430 s->code_mask + 0, s->code_mask + 4, 0);
431
432 can_bus_client_set_filters(&s->bus_client, s->filter, 2);
433 } else { /* Dual mode */
434 /* For EFF */
435 can_sja_dual_filter(&s->filter[0],
436 s->code_mask + 0, s->code_mask + 4, 1);
437
438 can_sja_dual_filter(&s->filter[1],
439 s->code_mask + 2, s->code_mask + 6, 1);
440
441 /* For SFF */
442 can_sja_dual_filter(&s->filter[2],
443 s->code_mask + 0, s->code_mask + 4, 0);
444
445 can_sja_dual_filter(&s->filter[3],
446 s->code_mask + 2, s->code_mask + 6, 0);
447
448 can_bus_client_set_filters(&s->bus_client, s->filter, 4);
449 }
450
451 s->rxmsg_cnt = 0;
452 s->rx_cnt = 0;
453 }
454 break;
455
456 case SJA_CMR: /* Command register. */
457 if (0x01 & val) { /* Send transmission request. */
458 buff2frame_pel(s->tx_buff, &frame);
459 if (DEBUG_FILTER) {
460 can_display_msg("[cansja]: Tx request " , &frame);
461 }
462
463 /*
464 * Clear transmission complete status,
465 * and Transmit Buffer Status.
466 * write to the backends.
467 */
468 s->status_pel &= ~(3 << 2);
469
470 can_bus_client_send(&s->bus_client, &frame, 1);
471
472 /*
473 * Set transmission complete status
474 * and Transmit Buffer Status.
475 */
476 s->status_pel |= (3 << 2);
477
478 /* Clear transmit status. */
479 s->status_pel &= ~(1 << 5);
480 s->interrupt_pel |= 0x02;
481 can_sja_update_pel_irq(s);
482 }
483 if (0x04 & val) { /* Release Receive Buffer */
484 if (s->rxmsg_cnt <= 0) {
485 break;
486 }
487
488 tmp8 = s->rx_buff[s->rxbuf_start]; count = 0;
489 if (tmp8 & (1 << 7)) { /* EFF */
490 count += 2;
491 }
492 count += 3;
493 if (!(tmp8 & (1 << 6))) { /* DATA */
494 count += (tmp8 & 0x0f);
495 }
496
497 if (DEBUG_FILTER) {
498 qemu_log("[cansja]: message released from "
499 "Rx FIFO cnt=%d, count=%d\n", s->rx_cnt, count);
500 }
501
502 s->rxbuf_start += count;
503 s->rxbuf_start %= SJA_RCV_BUF_LEN;
504
505 s->rx_cnt -= count;
506 s->rxmsg_cnt--;
507 if (s->rxmsg_cnt == 0) {
508 s->status_pel &= ~(1 << 0);
509 s->interrupt_pel &= ~(1 << 0);
510 can_sja_update_pel_irq(s);
511 }
512 }
513 if (0x08 & val) { /* Clear data overrun */
514 s->status_pel &= ~(1 << 1);
515 s->interrupt_pel &= ~(1 << 3);
516 can_sja_update_pel_irq(s);
517 }
518 break;
519 case SJA_SR: /* Status register */
520 case SJA_IR: /* Interrupt register */
521 break; /* Do nothing */
522 case SJA_IER: /* Interrupt enable register */
523 s->interrupt_en = val;
524 break;
525 case 16: /* RX frame information addr16-28. */
526 s->status_pel |= (1 << 5); /* Set transmit status. */
527 case 17 ... 28:
528 if (s->mode & 0x01) { /* Reset mode */
529 if (addr < 24) {
530 s->code_mask[addr - 16] = val;
531 }
532 } else { /* Operation mode */
533 s->tx_buff[addr - 16] = val; /* Store to TX buffer directly. */
534 }
535 break;
536 case SJA_CDR:
537 s->clock = val;
538 break;
539 }
540 } else { /* Basic Mode */
541 switch (addr) {
542 case SJA_BCAN_CTR: /* Control register, addr 0 */
543 if ((s->control & 0x01) && ((val & 0x01) == 0)) {
544 /* Go to operation mode from reset mode. */
545 s->filter[0].can_id = (s->code << 3) & (0xff << 3);
546 tmp = (~(s->mask << 3)) & (0xff << 3);
547 tmp |= QEMU_CAN_EFF_FLAG; /* Only Basic CAN Frame. */
548 s->filter[0].can_mask = tmp;
549 can_bus_client_set_filters(&s->bus_client, s->filter, 1);
550
551 s->rxmsg_cnt = 0;
552 s->rx_cnt = 0;
553 } else if (!(s->control & 0x01) && !(val & 0x01)) {
554 can_sja_software_reset(s);
555 }
556
557 s->control = 0x1f & val;
558 break;
559 case SJA_BCAN_CMR: /* Command register, addr 1 */
560 if (0x01 & val) { /* Send transmission request. */
561 buff2frame_bas(s->tx_buff, &frame);
562 if (DEBUG_FILTER) {
563 can_display_msg("[cansja]: Tx request " , &frame);
564 }
565
566 /*
567 * Clear transmission complete status,
568 * and Transmit Buffer Status.
569 */
570 s->status_bas &= ~(3 << 2);
571
572 /* write to the backends. */
573 can_bus_client_send(&s->bus_client, &frame, 1);
574
575 /*
576 * Set transmission complete status,
577 * and Transmit Buffer Status.
578 */
579 s->status_bas |= (3 << 2);
580
581 /* Clear transmit status. */
582 s->status_bas &= ~(1 << 5);
583 s->interrupt_bas |= 0x02;
584 can_sja_update_bas_irq(s);
585 }
586 if (0x04 & val) { /* Release Receive Buffer */
587 if (s->rxmsg_cnt <= 0) {
588 break;
589 }
590
591 tmp8 = s->rx_buff[(s->rxbuf_start + 1) % SJA_RCV_BUF_LEN];
592 count = 2 + (tmp8 & 0x0f);
593
594 if (DEBUG_FILTER) {
595 qemu_log("[cansja]: message released from "
596 "Rx FIFO cnt=%d, count=%d\n", s->rx_cnt, count);
597 }
598
599 s->rxbuf_start += count;
600 s->rxbuf_start %= SJA_RCV_BUF_LEN;
601 s->rx_cnt -= count;
602 s->rxmsg_cnt--;
603
604 if (s->rxmsg_cnt == 0) {
605 s->status_bas &= ~(1 << 0);
606 s->interrupt_bas &= ~(1 << 0);
607 can_sja_update_bas_irq(s);
608 }
609 }
610 if (0x08 & val) { /* Clear data overrun */
611 s->status_bas &= ~(1 << 1);
612 s->interrupt_bas &= ~(1 << 3);
613 can_sja_update_bas_irq(s);
614 }
615 break;
616 case 4:
617 s->code = val;
618 break;
619 case 5:
620 s->mask = val;
621 break;
622 case 10:
623 s->status_bas |= (1 << 5); /* Set transmit status. */
624 case 11 ... 19:
625 if ((s->control & 0x01) == 0) { /* Operation mode */
626 s->tx_buff[addr - 10] = val; /* Store to TX buffer directly. */
627 }
628 break;
629 case SJA_CDR:
630 s->clock = val;
631 break;
632 }
633 }
634 }
635
636 uint64_t can_sja_mem_read(CanSJA1000State *s, hwaddr addr, unsigned size)
637 {
638 uint64_t temp = 0;
639
640 DPRINTF("read addr 0x%02x ...\n", (unsigned int)addr);
641
642 if (addr > CAN_SJA_MEM_SIZE) {
643 return 0;
644 }
645
646 if (s->clock & 0x80) { /* PeliCAN Mode */
647 switch (addr) {
648 case SJA_MOD: /* Mode register, addr 0 */
649 temp = s->mode;
650 break;
651 case SJA_CMR: /* Command register, addr 1 */
652 temp = 0x00; /* Command register, cannot be read. */
653 break;
654 case SJA_SR: /* Status register, addr 2 */
655 temp = s->status_pel;
656 break;
657 case SJA_IR: /* Interrupt register, addr 3 */
658 temp = s->interrupt_pel;
659 s->interrupt_pel = 0;
660 if (s->rxmsg_cnt) {
661 s->interrupt_pel |= (1 << 0); /* Receive interrupt. */
662 }
663 can_sja_update_pel_irq(s);
664 break;
665 case SJA_IER: /* Interrupt enable register, addr 4 */
666 temp = s->interrupt_en;
667 break;
668 case 5: /* Reserved */
669 case 6: /* Bus timing 0, hardware related, not support now. */
670 case 7: /* Bus timing 1, hardware related, not support now. */
671 case 8: /*
672 * Output control register, hardware related,
673 * not supported for now.
674 */
675 case 9: /* Test. */
676 case 10 ... 15: /* Reserved */
677 temp = 0x00;
678 break;
679
680 case 16 ... 28:
681 if (s->mode & 0x01) { /* Reset mode */
682 if (addr < 24) {
683 temp = s->code_mask[addr - 16];
684 } else {
685 temp = 0x00;
686 }
687 } else { /* Operation mode */
688 temp = s->rx_buff[(s->rxbuf_start + addr - 16) %
689 SJA_RCV_BUF_LEN];
690 }
691 break;
692 case SJA_CDR:
693 temp = s->clock;
694 break;
695 default:
696 temp = 0xff;
697 }
698 } else { /* Basic Mode */
699 switch (addr) {
700 case SJA_BCAN_CTR: /* Control register, addr 0 */
701 temp = s->control;
702 break;
703 case SJA_BCAN_SR: /* Status register, addr 2 */
704 temp = s->status_bas;
705 break;
706 case SJA_BCAN_IR: /* Interrupt register, addr 3 */
707 temp = s->interrupt_bas;
708 s->interrupt_bas = 0;
709 if (s->rxmsg_cnt) {
710 s->interrupt_bas |= (1 << 0); /* Receive interrupt. */
711 }
712 can_sja_update_bas_irq(s);
713 break;
714 case 4:
715 temp = s->code;
716 break;
717 case 5:
718 temp = s->mask;
719 break;
720 case 20 ... 29:
721 temp = s->rx_buff[(s->rxbuf_start + addr - 20) % SJA_RCV_BUF_LEN];
722 break;
723 case 31:
724 temp = s->clock;
725 break;
726 default:
727 temp = 0xff;
728 break;
729 }
730 }
731 DPRINTF("read addr 0x%02x, %d bytes, content 0x%02lx\n",
732 (int)addr, size, (long unsigned int)temp);
733
734 return temp;
735 }
736
737 int can_sja_can_receive(CanBusClientState *client)
738 {
739 CanSJA1000State *s = container_of(client, CanSJA1000State, bus_client);
740
741 if (s->clock & 0x80) { /* PeliCAN Mode */
742 if (s->mode & 0x01) { /* reset mode. */
743 return 0;
744 }
745 } else { /* BasicCAN mode */
746 if (s->control & 0x01) {
747 return 0;
748 }
749 }
750
751 return 1; /* always return 1, when operation mode */
752 }
753
754 ssize_t can_sja_receive(CanBusClientState *client, const qemu_can_frame *frames,
755 size_t frames_cnt)
756 {
757 CanSJA1000State *s = container_of(client, CanSJA1000State, bus_client);
758 static uint8_t rcv[SJA_MSG_MAX_LEN];
759 int i;
760 int ret = -1;
761 const qemu_can_frame *frame = frames;
762
763 if (frames_cnt <= 0) {
764 return 0;
765 }
766 if (DEBUG_FILTER) {
767 can_display_msg("[cansja]: receive ", frame);
768 }
769
770 if (s->clock & 0x80) { /* PeliCAN Mode */
771
772 /* the CAN controller is receiving a message */
773 s->status_pel |= (1 << 4);
774
775 if (can_sja_accept_filter(s, frame) == 0) {
776 s->status_pel &= ~(1 << 4);
777 if (DEBUG_FILTER) {
778 qemu_log("[cansja]: filter rejects message\n");
779 }
780 return ret;
781 }
782
783 ret = frame2buff_pel(frame, rcv);
784 if (ret < 0) {
785 s->status_pel &= ~(1 << 4);
786 if (DEBUG_FILTER) {
787 qemu_log("[cansja]: message store failed\n");
788 }
789 return ret; /* maybe not support now. */
790 }
791
792 if (s->rx_cnt + ret > SJA_RCV_BUF_LEN) { /* Data overrun. */
793 s->status_pel |= (1 << 1); /* Overrun status */
794 s->interrupt_pel |= (1 << 3);
795 s->status_pel &= ~(1 << 4);
796 if (DEBUG_FILTER) {
797 qemu_log("[cansja]: receive FIFO overrun\n");
798 }
799 can_sja_update_pel_irq(s);
800 return ret;
801 }
802 s->rx_cnt += ret;
803 s->rxmsg_cnt++;
804 if (DEBUG_FILTER) {
805 qemu_log("[cansja]: message stored in receive FIFO\n");
806 }
807
808 for (i = 0; i < ret; i++) {
809 s->rx_buff[(s->rx_ptr++) % SJA_RCV_BUF_LEN] = rcv[i];
810 }
811 s->rx_ptr %= SJA_RCV_BUF_LEN; /* update the pointer. */
812
813 s->status_pel |= 0x01; /* Set the Receive Buffer Status. DS-p23 */
814 s->interrupt_pel |= 0x01;
815 s->status_pel &= ~(1 << 4);
816 s->status_pel |= (1 << 0);
817 can_sja_update_pel_irq(s);
818 } else { /* BasicCAN mode */
819
820 /* the CAN controller is receiving a message */
821 s->status_bas |= (1 << 4);
822
823 ret = frame2buff_bas(frame, rcv);
824 if (ret < 0) {
825 s->status_bas &= ~(1 << 4);
826 if (DEBUG_FILTER) {
827 qemu_log("[cansja]: message store failed\n");
828 }
829 return ret; /* maybe not support now. */
830 }
831
832 if (s->rx_cnt + ret > SJA_RCV_BUF_LEN) { /* Data overrun. */
833 s->status_bas |= (1 << 1); /* Overrun status */
834 s->status_bas &= ~(1 << 4);
835 s->interrupt_bas |= (1 << 3);
836 can_sja_update_bas_irq(s);
837 if (DEBUG_FILTER) {
838 qemu_log("[cansja]: receive FIFO overrun\n");
839 }
840 return ret;
841 }
842 s->rx_cnt += ret;
843 s->rxmsg_cnt++;
844
845 if (DEBUG_FILTER) {
846 qemu_log("[cansja]: message stored\n");
847 }
848
849 for (i = 0; i < ret; i++) {
850 s->rx_buff[(s->rx_ptr++) % SJA_RCV_BUF_LEN] = rcv[i];
851 }
852 s->rx_ptr %= SJA_RCV_BUF_LEN; /* update the pointer. */
853
854 s->status_bas |= 0x01; /* Set the Receive Buffer Status. DS-p15 */
855 s->status_bas &= ~(1 << 4);
856 s->interrupt_bas |= (1 << 0);
857 can_sja_update_bas_irq(s);
858 }
859 return 1;
860 }
861
862 static CanBusClientInfo can_sja_bus_client_info = {
863 .can_receive = can_sja_can_receive,
864 .receive = can_sja_receive,
865 };
866
867
868 int can_sja_connect_to_bus(CanSJA1000State *s, CanBusState *bus)
869 {
870 s->bus_client.info = &can_sja_bus_client_info;
871
872 if (!bus) {
873 return -EINVAL;
874 }
875
876 if (can_bus_insert_client(bus, &s->bus_client) < 0) {
877 return -1;
878 }
879
880 return 0;
881 }
882
883 void can_sja_disconnect(CanSJA1000State *s)
884 {
885 can_bus_remove_client(&s->bus_client);
886 }
887
888 int can_sja_init(CanSJA1000State *s, qemu_irq irq)
889 {
890 s->irq = irq;
891
892 qemu_irq_lower(s->irq);
893
894 can_sja_hardware_reset(s);
895
896 return 0;
897 }
898
899 const VMStateDescription vmstate_qemu_can_filter = {
900 .name = "qemu_can_filter",
901 .version_id = 1,
902 .minimum_version_id = 1,
903 .minimum_version_id_old = 1,
904 .fields = (VMStateField[]) {
905 VMSTATE_UINT32(can_id, qemu_can_filter),
906 VMSTATE_UINT32(can_mask, qemu_can_filter),
907 VMSTATE_END_OF_LIST()
908 }
909 };
910
911 static int can_sja_post_load(void *opaque, int version_id)
912 {
913 CanSJA1000State *s = opaque;
914 if (s->clock & 0x80) { /* PeliCAN Mode */
915 can_sja_update_pel_irq(s);
916 } else {
917 can_sja_update_bas_irq(s);
918 }
919 return 0;
920 }
921
922 /* VMState is needed for live migration of QEMU images */
923 const VMStateDescription vmstate_can_sja = {
924 .name = "can_sja",
925 .version_id = 1,
926 .minimum_version_id = 1,
927 .minimum_version_id_old = 1,
928 .post_load = can_sja_post_load,
929 .fields = (VMStateField[]) {
930 VMSTATE_UINT8(mode, CanSJA1000State),
931
932 VMSTATE_UINT8(status_pel, CanSJA1000State),
933 VMSTATE_UINT8(interrupt_pel, CanSJA1000State),
934 VMSTATE_UINT8(interrupt_en, CanSJA1000State),
935 VMSTATE_UINT8(rxmsg_cnt, CanSJA1000State),
936 VMSTATE_UINT8(rxbuf_start, CanSJA1000State),
937 VMSTATE_UINT8(clock, CanSJA1000State),
938
939 VMSTATE_BUFFER(code_mask, CanSJA1000State),
940 VMSTATE_BUFFER(tx_buff, CanSJA1000State),
941
942 VMSTATE_BUFFER(rx_buff, CanSJA1000State),
943
944 VMSTATE_UINT32(rx_ptr, CanSJA1000State),
945 VMSTATE_UINT32(rx_cnt, CanSJA1000State),
946
947 VMSTATE_UINT8(control, CanSJA1000State),
948
949 VMSTATE_UINT8(status_bas, CanSJA1000State),
950 VMSTATE_UINT8(interrupt_bas, CanSJA1000State),
951 VMSTATE_UINT8(code, CanSJA1000State),
952 VMSTATE_UINT8(mask, CanSJA1000State),
953
954 VMSTATE_STRUCT_ARRAY(filter, CanSJA1000State, 4, 0,
955 vmstate_qemu_can_filter, qemu_can_filter),
956
957
958 VMSTATE_END_OF_LIST()
959 }
960 };