can_sja1000.c 29 KB

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