導航:首頁 > 編程系統 > linux驅動層次

linux驅動層次

發布時間:2025-01-12 10:48:12

㈠ 如何學習嵌入式linux驅動

學習嵌入式Linux驅動,首先我們需要的是去了解整個嵌入式開發的整個流程分為四個層次:底層硬體設計、嵌入式驅動開發、內核開發、應用層開發。其中底層硬體設計必須要有一定的硬體功底,我建議你若不是科班出身(數電、模電、高頻學的比較好)的人不要去考慮。內核開發需要你有很好的軟體功底(C語言、C++學的很好,有過一定的項目經驗最好),這個事嵌入式驅動開發的人以後可以考慮發展的方向,不建議一開始就學。如果你是面臨著急需找工作的人並且你有一定的商業頭腦、創新思維,我認為學習應用層開發是最好不過的選擇,但是你別忘了因為簡單容易學所以學的人比較多。如果你把前面三個選擇都否定了,而且你C語言學的還可以,有學過C51或者STM32這些簡單的東西,你不妨看下去。如果你覺得這些對你沒用或者不感興趣,請就此打住不要再往下看不要再浪費你的時間了。親,去做你該做的事吧!
一、入門者:了解嵌入式
了解嵌入式開發我覺得最好的東西還是《嵌入式系統設計師教程》,這本書寫的很爛,無非是用來應付考試的。但是我認為對我們了解嵌入式開發需要學習些什麼東西還是有一點用處的,可以在網上瀏覽一下,你就可以知道嵌入式大概要學的東西,不建議精讀。另外如果想大致了解一下嵌入式開發的四個層次,可以看下韋東山韋老師的《作為一個新人,怎樣學習嵌入式Linux》http://blog.sina.com.cn/s/blog_13955cfdb0102v3it.html

二、初學者:學習使用Linux
我這里的初學者者指的是已經回了解了嵌入式,有慾望想往深處學習的碼農們。這個時候我們已經找到了感覺了。嵌入式操作系統有Vxworks、WINCE、uCLinux、Embedded Linux等操作,但是我們一般選擇Linux。原因有二:Linux代碼開源,可供學習免費使用。Linux學習的資料非常多,很容易找到小夥伴。學習嵌入式Linux驅動,就必須先學習使用Linux。但是我們對於Linux的使用其實不必學的太多,多了反而會在這浪費的時間。像大家都說可以的《鳥哥的linux私房菜》我不建議大家讀,我認為像《Linux就該這么學》這樣范范而談的書籍反而更適合我們初學者。我們對Linux的定位是:基本命令會用,不懂再查。
http://www.linuxprobe.com/chapter-00.html如果覺的適合自己可以去看下

二、菜鳥們:加強C語言,看得懂電路圖
我相信到這一階段你已經深深的愛上了Linux,當然你也可能恨死她了,恨她為什麼有那麼多命令,恨她為什麼不去想Windows那麼傻瓜式啊,點點就可以了,但是你別忘了其實Windows也有DOS命令行,只是你沒有用過而已吧。我對沒有去Linux命令界面敲過幾行命令的人視為不會使用操作系統的人,你覺得啦?
既然你愛上她了(不愛請不要再往下看),那請問你為了一個愛你的人做件可能對你難的事,你願意嗎?願意的話,我們就要去加強自己的C語言基礎,我覺得書看的多,視頻看的多,還不如看懂一本書,把一本書的程序題好好敲敲,你覺得啦?所以我還是推薦最好的入門的C語言書籍《C程序設計》譚浩強前輩寫的。對於看得懂電路圖我認為最好的是去下一個畫電路板的軟體隨便找幾個電路圖畫畫,慢慢就會了,當然你也可以跳過,我相信如果你真的愛上這一行了以後的學習工作中會逼出來的。

三、碼農們:選擇一塊合適的開發板,然後看書、看數據手冊、敲代碼、看視頻
嵌入式Linux驅動開發是一個敲代碼的過程,所以稱之為碼農。對於嵌入式Linux驅動開發來說是一個偏軟體的工作,而碼農們就是一個看書、看資料、看視頻學習理論知識,然後自己實現的反反復復的過程。只有你不斷Debug不斷解決不斷充實理論知識,才可能往更高層次走。對於書籍我推薦韋東山韋老師的《嵌入式Linux驅動開發完全手冊》,當然我覺得成為中國化的S3C2440數據手冊更好些(至於為什麼學ARM9的S3C2440可以往下看),當然這本書也有他的不好之處:太過於實踐,理論知識不全。我覺得配合杜春雷老師的《ARM體系結構與編程》看會非常好,有比較詳細的對ARM的介紹。另外既然我們學習S3C2440的話,《S3C2440數據手冊》我們是非看不可。另外老外寫的《設備驅動開發》也就是所謂的LDD,還有就是宋寶華老師的《Linux設備驅動開發詳解》,挺不錯的。視頻的話我力頂《嵌入式Linux驅動開發完全手冊》的作者韋東山韋老師的視頻,可以去百問網http://www.100ask.org/ 自行查看。開發板的話我覺得可以自行選擇,最好選擇S3c2440或者S3c2410的晶元,因為ARM9的資料最多,隨便上網搜就是一大把。
四、大神們:研究Linux
毛德操/ 胡希明寫的《Linux內核源代碼情景分析》、 趙炯《Linux內核完全注釋》、《unix環境高級編程》還有更多的可以去看一看瞧一瞧了,我相信你學到這里就可以自找出路了,我也目前在前面階段,以後把這些學習完再做補充了。

我相信能夠學習嵌入式Linux驅動的人都能夠知道有好的學習資料學習能夠事半功倍的,本人也是學習驅動的菜鳥,歷經了學習的滄桑,今天在這里分享一下自己學習嵌入式Linux驅動過程中自認為好的資料,不好請勿噴。有興趣的可以轉載分享給你的朋友。以後有時間我會整理我在學習過程中的東西,加我關注以後一起學習叫流。

㈡ linux主機側與設備側USB驅動

USB採用樹形拓撲結構,主機側和設備側的USB控制器分別稱為主機控制器((Host Controller)和USB設備控制器(UDC),每條匯流排上只有一個主機控制器,負責協調主機和設備間的通信,而設備不能主動向主機發送任何消息。

在Linux系統中,USB驅動可以從兩個角度去觀察,一個角度是主機側,一個角度是設備側。從上圖主機側去看,在Linux驅動中,處於USB驅動最底層的是USB主機控制器硬體,在其上運行的是USB主機控制器驅動,在主機控制器上的為USB核心層,再上層為USB設備驅動層(插入主機上的U盤、滑鼠、USB轉串口等設備驅動)。因此,在主機側的層次結構中,要實現的USB驅動包括兩類:USB主機控制器驅動和USB設備驅動,前者控制插入其中的USB設備,後者控制USB設備如何與主機通信。Linux內核中的USB核心負責USB驅動管理和協議處理的主要工作。主機控制器驅動和設備驅動之間的USB核心非常重要,其功能包括:通過定義一些數據結構、宏和功能函數,向上為設備驅動提供編程介面,向下為USB主機控制器驅動提供編程介面;維護整個系統的USB設備信息;完成設備熱插拔控制、匯流排數據傳輸控制等。

㈢ Linux網路設備驅動的具體結構

Linux網路設備驅動程序的體系結構從上到下可以劃分為4層,依次為網路協議介面層、網路設備介面層、提供實際功能的設備驅動功能層以及網路設備與媒介層,這4層的作用如下所示:
1)網路協議介面層向網路層協議提供統一的數據包收發介面,不論上層協議是ARP,還是IP,都通過dev_queue_xmit() 函數發送數據,並通過netif rx ()函數接收數據。這一層的存在使得上層協議獨立於具體的設備。
2)網路設備介面層向協議介面層提供統一的用於描述具體網路設備屬性和操作的結構體net device,該結構體是設備驅動功能層中各函數的容器。實際上,網路設備介面層從宏觀上規劃了具體操作硬體的設備驅動功能層的結構。
3)設備驅動功能層的各函數是網路設備介面層net_device數據結構的具體成員,是驅使網路設備硬體完成相應動作的程序,它通過hard_start_ xmit ()函數啟動發送操作,並通過網路設備上的中斷觸發接收操作。
4)網路設備與媒介層是完成數據包發送和接收的物理實體,包括網路適配器和具體的傳輸媒介,網路適配器被設備驅動功能層中的函數在物理上驅動。對於Linux系統而言,網路設備和媒介都可以是虛擬的。

㈣ linux中的底層,應用層,驅動之間的關系

內核--系統的底層,最核心的東西,操作系統運轉的基礎
驅動--應用程序與內核之間的介面,溝通應用軟體與操作系統的橋梁
應用層--所有的應用程序的統稱,實現某一個或幾個專有的功能

㈤ Linux系統中USB驅動程序的工作流程詳解

1.USB主機

在Linux驅動中,USB驅動處於最底層的是USB主機控制器硬體,在其之上運行的是USB主機控制器驅動,主機控制器之上為USB核心層,再上層為USB設備驅動層(插入主機上的U盤、滑鼠、USB轉串口等設備驅動)。

因此,在主機側的層次結構中,要實現的USB驅動包括兩類:USB主機控制器驅動和USB設備驅動,前者控制插入其中的USB設備,後者控制USB設備如何與主機通信。Linux內核USB核心負責USB驅動管理和協議處理的主要工作。主機控制器驅動和設備驅動之間的USB核心非常重要,其功能包括:通過定義一些數據結構、宏和功能函數,向上為設備驅動提供編程介面,向下為USB主機控制器驅動提供編程介面;通過全局變數維護整個系統的USB設備信息;完成設備熱插拔控制、匯流排數據傳輸控制等。

2.USB設備

Linux內核中USB設備側驅動程序分為3個層次:UDC驅動程序、Gadget API和Gadget驅動程序。UDC驅動程序直接訪問硬體,控制USB設備和主機間的底層通信,向上層提供與硬體相關操作的回調函數。當前Gadget API是UDC驅動程序回調函數的簡單包裝。Gadget驅動程序具體控制USB設備功能的實現,使設備表現出網路連接、列印機或USB Mass Storage等特性,它使用Gadget API控制UDC實現上述功能。Gadget API把下層的UDC驅動程序和上層的Gadget驅動程序隔離開,使得在Linux系統中編寫USB設備側驅動程序時能夠把功能的實現和底層通信分離。

3.層次

在USB設備組織結構中,從上到下分為設備(device)、配置(config)、介面(interface)和端點(endpoint)四個層次。USB設備程序綁定到介面上。

對於這四個層次的簡單描述如下:

(1)設備通常具有一個或多個的配置

(2)配置經常具有一個或多個的介面

(3)介面沒有或具有一個以上的端點

4.端點

USB通信最基本的形式是通過端點(USB端點分中斷(Interrupt)、批量(Bulk)、等時(ISO)、控制(Control)四種,每種用途不同),USB端點只能往一個方向傳送數據,從主機到設備或者從設備到主機,端點可以看作是單向的管道(pipe)。驅動程序把驅動程序對象注冊到USB子系統中,稍後再使用製造商和設備標識來判斷是否已經安裝了硬體。USB核心使用一個列表(是一個包含製造商ID和設備號ID的一個結構體)來判斷對於一個設備該使用哪一個驅動程序,熱插撥腳本使用它來確定當一個特定的設備插入到系統時該自動執行哪一個驅動程序的Probe。

5. 數據結構

(1)USB設備:對應數據結構struct usb_device

(2)配置:struct usb_host_config (任一時刻,只能有一個配置生效)

(3)USB介面:struct usb_interface (USB 核心將其傳遞給USB設備驅動,並由USB設備驅動負責後續的控制。一個USB介面代表一個基本功能,每個USB驅動控制一個介面。所以一個物理上的硬體設備可能需要 一個以上的驅動程序。)

(4)端點: struct usb_host_endpoint ,它所包含的真實端點信息在另一個結構中:struct usb_endpoint_descriptor(端點描述符,包含所有的USB特定數據)。

6. USB端點分類

USB 通訊的最基本形式是通過一個稱為端點的東西。一個USB端點只能向一個方向傳輸數據(從主機到設備(稱為輸出端點)或者從設備到主機(稱為輸入端點))。端點可被看作一個單向的管道。

USB 端點有 4 種不同類型, 分別具有不同的數據傳送方式:

(1)控制CONTROL

控制端點被用來控制對USB設備的不同部分訪問. 通常用作配置設備、獲取設備信息、發送命令到設備或獲取設備狀態報告。這些端點通常較小。每個 USB 設備都有一個控制端點稱為端點 0, 被 USB 核心用來在插入時配置設備。USB協議保證總有足夠的帶寬留給控制端點傳送數據到設備.

(2)中斷INTERRUPT

每當 USB 主機向設備請求數據時,中斷端點以固定的速率傳送小量的數據。此為USB 鍵盤和滑鼠的主要的數據傳送方法。它還用以傳送數據到USB設備來控制設備。通常不用來傳送大量數據。USB協議保證總有足夠的帶寬留給中斷端點傳送數據到設備.

(3)批量BULK

批量端點用以傳送大量數據。這些端點通常比中斷端點大得多. 它們普遍用於不能有任何數據丟失的情況。USB 協議不保證傳輸在特定時間范圍內完成。如果匯流排上沒有足夠的空間來發送整個BULK包,它被分為多個包進行傳輸。這些端點普遍用於列印機、USB Mass Storage和USB網路設備上。

(4)等時ISOCHRONOUS

等時端點也批量傳送大量數據, 但是這個數據不被保證能送達。這些端點用在可以處理數據丟失的設備中,並且更多依賴於保持持續的數據流。如音頻和視頻設備等等。

控制和批量端點用於非同步數據傳送,而中斷和等時端點是周期性的。這意味著這些端點被設置來在固定的時間連續傳送數據,USB 核心為它們保留了相應的帶寬。

7. endpoint

C/C++ Code復制內容到剪貼板structusb_host_endpoint{structusb_endpoint_descriptordesc;//端點描述符structlist_hearb_list;//此端點的URB對列,由USB核心維護void*hcpriv;structep_device*ep_dev;/*Forsysfsinfo*/unsignedchar*extra;/*Extradescriptors*/intextralen;intenabled;};

當調用USB設備驅動調用usb_submit_urb提交urb請求時,將調用int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb)把此urb增加到urb_list的尾巴上。(hcd: Host Controller Driver,對應數據結構struct usb_hcd )

8. urb

所有USB通訊均為請求--響應模式,USB設備不會主動向Host發送數據。寫數據:USB設備驅動發送urb請求給USB設備,USB設備不需要回數據。讀數據:USB設備驅動發送urb請求給USB設備,USB設備需要回數據。

USB 設備驅動通過urb和所有的 USB 設備通訊。urb用 struct urb 結構描述(include/linux/usb.h )。

urb 以一種非同步的方式同一個特定USB設備的特定端點發送或接受數據。一個 USB 設備驅動可根據驅動的需要,分配多個 urb 給一個端點或重用單個 urb 給多個不同的端點。設備中的每個端點都處理一個 urb 隊列, 所以多個 urb 可在隊列清空之前被發送到相同的端點。

一個 urb 的典型生命循環如下:

(1)被創建;

(2)被分配給一個特定 USB 設備的特定端點;

(3)被提交給 USB 核心;

(4)被 USB 核心提交給特定設備的特定 USB 主機控制器驅動;

(5)被 USB 主機控制器驅動處理, 並傳送到設備;

(6)以上操作完成後,USB主機控制器驅動通知 USB 設備驅動。

urb 也可被提交它的驅動在任何時間取消;如果設備被移除,urb 可以被USB核心取消。urb 被動態創建並包含一個內部引用計數,使它們可以在最後一個用戶釋放它們時被自動釋放。

8.1 提交 urb

一旦 urb 被正確地創建並初始化, 它就可以提交給 USB 核心以發送出到 USB 設備. 這通過調用函數sb_submit_urb 實現.

int usb_submit_urb(struct urb *urb, gfp_t mem_flags);

參數:

struct urb *urb :指向被提交的 urb 的指針

gfp_t mem_flags :使用傳遞給 kmalloc 調用同樣的參數, 用來告訴 USB 核心如何及時分配內存緩沖

因為函數 usb_submit_urb 可被在任何時候被調用(包括從一個中斷上下文), mem_flags 變數必須正確設置. 根據 usb_submit_urb 被調用的時間,只有 3 個有效值可用:

GFP_ATOMIC

只要滿足以下條件,就應當使用此值:

1) 調用者處於一個 urb 結束處理常式,中斷處理常式,底半部,tasklet或者一個定時器回調函數.

2) 調用者持有自旋鎖或者讀寫鎖. 注意如果正持有一個信號量, 這個值不必要.

3) current-state 不是 TASK_RUNNING. 除非驅動已自己改變 current 狀態,否則狀態應該一直是TASK_RUNNING .

GFP_NOIO

驅動處於塊 I/O 處理過程中. 它還應當用在所有的存儲類型的錯誤處理過程中.

GFP_KERNEL

所有不屬於之前提到的其他情況

在 urb 被成功提交給 USB 核心之後, 直到結束處理常式函數被調用前,都不能訪問 urb 結構的任何成員

8.2 urb結束處理常式

如果 usb_submit_urb 被成功調用, 並把對 urb 的控制權傳遞給 USB 核心, 函數返回 0; 否則返回一個負的錯誤代碼. 如果函數調用成功, 當 urb 被結束的時候結束處理常式會被調用一次.當這個函數被調用時, USB 核心就完成了這個urb, 並將它的控制權返回給設備驅動.

只有3 種結束urb並調用結束處理常式的情況:

(1)urb 被成功發送給設備, 且設備返回正確的確認.如果這樣, urb 中的status變數被設置為 0.

(2)發生錯誤, 錯誤值記錄在 urb 結構中的 status 變數.

(3)urb 從 USB 核心unlink. 這發生在要麼當驅動通過調用 usb_unlink_urb 或者 usb_kill_urb告知 USB 核心取消一個已提交的 urb,或者在一個 urb 已經被提交給它時設備從系統中去除.

9. 探測和斷開

在 struct usb_driver 結構中, 有 2 個 USB 核心在適當的時候調用的函數:

(1)當設備插入時, 如果 USB 核心認為這個驅動可以處理(USB核心使用一個列表(是一個包含製造商ID和設備號ID的一個結構體)來判斷對於一個設備該使用哪一個驅動程序),則調用探測(probe)函數,探測函數檢查傳遞給它的設備信息, 並判斷驅動是否真正合適這個設備.

(2)由於某些原因,設備被移除或驅動不再控制設備時,調用斷開(disconnect)函數,做適當清理.

探測和斷開回調函數都在USB集線器內核線程上下文中被調用, 因此它們休眠是合法的. 為了縮短 USB 探測時間,大部分工作盡可能在設備打開時完成.這是因為 USB 核心是在一個線程中處理 USB 設備的添加和移除, 因此任何慢設備驅動都可能使 USB 設備探測時間變長。

9.1探測函數分析

在探測回調函數中, USB設備驅動應當初始化它可能用來管理 USB 設備的所有本地結構並保存所有需要的設備信息到本地結構, 因為在此時做這些通常更容易.為了和設備通訊,USB 驅動通常要探測設備的端點地址和緩沖大小.

PS:Linux USB驅動相關細節知識補充

1. 在usb_fill_bulk_urb,usb_fill_int_urb,usb_fill_control_urb都需要指定回調函數,當此URB請求完成時,usb core回調用此函數。

注意:urb 回調函數是在中斷上下文運行, 因此它不應做任何內存分配, 持有任何信號量, 或任何可導致進程休眠的事情. 如果從回調中提交 urb 並需要分配新內存塊, 需使用 GFP_ATOMIC 標志來告知 USB 核心不要休眠.

2. urb封裝函數:

(1)int usb_bulk_msg(struct usb_device *usb_dev,unsigned int pipe,void*data, int len, int*actual_length,int timeout)

功能:創建批量 urb 並發送到指定的設備, 接著在返回之前等待完成.

參數:

struct usb_device *usb_dev :目標 USB 設備指針

unsigned int pipe :目標 USB 設備的特定端點. 必須使用特定的宏創建.

void *data :如果是 OUT 端點, 指向要發送到設備的數據的指針. 如果是 IN 端點, 這是從設備讀取的數據的緩沖區指針.

int len : data 參數指向的緩沖的長度

int *actual_length :指向函數放置真實位元組數的指針,根據端點方向,這些位元組要麼是被發送到設備的,要麼是從設備中讀取的.

int timeout :時鍾嘀噠數, 應等待的時間. 如果為 0, 函數永遠等待操作完成.

返回值:成功返回0,actual_length 參數包含被傳送或從設備中讀取的位元組數.否則返回負的錯誤值.

(2)int usb_control_msg(struct usb_device*dev, unsigned int pipe, __u8 request,__u8 requesttype, __u16 value, __u16 index,void *data, __u16 size,int timeout)

功能:創建控制 urb 並發送到指定的設備, 接著在返回之前等待完成.

參數:

struct usb_device *usb_dev :目標 USB 設備指針

unsigned int pipe :目標 USB 設備的特定端點. 必須使用特定的宏創建.

__u8 request :控制消息的 USB 請求值.

__u8 requesttype :控制消息的 USB 請求類型.

__u16 value :控制消息的 USB 消息值.

__u16 index :控制消息的 USB 消息索引值.

void *data :如果是 OUT 端點, 指向要發送到設備的數據的指針. 如果是 IN 端點, 這是從設備讀取的數據的緩沖區指針.

__u16 size : data 參數指向的緩沖的長度

int timeout :時鍾嘀噠數, 應等待的時間. 如果為 0, 函數永遠等待操作完成.

返回值:成功返回被傳送到或從設備讀取的位元組數.否則返回負的錯誤值.

(3)int usb_interrupt_msg(struct usb_device*usb_dev, unsigned int pipe,void *data,int len, int *actual_length,int timeout)

功能:創建中斷 urb 並發送到指定的設備, 接著在返回之前等待完成.其實就是usb_bulk_msg的包裝,所有參數和usb_bulk_msg一樣使用

閱讀全文

與linux驅動層次相關的資料

熱點內容
找不到鏡像文件和網路有關系嗎 瀏覽:493
如何找到使用軟體的app 瀏覽:73
wordcount降序 瀏覽:699
用模版批量建立excel表格文件 瀏覽:929
mif文件波形生成器 瀏覽:334
cf文件程序損壞修復器就行 瀏覽:469
華為qq下載的apk文件在哪裡 瀏覽:660
常用的邏輯數據模型各有什麼優缺點 瀏覽:698
2do安卓教程 瀏覽:313
全民突擊208版本一挑戰視頻 瀏覽:441
格蘭達編程工資待遇怎麼樣 瀏覽:68
iphone5s手機輸入法 瀏覽:556
攝像頭文件儲存在哪裡 瀏覽:301
sql查看資料庫文件 瀏覽:39
郵政app上英文名怎麼填 瀏覽:72
linuxgd庫安裝 瀏覽:990
我想買葯哪個網站比較好啊 瀏覽:266
超大數據運算用什麼語言 瀏覽:241
屬性里文件路徑也可以看見嗎 瀏覽:321
java怎樣截取字元串 瀏覽:195

友情鏈接