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

📄 console-generic.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
📖 第 1 页 / 共 3 页
字号:
  sccparms->un.uart.uaddr[1] = 0;   /* Not in multidrop mode, so clear */  sccparms->un.uart.toseq  = 0;     /* Tx Out-Of-SEQuence--no XON/XOFF now */  sccparms->un.uart.character[0] = 0x8000; /* Entry is invalid */  sccparms->un.uart.character[1] = 0x8000; /* Entry is invalid */  sccparms->un.uart.character[2] = 0x8000; /* Entry is invalid */  sccparms->un.uart.character[3] = 0x8000; /* Entry is invalid */  sccparms->un.uart.character[4] = 0x8000; /* Entry is invalid */  sccparms->un.uart.character[5] = 0x8000; /* Entry is invalid */  sccparms->un.uart.character[6] = 0x8000; /* Entry is invalid */  sccparms->un.uart.character[7] = 0x8000; /* Entry is invalid */  sccparms->un.uart.rccm = 0xc0ff;  /* No masking */  /*   * Set up the Receive Buffer Descriptor   */  RxBd[minor]->status = M8260_BD_EMPTY | M8260_BD_WRAP | M8260_BD_INTERRUPT;  RxBd[minor]->length = 0;  RxBd[minor]->buffer = rxBuf[minor];  /*   * Setup the Transmit Buffer Descriptor   */  TxBd[minor]->status = M8260_BD_WRAP; /*   * Set up SCCx general and protocol-specific mode registers   */  sccregs->gsmr_h = 0x00000020;     /* RFW=low latency operation */  sccregs->gsmr_l = 0x00028004;     /* TDCR=RDCR=16x clock mode, MODE=uart*/  sccregs->scce = ~0;               /* Clear any pending event */  sccregs->sccm = 0;                /* Mask all interrupt/event sources */  sccregs->psmr = 0x3000;           /* Normal operation & mode, 1 stop bit,                                       8 data bits, no parity */  sccregs->dsr = 0x7E7E;            /* No fractional stop bits */  sccregs->gsmr_l = 0x00028034;     /* ENT=enable Tx, ENR=enable Rx */  /*   *  Initialize the Rx and Tx with the new parameters.   */  switch (minor) {    case SCC1_MINOR:      m8xx_cp_execute_cmd (M8260_CR_OP_INIT_RX_TX | M8260_CR_SCC1);      break;    case SCC2_MINOR:      m8xx_cp_execute_cmd (M8260_CR_OP_INIT_RX_TX | M8260_CR_SCC2);      break;    case SCC3_MINOR:      m8xx_cp_execute_cmd (M8260_CR_OP_INIT_RX_TX | M8260_CR_SCC3);      break;    case SCC4_MINOR:      m8xx_cp_execute_cmd (M8260_CR_OP_INIT_RX_TX | M8260_CR_SCC4);      break;  }  if ( (mbx8xx_console_get_configuration() & 0x06) == 0x02 ) {    switch (minor) {      case SCC1_MINOR:	consoleIrqData.name = BSP_CPM_IRQ_SCC1;        consoleIrqData.hdl = m8xx_scc1_interrupt_handler;		break;      case SCC2_MINOR:	consoleIrqData.name = BSP_CPM_IRQ_SCC2;        consoleIrqData.hdl = m8xx_scc2_interrupt_handler;	break;      case SCC3_MINOR:	consoleIrqData.name = BSP_CPM_IRQ_SCC3;        consoleIrqData.hdl = m8xx_scc3_interrupt_handler;	break;      case SCC4_MINOR:	consoleIrqData.name = BSP_CPM_IRQ_SCC4;        consoleIrqData.hdl = m8xx_scc4_interrupt_handler;	break;	    }    if (!BSP_install_rtems_irq_handler (&consoleIrqData)) {      printk("Unable to connect SCC Irq handler\n");      rtems_fatal_error_occurred(1);    }  }}void m8xx_smc_enable(const rtems_irq_connect_data* ptr){  volatile m8260SMCRegisters_t *smcregs = 0;  switch (ptr->name) {  case BSP_CPM_IRQ_SMC1 :    smcregs = &m8260.smc1;    break;  case BSP_CPM_IRQ_SMC2 :    smcregs = &m8260.smc2;    break;  default:    break;  }  smcregs->smcm = 3;}void m8xx_smc_disable(const rtems_irq_connect_data* ptr){  volatile m8260SMCRegisters_t *smcregs = 0;  switch (ptr->name) {  case BSP_CPM_IRQ_SMC1 :    smcregs = &m8260.smc1;    break;  case BSP_CPM_IRQ_SMC2 :    smcregs = &m8260.smc2;    break;  default:    break;  }  smcregs->smcm &= (~3);}int m8xx_smc_isOn(const rtems_irq_connect_data* ptr){ return BSP_irq_enabled_at_cpm (ptr->name);}voidm8xx_uart_smc_initialize (int minor){  unsigned char brg;  volatile m8260SMCparms_t *smcparms = 0;  volatile m8260SMCRegisters_t *smcregs = 0;  /*   * Check that minor number is valid   */  if ( (minor < SMC1_MINOR) || (minor > SMC2_MINOR) )     return;  /* Get the simode clock source bit values for 9600 bps */  if( minor == SMC1_MINOR )    brg = m8xx_get_brg(M8260_SMC1_BRGS, 9600*16);  else    brg = m8xx_get_brg(M8260_SMC2_BRGS, 9600*16);  /*   * Allocate buffer descriptors   */  RxBd[minor] = m8xx_bd_allocate (1);  TxBd[minor] = m8xx_bd_allocate (1);  /*   *  Get the address of the parameter RAM for the specified port,   *  configure I/O port B and put SMC in NMSI mode, connect the   *  SMC to the appropriate BRG.   *   *  SMC2 RxD is shared with port B bit 20   *  SMC2 TxD is shared with port B bit 21   *  SMC1 RxD is shared with port B bit 24   *  SMC1 TxD is shared with port B bit 25   */  switch (minor) {    case SMC1_MINOR:      smcparms = &m8260.smc1p;      smcregs  = &m8260.smc1;#if 0      m8260.pbpar |=  0x000000C0;    /* PB24 & PB25 are dedicated peripheral pins */      m8260.pbdir &= ~0x000000C0;    /* PB24 & PB25 must not drive UART lines */      m8260.pbodr &= ~0x000000C0;    /* PB24 & PB25 are not open drain */      m8260.simode &= 0xFFFF0FFF;    /* Clear SMC1CS & SMC1 for NMSI mode */      m8260.simode |= brg << 12;     /* SMC1CS = brg */#endif      break;    case SMC2_MINOR:      smcparms = &m8260.smc2p;      smcregs = &m8260.smc2;#if 0      m8260.pbpar |=  0x00000C00;    /* PB20 & PB21 are dedicated peripheral pins */      m8260.pbdir &= ~0x00000C00;    /* PB20 & PB21 must not drive the UART lines */      m8260.pbodr &= ~0x00000C00;    /* PB20 & PB21 are not open drain */            m8260.simode &= 0x0FFFFFFF;    /* Clear SMC2CS & SMC2 for NMSI mode */      m8260.simode |= brg << 28;     /* SMC2CS = brg */#endif      break;  }    /*   * Set up SMC parameter RAM common to all protocols   */  smcparms->rbase = (char *)RxBd[minor] - (char *)&m8260;  smcparms->tbase = (char *)TxBd[minor] - (char *)&m8260;  smcparms->rfcr = M8260_RFCR_MOT | M8260_RFCR_60X_BUS;  smcparms->tfcr = M8260_TFCR_MOT | M8260_TFCR_60X_BUS;  if ( (mbx8xx_console_get_configuration() & 0x06) == 0x02 )    smcparms->mrblr = RXBUFSIZE;    /* Maximum Rx buffer size */  else    smcparms->mrblr = 1;            /* Maximum Rx buffer size */  /*   * Set up SMC1 parameter RAM UART-specific parameters   */  smcparms->un.uart.max_idl = 10;   /* Set nb of idle chars to close buffer */  smcparms->un.uart.brkcr = 0;      /* Set nb of breaks to send for STOP Tx */  smcparms->un.uart.brkec = 0;      /* Clear break counter */  /*   * Set up the Receive Buffer Descriptor   */  RxBd[minor]->status = M8260_BD_EMPTY | M8260_BD_WRAP | M8260_BD_INTERRUPT;  RxBd[minor]->length = 0;  RxBd[minor]->buffer = rxBuf[minor];  /*   * Setup the Transmit Buffer Descriptor   */  TxBd[minor]->status = M8260_BD_WRAP;  /*   * Set up SMCx general and protocol-specific mode registers   */  smcregs->smce = ~0;               /* Clear any pending events */  smcregs->smcm = 0;                /* Enable SMC Rx & Tx interrupts */  smcregs->smcmr = M8260_SMCMR_CLEN(9) | M8260_SMCMR_SM_UART;  /*   * Send "Init parameters" command   */  switch (minor) {    case SMC1_MINOR:      m8xx_cp_execute_cmd (M8260_CR_OP_INIT_RX_TX | M8260_CR_SMC1);      break;    case SMC2_MINOR:      m8xx_cp_execute_cmd (M8260_CR_OP_INIT_RX_TX | M8260_CR_SMC2);      break;  }    /*   * Enable receiver and transmitter   */  smcregs->smcmr |= M8260_SMCMR_TEN | M8260_SMCMR_REN;  if ( (mbx8xx_console_get_configuration() & 0x06) == 0x02 ) {    consoleIrqData.on = m8xx_smc_enable;    consoleIrqData.off = m8xx_smc_disable;    consoleIrqData.isOn = m8xx_smc_isOn;    switch (minor) {      case SMC1_MINOR:	consoleIrqData.name = BSP_CPM_IRQ_SMC1;	consoleIrqData.hdl  = m8xx_smc1_interrupt_handler;	break;      case SMC2_MINOR:	consoleIrqData.name = BSP_CPM_IRQ_SMC2;	consoleIrqData.hdl  = m8xx_smc2_interrupt_handler;	break;#if 0      case SMC1_MINOR:        rtems_interrupt_catch (m8xx_smc1_interrupt_handler,                                    PPC_IRQ_CPM_SMC1,                                    &old_handler[minor]);        smcregs->smcm = 3;            /* Enable SMC1 Rx & Tx interrupts */        m8260.sipnr_l |= M8260_SIMASK_SMC1;      /* Clear pending register */        m8260.simr_l  |= M8260_SIMASK_SMC1;      /* Enable SMC1 interrupts */        break;            case SMC2_MINOR:        rtems_interrupt_catch (m8xx_smc2_interrupt_handler,                                    PPC_IRQ_CPM_SMC2,                                    &old_handler[minor]);        smcregs->smcm = 3;            /* Enable SMC2 Rx & Tx interrupts */        m8260.sipnr_l |= M8260_SIMASK_SMC2;      /* Clear pending register */        m8260.simr_l  |= M8260_SIMASK_SMC2;      /* Enable SMC2 interrupts */        break;#endif    }    if (!BSP_install_rtems_irq_handler (&consoleIrqData)) {      printk("Unable to connect SMC Irq handler\n");      rtems_fatal_error_occurred(1);    }  }}voidm8xx_uart_initialize(void){}void m8xx_uart_interrupts_initialize(void){#ifdef mpc8260  /* CHECK THIS */#else#if defined(mpc860)  m8xx.cicr = 0x00E43F80;           /* SCaP=SCC1, SCbP=SCC2, SCcP=SCC3,                                       SCdP=SCC4, IRL=1, HP=PC15, IEN=1 */#else  m8xx.cicr = 0x00043F80;           /* SCaP=SCC1, SCbP=SCC2, IRL=1, HP=PC15, IEN=1 */#endif  m8xx.simask |= M8xx_SIMASK_LVM1;  /* Enable level interrupts */#endif}intm8xx_uart_pollRead(  int minor){  unsigned char c;  if (RxBd[minor]->status & M8260_BD_EMPTY) {    return -1;  }  rtems_cache_invalidate_multiple_data_lines(     (const void *) RxBd[minor]->buffer,    RxBd[minor]->length  );  c = ((char *)RxBd[minor]->buffer)[0];  RxBd[minor]->status = M8260_BD_EMPTY | M8260_BD_WRAP;  return c;}/* *  TODO: Get a free buffer and set it up. */int m8xx_uart_write(  int minor,  const char *buf,  int len){  while( (TxBd[minor]->status) & M8260_BD_READY );  rtems_cache_flush_multiple_data_lines( buf, len );  TxBd[minor]->buffer = (char *) buf;  TxBd[minor]->length = len;  TxBd[minor]->status = M8260_BD_READY | M8260_BD_WRAP | M8260_BD_INTERRUPT;  return 0;}  intm8xx_uart_pollWrite(  int minor,  const char *buf,  int len){  while (len--) {    while (TxBd[minor]->status & M8260_BD_READY)      continue;    txBuf[minor] = *buf++;    rtems_cache_flush_multiple_data_lines( (void *)&txBuf[minor], 1 );    TxBd[minor]->buffer = &txBuf[minor];    TxBd[minor]->length = 1;    TxBd[minor]->status = M8260_BD_READY | M8260_BD_WRAP;  }  return 0;}voidm8xx_uart_reserve_resources(  rtems_configuration_table *configuration){  rtems_termios_reserve_resources (configuration, NUM_PORTS);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -