⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 canbus.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -