2 * CAN device - SJA1000 chip emulation for QEMU
4 * Copyright (c) 2013-2014 Jin Yang
5 * Copyright (c) 2014-2018 Pavel Pisa
7 * Initial development supported by Google GSoC 2013 from RTEMS project slot
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:
16 * The above copyright notice and this permission notice shall be included in
17 * all copies or substantial portions of the Software.
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
28 #include "qemu/osdep.h"
30 #include "chardev/char.h"
33 #include "migration/vmstate.h"
34 #include "net/can_emu.h"
36 #include "can_sja1000.h"
39 #define DEBUG_FILTER 0
40 #endif /*DEBUG_FILTER*/
46 #define DPRINTF(fmt, ...) \
49 qemu_log("[cansja]: " fmt , ## __VA_ARGS__); \
53 static void can_sja_software_reset(CanSJA1000State
*s
)
57 s
->status_pel
&= ~0x37;
58 s
->status_pel
|= 0x34;
60 s
->rxbuf_start
= 0x00;
65 void can_sja_hardware_reset(CanSJA1000State
*s
)
67 /* Reset by hardware, p10 */
70 s
->interrupt_pel
= 0x00;
72 s
->rxbuf_start
= 0x00;
78 s
->interrupt_bas
= 0x00;
80 qemu_irq_lower(s
->irq
);
84 void can_sja_single_filter(struct qemu_can_filter
*filter
,
85 const uint8_t *acr
, const uint8_t *amr
, int 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;
93 filter
->can_id
|= QEMU_CAN_RTR_FLAG
;
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
;
102 filter
->can_mask
|= QEMU_CAN_RTR_FLAG
;
105 filter
->can_id
= (uint32_t)acr
[0] << 3;
106 filter
->can_id
|= (uint32_t)acr
[1] >> 5;
108 filter
->can_id
|= QEMU_CAN_RTR_FLAG
;
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
;
121 void can_sja_dual_filter(struct qemu_can_filter
*filter
,
122 const uint8_t *acr
, const uint8_t *amr
, int extended
)
125 filter
->can_id
= (uint32_t)acr
[0] << 21;
126 filter
->can_id
|= (uint32_t)acr
[1] << 13;
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;
132 filter
->can_id
= (uint32_t)acr
[0] << 3;
133 filter
->can_id
|= (uint32_t)acr
[1] >> 5;
135 filter
->can_id
|= QEMU_CAN_RTR_FLAG
;
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
;
147 /* Details in DS-p22, what we need to do here is to test the data. */
149 int can_sja_accept_filter(CanSJA1000State
*s
,
150 const qemu_can_frame
*frame
)
153 struct qemu_can_filter filter
;
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);
161 if (!can_bus_filter_match(&filter
, frame
->can_id
)) {
165 can_sja_single_filter(&filter
,
166 s
->code_mask
+ 0, s
->code_mask
+ 4, 0);
168 if (!can_bus_filter_match(&filter
, frame
->can_id
)) {
172 if (frame
->can_id
& QEMU_CAN_RTR_FLAG
) { /* RTR */
176 if (frame
->can_dlc
== 0) {
180 if ((frame
->data
[0] & ~(s
->code_mask
[6])) !=
181 (s
->code_mask
[2] & ~(s
->code_mask
[6]))) {
185 if (frame
->can_dlc
< 2) {
189 if ((frame
->data
[1] & ~(s
->code_mask
[7])) ==
190 (s
->code_mask
[3] & ~(s
->code_mask
[7]))) {
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);
201 if (can_bus_filter_match(&filter
, frame
->can_id
)) {
205 can_sja_dual_filter(&filter
,
206 s
->code_mask
+ 2, s
->code_mask
+ 6, 1);
208 if (can_bus_filter_match(&filter
, frame
->can_id
)) {
214 can_sja_dual_filter(&filter
,
215 s
->code_mask
+ 0, s
->code_mask
+ 4, 0);
217 if (can_bus_filter_match(&filter
, frame
->can_id
)) {
220 expect
= s
->code_mask
[1] << 4;
221 expect
|= s
->code_mask
[3] & 0x0f;
223 mask
= s
->code_mask
[5] << 4;
224 mask
|= s
->code_mask
[7] & 0x0f;
227 if ((frame
->data
[0] & mask
) ==
233 can_sja_dual_filter(&filter
,
234 s
->code_mask
+ 2, s
->code_mask
+ 6, 0);
236 if (can_bus_filter_match(&filter
, frame
->can_id
)) {
248 static void can_display_msg(const char *prefix
, const qemu_can_frame
*msg
)
253 qemu_log("%s%03X [%01d] %s %s",
255 msg
->can_id
& QEMU_CAN_EFF_MASK
,
257 msg
->can_id
& QEMU_CAN_EFF_FLAG
? "EFF" : "SFF",
258 msg
->can_id
& QEMU_CAN_RTR_FLAG
? "RTR" : "DAT");
260 for (i
= 0; i
< msg
->can_dlc
; i
++) {
261 qemu_log(" %02X", msg
->data
[i
]);
268 static void buff2frame_pel(const uint8_t *buff
, qemu_can_frame
*frame
)
273 if (buff
[0] & 0x40) { /* RTR */
274 frame
->can_id
= QEMU_CAN_RTR_FLAG
;
276 frame
->can_dlc
= buff
[0] & 0x0f;
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
];
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
];
303 static void buff2frame_bas(const uint8_t *buff
, qemu_can_frame
*frame
)
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
;
311 frame
->can_dlc
= buff
[1] & 0x0f;
313 for (i
= 0; i
< frame
->can_dlc
; i
++) {
314 frame
->data
[i
] = buff
[2 + i
];
322 static int frame2buff_pel(const qemu_can_frame
*frame
, uint8_t *buff
)
326 if (frame
->can_id
& QEMU_CAN_ERR_FLAG
) { /* error frame, NOT support now. */
330 buff
[0] = 0x0f & frame
->can_dlc
; /* DLC */
331 if (frame
->can_id
& QEMU_CAN_RTR_FLAG
) { /* RTR */
334 if (frame
->can_id
& QEMU_CAN_EFF_FLAG
) { /* EFF */
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
];
343 return frame
->can_dlc
+ 5;
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
];
351 return frame
->can_dlc
+ 3;
357 static int frame2buff_bas(const qemu_can_frame
*frame
, uint8_t *buff
)
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
366 if ((frame
->can_id
& QEMU_CAN_EFF_FLAG
) ||
367 (frame
->can_id
& QEMU_CAN_ERR_FLAG
)) {
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 */
376 buff
[1] |= frame
->can_dlc
& 0x0f;
377 for (i
= 0; i
< frame
->can_dlc
; i
++) {
378 buff
[2 + i
] = frame
->data
[i
];
381 return frame
->can_dlc
+ 2;
384 static void can_sja_update_pel_irq(CanSJA1000State
*s
)
386 if (s
->interrupt_en
& s
->interrupt_pel
) {
387 qemu_irq_raise(s
->irq
);
389 qemu_irq_lower(s
->irq
);
393 static void can_sja_update_bas_irq(CanSJA1000State
*s
)
395 if ((s
->control
>> 1) & s
->interrupt_bas
) {
396 qemu_irq_raise(s
->irq
);
398 qemu_irq_lower(s
->irq
);
402 void can_sja_mem_write(CanSJA1000State
*s
, hwaddr addr
, uint64_t val
,
405 qemu_can_frame frame
;
410 DPRINTF("write 0x%02llx addr 0x%02x\n",
411 (unsigned long long)val
, (unsigned int)addr
);
413 if (addr
> CAN_SJA_MEM_SIZE
) {
417 if (s
->clock
& 0x80) { /* PeliCAN Mode */
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. */
425 can_sja_single_filter(&s
->filter
[0],
426 s
->code_mask
+ 0, s
->code_mask
+ 4, 1);
429 can_sja_single_filter(&s
->filter
[1],
430 s
->code_mask
+ 0, s
->code_mask
+ 4, 0);
432 can_bus_client_set_filters(&s
->bus_client
, s
->filter
, 2);
433 } else { /* Dual mode */
435 can_sja_dual_filter(&s
->filter
[0],
436 s
->code_mask
+ 0, s
->code_mask
+ 4, 1);
438 can_sja_dual_filter(&s
->filter
[1],
439 s
->code_mask
+ 2, s
->code_mask
+ 6, 1);
442 can_sja_dual_filter(&s
->filter
[2],
443 s
->code_mask
+ 0, s
->code_mask
+ 4, 0);
445 can_sja_dual_filter(&s
->filter
[3],
446 s
->code_mask
+ 2, s
->code_mask
+ 6, 0);
448 can_bus_client_set_filters(&s
->bus_client
, s
->filter
, 4);
456 case SJA_CMR
: /* Command register. */
457 if (0x01 & val
) { /* Send transmission request. */
458 buff2frame_pel(s
->tx_buff
, &frame
);
460 can_display_msg("[cansja]: Tx request " , &frame
);
464 * Clear transmission complete status,
465 * and Transmit Buffer Status.
466 * write to the backends.
468 s
->status_pel
&= ~(3 << 2);
470 can_bus_client_send(&s
->bus_client
, &frame
, 1);
473 * Set transmission complete status
474 * and Transmit Buffer Status.
476 s
->status_pel
|= (3 << 2);
478 /* Clear transmit status. */
479 s
->status_pel
&= ~(1 << 5);
480 s
->interrupt_pel
|= 0x02;
481 can_sja_update_pel_irq(s
);
483 if (0x04 & val
) { /* Release Receive Buffer */
484 if (s
->rxmsg_cnt
<= 0) {
488 tmp8
= s
->rx_buff
[s
->rxbuf_start
]; count
= 0;
489 if (tmp8
& (1 << 7)) { /* EFF */
493 if (!(tmp8
& (1 << 6))) { /* DATA */
494 count
+= (tmp8
& 0x0f);
498 qemu_log("[cansja]: message released from "
499 "Rx FIFO cnt=%d, count=%d\n", s
->rx_cnt
, count
);
502 s
->rxbuf_start
+= count
;
503 s
->rxbuf_start
%= SJA_RCV_BUF_LEN
;
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
);
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
);
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
;
525 case 16: /* RX frame information addr16-28. */
526 s
->status_pel
|= (1 << 5); /* Set transmit status. */
528 if (s
->mode
& 0x01) { /* Reset mode */
530 s
->code_mask
[addr
- 16] = val
;
532 } else { /* Operation mode */
533 s
->tx_buff
[addr
- 16] = val
; /* Store to TX buffer directly. */
540 } else { /* Basic Mode */
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);
553 } else if (!(s
->control
& 0x01) && !(val
& 0x01)) {
554 can_sja_software_reset(s
);
557 s
->control
= 0x1f & val
;
559 case SJA_BCAN_CMR
: /* Command register, addr 1 */
560 if (0x01 & val
) { /* Send transmission request. */
561 buff2frame_bas(s
->tx_buff
, &frame
);
563 can_display_msg("[cansja]: Tx request " , &frame
);
567 * Clear transmission complete status,
568 * and Transmit Buffer Status.
570 s
->status_bas
&= ~(3 << 2);
572 /* write to the backends. */
573 can_bus_client_send(&s
->bus_client
, &frame
, 1);
576 * Set transmission complete status,
577 * and Transmit Buffer Status.
579 s
->status_bas
|= (3 << 2);
581 /* Clear transmit status. */
582 s
->status_bas
&= ~(1 << 5);
583 s
->interrupt_bas
|= 0x02;
584 can_sja_update_bas_irq(s
);
586 if (0x04 & val
) { /* Release Receive Buffer */
587 if (s
->rxmsg_cnt
<= 0) {
591 tmp8
= s
->rx_buff
[(s
->rxbuf_start
+ 1) % SJA_RCV_BUF_LEN
];
592 count
= 2 + (tmp8
& 0x0f);
595 qemu_log("[cansja]: message released from "
596 "Rx FIFO cnt=%d, count=%d\n", s
->rx_cnt
, count
);
599 s
->rxbuf_start
+= count
;
600 s
->rxbuf_start
%= SJA_RCV_BUF_LEN
;
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
);
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
);
623 s
->status_bas
|= (1 << 5); /* Set transmit status. */
625 if ((s
->control
& 0x01) == 0) { /* Operation mode */
626 s
->tx_buff
[addr
- 10] = val
; /* Store to TX buffer directly. */
636 uint64_t can_sja_mem_read(CanSJA1000State
*s
, hwaddr addr
, unsigned size
)
640 DPRINTF("read addr 0x%02x ...\n", (unsigned int)addr
);
642 if (addr
> CAN_SJA_MEM_SIZE
) {
646 if (s
->clock
& 0x80) { /* PeliCAN Mode */
648 case SJA_MOD
: /* Mode register, addr 0 */
651 case SJA_CMR
: /* Command register, addr 1 */
652 temp
= 0x00; /* Command register, cannot be read. */
654 case SJA_SR
: /* Status register, addr 2 */
655 temp
= s
->status_pel
;
657 case SJA_IR
: /* Interrupt register, addr 3 */
658 temp
= s
->interrupt_pel
;
659 s
->interrupt_pel
= 0;
661 s
->interrupt_pel
|= (1 << 0); /* Receive interrupt. */
663 can_sja_update_pel_irq(s
);
665 case SJA_IER
: /* Interrupt enable register, addr 4 */
666 temp
= s
->interrupt_en
;
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. */
672 * Output control register, hardware related,
673 * not supported for now.
676 case 10 ... 15: /* Reserved */
681 if (s
->mode
& 0x01) { /* Reset mode */
683 temp
= s
->code_mask
[addr
- 16];
687 } else { /* Operation mode */
688 temp
= s
->rx_buff
[(s
->rxbuf_start
+ addr
- 16) %
698 } else { /* Basic Mode */
700 case SJA_BCAN_CTR
: /* Control register, addr 0 */
703 case SJA_BCAN_SR
: /* Status register, addr 2 */
704 temp
= s
->status_bas
;
706 case SJA_BCAN_IR
: /* Interrupt register, addr 3 */
707 temp
= s
->interrupt_bas
;
708 s
->interrupt_bas
= 0;
710 s
->interrupt_bas
|= (1 << 0); /* Receive interrupt. */
712 can_sja_update_bas_irq(s
);
721 temp
= s
->rx_buff
[(s
->rxbuf_start
+ addr
- 20) % SJA_RCV_BUF_LEN
];
731 DPRINTF("read addr 0x%02x, %d bytes, content 0x%02lx\n",
732 (int)addr
, size
, (long unsigned int)temp
);
737 int can_sja_can_receive(CanBusClientState
*client
)
739 CanSJA1000State
*s
= container_of(client
, CanSJA1000State
, bus_client
);
741 if (s
->clock
& 0x80) { /* PeliCAN Mode */
742 if (s
->mode
& 0x01) { /* reset mode. */
745 } else { /* BasicCAN mode */
746 if (s
->control
& 0x01) {
751 return 1; /* always return 1, when operation mode */
754 ssize_t
can_sja_receive(CanBusClientState
*client
, const qemu_can_frame
*frames
,
757 CanSJA1000State
*s
= container_of(client
, CanSJA1000State
, bus_client
);
758 static uint8_t rcv
[SJA_MSG_MAX_LEN
];
761 const qemu_can_frame
*frame
= frames
;
763 if (frames_cnt
<= 0) {
767 can_display_msg("[cansja]: receive ", frame
);
770 if (s
->clock
& 0x80) { /* PeliCAN Mode */
772 /* the CAN controller is receiving a message */
773 s
->status_pel
|= (1 << 4);
775 if (can_sja_accept_filter(s
, frame
) == 0) {
776 s
->status_pel
&= ~(1 << 4);
778 qemu_log("[cansja]: filter rejects message\n");
783 ret
= frame2buff_pel(frame
, rcv
);
785 s
->status_pel
&= ~(1 << 4);
787 qemu_log("[cansja]: message store failed\n");
789 return ret
; /* maybe not support now. */
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);
797 qemu_log("[cansja]: receive FIFO overrun\n");
799 can_sja_update_pel_irq(s
);
805 qemu_log("[cansja]: message stored in receive FIFO\n");
808 for (i
= 0; i
< ret
; i
++) {
809 s
->rx_buff
[(s
->rx_ptr
++) % SJA_RCV_BUF_LEN
] = rcv
[i
];
811 s
->rx_ptr
%= SJA_RCV_BUF_LEN
; /* update the pointer. */
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 */
820 /* the CAN controller is receiving a message */
821 s
->status_bas
|= (1 << 4);
823 ret
= frame2buff_bas(frame
, rcv
);
825 s
->status_bas
&= ~(1 << 4);
827 qemu_log("[cansja]: message store failed\n");
829 return ret
; /* maybe not support now. */
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
);
838 qemu_log("[cansja]: receive FIFO overrun\n");
846 qemu_log("[cansja]: message stored\n");
849 for (i
= 0; i
< ret
; i
++) {
850 s
->rx_buff
[(s
->rx_ptr
++) % SJA_RCV_BUF_LEN
] = rcv
[i
];
852 s
->rx_ptr
%= SJA_RCV_BUF_LEN
; /* update the pointer. */
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
);
862 static CanBusClientInfo can_sja_bus_client_info
= {
863 .can_receive
= can_sja_can_receive
,
864 .receive
= can_sja_receive
,
868 int can_sja_connect_to_bus(CanSJA1000State
*s
, CanBusState
*bus
)
870 s
->bus_client
.info
= &can_sja_bus_client_info
;
876 if (can_bus_insert_client(bus
, &s
->bus_client
) < 0) {
883 void can_sja_disconnect(CanSJA1000State
*s
)
885 can_bus_remove_client(&s
->bus_client
);
888 int can_sja_init(CanSJA1000State
*s
, qemu_irq irq
)
892 qemu_irq_lower(s
->irq
);
894 can_sja_hardware_reset(s
);
899 const VMStateDescription vmstate_qemu_can_filter
= {
900 .name
= "qemu_can_filter",
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()
911 static int can_sja_post_load(void *opaque
, int version_id
)
913 CanSJA1000State
*s
= opaque
;
914 if (s
->clock
& 0x80) { /* PeliCAN Mode */
915 can_sja_update_pel_irq(s
);
917 can_sja_update_bas_irq(s
);
922 /* VMState is needed for live migration of QEMU images */
923 const VMStateDescription vmstate_can_sja
= {
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
),
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
),
939 VMSTATE_BUFFER(code_mask
, CanSJA1000State
),
940 VMSTATE_BUFFER(tx_buff
, CanSJA1000State
),
942 VMSTATE_BUFFER(rx_buff
, CanSJA1000State
),
944 VMSTATE_UINT32(rx_ptr
, CanSJA1000State
),
945 VMSTATE_UINT32(rx_cnt
, CanSJA1000State
),
947 VMSTATE_UINT8(control
, CanSJA1000State
),
949 VMSTATE_UINT8(status_bas
, CanSJA1000State
),
950 VMSTATE_UINT8(interrupt_bas
, CanSJA1000State
),
951 VMSTATE_UINT8(code
, CanSJA1000State
),
952 VMSTATE_UINT8(mask
, CanSJA1000State
),
954 VMSTATE_STRUCT_ARRAY(filter
, CanSJA1000State
, 4, 0,
955 vmstate_qemu_can_filter
, qemu_can_filter
),
958 VMSTATE_END_OF_LIST()