uart发送缓冲器就绪信号卡在串行传输中

时间:2012-02-25 23:16:20

标签: operating-system serial-port uart

没有启用中断的终端uart驱动程序

void TerminalInit_polledio(int term_num)
{
   int BAUD_RATE = 9600;
   int divisor = 115200 / BAUD_RATE;

// first setup our vars
   terminals[term_num].echo_mode = TRUE;
   terminals[term_num].missed_intr = TRUE;

// Use a pair of sems. One limits available space in the output queue
// (terminal display), the other limits chars that are typed from the
// terminal. As part of initialization, the count of the output queue
// is set to the capacity of the char queue
  // terminals[term_num].out_sid = SemInit(CHAR_Q_SIZE); 
  // a circular q, capacity CHAR_Q_SIZE
  // terminals[term_num].in_sid = SemInit(0);

   InitCharQ(&terminals[term_num].in_q);   // initially empty
   InitCharQ(&terminals[term_num].out_q);  // initially empty
   InitCharQ(&terminals[term_num].echo_q); // initially empty

// then setup the terminal for 7-E-1 at 9600 baud
// abbrevs:
// CFCR Char Format Control Reg, MSR Modem Status Reg, IIR Intr Indicator Reg
// MCR Modem Control Reg, IER Intr Enable Reg, LSR Line Status Reg
// ERXRDY Enable Recv Ready, ETXRDY Enable Xmit Ready
// LSR_TSRE Line Status Reg Xmit+Shift Regs Empty
   outportb(terminals[term_num].io_base + CFCR, CFCR_DLAB); // CFCR_DLAB is 0x80
   outportb(terminals[term_num].io_base + BAUDLO,LOBYTE(divisor));
   outportb(terminals[term_num].io_base + BAUDHI,HIBYTE(divisor));
   outportb(terminals[term_num].io_base + CFCR,CFCR_8BITS ); //8-N-1
   outportb(terminals[term_num].io_base + IER,0);
   // raise DTR & RTS of the serial port to start read/write
   outportb(terminals[term_num].io_base + MCR, MCR_DTR | MCR_RTS | MCR_IENABLE);
   outportb(terminals[term_num].io_base + IER,0);
   //IO_DELAY();
   //outportb(terminals[term_num].io_base + IER, IER_ERXRDY | IER_ETXRDY);
   //IO_DELAY();

   //FIFO stuff 
   outportb(terminals[term_num].io_base + FIFO, FIFO_ENABLE | FIFO_TRIGGER_8);
   outportb(terminals[term_num].io_base + FIFO, FIFO_RCV_RESET | FIFO_XMT_RESET);
}

u8 get_serial_char_polledio() {
  u8 status;
  //printf("=>");
   while(!(inportb(terminals[FT_TERM].io_base + LSR) & LSR_RXRDY)){
     //cons_printf("%2.0x_",status);
   }
   return (inportb(terminals[FT_TERM].io_base + DATA) & 0x7F);
}

void put_serial_char_polledio(u8 ch) {
    char status = inportb(terminals[FT_TERM].io_base + LSR) & LSR_TXRDY ;

    while(!status) {
      //cons_printf(" <%2.0x_%c> ",status,ch);
    }
    outportb(terminals[FT_TERM].io_base + DATA, ch);
    inportb(terminals[FT_TERM].io_base + LSR) & LSR_TXRDY ;
//     cons_printf(" <%2.0x_%c> ",status,ch);
}


void uart_out(){
    char ch = 'A';
    while(1){
      put_serial_char_polledio(ch);
      //printf("%c ",get_serial_char_polledio());
    }
}

uart_out()是在我的操作系统中作为进程调度和运行的方法,但是在将char A放入或传输一次后,进程将停止并且不会再输出任何字符。有什么我想念的吗?

0 个答案:

没有答案