linux設備驅動之串口移植,Linux設備驅動之UART驅動結構

一、對于串口驅動Linux系統中UART驅動屬于終端設備驅動,應該說是實現串口驅動和終端驅動來實現串口終端設備的驅動。要了解串口終端的驅動在Linux系統的結構就先要了解終端設備驅動在Linux系統中的結構體系,一方面自己了解的不夠,另一發面關于終端設備的體系結構網上有很多很好很詳細的資料參考,這里我主要是鑒于終端設備體系的復雜性,我大概總結一下自己了解到的一些方面和一個整體的框架。

二、終端設備的結構

163347506_1_20190611094930502.gif

Linux內核中?tty的層次結構圖所示,包含tty核心、tty線路規程和tty驅動。tty核心是對整個tty設備的抽象,對用戶提供統一的接口,tty線路規程是對傳輸數據的格式化,tty驅動則是面向tty設備的驅動,這是對設備的驅動,應該要我們來實現的,但是后面我們可以看到,對于串口驅動Linux還要進行抽象把共性提取出來封裝,使得整個驅動層次化簡單化。使得驅動的修改只要設計設備硬件的差異來,但是這樣使得設備驅動的結構體系比較復雜,過程層次太多,難于理解。

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

接收數據的流程為:?從tty硬件接收到的數據向上交給tty驅動,進入tty線路規程驅動,再進入?tty?核心,在這里它被一個用戶獲取。盡管大多數時候tty核心和tty之間的數據傳輸會經歷tty線路規程的轉換,但是tty驅動與tty核心之間也可以直接傳輸數據。

163347506_2_20190611094930846.gif

三、tty設備驅動結構

163347506_3_20190611094931143.gif

圖顯示了與tty相關的主要源文件及數據的流向。tty_io.c定義了tty?設備通用的file_operations結構體并實現了接口函數tty_register_driver()用于注冊tty設備,它會利fs/char_dev.c提供的接口函數注冊字符設備,與具體設備對應的tty驅動將實現tty_driver結構體中的成員函數。同時?tty_io.c也提供了tty_register_ldisc()接口函數用于注冊線路規程,n_tty.c文件則實現了tty_disc結構體中的成員。特定tty設備驅動的主體工作是填充tty_driver結構體中的成員,實現其中的成員函數。

四、串口驅動核心層

163347506_4_20190611094931393.gif

上圖的數據流向應該和上面tty設備驅動一樣,同樣需要經過tty線路規則層,不過上圖箭頭標的不是很準確,說明一下,因為圖是從網上下的。

很明顯的看得到由tty設備驅動到串口驅動中間經過了一層serial_core ,從tty設備驅動中需要填充的是tty_driver結構,經過串口核心層后就轉變成了實現xxx_uart.c 。到現在Linux系統已經封裝了終端設備(tty)的驅動,www.linuxidc.com而我們只需要實現串口驅動就能實現整個串口終端驅動。

五、主要結構與關系

對于tty驅動層主要有幾個重要的結構

serial_core實現了UART設備的通用TTY驅動層(稱為串口核心層),這樣UART驅動的主要任務演變成了實現serial_core中定義的一組uart_xxx接口而非tty_xxx接口,見如下的對應關系

----------------設備方法-----------------------------設備注冊------------------------設備信息

------------tty_operations------------------------tty_driver---------------------------tty-struct????????? // tty核心層定義,serial_core(串口核心層實現的結構體)

+???????????????????????????????????????????????????? +??????????????????????????????????????????????????? +

+???????????????????????????????????????????????????? +???????????????????????????????????????????????????? +

--------------uart_ops-----------------------------uart_driver---------------------------uart_port???? // 串口核心層定義,需要我們實現,但是Linuxs3c2410支持很好,我們只有去修改一下

----------s3c24xx_serial-ops-----------------s3c24xx_uart_drv-----------------s3c24xx_uart_port

對于s3c2410支持很好,一般只需要修改一些設備的硬件的一些寄存器設置的差異部分,所以看s3c2440的uart驅動代碼的時候發現好少,一開始我都懵了,怎么其他的驅動代碼這么多,怎么2440的代碼這么少,下一篇文章我將分析一下s3c2440的代碼。那么這樣一來主要修改的地方時s3c24xx_uart_port的一些設置

s3c24xx_uart_port主要包含一下幾個結構

uart_port

s3c24xx_uart_info??????? ——>主要是UART中的FIFO信息,需要修改

s3c34xx_uart_clksrc???? ——>UART時鐘、頻率 ,需要修改

另外在加上一個結構體 s3c2410_uartcfg ——>硬件端口、寄存器 ,這個需要修改

歸納起來,對于支持完善的s3c2410的Linux來修改成s3c2440的驅動,需要修改的地方就是后面說明的三個結構體啦,所以工作就簡單了很多啊。但是整個結構變的復雜了,上面是我自己總結的,圖是網上下載的,有什么地方不對或者錯誤,希望廣大網友指出,我好更正。163347506_5_20190611094931659.gif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532791.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532791.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux python復制安裝,復制一個Python全部環境到另一個環境,python另一個,導出此環境下安裝的包...

復制一個Python全部環境到另一個環境,python另一個,導出此環境下安裝的包導出此環境下安裝的包的版本信息清單pipfreeze>requirements.txt聯網,下載清單中的包到all-packet文件夾[[email protected] ~]# pip download -d ./all-packet -r requirement…

NVIDIA英偉達的Multi-GPU多卡通信框架NCCL

NVIDIA英偉達的Multi-GPU多卡通信框架NCCL 筆者注:NCCL 開源項目地址:https://github.com/NVIDIA/nccl 轉自:https://www.zhihu.com/question/63219175/answer/206697974 NCCL是Nvidia Collective multi-GPU Communication Library的簡稱&…

C語言n個坐標點間的最大距離,c語言已知兩點坐標,求另一點到穿過這兩點的直線最短距離。...

c語言已知兩點坐標,求另一點到穿過這兩點的直線最短距離。以下文字資料是由(歷史新知網www.lishixinzhi.com)小編為大家搜集整理后發布的內容,讓我們趕快一起來看一下吧!c語言已知兩點坐標,求另一點到穿過這兩點的直線最短距離。#…

[分布式訓練] 單機多卡的正確打開方式:理論基礎

[分布式訓練] 單機多卡的正確打開方式:理論基礎 轉自:https://fyubang.com/2019/07/08/distributed-training/ 瓦礫由于最近bert-large用的比較多,踩了很多分布式訓練的坑,加上在TensorFlow和PyTorch之間更換,算是熟…

s3c2416開發板 linux,S3C2416移植內核Linux3.1的wm9713聲卡過程

移植內核的聲卡驅動。原因沒有聲卡驅動,WM9713聲卡驅動移植(原來的內核有UDA1341聲卡驅動,我們再次基礎上直接修改)1、直接復制內核得到三個文件:s3c2416_wm9713.c , wm9713.c , s3c2416_ac97.c.linux-3.1\sound\soc\codecs\Wm9713.c---->wm9713.c;li…

Linux查看文件內容命令:cat, tail, head, more, less

Linux查看文件內容命令:cat, tail, head, more, less cat 直接顯示整個文件。 cat直接顯示全部文件內容,沒有換頁等交互。 cat filenamemore more命令,功能類似 cat ,cat命令是整個文件的內容從上到下顯示在屏幕上。 more會…

linux查看隊列 msg,linux第10天 msg消息隊列

cat /proc/sys/kernel/msgmax最大消息長度限制cat /proc/sys/kernel/msgmnb消息隊列總的字節數cat /proc/sys/kernel/msgmni消息條目數消息隊列綜合案例//server#include #include #include #include #include #include #include #include #define ERR_EXIT(m)do{perror(m);}wh…

Linux中 C++ main函數參數argc和argv含義及用法

Linux中 C main函數參數argc和argv含義及用法 簡介 argc 是 argument count的縮寫,表示傳入main函數的參數個數; argv 是 argument vector的縮寫,表示傳入main函數的參數序列或指針,并且第一個參數argv[0]一定是程序的名稱&…

c語言六位搶答器課程設計,51單片機八路搶答器課程設計

;說明:本人的這個設計改進后解決了前一個版本中1號搶答優先的問題,并增加了錦囊的設置,當參賽選手在回答問題時要求使用錦囊,則主持人按下搶答開始鍵,計時重新開始。;八路搶答器電路請看下圖是用ps仿真的,已…

ELF文件詳解—初步認識

ELF文件詳解—初步認識 轉自:https://blog.csdn.net/daide2012/article/details/73065204 一、 引言 在講解ELF文件格式之前,我們來回顧一下,一個用C語言編寫的高級語言程序是從編寫到打包、再到編譯執行的基本過程,我們知道在C…

埃及分數問題c語言,埃及分數問題(轉)

今日,小雨和小明來到網絡中心,繼續與劉老師討論“數的認識”問題。劉老師說:“還有一種‘埃及分數’需要認識。這是一類分裂分數的思維題,對思維能力的訓練很有價值。”小明說:“有意思,愿洗耳恭聽。”劉老…

linux常用命令--開發調試篇

前言 Linux常用命令中有一些命令可以在開發或調試過程中起到很好的幫助作用,有些可以幫助了解或優化我們的程序,有些可以幫我們定位疑難問題。本文將簡單介紹一下這些命令。 轉自:https://www.yanbinghu.com/2018/09/26/61877.html 示例程序…

簡單有趣的c語言小程序,一個有趣的小程序

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓源碼:#include #include #include #include #include HINSTANCE g_hInstance 0;LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nSh…

linux下ora 01110,ORA-01003ORA-01110

Oracle 9i數據庫登錄時,提示ORA-01003&ORA-01110,大概意思是數據文件存儲介質損壞。startup nomount,正常;alter database mount,也正常;alter database open,提示如下:alter database open*ERROR 位于第 1 行:ORA…

x11轉發:通過ssh遠程使用GUI程序

x11轉發:通過ssh遠程使用GUI程序 我們常常使用ssh服務遠程操控服務器,大多數操作我們都可以通過命令行命令來實現。 ssh遠程無法查看GUI程序 現在,筆者在x11-test目錄下放入一張圖片test.jpg,并通過opnencv-python寫一個簡單的…

操作系統引導詳細過程

操作系統引導詳細過程 轉自:https://blog.csdn.net/lijie45655/article/details/89366372 就直觀而言,我們所見到計算機啟動的過程是:按下電腦開機鍵,系統在黑色的屏幕下打印出一些英文語句、然后進入進度條狀態,最后…

android 自定義透明 等待 dialog,Android自定義Dialog內部透明、外部遮罩效果

Android自定義Dialog內部透明、外部遮罩效果發布時間:2020-09-09 03:01:41來源:腳本之家閱讀:117作者:zst1303939801本文實例為大家分享了Android自定義Dialog遮罩效果的具體代碼,供大家參考,具體內容如下圖…

對比損失的PyTorch實現詳解

對比損失的PyTorch實現詳解 本文以SiT代碼中對比損失的實現為例作介紹。 論文:https://arxiv.org/abs/2104.03602 代碼:https://github.com/Sara-Ahmed/SiT 對比損失簡介 作為一種經典的自監督損失,對比損失就是對一張原圖像做不同的圖像…

android 融云瀏覽大圖,融云 Android sdk kit 頭像昵稱更新機制

先申明筆者的實現方式不是唯一 也不一定是最優化的方案 如果您看到此篇博文 有不同看法 或者 更好的優化 更高的效率 歡迎在評論發表意見 融云官網點我融云頭像機制相關視頻詳解首先跟大家說一下 kit 跟 lib 的頭像機制 kit 是已經包含融云已經給開發者定制好的界面 諸如 會話界…

RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one.

RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. 報錯信息 報錯信息: RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. This error indicates tha…