linux驅動之終端控制體系與串列埠驅動程式設計

2021-09-21 13:01:56 字數 2272 閱讀 1393

終端概述

控制台偽終端

終端體系

串列埠驅動描述

串列埠驅動註冊

uart埠描述

操作串列埠

新增埠串列埠驅動程式設計

在介紹終端控制體系之前,要先普及 一下資料通訊的基本方式。

資料通訊的基本方式可分為並行通訊序列通訊兩種:

非同步通訊是以字元為傳輸單位,通訊中兩個字元間的時間間隔是不固定的,然而同乙個字元中的兩個相鄰位之間的時間間隔是固定的。

通訊協議:是指雙方約定的一些規則。在使用非同步串列埠傳送乙個字元的資訊時,對資料格式有如下約定:規定有空閒位、起始位、資料位、奇偶校驗位、停止位。

波特率:是衡量資料傳送速率的指標。表示每秒鐘傳送的二進位制位數。

在linux中,tty(終端)是一類字元裝置的統稱,包括了3種型別:控制台,串列埠和偽終端。

供核心使用的終端為控制台。控制台在linux啟動時,通過命令 console=… 指定,如果沒有指定控制台,系統把第乙個註冊的終端(tty)作為控制台。

在linux中,tty體系分為:tty核心,tty線路規程,tty驅動三部分。tty核心從使用者獲取要傳送給tty裝置的資料,然後把資料傳遞給tty線路規程,它對資料進行處理後,負責把資料傳遞到tty驅動程式,tty驅動程式負責格式化資料,並通過硬體傳送出去。

讀操作:

tty驅動從硬體收到資料後,負責把資料傳遞到tty核心,tty核心將從tty驅動收到的資料快取到乙個tty_flip_buffer型別的結構中。該結構包含兩個資料陣列。從tty裝置接受到的資料被儲存於第乙個陣列,當這個陣列滿,等待資料的使用者將被通知。當使用者從這個陣列讀資料時,任何從tty驅動新來的資料被儲存在第二個陣列。當第二個陣列存滿後,資料再次提交給使用者,並且驅動又開始填充第乙個陣列,以此交替。

linux核心使用 uart_driver 描述串列埠驅動,它包含串列埠裝置的驅動名、裝置名、裝置號等資訊。

struct uart_driver

;

linux 為串列埠驅動註冊提供了如下介面:

int

uart_register_driver

(struct uart_driver *drv)

;

uart_port 用於描述乙個 uart 埠(乙個串列埠)的位址、fifi大小、埠等資訊;

struct uart_port

;

uart_ops 定義了針對串列埠的一系列操作,包括傳送、接受及線路設定等。

struct uart_ops

;

串列埠核心層提供如下函式來新增1個埠:

int

uart_add_one_port

(struct uart_driver *drv,

struct uart_port *port)

;

操作流程定義乙個 uart_driver 的變數,並初始化;

使用 uart_register_driver 來註冊這個驅動;

初始化 uart_port 和 ops 函式表;

呼叫 uart_add_one_port() 新增初始化好的 uart_port。

終端控制台體系

資料通訊 並行通訊 序列通訊 非同步通訊 以乙個字元為單位,通訊中兩個字元間的時間間隔不固定的,然而同乙個字元中的兩個相鄰位之間的時間間隔是固定 的。通訊協議 是指通訊雙方約定的一些規則。在使用非同步串列埠傳送乙個字元的資訊時,對資料格式有如下約定 規定有空閒位,起始位,資料位,奇偶校驗位,停止位。...

Linux裝置驅動之控制台驅動

一 前言 我們在之前分析過input子系統和tty裝置驅動架構.今天需要將兩者結合起來.看看linux中的控制台是怎麼樣實現的.二 控制台驅動的初始化 之前在分析tty驅動架構的時候曾分析到.主裝置為4,次裝置為0的裝置節點,即 dev tty0為當前的控制終端.有tty init 中,有以下 段 ...

linux 終端控制碼

esc的ascii編碼是 27 十進位制 33 八進位制 1b 16進製制 很多終端編碼是esc和其他鍵的組合 比如1.方向鍵向上可以用 esc a 模擬 同理 esc b esc c esc d 模擬其他三個方向 2.printf 33 a printf 033 a 能達到一樣的效果 也就是把上面...