国产无码免费,人妻口爆,国产V在线,99中文精品7,国产成人无码AA精品一,制度丝袜诱惑av,久久99免费麻辣视频,蜜臀久久99精品久久久久久酒店
        訂閱
        糾錯
        加入自媒體

        技術文章:基于Linux的tty架構及UART驅動詳解

        2021-02-05 17:06
        一口Linux
        關注

        本文由技術大拿:蒙工 投稿!

        桂電畢業的資深嵌入式專家。

        一、模塊硬件學習

        1.1. Uart介紹

        通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱為UART,是一種異步收發傳輸器,是電腦硬件的一部分。它將要傳輸的資料在串行通信與并行通信之間加以轉換。

        作為把并行輸入信號轉成串行輸出信號的芯片,UART 通常被集成于其他通訊接口的連上。

        UART 是一種通用串行數據總線,用于異步通信。該總線雙向通信,可以實現全雙工傳輸和接收。在嵌入式設備中,UART 用于主機與輔助設備通信,如汽車音與外接AP 之間的通信,與PC 機通信包括與監控調試器和其它器件,如EEPOM通信。

        1.1.1. 通信協議

        UART作為異步串口通信協議的一種,工作原理是將傳輸數據的每個字符一位接一位地傳輸。其中各位的意義如下:

        起始位:先發出一個邏輯”0”的信號,表示傳輸字符的開始。

        數據位:緊接著起始位之后。數據位的個數可以是5、6、7、8等,構成一個字符。通常采用ASCII碼。從最低位開始傳送,靠時鐘定位。

        奇偶校驗位:數據位加上這一位后,使得“1”的位數應為偶數(偶校驗)或奇數(奇校驗),以此來校驗數據傳送的正確性。

        停止位:它是一個字符數據的結束標志。可以是1位、1.5位、2位的高電平。

        由于數據是在傳輸線上定時的,并且每一個設備有其自己的時鐘,很可能在通信中兩臺設備間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,并且提供計算機校正時鐘同步的機會。適用于停止位的位數越多,不同時鐘同步的容忍程度越大,但是數據傳輸率同時也越慢。

        空閑位:處于邏輯“1”狀態,表示當前線路上沒有數據傳送。

        Uart傳輸數據如圖2-1所示:

        1.1.2. 波特率

        波特率是衡量資料傳送速率的指標。表示每秒鐘傳送的符號數(symbol)。一個符號代表的信息量(比特數)與符號的階數有關。例如傳輸使用256階符號,每8bit代表一個符號,數據傳送速率為120字符/秒,則波特率就是120 baud,比特率是120*8=960bit/s。這兩者的概念很容易搞錯。

        UART 的接收和發送是按照相同的波特率進行收發的。波特率發生器產生的時鐘頻率不是波特率時鐘頻率,而是波特率時鐘頻率的16倍,目的是為在接收時進行精確的采樣,以提取出異步的串行數據。根據給定的晶振時鐘和要求的波特率,可以算出波特率分頻計數值。

        1.1.3. 工作原理

        發送數據過程:空閑狀態,線路處于高電位;當收到發送數據指令后,拉低線路一個數據位的時間T,接著數據位按低位到高位依次發送,數據發送完畢后,接著發送奇偶檢驗位和停止位(停止位為高電位),一幀數據發送結束。

        接收數據過程: 空閑狀態,線路處于高電位;當檢測到線路的下降沿(線路電位由高電位變為低電位)時說明線路有數據傳輸,按照約定的波特率從低位到高位接收數據,數據接收完畢后,接著接收并比較奇偶檢驗位是否正確,如果正確則通知則通知后續設備準備接收數據或存入緩存。

        由于UART是異步傳輸,沒有傳輸同步時鐘。為了能保證數據傳輸的正確性,UART采用16倍數據波特率的時鐘進行采樣。每個數據有16個時鐘采樣,取中間的采樣值,以保證采樣不會滑碼或誤碼。

        一般UART一幀的數據位為8,這樣即使每一個數據有一個時鐘的誤差,接收端也能正確地采樣到數據。

        UART的接收數據時序為:當檢測到數據下降沿時,表明線路上有數據進行傳輸,這時計數器CNT開始計數,當計數器,當計數器為8時,采樣的值為“0”表示開始位;當計數器為24=161+8時,采樣的值為bit0數據;當計數器的值為40=162+8時,采樣的值為bit1數據;依次類推,進行后面6個數據的采樣。如果需要進行奇偶校驗位,則當計數器的值為152=169+8時,采樣的值為奇偶位;當計數器的值為168=1610+8時,采樣的值為“1”表示停止位,一幀數據收發完成。

        1.1.4. RS232與RS485

        UART:通常說的UART指的是一種串行通信協議,規定了數據幀格式,波特率等。RS232和RS485:是兩種不同的電氣協議,也就是說,是對電氣特性以及物理特性的規定,作用于數據的傳輸通路上,它并不含對數據的處理方式。

        對應的物理器件有RS232或者RS485驅動芯片,將CPU經過UART傳送過來的電壓信號驅動成RS232或者RS485電平邏輯。

        RS232使用3-15V有效電平,而UART,因為對電氣特性沒有規定,所以直接使用CPU使用的電平,即TTL電平(在0-3.3V之間)。

        更具體的,電氣的特性也決定了線路的連接方式,比如RS232,規定用電平表示數據,因此線路就是單線路的,兩根線能達到全雙工的目的;RS485使用差分電平表示數據,因此必須用兩根線才能達到傳輸數據的基本要求,要實現全雙工,必須使用4根線。

        RS232和RS485的區別(1)抗干擾性

        RS485 接口是采用平衡驅動器和差分接收器的組合,具有抑制共模干擾的能力,抗噪聲干擾性強。RS232接口使用一根信號線和一根信號返回線而構成供地的傳輸形式,這種共地傳輸容易產生共模干擾,所以抗噪聲干擾性弱。(2)傳輸距離RS485 接口的最大傳輸距離標準值為1200 米(9600bps 時),實際上可達3000米。RS232 傳輸距離有限,最大傳輸距離標準值為50米,實際上也只能用15米左右。(3)通信能力RS485接口在總線上最多可以連接128個收發器,即具有多站能力,而這樣的用戶可以利用單一的RS485接口方便的建立起設備網絡。RS232只允許一對一通信。(4)傳輸速率RS232傳輸速率較低,在異步傳輸時,波特率為20Kbps.RS485的數據最高傳輸速率為10Mbps.(5) 信號線RS485全雙工:uart-tx 1根線,變成 RS485- A/B 2根線;uart-rx 1根線,變成 RS485- x/y 2根線,RS485半雙工: 將全雙工的 A/B; X/Y 合并起來,分時復用。RS232只允許一對一通信(6)電氣電平值邏輯“1”以兩線間的電壓差為+(2-6)V表示;邏輯“0”以兩線間的電壓差為-(2-6)V表示。在RS232中任何一條信號的電壓均為負邏輯關系。即:邏輯“1”-5-15V;邏輯“0”,+5~+15V,噪聲容限為2V。即要求接收器能識別低至+3V的信號作為邏輯“0”,高到-3V的信號的信號作為邏輯“1”。RS232接口的信號電平值較高,易損壞接口電路的芯片,又因為與TTL電平不兼容故使用電平轉換電路方能與TTL電路連接。RS485接口信號電平比RS232降低了,就不易損壞接口電路的芯片,且該電平與TTL電平兼容,方便與TTL電路連接。1.1.5. 流控

        數據在兩個串口傳輸時,常常會出現丟失數據的現象,或者兩臺計算機的處理速度不同,如臺式機與單片機之間的通訊,接收端數據緩沖區以滿,此時繼續發送的數據就會丟失,流控制能解決這個問題,當接收端數據處理不過來時,就發出“不再接收”的信號,發送端就停止發送,直到收到“可以繼續發送”的信號再發送數據。

        因此流控制可以控制數據傳輸的進程,防止數據丟失。PC機中常用的兩種流控為:硬件流控(包括RTS/CTS、DTR/CTS等)和軟件流控制XON/XOFF(繼續/停止)。

        1.1.5.1. 硬件流控

        硬件流控制常用的有RTS/CTS流控制和DTR/DSR流控制兩種。

        DTR–數據終端就緒(Data Terminal Ready)低有效,當為低時,表示本設備自身準備就緒。此信號輸出對端設備,使用對端設備決定能否與本設備通信。

        DSR-數據裝置就緒(Data Set Ready)低有效,此信號由本設備相連接的對端設備提供,當為低時,本設備才能與設備端進行通信。

        RTS - 請求發送(數據)(Request To Send)低有效,此信號由本設備在需要發送數據給對端設備時設置。當為低時,表示本設備有數據需要向對端設備發送。對端設備能否接收到本方的發送數據,則通過CTS信號來應答。

        CTS -  接收發送(請求)(Clear To Send)低有效,對端設備能否接收本方所發送的數據,由CTS決定。若CTS為低,則表示對端的以準備好,可以接收本端發送數據。

        以RTS/CTS流控制分析,分析主機發送/接收流程:

        物理連接

        主機的RTS(輸出信號),連接到從機的CTS(輸入信號)。主機是CTS(輸入信號),連接到從機的RTS(輸入信號)。

        1.主機的發送過程:主機查詢主機的CTS腳信號,此信號連接到從機的RTS信號,受從機控制。如果主機CTS信號有效(為低),表示從機的接收FIFO未滿,從機可以接收,此時主機可以向從機發送數據,并且在發送過程中要一直查詢CTS信號是否為有效狀態。主機查詢到CTS無效時,則中止發送。主機的CTS信號什么時候會無效呢?從機在接收到主機發送的數據時,從機的接收模塊的FIFO如果滿了,則會使從機RTS無效,也即主機的CTS信號無效。主機查詢到CTS無效時,主機發送中止。

        2.主機接收模式:如果主機接收FIFO未滿,那么使主機RTS信號有效(為低),即從機的CTS信號有效。此時如果從機要發送,發送前會查詢從機的CTS信號,如果有效,則開始發送。并且在發送過程中要一直查詢從機CTS信號的有效狀態,如果無效則終止發送。是否有效由主機的RTS信號決定。如果主機FIFO滿了,則使主機的RTS信號無效,也即從機CTS信號無效,主機接收中止。

        1.1.5.2. 軟件流控

        由于電纜的限制,在普通的控制通訊中一般不采用硬件流控制,而是使用軟件流控制。

        一般通過XON/XOFF來實現軟件流控制。常用方法是:當接收端的輸入緩沖區內數據量超過設定的高位時,就向數據發送端發送XOFF字符后就立即停止發送數據。

        當接收端的輸入緩沖區內數據量低于設定的低位時,就向數據發送端發送XON字符(十進制的17或Control-Q),發送端收到XON字符后就立即開始發送數據。

        一般可從設備配套源程序中找到發送端收到XON字符后就立即發送數據。一般可以從設備配套源程序中找到發送的是什么字節。

        應注意,若傳輸的是二進制的數據,標志字符也可能在數據流中出現而引起誤操作,這是軟件流控的缺陷,而硬件流控不會出現這樣的問題。

        二、Linux serial框架

        在Linux系統中,終端是一種字符型設備,它有多種類型,通常使用tty(Teletype)來簡稱各種類型的終端設備。

        對于嵌入式系統而言,最普遍采用的是Uart(Universal Asynchronous Receiver/Transmitter),串行端口,日常生活中簡稱端口

        2.1. TTY驅動程序框架2.1.1. TTY概念2.1.1.1. 串口終端(/dev/ttyS*)

        串口終端是使用計算機串口連接的終端設備。Linux把每個串行端口都看做是一個字符設備。這些串行端口所對應的設備名稱是/dev/ttySAC*;

        2.1.1.2. 控制臺終端(/dev/console)

        在Linux系統中,計算機的輸出設備通常被稱為控制臺終端,這里特指printk信息輸出到設備。/dev/console是一個虛擬的設備,它需要映射到真正的tty上,比如通過內核啟動參數“console=ttySCA0”就把console映射到了串口0

        2.1.1.3. 虛擬終端(/dev/tty*)

        當用戶登錄時,使用的是虛擬終端。使用Ctcl+Alt[F1 - F6]組合鍵時,我們就可以切換到tty1、tty2、tty3等上面去。tty*就稱為虛擬終端,而tty0則是當前所使用虛擬終端的一個別名。

        2.1.2. TTY架構分析

        整個 tty架構大概的樣子如圖3.1所示,簡單來分的話可以說成兩層,一層是下層我們的串口驅動層,它直接與硬件相接觸,我們需要填充一個 struct uart_ops 的結構體,另一層是上層 tty 層,包括 tty 核心以及線路規程,它們各自都有一個 Ops 結構,用戶空通過間是 tty 注冊的字符設備節點來訪問。

        圖3.1tty架構圖

        如圖3.2所示,tty設備發送數據的流程為:tty核心從一個用戶獲取將要發送給一個tty設備的數據,tty核心將數據傳遞給tty線路規程驅動,接著數據被傳到tty驅動,tty驅動將數據轉換為可以發給硬件的格式。

        接收數據的流程為:從tty硬件接收到的數據向上交給tty驅動,接著進入tty線路規程驅動,再進入tty核心,在這里它被一個用戶獲取。

        圖3.2 tty設備發送、接收數據流程2.2. 關鍵數據結構2.2.1. Struct uart_driver

        uart_driver 包含了串口設備名,串口驅動名,主次設備號,串口控制臺(可選))等信息,還封裝了tty_driver(底層串口驅動無需關心tty_driver)

        struct uart_driver {
               struct module    *owner; 擁有該uart_driver的模塊,一般為THIS_MODULE
               const char        *driver_name; 驅動串口名,串口設備名以驅動名為基礎
               const char        *dev_name; 串口設備名
               int                 major; 主設備號
               int                 minor; 次設備號
               int                 nr; 該uart_driver支持的串口數
               struct console    *cons; 其對應的console,若該uart_driver支持serial console,
        *否則為NULL
        * these are private; the low level driver should not
        * touch these; they should be initialised to NULL
        struct uart_state *state; 下層,窗口驅動層
        struct tty_driver  *tty_driver; tty相關
        2.2.2. struct console

        實現控制臺打印功能必須要注冊的結構體

        struct console {
             char name[16];
             void(*write)(struct console *,const char *, unsigined);
             int (*read)(struct console *, char *, unsigned);
             struct tty_driver *(struct console *,int*);
             void (*unblank)(void);
             int  (*setup)(struct console *, char *);
             int  (*early_setup)(void);
             short  flags;
             short  index; 用來指定該console使用哪一個uart port (對應的uart_port中的line),如果為-1,kernel會自動選擇第一個uart port
             int   cflag;
             void  *data;
             struct   console *next;
        };

        1  2  3  4  下一頁>  
        聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

        發表評論

        0條評論,0人參與

        請輸入評論內容...

        請輸入評論/評論長度6~500個字

        您提交的評論過于頻繁,請輸入驗證碼繼續

        暫無評論

        暫無評論

          掃碼關注公眾號
          OFweek人工智能網
          獲取更多精彩內容
          文章糾錯
          x
          *文字標題:
          *糾錯內容:
          聯系郵箱:
          *驗 證 碼:

          粵公網安備 44030502002758號

          主站蜘蛛池模板: 亚洲自拍电影| 平度市| 超碰成人AV| 苍井空亚洲精品AA片在线播放| 金昌市| 国产小精品| 66精品人妻| 国产AV一二三| 屁屁影院国产第一页| 不卡黄片| 欧美一区二区三区在线观看| 哈尔滨市| 久草精品视频| 青青操影院| 佛山市| 黄www| 人妻少妇被猛烈进入中文字幕| 南岸区| 丁青县| 性中国熟妇| 五月天福利导航| 五月香蕉网| 白河县| 91TS人妖另类精品系列| 中文字幕日产乱码中| 得荣县| 淫综合网| www.黄| 青青久草| 91肉丝| 国产精品久久777777| 冀州市| 布拖县| 成人自拍偷拍| 淮阳县| 毛片自拍| 拳交av| 广河县| 狼人久久乐| 日本www色| 绥德县|