新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 打通linux的tty驅動的數據鏈路

        打通linux的tty驅動的數據鏈路

        作者: 時間: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);

        ………

        }

        ……

        }

        這個函數主要的功能是,從tty_buffer中找到數據緩沖區char_buf_ptr,并將這個緩沖區指針傳遞給線路規程的操作函數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條件成立,明顯地是拷貝數據進tty的read_buf;進入else,在正常的狀態下會調用n_tty_receive_char,然后會調用put_tty_queue,在這個函數里最終還是把數據拷貝到tty的read_buf中。

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

        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;

        }

        上面代碼的意思是把要寫的數據拷貝到state的緩沖區里。然后調用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的操作函數集的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緩沖區的數據寫進串口發送數據寄存器,也就是數據到達硬件層。到此,寫操作的數據鏈路也連通。


        上一頁 1 2 3 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 鸡泽县| 柏乡县| 井陉县| 湘潭县| 布拖县| 长垣县| 上虞市| 三台县| 呼玛县| 古浪县| 阿鲁科尔沁旗| 潼关县| 静海县| 浦县| 新邵县| 黎平县| 织金县| 蒲江县| 临颍县| 淅川县| 公主岭市| 惠安县| 宁安市| 奈曼旗| 沁源县| 镇巴县| 沂水县| 盐池县| 湘乡市| 基隆市| 忻城县| 肇源县| 合山市| 阿图什市| 察雅县| 外汇| 汶上县| 万源市| 镇坪县| 湘西| 嘉义市|