日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 打通linux的tty驅動的數(shù)據鏈路

          打通linux的tty驅動的數(shù)據鏈路

          作者: 時間:2016-10-08 來源:網絡 收藏

          {

          ……

          while((head = tty->buf.head) != NULL) {

          ………

          count= head->commit – head->read;

          ………

          char_buf= head->char_buf_ptr + head->read;

          flag_buf= head->flag_buf_ptr + head->read;

          head->read+= count;

          disc->ops->receive_buf(tty,char_buf,

          flag_buf,count);

          ………

          }

          ……

          }

          這個函數(shù)主要的功能是,從tty_buffer中找到數(shù)據緩沖區(qū)char_buf_ptr,并將這個緩沖區(qū)指針傳遞給線路規(guī)程的操作函數(shù)receive_buf.再來看receive_buf:

          static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char*cp,

          char *fp, int count)

          {

          ……

          if(tty->real_raw) {

          ………

          memcpy(tty->read_buf+ tty->read_head, cp, i);

          ………

          }else{

          ………

          switch(flags) {

          caseTTY_NORMAL:

          n_tty_receive_char(tty,*p);

          break;

          ……

          }

          if(tty->ops->flush_chars)

          tty->ops->flush_chars(tty);

          ………

          }

          ………

          }

          從上面這段代碼可以看到,if條件成立,明顯地是拷貝數(shù)據進tty的read_buf;進入else,在正常的狀態(tài)下會調用n_tty_receive_char,然后會調用put_tty_queue,在這個函數(shù)里最終還是把數(shù)據拷貝到tty的read_buf中。

          到此,tty驅動的讀操作數(shù)據鏈路基本上連通了。

          uart_write:

          static int uart_write(struct tty_struct *tty,

          const unsigned char *buf, int count)

          {

          ……

          port= state->uart_port;

          circ= state->xmit;

          ……

          while(1){

          c= CIRC_SPACE_TO_END(circ->head, circ->tail, UART_XMIT_SIZE);

          ………

          memcpy(circ->buf+ circ->head, buf, c);

          ………

          }

          ……

          uart_start(tty);

          return ret;

          }

          上面代碼的意思是把要寫的數(shù)據拷貝到state的緩沖區(qū)里。然后調用uart_start.

          static void __uart_start(struct tty_struct *tty)

          {

          struct uart_state *state = tty->driver_data;

          struct uart_port *port = state->uart_port;

          if(!uart_circ_empty(state->xmit) state->xmit.buf

          !tty->stopped !tty->hw_stopped)

          port->ops->start_tx(port);

          }

          調用了uart_port的操作函數(shù)集的start_tx.

          static void serial8250_start_tx(struct uart_port *port)

          {

          struct uart_8250_port *up = container_of(port, struct uart_8250_port, port);

          ……

          transmit_chars(up);

          ………

          }

          在transmit_chars中會把state->xmit緩沖區(qū)的數(shù)據寫進串口發(fā)送數(shù)據寄存器,也就是數(shù)據到達硬件層。到此,寫操作的數(shù)據鏈路也連通。


          上一頁 1 2 3 下一頁

          關鍵詞:

          評論


          相關推薦

          技術專區(qū)

          關閉