1. 程式人生 > >linux裝置模型之uart驅動架構分析

linux裝置模型之uart驅動架構分析

一:前言
接著前面的終端控制檯分析,接下來分析serial的驅動.在linux中,serial也對應著終端,通常被稱為串列埠終端.在shell上,我們看到的/dev/ttyS*就是串列埠終端所對應的裝置節點.
在分析具體的serial驅動之前.有必要先分析uart驅動架構.uart是Universal Asynchronous Receiver and Transmitter的縮寫.翻譯成中文即為”通用非同步收發器”.它是串列埠裝置驅動的封裝層.
二:uart驅動架構概貌
如下圖所示:

diyblPic

上圖中紅色部份標識即為uart部份的操作.
從上圖可以看到,uart裝置是繼tty_driver的又一層封裝.實際上uart_driver就是對應tty_driver.在它的操作函式中,將操作轉入uart_port.
在寫操作的時候,先將資料放入一個叫做circ_buf的環形快取區.然後uart_port從快取區中取資料,將其寫入到串列埠裝置中.
當uart_port從serial裝置接收到資料時,會將裝置放入對應line discipline的快取區中.
這樣.使用者在編寫串列埠驅動的時候,只先要註冊一個uart_driver.它的主要作用是定義裝置節點號.然後將對裝置的各項操作封裝在uart_port.驅動工程師沒必要關心上層的流程,只需按硬體規範將uart_port中的介面函式完成就可以了.

三:uart驅動中重要的資料結構及其關聯
我們可以自己考慮下,基於上面的架構程式碼應該要怎麼寫.首先考慮以下幾點:
1: 一個uart_driver通常會註冊一段裝置號.即在使用者空間會看到uart_driver對應有多個裝置節點.例如:
/dev/ttyS0  /dev/ttyS1
每個裝置節點是對應一個具體硬體的,從上面的架構來看,每個裝置檔案應該對應一個uart_port.
也就是說:uart_device怎麼同多個uart_port關係起來?怎麼去區分操作的是哪一個裝置檔案?

2:每個uart_port對應一個circ_buf,所以uart_port必須要和這個快取區關係起來

回憶tty驅動架構中.tty_driver有一個叫成員指向一個數組,即tty->ttys.每個裝置檔案對應設陣列中的一項.而這個陣列所程式碼的資料結構為tty_struct. 相應的tty_struct會將tty_driver和ldisc關聯起來.
那在uart驅動中,是否也可用相同的方式來處理呢?
將uart驅動常用的資料結構表示如下:
diyblPic




結合上面提出的疑問.可以很清楚的看懂這些結構的設計.

四:uart_driver的註冊操作
Uart_driver註冊對應的函式為: uart_register_driver()程式碼如下:
01 int uart_register_driver(struct uart_driver *drv)
02 {
03 struct tty_driver *normal = NULL;
04 int i, retval;
05
06 BUG_ON(drv->state);
07
08 /*
09 * Maybe we should be using a slab cache for this, especially if
10 * we have a large number of ports to handle.
11
*/
12 drv->state = kzalloc(sizeof(struct uart_state) * drv->nr, GFP_KERNEL);
13 retval = -ENOMEM;
14

相關推薦

linux裝置模型uart驅動架構分析

一:前言 接著前面的終端控制檯分析,接下來分析serial的驅動.在linux中,serial也對應著終端,通常被稱為串列埠終端.在shell上,我們看到的/dev/ttyS*就是串列埠終端所對應的裝置節點. 在分析具體的serial驅動之前.有必要先分析uart

Linux裝置模型tty驅動架構分析

------------------------------------------ 本文系本站原創,歡迎轉載!轉載請註明出處:http://ericxiao.cublog.cn/------------------------------------------一:前言Tty這個名稱源於電傳打位元組的簡稱。

【原創】linux裝置模型kset/kobj/ktype分析

# 背 景 - `Read the fucking source code!` --By 魯迅 - `A picture is worth a thousand words.` --By 高爾基 說明: 1. Kernel版本:4.14 2. ARM64處理器,Contex-A53,雙核 3. 使用工具:

Linux裝置模型tty&&uart驅動架構分析

五: uart_add_one_port()操作 在前面提到.在對uart裝置檔案過程中.會將操作轉換到對應的port上,這個port跟uart_driver是怎麼關聯起來的呢?這就是uart_add_ont_port()的主要工作了. 顧名思義,這個函式是在uart_driver增加一個port.程式碼如

linux裝置模型bus,device,driver分析

=============================== 本文系本站原創,歡迎轉載! 轉載請註明出處:http://blog.csdn.net/gdt_a20 ===============================   上篇分析了bus,driver的註冊過程

linux裝置模型匯流排 裝置驅動

《Linux核心修煉之道》讀書筆記 1、 裝置模型的上層建築由匯流排(bus) 、裝置(device)、 驅動(device_driver)這3個數據結構構成,裝置模型表示了它們之間的連線關係。

linux裝置模型I2C子系統

=============================== 本文系本站原創,歡迎轉載! 轉載請註明出處:http://blog.csdn.net/gdt_a20 ===============================       I2c子系統將i2c控制器(

linux裝置模型spi子系統

=============================== 本文系本站原創,歡迎轉載! 轉載請註明出處:http://www.cnblogs.com/gdt-a20 ===============================       相比於前面介紹的i2c子系統,spi子系

linux裝置模型mmc,sd子系統

struct mmc_host { 171         struct device           *parent;          172         struct device           class_dev; 173         int                    

linux裝置模型Class

    參考:http://www.wowotech.net/device_model/class.html     剛開始寫字元裝置驅動程式的時候,老師教我們自動建立裝置節點,“要先建立類,在類下面建立裝置,類名字不重要“。         firstdrv_class

學習《Linux裝置模型淺析驅動篇》筆記(一)

原文中說了,核心版本為2.6.29;這裡都貼3.15的核心原始碼; 檔案/drivers/rtc/rtc-s3c.c static struct platform_driver s3c_rtc_driver = {         .probe= s3c_rtc_pro

Linux裝置模型分析bus(基於3.10.1核心)

作者:劉昊昱  核心版本:3.10.1 一、bus定義 Linux裝置驅動模型中的bus,即可以是物理匯流排(如PCI、I2C匯流排)的抽象,也可以是出於裝置驅動模型架構需要而定義的虛擬的“platform”匯流排。一個符合Linux裝置驅動模型的device或devi

Linux裝置模型分析device_driver(基於3.10.1核心)

一、device_driver定義 181/**  182 * struct device_driver - The basic device driver structure  183 * @name:   Name of the device

Linux音訊驅動ASoC驅動架構

1.  ASoC的由來 ASoC--ALSA System on Chip ,是建立在標準ALSA驅動層上,為了更好地支援嵌入式處理器和移動裝置中的音訊Codec的一套軟體體系。在ASoc出現之前,核心對於SoC中的音訊已經有部分的支援,不過會有一些侷限性:    Codec驅動與SoC CPU的底層

linux tty驅動架構分析

轉自:http://blog.chinaunix.net/uid-24227137-id-3437527.html 前一陣子移植一個串列埠驅動,發現linux的驅動構架中,面向物件的思想已經根深蒂固。就比如這串列埠驅動,程式碼中經常有一些貌似和串列埠無關的程式碼,比如,tt

宋寶華《Linux裝置驅動開發詳解》——sysfs檔案系統與linux裝置模型(5.4.2)

以下讀書筆記內容,摘自宋寶華《Linux裝置驅動開發詳解》一書。 1、sysfs檔案系統的簡介 (1)linux2.6以後的核心引進syfs檔案系統,是虛擬檔案系統; (2)產生一個包括所有系統硬體

Linux裝置驅動程式學習(12) -Linux裝置模型(底層原理簡介)

以《LDD3》的說法:Linux裝置模型這部分內容可以認為是高階教材,對於多數程式作者來說是不必要的。但是我個人認為:對於一個嵌入式Linux的底層程式設計師來說,這部分內容是很重要的。 以我學習的ARM9為例,有很多匯流排(如SPI、IIC、IIS等等)在Linux下已經被

Linux裝置模型(匯流排、裝置驅動程式和類)之一:bus_type

      匯流排是處理器和一個或多個裝置之間的通道,在裝置模型中,所有的裝置都通過匯流排相連,甚至是內部的虛擬"platform"匯流排。可以通過ls -l /sys/bus看到系統載入的所有匯流排。drwxr-xr-x root     root             

Java內存模型從JMM角度分析DCL

span 利用 eight first 多人 能夠 的人 ref upload DCL,即Double Check Lock,中衛雙重檢查鎖定。其實DCL很多人在單例模式中用過,LZ面試人的時候也要他們寫過,但是有很多人都會寫錯。他們為什麽會寫錯呢?其錯誤根源在哪裏?有什麽

Linux queue.hTAILQ隊列分析

freebsd free tel 所有 lis img 對象 processor 宏定義 轉自 這兩天想看看memcached的實現,所以先學習了libevent,使用起來還是比較簡單的,其實是對select/poll/kqueue等的封裝,學習libevent過程中又