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