Changeset 68920e7f in rtems
- Timestamp:
- 09/12/18 08:43:02 (6 years ago)
- Branches:
- 5, master
- Children:
- d22147e
- Parents:
- 53fb03fe
- git-author:
- Sebastian Huber <sebastian.huber@…> (09/12/18 08:43:02)
- git-committer:
- Sebastian Huber <sebastian.huber@…> (09/17/18 06:56:32)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
bsps/powerpc/tqm8xx/console/console.c
r53fb03fe r68920e7f 115 115 * Interrupt-driven callback 116 116 */ 117 static int m8xx_scc_mode[CONS_CHN_CNT];118 static void *sccttyp[CONS_CHN_CNT];119 117 typedef struct m8xx_console_chan_desc_s { 118 void *tty; 119 volatile m8xxBufferDescriptor_t *sccFrstRxBd; 120 volatile m8xxBufferDescriptor_t *sccCurrRxBd; 121 volatile m8xxBufferDescriptor_t *sccFrstTxBd; 122 volatile m8xxBufferDescriptor_t *sccPrepTxBd; 123 volatile m8xxBufferDescriptor_t *sccDequTxBd; 120 124 bool is_scc; /* true for SCC */ 121 125 struct { … … 127 131 volatile m8xxSMCRegisters_t *smcr; 128 132 } regs; 133 int chan; 134 rtems_termios_device_mode mode; 129 135 rtems_vector_number ivec_src; 130 136 int cr_chan_code; … … 138 144 .parms = {(m8xxSCCparms_t *)&(m8xx.scc1p),NULL}, 139 145 .regs = {&(m8xx.scc1),NULL}, 146 .chan = CONS_CHN_SCC1, 140 147 .ivec_src = BSP_CPM_IRQ_SCC1, 141 148 .cr_chan_code = M8xx_CR_CHAN_SCC1, … … 145 152 .parms = {&(m8xx.scc2p),NULL}, 146 153 .regs = {&(m8xx.scc2),NULL}, 154 .chan = CONS_CHN_SCC2, 147 155 .ivec_src = BSP_CPM_IRQ_SCC2, 148 156 .cr_chan_code = M8xx_CR_CHAN_SCC2, … … 152 160 .parms = {&(m8xx.scc3p),NULL}, 153 161 .regs = {&(m8xx.scc3),NULL}, 162 .chan = CONS_CHN_SCC3, 154 163 .ivec_src = BSP_CPM_IRQ_SCC3, 155 164 .cr_chan_code = M8xx_CR_CHAN_SCC3, … … 159 168 .parms = {&(m8xx.scc4p),NULL}, 160 169 .regs = {&(m8xx.scc4),NULL}, 170 .chan = CONS_CHN_SCC4, 161 171 .ivec_src = BSP_CPM_IRQ_SCC4, 162 172 .cr_chan_code = M8xx_CR_CHAN_SCC4, … … 166 176 .parms = {NULL,&(m8xx.smc1p)}, 167 177 .regs = {NULL,&(m8xx.smc1)}, 178 .chan = CONS_CHN_SMC1, 168 179 .ivec_src = BSP_CPM_IRQ_SMC1, 169 180 .cr_chan_code = M8xx_CR_CHAN_SMC1, … … 173 184 .parms = {NULL,&(m8xx.smc2p)}, 174 185 .regs = {NULL,&(m8xx.smc2)}, 186 .chan = CONS_CHN_SMC2, 175 187 .ivec_src = BSP_CPM_IRQ_SMC2_OR_PIP, 176 188 .cr_chan_code = M8xx_CR_CHAN_SMC2, 177 189 .brg_used = -1}}; 178 190 179 #define CHN_PARAM_GET(c han,param)\180 ( m8xx_console_chan_desc[chan].is_scc \181 ? m8xx_console_chan_desc[chan].parms.sccp->param \182 : m8xx_console_chan_desc[chan].parms.smcp->param)183 184 #define CHN_PARAM_SET(c han,param,value)\185 do {if ( m8xx_console_chan_desc[chan].is_scc) \186 m8xx_console_chan_desc[chan].parms.sccp->param = value; \187 else 188 m8xx_console_chan_desc[chan].parms.smcp->param = value; \191 #define CHN_PARAM_GET(cd,param) \ 192 (cd->is_scc \ 193 ? cd->parms.sccp->param \ 194 : cd->parms.smcp->param) 195 196 #define CHN_PARAM_SET(cd,param,value) \ 197 do {if (cd->is_scc) \ 198 cd->parms.sccp->param = value; \ 199 else \ 200 cd->parms.smcp->param = value; \ 189 201 } while (0) 190 202 191 #define CHN_EVENT_GET(c han)\192 ( m8xx_console_chan_desc[chan].is_scc \193 ? m8xx_console_chan_desc[chan].regs.sccr->scce \194 : m8xx_console_chan_desc[chan].regs.smcr->smce)195 196 #define CHN_EVENT_CLR(c han,mask)\197 do { 198 if ( m8xx_console_chan_desc[chan].is_scc) \199 m8xx_console_chan_desc[chan].regs.sccr->scce = (mask); \200 else 201 m8xx_console_chan_desc[chan].regs.smcr->smce = (mask); \203 #define CHN_EVENT_GET(cd) \ 204 (cd->is_scc \ 205 ? cd->regs.sccr->scce \ 206 : cd->regs.smcr->smce) 207 208 #define CHN_EVENT_CLR(cd,mask) \ 209 do { \ 210 if (cd->is_scc) \ 211 cd->regs.sccr->scce = (mask); \ 212 else \ 213 cd->regs.smcr->smce = (mask); \ 202 214 }while (0) 203 215 204 #define CHN_MASK_GET(c han)\205 ( m8xx_console_chan_desc[chan].is_scc \206 ? m8xx_console_chan_desc[chan].regs.sccr->sccm \207 : m8xx_console_chan_desc[chan].regs.smcr->smcm)208 209 #define CHN_MASK_SET(c han,mask)\210 do { 211 if ( m8xx_console_chan_desc[chan].is_scc) \212 m8xx_console_chan_desc[chan].regs.sccr->sccm = (mask); \213 else 214 m8xx_console_chan_desc[chan].regs.smcr->smcm = (mask); \216 #define CHN_MASK_GET(cd) \ 217 (cd->is_scc \ 218 ? cd->regs.sccr->sccm \ 219 : cd->regs.smcr->smcm) 220 221 #define CHN_MASK_SET(cd,mask) \ 222 do { \ 223 if (cd->is_scc) \ 224 cd->regs.sccr->sccm = (mask); \ 225 else \ 226 cd->regs.smcr->smcm = (mask); \ 215 227 }while (0) 216 217 218 static volatile m8xxBufferDescriptor_t *sccFrstRxBd[CONS_CHN_CNT];219 static volatile m8xxBufferDescriptor_t *sccCurrRxBd[CONS_CHN_CNT];220 static volatile m8xxBufferDescriptor_t *sccFrstTxBd[CONS_CHN_CNT];221 static volatile m8xxBufferDescriptor_t *sccPrepTxBd[CONS_CHN_CNT];222 static volatile m8xxBufferDescriptor_t *sccDequTxBd[CONS_CHN_CNT];223 228 224 229 /* … … 286 291 */ 287 292 288 static int sccBRGalloc( int chan,int baud)293 static int sccBRGalloc(m8xx_console_chan_desc_t *cd,int baud) 289 294 { 290 295 rtems_interrupt_level level; 291 m8xx_console_chan_desc_t *chan_desc = &(m8xx_console_chan_desc[chan]);292 296 uint32_t reg_val; 293 297 int old_brg; … … 299 303 #endif 300 304 301 old_brg = c han_desc->brg_used;305 old_brg = cd->brg_used; 302 306 /* compute brg register contents needed */ 303 307 reg_val = sccBRGval(baud); … … 364 368 /* connect to scc/smc */ 365 369 if (new_brg >= 0) { 366 m8xx_console_chan_desc[chan].brg_used = new_brg;370 cd->brg_used = new_brg; 367 371 /* 368 372 * Put SCC in NMSI mode, connect SCC to BRG or CLKx 369 373 */ 370 if ( m8xx_console_chan_desc[chan].is_scc) {371 m8xx.sicr = ((m8xx.sicr & ~(M8xx_SICR_SCCRX_MSK(c han) |372 M8xx_SICR_SCCTX_MSK(c han))) |373 M8xx_SICR_SCCRX(c han,new_brg)|374 M8xx_SICR_SCCTX(c han,new_brg));374 if (cd->is_scc) { 375 m8xx.sicr = ((m8xx.sicr & ~(M8xx_SICR_SCCRX_MSK(cd->chan) | 376 M8xx_SICR_SCCTX_MSK(cd->chan))) | 377 M8xx_SICR_SCCRX(cd->chan,new_brg)| 378 M8xx_SICR_SCCTX(cd->chan,new_brg)); 375 379 } 376 380 else { 377 381 /* connect SMC to BRGx or CLKx... */ 378 m8xx.simode = ((m8xx.simode & ~(M8xx_SIMODE_SMCCS_MSK(c han - CONS_CHN_SMC1)))|379 M8xx_SIMODE_SMCCS(c han - CONS_CHN_SMC1,new_brg));382 m8xx.simode = ((m8xx.simode & ~(M8xx_SIMODE_SMCCS_MSK(cd->chan - CONS_CHN_SMC1)))| 383 M8xx_SIMODE_SMCCS(cd->chan - CONS_CHN_SMC1,new_brg)); 380 384 } 381 385 } … … 390 394 sccSetAttributes (int minor, const struct termios *t) 391 395 { 396 m8xx_console_chan_desc_t *cd = &m8xx_console_chan_desc[minor]; 392 397 int baud; 393 398 … … 414 419 case B460800: baud = 460800; break; 415 420 } 416 return sccBRGalloc( minor,baud);421 return sccBRGalloc(cd,baud); 417 422 return 0; 418 423 } … … 424 429 sccInterruptHandler (void *arg) 425 430 { 426 int chan = (int)arg;431 m8xx_console_chan_desc_t *cd = arg; 427 432 428 433 /* 429 434 * Buffer received? 430 435 */ 431 if (CHN_EVENT_GET(c han) & 0x1) {436 if (CHN_EVENT_GET(cd) & 0x1) { 432 437 /* 433 438 * clear SCC event flag 434 439 */ 435 CHN_EVENT_CLR(c han,0x01);440 CHN_EVENT_CLR(cd,0x01); 436 441 /* 437 442 * process event 438 443 */ 439 while (( sccCurrRxBd[chan]->status & M8xx_BD_EMPTY) == 0) {440 if ( sccttyp[chan]!= NULL) {441 rtems_cache_invalidate_multiple_data_lines((void *) sccCurrRxBd[chan]->buffer,442 sccCurrRxBd[chan]->length);443 rtems_termios_enqueue_raw_characters ( sccttyp[chan],444 (char *) sccCurrRxBd[chan]->buffer,445 sccCurrRxBd[chan]->length);444 while ((cd->sccCurrRxBd->status & M8xx_BD_EMPTY) == 0) { 445 if (cd->tty != NULL) { 446 rtems_cache_invalidate_multiple_data_lines((void *)cd->sccCurrRxBd->buffer, 447 cd->sccCurrRxBd->length); 448 rtems_termios_enqueue_raw_characters (cd->tty, 449 (char *)cd->sccCurrRxBd->buffer, 450 cd->sccCurrRxBd->length); 446 451 } 447 452 /* 448 453 * clear status 449 454 */ 450 sccCurrRxBd[chan]->status =451 ( sccCurrRxBd[chan]->status455 cd->sccCurrRxBd->status = 456 (cd->sccCurrRxBd->status 452 457 & (M8xx_BD_WRAP | M8xx_BD_INTERRUPT)) 453 458 | M8xx_BD_EMPTY; … … 455 460 * advance to next BD 456 461 */ 457 if (( sccCurrRxBd[chan]->status & M8xx_BD_WRAP) != 0) {458 sccCurrRxBd[chan] = sccFrstRxBd[chan];462 if ((cd->sccCurrRxBd->status & M8xx_BD_WRAP) != 0) { 463 cd->sccCurrRxBd = cd->sccFrstRxBd; 459 464 } 460 465 else { 461 sccCurrRxBd[chan]++;466 cd->sccCurrRxBd++; 462 467 } 463 468 } … … 466 471 * Buffer transmitted? 467 472 */ 468 if (CHN_EVENT_GET(c han) & 0x2) {473 if (CHN_EVENT_GET(cd) & 0x2) { 469 474 /* 470 475 * then clear interrupt event bit 471 476 */ 472 CHN_EVENT_CLR(c han,0x2);477 CHN_EVENT_CLR(cd,0x2); 473 478 /* 474 479 * and signal successful transmit to termios … … 477 482 * FIXME: multiple dequeue calls for multiple buffers 478 483 */ 479 while(( sccDequTxBd[chan] != sccPrepTxBd[chan]) &&480 (( sccDequTxBd[chan]->status & M8xx_BD_READY) == 0)) {481 if ( sccttyp[chan]!= NULL) {482 rtems_termios_dequeue_characters ( sccttyp[chan],483 sccDequTxBd[chan]->length);484 while((cd->sccDequTxBd != cd->sccPrepTxBd) && 485 ((cd->sccDequTxBd->status & M8xx_BD_READY) == 0)) { 486 if (cd->tty != NULL) { 487 rtems_termios_dequeue_characters (cd->tty, 488 cd->sccDequTxBd->length); 484 489 } 485 490 /* 486 491 * advance to next BD 487 492 */ 488 if (( sccDequTxBd[chan]->status & M8xx_BD_WRAP) != 0) {489 sccDequTxBd[chan] = sccFrstTxBd[chan];493 if ((cd->sccDequTxBd->status & M8xx_BD_WRAP) != 0) { 494 cd->sccDequTxBd = cd->sccFrstTxBd; 490 495 } 491 496 else { 492 sccDequTxBd[chan]++;497 cd->sccDequTxBd++; 493 498 } 494 499 } … … 497 502 498 503 static void 499 mpc8xx_console_irq_on( int chan)500 { 501 CHN_MASK_SET(c han, 3); /* Enable TX and RX interrupts */504 mpc8xx_console_irq_on(m8xx_console_chan_desc_t *cd) 505 { 506 CHN_MASK_SET(cd, 3); /* Enable TX and RX interrupts */ 502 507 } 503 508 504 509 static void 505 sccInitialize (m8xx_console_chan_desc_t *cd , int chan)510 sccInitialize (m8xx_console_chan_desc_t *cd) 506 511 { 507 512 int i; … … 518 523 * Allocate buffer descriptors 519 524 */ 520 sccCurrRxBd[chan]=521 sccFrstRxBd[chan]= m8xx_bd_allocate(SCC_RXBD_CNT);522 sccPrepTxBd[chan]=523 sccDequTxBd[chan]=524 sccFrstTxBd[chan]= m8xx_bd_allocate(SCC_TXBD_CNT);525 switch(c han) {525 cd->sccCurrRxBd = 526 cd->sccFrstRxBd = m8xx_bd_allocate(SCC_RXBD_CNT); 527 cd->sccPrepTxBd = 528 cd->sccDequTxBd = 529 cd->sccFrstTxBd = m8xx_bd_allocate(SCC_TXBD_CNT); 530 switch(cd->chan) { 526 531 case CONS_CHN_SCC1: 527 532 /* … … 606 611 * allocate and connect BRG 607 612 */ 608 sccBRGalloc(c han,9600);613 sccBRGalloc(cd,9600); 609 614 610 615 … … 612 617 * Set up SCCx parameter RAM common to all protocols 613 618 */ 614 CHN_PARAM_SET(c han,rbase,(char *)sccFrstRxBd[chan]- (char *)&m8xx);615 CHN_PARAM_SET(c han,tbase,(char *)sccFrstTxBd[chan]- (char *)&m8xx);616 CHN_PARAM_SET(c han,rfcr ,M8xx_RFCR_MOT | M8xx_RFCR_DMA_SPACE(0));617 CHN_PARAM_SET(c han,tfcr ,M8xx_TFCR_MOT | M8xx_TFCR_DMA_SPACE(0));618 if ( m8xx_scc_mode[chan]!= TERMIOS_POLLED)619 CHN_PARAM_SET(c han,mrblr,RXBUFSIZE);619 CHN_PARAM_SET(cd,rbase,(char *)cd->sccFrstRxBd - (char *)&m8xx); 620 CHN_PARAM_SET(cd,tbase,(char *)cd->sccFrstTxBd - (char *)&m8xx); 621 CHN_PARAM_SET(cd,rfcr ,M8xx_RFCR_MOT | M8xx_RFCR_DMA_SPACE(0)); 622 CHN_PARAM_SET(cd,tfcr ,M8xx_TFCR_MOT | M8xx_TFCR_DMA_SPACE(0)); 623 if (cd->mode != TERMIOS_POLLED) 624 CHN_PARAM_SET(cd,mrblr,RXBUFSIZE); 620 625 else 621 CHN_PARAM_SET(c han,mrblr,1);626 CHN_PARAM_SET(cd,mrblr,1); 622 627 623 628 /* 624 629 * Set up SCCx parameter RAM UART-specific parameters 625 630 */ 626 CHN_PARAM_SET(c han,un.uart.max_idl ,MAX_IDL_DEFAULT);627 CHN_PARAM_SET(c han,un.uart.brkln ,0);628 CHN_PARAM_SET(c han,un.uart.brkec ,0);629 CHN_PARAM_SET(c han,un.uart.brkcr ,0);630 if ( m8xx_console_chan_desc[chan].is_scc) {631 m8xx_console_chan_desc[chan].parms.sccp->un.uart.character[0]=0x8000; /* no char filter */632 m8xx_console_chan_desc[chan].parms.sccp->un.uart.rccm=0x80FF; /* control character mask */631 CHN_PARAM_SET(cd,un.uart.max_idl ,MAX_IDL_DEFAULT); 632 CHN_PARAM_SET(cd,un.uart.brkln ,0); 633 CHN_PARAM_SET(cd,un.uart.brkec ,0); 634 CHN_PARAM_SET(cd,un.uart.brkcr ,0); 635 if (cd->is_scc) { 636 cd->parms.sccp->un.uart.character[0]=0x8000; /* no char filter */ 637 cd->parms.sccp->un.uart.rccm=0x80FF; /* control character mask */ 633 638 } 634 639 … … 637 642 */ 638 643 for (i = 0;i < SCC_RXBD_CNT;i++) { 639 sccFrstRxBd[chan][i].status = M8xx_BD_EMPTY | M8xx_BD_INTERRUPT;644 cd->sccFrstRxBd[i].status = M8xx_BD_EMPTY | M8xx_BD_INTERRUPT; 640 645 if (i == SCC_RXBD_CNT-1) { 641 sccFrstRxBd[chan][i].status |= M8xx_BD_WRAP;642 } 643 sccFrstRxBd[chan][i].length = 0;644 sccFrstRxBd[chan][i].buffer = (*cd->rxBuf)[i];646 cd->sccFrstRxBd[i].status |= M8xx_BD_WRAP; 647 } 648 cd->sccFrstRxBd[i].length = 0; 649 cd->sccFrstRxBd[i].buffer = (*cd->rxBuf)[i]; 645 650 } 646 651 /* … … 648 653 */ 649 654 for (i = 0;i < SCC_TXBD_CNT;i++) { 650 sccFrstTxBd[chan][i].status = M8xx_BD_INTERRUPT;655 cd->sccFrstTxBd[i].status = M8xx_BD_INTERRUPT; 651 656 if (i == SCC_TXBD_CNT-1) { 652 sccFrstTxBd[chan][i].status |= M8xx_BD_WRAP;653 } 654 sccFrstTxBd[chan][i].length = 0;655 sccFrstTxBd[chan][i].buffer = NULL;657 cd->sccFrstTxBd[i].status |= M8xx_BD_WRAP; 658 } 659 cd->sccFrstTxBd[i].length = 0; 660 cd->sccFrstTxBd[i].buffer = NULL; 656 661 } 657 662 … … 659 664 * Set up SCC general and protocol-specific mode registers 660 665 */ 661 CHN_EVENT_CLR(c han,~0); /* Clear any pending events */662 CHN_MASK_SET(c han,0); /* Mask all interrupt/event sources */663 664 if ( m8xx_console_chan_desc[chan].is_scc) {665 m8xx_console_chan_desc[chan].regs.sccr->psmr = 0xb000; /* 8N1, CTS flow control */666 m8xx_console_chan_desc[chan].regs.sccr->gsmr_h = 0x00000000;667 m8xx_console_chan_desc[chan].regs.sccr->gsmr_l = 0x00028004; /* UART mode */666 CHN_EVENT_CLR(cd,~0); /* Clear any pending events */ 667 CHN_MASK_SET(cd,0); /* Mask all interrupt/event sources */ 668 669 if (cd->is_scc) { 670 cd->regs.sccr->psmr = 0xb000; /* 8N1, CTS flow control */ 671 cd->regs.sccr->gsmr_h = 0x00000000; 672 cd->regs.sccr->gsmr_l = 0x00028004; /* UART mode */ 668 673 } 669 674 else { 670 m8xx_console_chan_desc[chan].regs.smcr->smcmr = 0x4820;675 cd->regs.smcr->smcmr = 0x4820; 671 676 } 672 677 /* 673 678 * Send "Init parameters" command 674 679 */ 675 m8xx_cp_execute_cmd(M8xx_CR_OP_INIT_RX_TX 676 | m8xx_console_chan_desc[chan].cr_chan_code); 680 m8xx_cp_execute_cmd(M8xx_CR_OP_INIT_RX_TX | cd->cr_chan_code); 677 681 678 682 /* 679 683 * Enable receiver and transmitter 680 684 */ 681 if ( m8xx_console_chan_desc[chan].is_scc) {682 m8xx_console_chan_desc[chan].regs.sccr->gsmr_l |= 0x00000030;685 if (cd->is_scc) { 686 cd->regs.sccr->gsmr_l |= 0x00000030; 683 687 } 684 688 else { 685 m8xx_console_chan_desc[chan].regs.smcr->smcmr |= 0x0003;686 } 687 688 if ( m8xx_scc_mode[chan]!= TERMIOS_POLLED) {689 cd->regs.smcr->smcmr |= 0x0003; 690 } 691 692 if (cd->mode != TERMIOS_POLLED) { 689 693 rtems_status_code sc; 690 694 691 695 sc = rtems_interrupt_handler_install( 692 m8xx_console_chan_desc[chan].ivec_src,696 cd->ivec_src, 693 697 "SCC", 694 698 RTEMS_INTERRUPT_UNIQUE, 695 699 sccInterruptHandler, 696 (void *)chan700 cd 697 701 ); 698 702 if (sc != RTEMS_SUCCESSFUL) { 699 703 rtems_panic("console: cannot install IRQ handler"); 700 704 } 701 mpc8xx_console_irq_on(c han);705 mpc8xx_console_irq_on(cd); 702 706 } 703 707 } … … 709 713 sccPollRead (int minor) 710 714 { 715 m8xx_console_chan_desc_t *cd = &m8xx_console_chan_desc[minor]; 711 716 int c = -1; 712 int chan = minor;713 717 714 718 while(1) { 715 if (( sccCurrRxBd[chan]->status & M8xx_BD_EMPTY) != 0) {719 if ((cd->sccCurrRxBd->status & M8xx_BD_EMPTY) != 0) { 716 720 return -1; 717 721 } 718 722 719 if (0 == ( sccCurrRxBd[chan]->status & (M8xx_BD_OVERRUN723 if (0 == (cd->sccCurrRxBd->status & (M8xx_BD_OVERRUN 720 724 | M8xx_BD_PARITY_ERROR 721 725 | M8xx_BD_FRAMING_ERROR … … 723 727 | M8xx_BD_IDLE))) { 724 728 /* character received and no error detected */ 725 rtems_cache_invalidate_multiple_data_lines((void *) sccCurrRxBd[chan]->buffer,726 sccCurrRxBd[chan]->length);727 c = (unsigned)*((char *) sccCurrRxBd[chan]->buffer);729 rtems_cache_invalidate_multiple_data_lines((void *)cd->sccCurrRxBd->buffer, 730 cd->sccCurrRxBd->length); 731 c = (unsigned)*((char *)cd->sccCurrRxBd->buffer); 728 732 /* 729 733 * clear status 730 734 */ 731 735 } 732 sccCurrRxBd[chan]->status =733 ( sccCurrRxBd[chan]->status736 cd->sccCurrRxBd->status = 737 (cd->sccCurrRxBd->status 734 738 & (M8xx_BD_WRAP | M8xx_BD_INTERRUPT)) 735 739 | M8xx_BD_EMPTY; … … 737 741 * advance to next BD 738 742 */ 739 if (( sccCurrRxBd[chan]->status & M8xx_BD_WRAP) != 0) {740 sccCurrRxBd[chan] = sccFrstRxBd[chan];743 if ((cd->sccCurrRxBd->status & M8xx_BD_WRAP) != 0) { 744 cd->sccCurrRxBd = cd->sccFrstRxBd; 741 745 } 742 746 else { 743 sccCurrRxBd[chan]++;747 cd->sccCurrRxBd++; 744 748 } 745 749 if (c >= 0) { … … 761 765 { 762 766 if (len > 0) { 763 int chan = minor; 764 765 if ((sccPrepTxBd[chan]->status & M8xx_BD_READY) == 0) { 766 sccPrepTxBd[chan]->buffer = (char *)buf; 767 sccPrepTxBd[chan]->length = len; 767 m8xx_console_chan_desc_t *cd = &m8xx_console_chan_desc[minor]; 768 if ((cd->sccPrepTxBd->status & M8xx_BD_READY) == 0) { 769 cd->sccPrepTxBd->buffer = (char *)buf; 770 cd->sccPrepTxBd->length = len; 768 771 rtems_cache_flush_multiple_data_lines((const void *)buf,len); 769 772 /* 770 773 * clear status, set ready bit 771 774 */ 772 sccPrepTxBd[chan]->status =773 ( sccPrepTxBd[chan]->status775 cd->sccPrepTxBd->status = 776 (cd->sccPrepTxBd->status 774 777 & M8xx_BD_WRAP) 775 778 | M8xx_BD_READY | M8xx_BD_INTERRUPT; 776 if (( sccPrepTxBd[chan]->status & M8xx_BD_WRAP) != 0) {777 sccPrepTxBd[chan] = sccFrstTxBd[chan];779 if ((cd->sccPrepTxBd->status & M8xx_BD_WRAP) != 0) { 780 cd->sccPrepTxBd = cd->sccFrstTxBd; 778 781 } 779 782 else { 780 sccPrepTxBd[chan]++;783 cd->sccPrepTxBd++; 781 784 } 782 785 } … … 789 792 sccPollWrite (int minor, const char *buf, size_t len) 790 793 { 794 m8xx_console_chan_desc_t *cd = &m8xx_console_chan_desc[minor]; 791 795 static char txBuf[CONS_CHN_CNT][SCC_TXBD_CNT]; 792 int chan = minor;796 int chan = cd->chan; 793 797 int bd_used; 794 798 size_t retval = len; 795 799 796 800 while (len--) { 797 while ( sccPrepTxBd[chan]->status & M8xx_BD_READY)801 while (cd->sccPrepTxBd->status & M8xx_BD_READY) 798 802 continue; 799 bd_used = sccPrepTxBd[chan]-sccFrstTxBd[chan];803 bd_used = cd->sccPrepTxBd - cd->sccFrstTxBd; 800 804 txBuf[chan][bd_used] = *buf++; 801 805 rtems_cache_flush_multiple_data_lines((const void *)&txBuf[chan][bd_used], 802 806 sizeof(txBuf[chan][bd_used])); 803 sccPrepTxBd[chan]->buffer = &(txBuf[chan][bd_used]);804 sccPrepTxBd[chan]->length = 1;805 sccPrepTxBd[chan]->status =806 ( sccPrepTxBd[chan]->status807 cd->sccPrepTxBd->buffer = &(txBuf[chan][bd_used]); 808 cd->sccPrepTxBd->length = 1; 809 cd->sccPrepTxBd->status = 810 (cd->sccPrepTxBd->status 807 811 & M8xx_BD_WRAP) 808 812 | M8xx_BD_READY; 809 if (( sccPrepTxBd[chan]->status & M8xx_BD_WRAP) != 0) {810 sccPrepTxBd[chan] = sccFrstTxBd[chan];813 if ((cd->sccPrepTxBd->status & M8xx_BD_WRAP) != 0) { 814 cd->sccPrepTxBd = cd->sccFrstTxBd; 811 815 } 812 816 else { 813 sccPrepTxBd[chan]++;817 cd->sccPrepTxBd++; 814 818 } 815 819 } … … 866 870 { 867 871 rtems_status_code status = RTEMS_SUCCESSFUL; 868 int chan,entry,ttynum;872 int entry,ttynum; 869 873 char tty_name[] = "/dev/tty00"; 870 874 … … 883 887 entry++) { 884 888 if (channel_list[entry].driver_mode != CONS_MODE_UNUSED) { 889 m8xx_console_chan_desc_t *cd = 890 &m8xx_console_chan_desc[channel_list[entry].driver_mode]; 885 891 /* 886 892 * Do device-specific initialization 887 893 */ 888 chan = channel_list[entry].minor; 889 m8xx_scc_mode[chan] = channel_list[entry].driver_mode; 890 sccInitialize (&m8xx_console_chan_desc[chan], chan); 894 cd->mode = channel_list[entry].driver_mode; 895 sccInitialize (cd); 891 896 892 897 /* … … 932 937 ) 933 938 { 939 m8xx_console_chan_desc_t *cd = &m8xx_console_chan_desc[minor]; 934 940 rtems_status_code status; 935 941 int chan = minor; … … 956 962 }; 957 963 958 if ( m8xx_scc_mode[chan]== TERMIOS_IRQ_DRIVEN) {964 if (cd->mode == TERMIOS_IRQ_DRIVEN) { 959 965 status = rtems_termios_open (major, minor, arg, &interruptCallbacks); 960 sccttyp[chan]= args->iop->data1;966 m8xx_console_chan_desc[chan].tty = args->iop->data1; 961 967 } 962 968 else { 963 969 status = rtems_termios_open (major, minor, arg, &pollCallbacks); 964 sccttyp[chan]= args->iop->data1;970 m8xx_console_chan_desc[chan].tty = args->iop->data1; 965 971 } 966 972 return status; … … 979 985 980 986 rc = rtems_termios_close (arg); 981 sccttyp[minor]= NULL;987 m8xx_console_chan_desc[minor].tty = NULL; 982 988 983 989 return rc;
Note: See TracChangeset
for help on using the changeset viewer.