📄 canbus.c
字号:
candev[i]->msg10.cfg = I82527_MSG_CFG_DIR ; /* dir is xmit */ candev[i]->msg10.ctrl0 = I82527_MSG_CTRL_MSGVAL_CLR |/* this msg invalid */ I82527_MSG_CTRL_TXIE_CLR |/* no tx interrupts */ I82527_MSG_CTRL_RXIE_CLR | /* no rx interrupts */ I82527_MSG_CTRL_INTPND_CLR; candev[i]->msg11.cfg = I82527_MSG_CFG_DIR ; /* dir is xmit */ candev[i]->msg11.ctrl0 = I82527_MSG_CTRL_MSGVAL_CLR |/* this msg invalid */ I82527_MSG_CTRL_TXIE_CLR |/* no tx interrupts */ I82527_MSG_CTRL_RXIE_CLR |/* no rx interrupts */ I82527_MSG_CTRL_INTPND_CLR; candev[i]->msg12.cfg = I82527_MSG_CFG_DIR ; /* dir is xmit */ candev[i]->msg12.ctrl0 = I82527_MSG_CTRL_MSGVAL_CLR |/* this msg invalid */ I82527_MSG_CTRL_TXIE_CLR |/* no tx interrupts */ I82527_MSG_CTRL_RXIE_CLR |/* no rx interrupts */ I82527_MSG_CTRL_INTPND_CLR; candev[i]->msg13.cfg = I82527_MSG_CFG_DIR ; /* dir is xmit */ candev[i]->msg13.ctrl0 = I82527_MSG_CTRL_MSGVAL_CLR |/* this msg invalid */ I82527_MSG_CTRL_TXIE_CLR |/* no tx interrupts */ I82527_MSG_CTRL_RXIE_CLR |/* no rx interrupts */ I82527_MSG_CTRL_INTPND_CLR; candev[i]->msg14.cfg = I82527_MSG_CFG_DIR ; /* dir is xmit */ candev[i]->msg14.ctrl0 = I82527_MSG_CTRL_MSGVAL_CLR |/* this msg invalid */ I82527_MSG_CTRL_TXIE_CLR |/* no tx interrupts */ I82527_MSG_CTRL_RXIE_CLR |/* no rx interrupts */ I82527_MSG_CTRL_INTPND_CLR; candev[i]->msg15.cfg = 0 ; /* dir is rcv */ candev[i]->msg15.ctrl0 = I82527_MSG_CTRL_MSGVAL_CLR |/* this msg invalid */ I82527_MSG_CTRL_TXIE_CLR |/* no tx interrupts */ I82527_MSG_CTRL_RXIE_CLR |/* no rx interrupts */ I82527_MSG_CTRL_INTPND_CLR; candev[i]->msg15.ctrl1 = I82527_MSG_CTRL_RMTPND_CLR | I82527_MSG_CTRL_TXRQ_CLR | I82527_MSG_CTRL_MSGLST_CLR | I82527_MSG_CTRL_NEWDAT_CLR; } if ((status=rtems_io_register_name ("/dev/can0", major, 0)) != RTEMS_SUCCESSFUL) { rtems_fatal_error_occurred (status); } if ((status=rtems_io_register_name ("/dev/can1", major, 1)) != RTEMS_SUCCESSFUL) { rtems_fatal_error_occurred (status); } if ((status=rtems_io_register_name ("/dev/can2", major, 2)) != RTEMS_SUCCESSFUL) { rtems_fatal_error_occurred (status); } return RTEMS_SUCCESSFUL;}rtems_device_driver canbus_open( rtems_device_major_number major, rtems_device_minor_number minor, void * arg){ /* msg is in use, rx interrupts are enabled */ candev[minor]->msg15.ctrl0 = 0xff & (I82527_MSG_CTRL_MSGVAL_SET | I82527_MSG_CTRL_RXIE_SET); candev[minor]->ctrl |= I82527_CTRL_IE; candev[minor]->ctrl &= ~(I82527_CTRL_CCE | I82527_CTRL_INIT); switch (minor) { case 0: m8xx.simask |= M8xx_SIMASK_IRM3; break; case 1: m8xx.simask |= M8xx_SIMASK_IRM4; break; case 2: m8xx.simask |= M8xx_SIMASK_IRM2; break; default: return 0xffffffff; } return RTEMS_SUCCESSFUL;}rtems_device_driver canbus_close( rtems_device_major_number major, rtems_device_minor_number minor, void * arg){ /* msg is not in use, rx & txinterrupts are disbled */ candev[minor]->msg15.ctrl0 = 0xff & (I82527_MSG_CTRL_MSGVAL_CLR | I82527_MSG_CTRL_RXIE_CLR | I82527_MSG_CTRL_TXIE_CLR); /* Take transceiver off the bus, enable cfg. reg. writes */ candev[minor]->ctrl |= (I82527_CTRL_CCE | I82527_CTRL_INIT); return RTEMS_SUCCESSFUL;}rtems_device_driver canbus_read( rtems_device_major_number major, rtems_device_minor_number minor, void * arg){ i82527_msg_t *msg; int i; int tmpHead; msg = arg; tmpHead = rxMsgBufHead[minor]; while (1){ if ((tmpHead == rxMsgBufTail[minor]) && !(rxMsgBuf[minor][tmpHead].ctrl1 & I82527_MSG_CTRL_NEWDAT)) { break; } if (rxMsgBuf[minor][tmpHead].ctrl1 & I82527_MSG_CTRL_NEWDAT) { int pkt_len; msg->ctrl0 = rxMsgBuf[minor][tmpHead].ctrl0; msg->ctrl1 = rxMsgBuf[minor][tmpHead].ctrl1; msg->arb = rxMsgBuf[minor][tmpHead].arb; msg->cfg = rxMsgBuf[minor][tmpHead].cfg; pkt_len = (msg->cfg >> 4) & 0xf; for (i=0; i<pkt_len; i++) { msg->data[i] = rxMsgBuf[minor][tmpHead].data[i]; } rxMsgBuf[minor][tmpHead].ctrl1 = 0xff & I82527_MSG_CTRL_NEWDAT_CLR; tmpHead++; if (tmpHead == RX_CAN_BUF_SIZE) { tmpHead = 0; } rxMsgBufHead[minor] = tmpHead; return RTEMS_SUCCESSFUL; } tmpHead++; if (tmpHead == RX_CAN_BUF_SIZE) { tmpHead = 0; } if (tmpHead == rxMsgBufHead[minor]) { break; } } return RTEMS_UNSATISFIED;} rtems_device_driver canbus_write( rtems_device_major_number major, rtems_device_minor_number minor, void * arg){ i82527_msg_t *msg; int i; msg = arg; while(candev[minor]->msg1.ctrl1 & I82527_MSG_CTRL_TXRQ){ continue; } candev[minor]->msg1.ctrl1 = 0xff & I82527_MSG_CTRL_CPUUPD_SET; candev[minor]->msg1.cfg = msg->cfg; candev[minor]->msg1.arb = msg->arb; for (i=0; i < ((msg->cfg >> 4) & 0xff); i++) { candev[minor]->msg1.data[i] = msg->data[i]; } candev[minor]->msg1.ctrl0 = 0xff & (I82527_MSG_CTRL_INTPND_CLR | I82527_MSG_CTRL_MSGVAL_SET | I82527_MSG_CTRL_TXIE_CLR); candev[minor]->msg1.cfg |= I82527_MSG_CFG_DIR; candev[minor]->msg1.ctrl1 = 0xff & (I82527_MSG_CTRL_NEWDAT_SET | I82527_MSG_CTRL_CPUUPD_CLR | I82527_MSG_CTRL_TXRQ_SET); return RTEMS_SUCCESSFUL;}rtems_device_driver canbus_control( rtems_device_major_number major, rtems_device_minor_number minor, void * arg){ return RTEMS_SUCCESSFUL;}/* part of old canbus_read */#if 0 for (i=0; i < RX_CAN_BUF_SIZE) { if (rxMsgBuf[minor][i].ctrl1 & I82527_MSG_CTRL_NEWDAT) break; } if (i < RX_CAN_BUF_SIZE) { int pkt_len; int j; msg.arb = rxMsgBuf[minor][i].arb; msg.cfg = rxMsgBuf[minor][i].cfg; pkt_len = (msg.cfg >> 4) & 0xf; for (j=0; j < pkt_len; j++) msg.data[j] = rxMsgBuf[minor][i].data[j]; /* wait until there is a msg */ while (!(candev->msg15.ctrl1 & I82527_MSG_CTRL_NEWDAT)) continue; msg->ctrl1 = candev->msg15.ctrl1; msg->cfg = candev->msg15.cfg; msg->arb = candev->msg15.arb; for (i=0; i < ((candev->msg15.cfg >> 4) & 0xff); i++) { msg->data[i] = candev->msg15.data[i]; } candev->msg15.ctrl0 = 0xff & (I82527_MSG_CTRL_MSGVAL_SET | I82527_MSG_CTRL_INTPND_CLR); candev->msg15.ctrl1 = 0xff & (I82527_MSG_CTRL_NEWDAT_CLR | I82527_MSG_CTRL_RMTPND_CLR); candev->status = 0x0; return RTEMS_SUCCESSFUL;#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -