📄 console-generic.c
字号:
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 + -