Linux 串口、usb转串口驱动分析(2-1) 【转】
轉自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26807463&id=4186851
Linux 串口、usb轉串口驅動分析1
內核版本:2.6.35.6 榮鵬140319
聲明:圖和個別段落(我做了小的修改)是直接從網上截取
目標:主要是想對Linux 串口、usb轉串口驅動框架有一個整體的把控,因此會忽略某些細節,同時里面涉及到的一些驅動基礎,比如字符設備驅動、平臺驅動等也不進行詳細說明原理。如果有任何錯誤地方,請指出,謝謝!
一、整體概述
linux下的串口或者usb轉串口驅動都是依賴linux內核提供的tty核心、tty線路規劃和tty驅動,所以牽涉到很多層次,之所以有這么多層次,肯定是有它們存在意義的。
舉例來說,像串口或者usb轉串口的驅動,最終可以確定的是以字符設備驅動提供給上層使用,于是tty核心層就對這部分通用的實現進行了封裝,但這不是最重要的,最重要的是tty核心層里同時實現了一種數據格式化機制,這就是tty線路規劃,這樣的好處是可以分別針對不同類設備的線路規劃,比如針對終端io的,比如針對網絡的ppp還有slip還有藍牙還有IrDA等,這些的實現不需要考慮底層硬件,也就是說這些串口到具體協議的轉換的實現與硬件相分離了,這就是tty核心及tty線路規劃存在的目地。
那為什么會有tty驅動層呢? 也許你覺得我們的串口驅動可以直接通過tty核心提供的功能就可以實現了。 這個確實是可以,但是linux內核因為要兼容世界上存在的各種串口設備,所以針對串口額外實現了一個serial核心層,針對usb轉串口額外實現了usb-serial核心層,它們就是所謂的tty驅動層。我們的串口或者usb轉串口實現就是與tty驅動層打交道,當然串口芯片或者usb轉串口芯片有很多種,所以不同的芯片都要有對應的驅動,但是它們都是基于tty驅動層實現,這個是可以肯定的。
所以,我們要寫串口驅動,最好還是對這些層次有些了解。
整體框架圖如下:
這圖是直接摘抄網上的。其實,我認為在tty驅動層下還應該有個具體的驅動,比如如果是8250串口控制器芯片,那么應該有個8250的驅動,然后才是硬件。
更準確的圖我認為如下圖所示:
更詳細的如下圖所示:
下面摘抄網上的
(1)、tty線程規程
以特殊的方式格式化從一個用戶或者硬件收到的數據,這種格式化常常采用一個協議轉換的形式,如虛擬終端、PPP、Bluetooth、Ir等。
(2)、tty設備發送數據流程
tty核心從一個用戶獲取將要發送給一個tty設備的數據,tty核心將數據傳遞給tty線路規程驅動,接著數據被傳遞到tty驅動,tty驅動將數據轉換為可以發送的硬件格式。
(3)、tty設備接收數據流程
從tty硬件接收到的數據向上交給tty驅動,進入tty線路規程驅動,再進入tty核心,在此被用戶獲取。盡管tty核心與tty之間的數據傳輸會經歷tty線路規程的轉換,但是tty驅動與tty核心之間也可以直接傳輸數據。
再摘抄2張網上的圖:
tty設備的數據流通圖:
總結
以上是生活随笔為你收集整理的Linux 串口、usb转串口驱动分析(2-1) 【转】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [OpenGL ES 03]3D变换:模
- 下一篇: Bishops Alliance—— 最