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 下platform設備和驅動注冊的先後順序
Linux關於匯流排、設備、驅動的注冊順序
設備掛接到匯流排上時,與匯流排上的所有驅動進行匹配(用bus_type.match進行匹配),
如果匹配成功,則調用bus_type.probe或者driver.probe初始化該設備,掛接到匯流排上
如果匹配失敗,則只是將該設備掛接到匯流排上。
驅動掛接到匯流排上時,與匯流排上的所有設備進行匹配(用bus_type.match進行匹配),
如果匹配成功,則調用bus_type.probe或者driver.probe初始化該設備;掛接到匯流排上
如果匹配失敗,則只是將該驅動掛接到匯流排上。
需要重點關注的是匯流排的匹配函數match(),驅動的初始化函數probe()
1. platform_bus_type--匯流排先被kenrel注冊。
2. 系統初始化過程中調用platform_add_devices或者platform_device_register,將平台設備(platform devices)注冊到平台匯流排中(platform_bus_type)
3. 平台驅動(platform driver)與平台設備(platform device)的關聯是在platform_driver_register或者driver_register中實現,一般這個函數在驅動的初始化過程調用。
通過這三步,就將平台匯流排,設備,驅動關聯起來。
1. platform bus先被kenrel注冊。
------------------------------------------------------
do_basic_setup() -->-driver_init() -->-platform_bus_init()-->bus_register()
2. 系統初始化過程中調用platform_add_devices或者platform_device_register,將平台設備(platform devices)注冊到平台匯流排中(platform_bus_type)
------------------------------------------------------
系統啟動階段,匯流排的驅動鏈表還是空的,所以啟動階段的platform_add_devices()只負責將設備添加到匯流排的設備鏈表上。
③ Linux驅動程序有幾種載入方式以及它們之間的區別
linux關於匯流排、設備、驅動的注冊順序
設備掛接到匯流排上時,與匯流排上的所有驅動進行匹配(用bus_type.match進行匹配),
如果匹配成功,則調用bus_type.probe或者driver.probe初始化該設備,掛接到匯流排上
如果匹配失敗,則只是將該設備掛接到匯流排上。
驅動掛接到匯流排上時,與匯流排上的所有設備進行匹配(用bus_type.match進行匹配),
如果匹配成功,則調用bus_type.probe或者driver.probe初始化該設備;掛接到匯流排上
如果匹配失敗,則只是將該驅動掛接到匯流排上。
需要重點關注的是匯流排的匹配函數match(),驅動的初始化函數probe()
1.
platform_bus_type--匯流排先被kenrel注冊。
2.
系統初始化過程中調用platform_add_devices或者platform_device_register,將平台設備(platform
devices)注冊到平台匯流排中(platform_bus_type)
3.
平台驅動(platform
driver)與平台設備(platform
device)的關聯是在platform_driver_register或者driver_register中實現,一般這個函數在驅動的初始化過程調用。
通過這三步,就將平台匯流排,設備,驅動關聯起來。
1.
platform
bus先被kenrel注冊。
------------------------------------------------------
do_basic_setup()
-->-driver_init()
-->-platform_bus_init()-->bus_register()
2.
系統初始化過程中調用platform_add_devices或者platform_device_register,將平台設備(platform
devices)注冊到平台匯流排中(platform_bus_type)
------------------------------------------------------
系統啟動階段,匯流排的驅動鏈表還是空的,所以啟動階段的platform_add_devices()只負責將設備添加到匯流排的設備鏈表上。
④ linux中設備和驅動到底有什麼區別,有什麼聯系啊學習2.6的內核,搞得好暈呢!
2.6.x版本的內核,核心部分變動不大。
每個小版本之間,都是在不停的添加新驅動、解一些小bug、對現有系統進行完善。
你如果讓我在這里說每個版本之間的區別的話,估計要寫好幾頁了。建議你到官網(www.kernel.org/目前已經可以訪問了)上去看下每個版本的ChangeLog。這個東西,沒有任何人比它說的更詳細了。如果你對某個修改比較感興趣,還可以下載對應的patch包,看看那些Hacker究竟做了哪些修改。
當然,最方便的方法,還是使用git把Kerne的代碼下載下來,然後用git log命令可以看到每次修改的歷史信息的。非常方便和詳細。
不明白的請追問。
⑤ Linux 主機驅動與外設驅動分離
Linux中的SPI、IPC、USB等子系統都利用了典型的把主機驅動和外設驅動分離的想法,讓主機端只負責產生匯流排上的傳輸波形,而外設端只是通過標準的API來讓主機端以適當的波形訪問自身。因此這裡面就涉及了4個軟體模塊:
1)主機端的驅動。根據具體的IC、SPI、USB等控制器的硬體手冊,操作具體的IPC、SPI、USB等控制器,產生匯流排的各種波形。
2)連接主機和外設的紐帶。外設不直接調用主機端的驅動來產生波形,而是調一個標準的API。由這個標準的API把這個波形的傳輸請求間接「轉發」給了具體的主機端驅動。當然,在這里,最好把關於波形的描述也以某種數據結構標准化。
3)外設端的驅動。外設接在I-C、SPI、USB這樣的匯流排上,但是它們本身可以是觸摸屏、網卡、音效卡或者任意一種類型的設備。我們在相關的i2c_driver、spi_driver、usb_driver這種xxx_driver的probe () 函數中去注冊它具體的類型。當這些外設要求IP℃、SPI、USB等去訪問它的時候,它調用「連接主機和外設的紐帶」模塊的標准API。
4)板級邏輯。板級邏輯用來描述主機和外設是如何互聯的,它相當於一個「路由表」。假設板子上有多個SPI控制器和多個SPI外設,那究竟誰接在誰上面管理互聯關系,既不是主機端的責任,也不是外設端的責任,這屬於板級邏輯的責任。這部分通常出現在arch/arm/mach-xxx下面或者arch/arm/bootldts下面。
什麼叫良好的軟體設計一言以蔽之,讓正確的代碼出現在正確的位置。不要在錯誤的時間、錯誤的地點,編寫一段錯誤的代碼。在LKML中,關於代碼出現在錯誤的位置,常見的台詞是代碼「out of place"。
Linux通過上述的設計方法,把一堆雜亂不友好的代碼變成了4個輕量級的小模塊,每個模塊都各得其所。每個模塊都覺得很「爽」,站在主機端想一想,它其實也是很「爽」的,因為它的職責本來就是產生波形,而現在我們就讓它只產生波形不幹別的;站在外設端想一想,它也變得一身輕松。
⑥ LINUX 終端設備驅動
在Linux系統中,終端是一種字元型設備,它有多種類型,通常使用tty (Teletype)來簡稱各種類型的終端設備。對於嵌入式系統而言,最普遍採用的是UART (Universal Asynchronous Receiver/Transmitter)串列埠,日常生活中簡稱串口。
Linux內核中tty的層次結構它包含tty核心tty_10.c、tty或路規在n_tty.C(頭現N_11Y線路規程)和tty驅動實例xxx_tty.c,tty線路規程的工作是以特殊的方式格式化從一個用戶或者硬體收到的數據,這種格式化常常採用一個協議轉換的形式tty _io.c本身是一個標準的字元設備驅動,它對上有字元改備的職貢,買現tle_operatIonS雙貝圖效。但是tty核心層對下又定義了tty_driver的架構,這樣tty設備驅動的主體工作就變成了琪允tty_driVeT依構體中的成員,實現其中的tty_operations的成員函數,而不再是去實現file_operations這一級的工作。tty設備發送數據的流程為:tty核心從一個用戶獲取將要發送給一個tty設備的數據,tty核心將數據傳遞給tty線路規程驅動,接著數據被傳遞到tty驅動,tty驅動將數據轉換為可以發送給硬體的格式。接收數據的流程為:從tty硬體接收到的數據向上交給tty驅動,接著進入tty線路規程驅動,再進入tty核心,在這里它被一個用戶獲取。盡管一個特定的底層UART設備驅動完全可以遵循上述tty_driver的方法來設計,即定義tty_driver並實現tty_operations中的成員函數,但是鑒於串口之間的共性,Linux考慮在文件drivers'ttyliserial'serial_core.c中實現了UART設備的通用tty驅動層(我們可以稱其為串口核心層)。這樣,UART驅動的主要任務就進一步演變成了實現serial-core.c中定義的一組uart_xxx介面而不是tty_xxx介面。因此,按照面向對象的思想,可以認為tty_driver是字元設備的泛化、serial-core是tty_driver的泛化,而具體的串口驅動又是serial-core的泛化。
⑦ linux匯流排驅動模型中,匯流排也是一種設備,匯流排與表示它的設備是怎麼聯系的
設備模型中,關心匯流排,設備,驅動這三個實體,匯流排將設備和驅動綁定,在系統每注冊一個設備的時候,會尋找與之匹配的驅動。相反,在系統每注冊一個驅動的時候,尋找與之匹配的設備,匹配是由匯流排來完成的。 你還可以看一看鏈表的信息。它們都是關聯的。 有個最牛的函數contain_o
f 非常牛。還有輪詢鏈表的函數。
⑧ Linux設備文件與設備驅動程序之間的關系
設各驅動程序在系統中的位置如圖1所示。由於設各驅動程序是直接與外部設各的寄存器打交道的,並且由於外部設各的多樣性及其快速的發展,設各驅動程序常常是由外部設各供應廠商或者是需要掛接外部設備的計算機開發人員提供的,因此,驅動程序不便與linux內核編制在一起形成一個一體化的結構。於是,linux允許把外部設備以內核模塊的形式來提供設各驅動程序。這樣就可使用戶根據需要'動態地向linux內核插入設各
設各驅動程序在系統中的位置如圖1所示。
由於設各驅動程序是直接與外部設各的寄存器打交道的,並且由於外部設各的多樣性及其快速的發展,設各驅動程序常常是由外部設各供應廠商或者是需要掛接外部設備的計算機開發人員提供的,因此,驅動程序不便與linux內核編制在一起形成一個一體化的結構。於是,linux允許把外部設備以內核模塊的形式來提供設各驅動程序。這樣就可使用戶根據需要'動態地向linux內核插入設各驅動模塊,從而大大提高了內核的靈活性。設備驅動程序與文件系統及應用程序的關系如圖2所示。
⑨ Linux系統下各設備的驅動版本怎麼檢查
對於網卡:
用ethtool
-i
ethX可以查詢該網路設備的版本信息
包括driver版本信息和firmware版本信息
用此命令也能看到匯流排信息和該設備所用的driver模塊名稱
假定該網卡使用的驅動模塊是intel的e1000
再用modinfo
e1000就可看到該driver模塊的詳細信息
⑩ 如何 理解 linux 設備 驅動 匯流排
linux
主機的硬體配備
lspci
找到的是目前主機上面的硬體配備
[root@www
~]#
lspci
[-vvn]
選項與參數:
-v
:顯示更多的
pci
介面裝置的詳細信息
-vv
:比
-v
還要更詳細的信息
-n
:直接觀察
pci
的
id
而不是廠商名稱
查閱您系統內的
pci
裝置:
[root@www
~]#
lspci
#不必加上任何選項,就能夠顯示出目前的硬體配備為何
host
bridge:
<==主板晶元
vga
compatible
controller
<==顯卡
audio
device
<==音頻設備
pci
bridge
<==介面插槽
usb
controller
<==usb控制器
isa
bridge
ide
interface
smbus
ethernet
controller
<==網卡
04:00.0
ethernet
controller:
realtek
semiconctor
co.,
ltd.
查看一般詳細信息
[root@www
~]#
lspci
-v
查看網卡詳細信息:
[root@www
~]#
lspci
-s
04:00.0
-vv
-s
:後面接的是每個設備的匯流排、插槽與相關函數功能