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"
32 #include "migration/vmstate.h"
33 #include "net/can_emu.h"
35 #include "can_sja1000.h"
38 #define DEBUG_FILTER 0
39 #endif /*DEBUG_FILTER*/
45 #define DPRINTF(fmt, ...) \
48 qemu_log("[cansja]: " fmt , ## __VA_ARGS__); \
52 static void can_sja_software_reset(CanSJA1000State
*s
)
56 s
->status_pel
&= ~0x37;
57 s
->status_pel
|= 0x34;
59 s
->rxbuf_start
= 0x00;
64 void can_sja_hardware_reset(CanSJA1000State
*s
)
66 /* Reset by hardware, p10 */
69 s
->interrupt_pel
= 0x00;
71 s
->rxbuf_start
= 0x00;
77 s
->interrupt_bas
= 0x00;
79 qemu_irq_lower(s
->irq
);
83 void can_sja_single_filter(struct qemu_can_filter
*filter
,
84 const uint8_t *acr
, const uint8_t *amr
, int extended
)
87 filter
->can_id
= (uint32_t)acr
[0] << 21;
88 filter
->can_id
|= (uint32_t)acr
[1] << 13;
89 filter
->can_id
|= (uint32_t)acr
[2] << 5;
90 filter
->can_id
|= (uint32_t)acr
[3] >> 3;
92 filter
->can_id
|= QEMU_CAN_RTR_FLAG
;
95 filter
->can_mask
= (uint32_t)amr
[0] << 21;
96 filter
->can_mask
|= (uint32_t)amr
[1] << 13;
97 filter
->can_mask
|= (uint32_t)amr
[2] << 5;
98 filter
->can_mask
|= (uint32_t)amr
[3] >> 3;
99 filter
->can_mask
= ~filter
->can_mask
& QEMU_CAN_EFF_MASK
;
101 filter
->can_mask
|= QEMU_CAN_RTR_FLAG
;
104 filter
->can_id
= (uint32_t)acr
[0] << 3;
105 filter
->can_id
|= (uint32_t)acr
[1] >> 5;
107 filter
->can_id
|= QEMU_CAN_RTR_FLAG
;
110 filter
->can_mask
= (uint32_t)amr
[0] << 3;
111 filter
->can_mask
|= (uint32_t)amr
[1] << 5;
112 filter
->can_mask
= ~filter
->can_mask
& QEMU_CAN_SFF_MASK
;
113 if (!(amr
[1] & 0x10)) {
114 filter
->can_mask
|= QEMU_CAN_RTR_FLAG
;
120 void can_sja_dual_filter(struct qemu_can_filter
*filter
,
121 const uint8_t *acr
, const uint8_t *amr
, int extended
)
124 filter
->can_id
= (uint32_t)acr
[0] << 21;
125 filter
->can_id
|= (uint32_t)acr
[1] << 13;
127 filter
->can_mask
= (uint32_t)amr
[0] << 21;
128 filter
->can_mask
|= (uint32_t)amr
[1] << 13;
129 filter
->can_mask
= ~filter
->can_mask
& QEMU_CAN_EFF_MASK
& ~0x1fff;
131 filter
->can_id
= (uint32_t)acr
[0] << 3;
132 filter
->can_id
|= (uint32_t)acr
[1] >> 5;
134 filter
->can_id
|= QEMU_CAN_RTR_FLAG
;
137 filter
->can_mask
= (uint32_t)amr
[0] << 3;
138 filter
->can_mask
|= (uint32_t)amr
[1] >> 5;
139 filter
->can_mask
= ~filter
->can_mask
& QEMU_CAN_SFF_MASK
;
140 if (!(amr
[1] & 0x10)) {
141 filter
->can_mask
|= QEMU_CAN_RTR_FLAG
;
146 /* Details in DS-p22, what we need to do here is to test the data. */
148 int can_sja_accept_filter(CanSJA1000State
*s
,
149 const qemu_can_frame
*frame
)
152 struct qemu_can_filter filter
;
154 if (s
->clock
& 0x80) { /* PeliCAN Mode */
155 if (s
->mode
& (1 << 3)) { /* Single mode. */
156 if (frame
->can_id
& QEMU_CAN_EFF_FLAG
) { /* EFF */
157 can_sja_single_filter(&filter
,
158 s
->code_mask
+ 0, s
->code_mask
+ 4, 1);
160 if (!can_bus_filter_match(&filter
, frame
->can_id
)) {
164 can_sja_single_filter(&filter
,
165 s
->code_mask
+ 0, s
->code_mask
+ 4, 0);
167 if (!can_bus_filter_match(&filter
, frame
->can_id
)) {
171 if (frame
->can_id
& QEMU_CAN_RTR_FLAG
) { /* RTR */
175 if (frame
->can_dlc
== 0) {
179 if ((frame
->data
[0] & ~(s
->code_mask
[6])) !=
180 (s
->code_mask
[2] & ~(s
->code_mask
[6]))) {
184 if (frame
->can_dlc
< 2) {
188 if ((frame
->data
[1] & ~(s
->code_mask
[7])) ==
189 (s
->code_mask
[3] & ~(s
->code_mask
[7]))) {
195 } else { /* Dual mode */
196 if (frame
->can_id
& QEMU_CAN_EFF_FLAG
) { /* EFF */
197 can_sja_dual_filter(&filter
,
198 s
->code_mask
+ 0, s
->code_mask
+ 4, 1);
200 if (can_bus_filter_match(&filter
, frame
->can_id
)) {
204 can_sja_dual_filter(&filter
,
205 s
->code_mask
+ 2, s
->code_mask
+ 6, 1);
207 if (can_bus_filter_match(&filter
, frame
->can_id
)) {
213 can_sja_dual_filter(&filter
,
214 s
->code_mask
+ 0, s
->code_mask
+ 4, 0);
216 if (can_bus_filter_match(&filter
, frame
->can_id
)) {
219 expect
= s
->code_mask
[1] << 4;
220 expect
|= s
->code_mask
[3] & 0x0f;
222 mask
= s
->code_mask
[5] << 4;
223 mask
|= s
->code_mask
[7] & 0x0f;
226 if ((frame
->data
[0] & mask
) ==
232 can_sja_dual_filter(&filter
,
233 s
->code_mask
+ 2, s
->code_mask
+ 6, 0);
235 if (can_bus_filter_match(&filter
, frame
->can_id
)) {
247 static void can_display_msg(const char *prefix
, const qemu_can_frame
*msg
)
250 FILE *logfile
= qemu_log_lock();
252 qemu_log("%s%03X [%01d] %s %s",
254 msg
->can_id
& QEMU_CAN_EFF_MASK
,
256 msg
->can_id
& QEMU_CAN_EFF_FLAG
? "EFF" : "SFF",
257 msg
->can_id
& QEMU_CAN_RTR_FLAG
? "RTR" : "DAT");
259 for (i
= 0; i
< msg
->can_dlc
; i
++) {
260 qemu_log(" %02X", msg
->data
[i
]);
264 qemu_log_unlock(logfile
);
267 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 (frame
->can_dlc
> 8) {
282 if (buff
[0] & 0x80) { /* Extended */
283 frame
->can_id
|= QEMU_CAN_EFF_FLAG
;
284 frame
->can_id
|= buff
[1] << 21; /* ID.28~ID.21 */
285 frame
->can_id
|= buff
[2] << 13; /* ID.20~ID.13 */
286 frame
->can_id
|= buff
[3] << 5;
287 frame
->can_id
|= buff
[4] >> 3;
288 for (i
= 0; i
< frame
->can_dlc
; i
++) {
289 frame
->data
[i
] = buff
[5 + i
];
295 frame
->can_id
|= buff
[1] << 3;
296 frame
->can_id
|= buff
[2] >> 5;
297 for (i
= 0; i
< frame
->can_dlc
; i
++) {
298 frame
->data
[i
] = buff
[3 + i
];
307 static void buff2frame_bas(const uint8_t *buff
, qemu_can_frame
*frame
)
312 frame
->can_id
= ((buff
[0] << 3) & (0xff << 3)) + ((buff
[1] >> 5) & 0x07);
313 if (buff
[1] & 0x10) { /* RTR */
314 frame
->can_id
= QEMU_CAN_RTR_FLAG
;
316 frame
->can_dlc
= buff
[1] & 0x0f;
318 if (frame
->can_dlc
> 8) {
322 for (i
= 0; i
< frame
->can_dlc
; i
++) {
323 frame
->data
[i
] = buff
[2 + i
];
331 static int frame2buff_pel(const qemu_can_frame
*frame
, uint8_t *buff
)
334 int dlen
= frame
->can_dlc
;
336 if (frame
->can_id
& QEMU_CAN_ERR_FLAG
) { /* error frame, NOT support now. */
344 buff
[0] = 0x0f & frame
->can_dlc
; /* DLC */
345 if (frame
->can_id
& QEMU_CAN_RTR_FLAG
) { /* RTR */
348 if (frame
->can_id
& QEMU_CAN_EFF_FLAG
) { /* EFF */
350 buff
[1] = extract32(frame
->can_id
, 21, 8); /* ID.28~ID.21 */
351 buff
[2] = extract32(frame
->can_id
, 13, 8); /* ID.20~ID.13 */
352 buff
[3] = extract32(frame
->can_id
, 5, 8); /* ID.12~ID.05 */
353 buff
[4] = extract32(frame
->can_id
, 0, 5) << 3; /* ID.04~ID.00,xxx */
354 for (i
= 0; i
< dlen
; i
++) {
355 buff
[5 + i
] = frame
->data
[i
];
359 buff
[1] = extract32(frame
->can_id
, 3, 8); /* ID.10~ID.03 */
360 buff
[2] = extract32(frame
->can_id
, 0, 3) << 5; /* ID.02~ID.00,xxxxx */
361 for (i
= 0; i
< dlen
; i
++) {
362 buff
[3 + i
] = frame
->data
[i
];
371 static int frame2buff_bas(const qemu_can_frame
*frame
, uint8_t *buff
)
374 int dlen
= frame
->can_dlc
;
377 * EFF, no support for BasicMode
378 * No use for Error frames now,
379 * they could be used in future to update SJA1000 error state
381 if ((frame
->can_id
& QEMU_CAN_EFF_FLAG
) ||
382 (frame
->can_id
& QEMU_CAN_ERR_FLAG
)) {
390 buff
[0] = extract32(frame
->can_id
, 3, 8); /* ID.10~ID.03 */
391 buff
[1] = extract32(frame
->can_id
, 0, 3) << 5; /* ID.02~ID.00,xxxxx */
392 if (frame
->can_id
& QEMU_CAN_RTR_FLAG
) { /* RTR */
395 buff
[1] |= frame
->can_dlc
& 0x0f;
396 for (i
= 0; i
< dlen
; i
++) {
397 buff
[2 + i
] = frame
->data
[i
];
403 static void can_sja_update_pel_irq(CanSJA1000State
*s
)
405 if (s
->interrupt_en
& s
->interrupt_pel
) {
406 qemu_irq_raise(s
->irq
);
408 qemu_irq_lower(s
->irq
);
412 static void can_sja_update_bas_irq(CanSJA1000State
*s
)
414 if ((s
->control
>> 1) & s
->interrupt_bas
) {
415 qemu_irq_raise(s
->irq
);
417 qemu_irq_lower(s
->irq
);
421 void can_sja_mem_write(CanSJA1000State
*s
, hwaddr addr
, uint64_t val
,
424 qemu_can_frame frame
;
429 DPRINTF("write 0x%02llx addr 0x%02x\n",
430 (unsigned long long)val
, (unsigned int)addr
);
432 if (addr
> CAN_SJA_MEM_SIZE
) {
436 if (s
->clock
& 0x80) { /* PeliCAN Mode */
438 case SJA_MOD
: /* Mode register */
439 s
->mode
= 0x1f & val
;
440 if ((s
->mode
& 0x01) && ((val
& 0x01) == 0)) {
441 /* Go to operation mode from reset mode. */
442 if (s
->mode
& (1 << 3)) { /* Single mode. */
444 can_sja_single_filter(&s
->filter
[0],
445 s
->code_mask
+ 0, s
->code_mask
+ 4, 1);
448 can_sja_single_filter(&s
->filter
[1],
449 s
->code_mask
+ 0, s
->code_mask
+ 4, 0);
451 can_bus_client_set_filters(&s
->bus_client
, s
->filter
, 2);
452 } else { /* Dual mode */
454 can_sja_dual_filter(&s
->filter
[0],
455 s
->code_mask
+ 0, s
->code_mask
+ 4, 1);
457 can_sja_dual_filter(&s
->filter
[1],
458 s
->code_mask
+ 2, s
->code_mask
+ 6, 1);
461 can_sja_dual_filter(&s
->filter
[2],
462 s
->code_mask
+ 0, s
->code_mask
+ 4, 0);
464 can_sja_dual_filter(&s
->filter
[3],
465 s
->code_mask
+ 2, s
->code_mask
+ 6, 0);
467 can_bus_client_set_filters(&s
->bus_client
, s
->filter
, 4);
475 case SJA_CMR
: /* Command register. */
476 if (0x01 & val
) { /* Send transmission request. */
477 buff2frame_pel(s
->tx_buff
, &frame
);
479 can_display_msg("[cansja]: Tx request " , &frame
);
483 * Clear transmission complete status,
484 * and Transmit Buffer Status.
485 * write to the backends.
487 s
->status_pel
&= ~(3 << 2);
489 can_bus_client_send(&s
->bus_client
, &frame
, 1);
492 * Set transmission complete status
493 * and Transmit Buffer Status.
495 s
->status_pel
|= (3 << 2);
497 /* Clear transmit status. */
498 s
->status_pel
&= ~(1 << 5);
499 s
->interrupt_pel
|= 0x02;
500 can_sja_update_pel_irq(s
);
502 if (0x04 & val
) { /* Release Receive Buffer */
503 if (s
->rxmsg_cnt
<= 0) {
507 tmp8
= s
->rx_buff
[s
->rxbuf_start
]; count
= 0;
508 if (tmp8
& (1 << 7)) { /* EFF */
512 if (!(tmp8
& (1 << 6))) { /* DATA */
513 count
+= (tmp8
& 0x0f);
517 qemu_log("[cansja]: message released from "
518 "Rx FIFO cnt=%d, count=%d\n", s
->rx_cnt
, count
);
521 s
->rxbuf_start
+= count
;
522 s
->rxbuf_start
%= SJA_RCV_BUF_LEN
;
526 if (s
->rxmsg_cnt
== 0) {
527 s
->status_pel
&= ~(1 << 0);
528 s
->interrupt_pel
&= ~(1 << 0);
529 can_sja_update_pel_irq(s
);
532 if (0x08 & val
) { /* Clear data overrun */
533 s
->status_pel
&= ~(1 << 1);
534 s
->interrupt_pel
&= ~(1 << 3);
535 can_sja_update_pel_irq(s
);
538 case SJA_SR
: /* Status register */
539 case SJA_IR
: /* Interrupt register */
540 break; /* Do nothing */
541 case SJA_IER
: /* Interrupt enable register */
542 s
->interrupt_en
= val
;
544 case 16: /* RX frame information addr16-28. */
545 s
->status_pel
|= (1 << 5); /* Set transmit status. */
548 if (s
->mode
& 0x01) { /* Reset mode */
550 s
->code_mask
[addr
- 16] = val
;
552 } else { /* Operation mode */
553 s
->tx_buff
[addr
- 16] = val
; /* Store to TX buffer directly. */
560 } else { /* Basic Mode */
562 case SJA_BCAN_CTR
: /* Control register, addr 0 */
563 if ((s
->control
& 0x01) && ((val
& 0x01) == 0)) {
564 /* Go to operation mode from reset mode. */
565 s
->filter
[0].can_id
= (s
->code
<< 3) & (0xff << 3);
566 tmp
= (~(s
->mask
<< 3)) & (0xff << 3);
567 tmp
|= QEMU_CAN_EFF_FLAG
; /* Only Basic CAN Frame. */
568 s
->filter
[0].can_mask
= tmp
;
569 can_bus_client_set_filters(&s
->bus_client
, s
->filter
, 1);
573 } else if (!(s
->control
& 0x01) && !(val
& 0x01)) {
574 can_sja_software_reset(s
);
577 s
->control
= 0x1f & val
;
579 case SJA_BCAN_CMR
: /* Command register, addr 1 */
580 if (0x01 & val
) { /* Send transmission request. */
581 buff2frame_bas(s
->tx_buff
, &frame
);
583 can_display_msg("[cansja]: Tx request " , &frame
);
587 * Clear transmission complete status,
588 * and Transmit Buffer Status.
590 s
->status_bas
&= ~(3 << 2);
592 /* write to the backends. */
593 can_bus_client_send(&s
->bus_client
, &frame
, 1);
596 * Set transmission complete status,
597 * and Transmit Buffer Status.
599 s
->status_bas
|= (3 << 2);
601 /* Clear transmit status. */
602 s
->status_bas
&= ~(1 << 5);
603 s
->interrupt_bas
|= 0x02;
604 can_sja_update_bas_irq(s
);
606 if (0x04 & val
) { /* Release Receive Buffer */
607 if (s
->rxmsg_cnt
<= 0) {
611 tmp8
= s
->rx_buff
[(s
->rxbuf_start
+ 1) % SJA_RCV_BUF_LEN
];
612 count
= 2 + (tmp8
& 0x0f);
615 qemu_log("[cansja]: message released from "
616 "Rx FIFO cnt=%d, count=%d\n", s
->rx_cnt
, count
);
619 s
->rxbuf_start
+= count
;
620 s
->rxbuf_start
%= SJA_RCV_BUF_LEN
;
624 if (s
->rxmsg_cnt
== 0) {
625 s
->status_bas
&= ~(1 << 0);
626 s
->interrupt_bas
&= ~(1 << 0);
627 can_sja_update_bas_irq(s
);
630 if (0x08 & val
) { /* Clear data overrun */
631 s
->status_bas
&= ~(1 << 1);
632 s
->interrupt_bas
&= ~(1 << 3);
633 can_sja_update_bas_irq(s
);
643 s
->status_bas
|= (1 << 5); /* Set transmit status. */
646 if ((s
->control
& 0x01) == 0) { /* Operation mode */
647 s
->tx_buff
[addr
- 10] = val
; /* Store to TX buffer directly. */
657 uint64_t can_sja_mem_read(CanSJA1000State
*s
, hwaddr addr
, unsigned size
)
661 DPRINTF("read addr 0x%02x ...\n", (unsigned int)addr
);
663 if (addr
> CAN_SJA_MEM_SIZE
) {
667 if (s
->clock
& 0x80) { /* PeliCAN Mode */
669 case SJA_MOD
: /* Mode register, addr 0 */
672 case SJA_CMR
: /* Command register, addr 1 */
673 temp
= 0x00; /* Command register, cannot be read. */
675 case SJA_SR
: /* Status register, addr 2 */
676 temp
= s
->status_pel
;
678 case SJA_IR
: /* Interrupt register, addr 3 */
679 temp
= s
->interrupt_pel
;
680 s
->interrupt_pel
= 0;
682 s
->interrupt_pel
|= (1 << 0); /* Receive interrupt. */
684 can_sja_update_pel_irq(s
);
686 case SJA_IER
: /* Interrupt enable register, addr 4 */
687 temp
= s
->interrupt_en
;
689 case 5: /* Reserved */
690 case 6: /* Bus timing 0, hardware related, not support now. */
691 case 7: /* Bus timing 1, hardware related, not support now. */
693 * Output control register, hardware related,
694 * not supported for now.
697 case 10 ... 15: /* Reserved */
702 if (s
->mode
& 0x01) { /* Reset mode */
704 temp
= s
->code_mask
[addr
- 16];
708 } else { /* Operation mode */
709 temp
= s
->rx_buff
[(s
->rxbuf_start
+ addr
- 16) %
719 } else { /* Basic Mode */
721 case SJA_BCAN_CTR
: /* Control register, addr 0 */
724 case SJA_BCAN_SR
: /* Status register, addr 2 */
725 temp
= s
->status_bas
;
727 case SJA_BCAN_IR
: /* Interrupt register, addr 3 */
728 temp
= s
->interrupt_bas
;
729 s
->interrupt_bas
= 0;
731 s
->interrupt_bas
|= (1 << 0); /* Receive interrupt. */
733 can_sja_update_bas_irq(s
);
742 temp
= s
->rx_buff
[(s
->rxbuf_start
+ addr
- 20) % SJA_RCV_BUF_LEN
];
752 DPRINTF("read addr 0x%02x, %d bytes, content 0x%02lx\n",
753 (int)addr
, size
, (long unsigned int)temp
);
758 bool can_sja_can_receive(CanBusClientState
*client
)
760 CanSJA1000State
*s
= container_of(client
, CanSJA1000State
, bus_client
);
762 if (s
->clock
& 0x80) { /* PeliCAN Mode */
763 if (s
->mode
& 0x01) { /* reset mode. */
766 } else { /* BasicCAN mode */
767 if (s
->control
& 0x01) {
772 return true; /* always return true, when operation mode */
775 ssize_t
can_sja_receive(CanBusClientState
*client
, const qemu_can_frame
*frames
,
778 CanSJA1000State
*s
= container_of(client
, CanSJA1000State
, bus_client
);
779 static uint8_t rcv
[SJA_MSG_MAX_LEN
];
782 const qemu_can_frame
*frame
= frames
;
784 if (frames_cnt
<= 0) {
787 if (frame
->flags
& QEMU_CAN_FRMF_TYPE_FD
) {
789 can_display_msg("[cansja]: ignor fd frame ", frame
);
795 can_display_msg("[cansja]: receive ", frame
);
798 if (s
->clock
& 0x80) { /* PeliCAN Mode */
800 /* the CAN controller is receiving a message */
801 s
->status_pel
|= (1 << 4);
803 if (can_sja_accept_filter(s
, frame
) == 0) {
804 s
->status_pel
&= ~(1 << 4);
806 qemu_log("[cansja]: filter rejects message\n");
811 ret
= frame2buff_pel(frame
, rcv
);
813 s
->status_pel
&= ~(1 << 4);
815 qemu_log("[cansja]: message store failed\n");
817 return ret
; /* maybe not support now. */
820 if (s
->rx_cnt
+ ret
> SJA_RCV_BUF_LEN
) { /* Data overrun. */
821 s
->status_pel
|= (1 << 1); /* Overrun status */
822 s
->interrupt_pel
|= (1 << 3);
823 s
->status_pel
&= ~(1 << 4);
825 qemu_log("[cansja]: receive FIFO overrun\n");
827 can_sja_update_pel_irq(s
);
833 qemu_log("[cansja]: message stored in receive FIFO\n");
836 for (i
= 0; i
< ret
; i
++) {
837 s
->rx_buff
[(s
->rx_ptr
++) % SJA_RCV_BUF_LEN
] = rcv
[i
];
839 s
->rx_ptr
%= SJA_RCV_BUF_LEN
; /* update the pointer. */
841 s
->status_pel
|= 0x01; /* Set the Receive Buffer Status. DS-p23 */
842 s
->interrupt_pel
|= 0x01;
843 s
->status_pel
&= ~(1 << 4);
844 s
->status_pel
|= (1 << 0);
845 can_sja_update_pel_irq(s
);
846 } else { /* BasicCAN mode */
848 /* the CAN controller is receiving a message */
849 s
->status_bas
|= (1 << 4);
851 ret
= frame2buff_bas(frame
, rcv
);
853 s
->status_bas
&= ~(1 << 4);
855 qemu_log("[cansja]: message store failed\n");
857 return ret
; /* maybe not support now. */
860 if (s
->rx_cnt
+ ret
> SJA_RCV_BUF_LEN
) { /* Data overrun. */
861 s
->status_bas
|= (1 << 1); /* Overrun status */
862 s
->status_bas
&= ~(1 << 4);
863 s
->interrupt_bas
|= (1 << 3);
864 can_sja_update_bas_irq(s
);
866 qemu_log("[cansja]: receive FIFO overrun\n");
874 qemu_log("[cansja]: message stored\n");
877 for (i
= 0; i
< ret
; i
++) {
878 s
->rx_buff
[(s
->rx_ptr
++) % SJA_RCV_BUF_LEN
] = rcv
[i
];
880 s
->rx_ptr
%= SJA_RCV_BUF_LEN
; /* update the pointer. */
882 s
->status_bas
|= 0x01; /* Set the Receive Buffer Status. DS-p15 */
883 s
->status_bas
&= ~(1 << 4);
884 s
->interrupt_bas
|= (1 << 0);
885 can_sja_update_bas_irq(s
);
890 static CanBusClientInfo can_sja_bus_client_info
= {
891 .can_receive
= can_sja_can_receive
,
892 .receive
= can_sja_receive
,
896 int can_sja_connect_to_bus(CanSJA1000State
*s
, CanBusState
*bus
)
898 s
->bus_client
.info
= &can_sja_bus_client_info
;
904 if (can_bus_insert_client(bus
, &s
->bus_client
) < 0) {
911 void can_sja_disconnect(CanSJA1000State
*s
)
913 can_bus_remove_client(&s
->bus_client
);
916 int can_sja_init(CanSJA1000State
*s
, qemu_irq irq
)
920 qemu_irq_lower(s
->irq
);
922 can_sja_hardware_reset(s
);
927 const VMStateDescription vmstate_qemu_can_filter
= {
928 .name
= "qemu_can_filter",
930 .minimum_version_id
= 1,
931 .minimum_version_id_old
= 1,
932 .fields
= (VMStateField
[]) {
933 VMSTATE_UINT32(can_id
, qemu_can_filter
),
934 VMSTATE_UINT32(can_mask
, qemu_can_filter
),
935 VMSTATE_END_OF_LIST()
939 static int can_sja_post_load(void *opaque
, int version_id
)
941 CanSJA1000State
*s
= opaque
;
942 if (s
->clock
& 0x80) { /* PeliCAN Mode */
943 can_sja_update_pel_irq(s
);
945 can_sja_update_bas_irq(s
);
950 /* VMState is needed for live migration of QEMU images */
951 const VMStateDescription vmstate_can_sja
= {
954 .minimum_version_id
= 1,
955 .minimum_version_id_old
= 1,
956 .post_load
= can_sja_post_load
,
957 .fields
= (VMStateField
[]) {
958 VMSTATE_UINT8(mode
, CanSJA1000State
),
960 VMSTATE_UINT8(status_pel
, CanSJA1000State
),
961 VMSTATE_UINT8(interrupt_pel
, CanSJA1000State
),
962 VMSTATE_UINT8(interrupt_en
, CanSJA1000State
),
963 VMSTATE_UINT8(rxmsg_cnt
, CanSJA1000State
),
964 VMSTATE_UINT8(rxbuf_start
, CanSJA1000State
),
965 VMSTATE_UINT8(clock
, CanSJA1000State
),
967 VMSTATE_BUFFER(code_mask
, CanSJA1000State
),
968 VMSTATE_BUFFER(tx_buff
, CanSJA1000State
),
970 VMSTATE_BUFFER(rx_buff
, CanSJA1000State
),
972 VMSTATE_UINT32(rx_ptr
, CanSJA1000State
),
973 VMSTATE_UINT32(rx_cnt
, CanSJA1000State
),
975 VMSTATE_UINT8(control
, CanSJA1000State
),
977 VMSTATE_UINT8(status_bas
, CanSJA1000State
),
978 VMSTATE_UINT8(interrupt_bas
, CanSJA1000State
),
979 VMSTATE_UINT8(code
, CanSJA1000State
),
980 VMSTATE_UINT8(mask
, CanSJA1000State
),
982 VMSTATE_STRUCT_ARRAY(filter
, CanSJA1000State
, 4, 0,
983 vmstate_qemu_can_filter
, qemu_can_filter
),
986 VMSTATE_END_OF_LIST()