1. 程式人生 > >驅動程式分層分離概念___匯流排裝置驅動模型

驅動程式分層分離概念___匯流排裝置驅動模型

在輸入子系統那一章,一個驅動分為上下兩層,現在我們要引入另外一個概念,叫做分層分離概念:

在輸入子系統,Input.c中中提供統一的介面,buttons.c專注於硬體相關的程式碼,evdev.c則專注於純軟體的東西,現在我們把這兩個分離出來,Input.c與下面一層分層,

//現在我們來看一下我們寫輸入子系統說的一個例子,gpio_keys.c

為什麼我們會關心probe函式,現在我們來引入另外一個概念:

匯流排BUS--驅動driver - 裝置device模型

device:放硬體相關的東西

driver:放比較穩定的程式碼

現在我們好奇這個模型怎麼用呢:

我們檢視一個這個函式:platform_driver_register(&gpio_keys_device_driver);


意思為向上通過一條虛擬匯流排driver_register(drv->driver)註冊一個driver

這個driver_register會將這個驅動結構體放到Bus的某個連結串列(比如:driver連結串列)裡面,

而硬體相關這邊:device_add會將device這個結構體放到連結串列上去

現在我們好奇的是,device這邊硬體相關的怎麼和driver這邊比較穩定的程式碼相聯絡起來呢?


我們知道,device_add會將device這個結構體放到連結串列上面之後,還會從driver中把它取出來進行比對,用的函式是匯流排裡面的比較函式match:將driver與device進行比較能不支援device,能支援的話就呼叫driver裡面的 .probe

函式

現在我們來看看device_add做什麼事情:

如圖1所示,把device放入bus的dev的連結串列

2,從匯流排的DRV連結串列取出每一個DRV,用匯流排的match函式判斷drv能否支援device,如果能夠支援的話,呼叫.PROBE函式

現在我們來看看drever_register做什麼事情:

如圖1所示,將driver放入連結串列

2,從device取出,與其一一比較,用bus的match函式

3,如果能夠支援,呼叫probe函式

注意了,這只不過是註冊並且左右建立連線的一種機制,driver和device只不過是一種結構體,裡面怎麼實現由我們自己決定,這裡只不過是提供一個機制,將一個驅動程式強制分為左右兩邊。

現在我們來看一個驅動程式,檔案路徑為:drivers\input\keyboard\ gpio_keys.c

現在我們來檢視一下platform_driver_register(&gpio_keys_device_driver)裡面有什麼東西

&platform_bus_type為一個虛擬匯流排,裡面有一個函式match,

那麼如何讓左右兩邊同時支援呢我們檢視一下match函式:

從程式碼可以看出,匹配是通過名字來判斷是否支援,從而呼叫.PROBE函式

如果想讓probe函式能被呼叫,則左邊應該有一個同名的platform device

************************************************** ***********************

敲重點了!!!!!!!!!!

************************************************** ***********************

現在我們乾脆來寫一個驅動程式實現點燈功能,來更好了解一下分層分離的概念

比如說,開發板有3個led燈,而我們只想點一盞燈,該如何做?

我們來寫一個驅動程式,將其強制分為左右兩邊

1,新建兩個檔案:led_dev.cled_drv.c

led_dev.c 檔案中,分配/設定/註冊一個platform_device

分配:

設定

註冊入口函式和出口函式

修飾一下入口函式和出口函式,並加上GPL協議:

新增標頭檔案:

新增release函式:

現在硬體相關的程式碼已經寫好了,現在我們來寫另一邊,即driver

-------------------------------------------------- ----------------------------------

led_drv.c 檔案中,分配/設定/註冊一個的platform_driver

新增標頭檔案:


寫出入口函式和出口函式並修飾一下,同時增加GPL協議:

定義一個platform driver,同時命名要相同

建立類名和相關變數等:

構造一個file_operation結構體:

現在我們來寫一下這個函式:led_probe函式,根據platform_device的資源進行ioremap

ioremap的作用英文的英文將一個IO  地址空間對映到核心的虛擬地址空間上去,便於訪問,同時要註冊字元裝置驅動程式

而對於led_remove函式,要我們解除安裝字元裝置驅動程式,同時寫出iounmap

寫出open函式:

寫出write函式:

寫出測試程式:

 

================================================== ==

我們現在來編譯-一下:

如圖1所示,將檔案拷貝到伺服器上去編譯

2,將其他檔案的生成檔案拷貝到本資料夾中,並修改一下生成檔案編譯的檔名

3,輸入使編譯:


4,編譯測試程式:arm-linux-gcc -o led_test led_test.c,並將編譯後的兩個 . ko 檔案拷貝到根檔案系統上去:

5,掛載NFS,並裝載led_dev,ko檔案,再裝載led_drv.ko,並檢視是否有dev/ LED:


使用測試程式。 . / led_test on 和 . /led_test off 即可檢視led的亮滅情況

從這裡我們就可以看到,本來一個很簡單的東西,我們認為的將他拆分成兩部分,左邊為硬體相關的東西,右邊為比較穩定的程式碼。

以上就是所謂的分離概念,分離經常用到的是所謂的裝置驅動程式匯流排模型,這種模型只提供一種機制而已,在這種機制中,想實現什麼是由我們自己決定的。


相關推薦

驅動程式分層分離概念___匯流排裝置驅動模型

在輸入子系統那一章,一個驅動分為上下兩層,現在我們要引入另外一個概念,叫做分層分離概念:在輸入子系統,Input.c中中提供統一的介面,buttons.c專注於硬體相關的程式碼,evdev.c則專注於純

IIC裝置驅動程式(十)————IIC匯流排驅動實現例項

#include <linux/kernel.h> #include <linux/module.h> #include <linux/i2c.h> #include <linux/init.h> #includ

USB大容量儲存裝置無法啟動--這個裝置(服務)的驅動程式已被禁用。另一個驅動程式可以提供這個功能。 (程式碼 32)

問題描述如下: 這個裝置(服務)的驅動程式已被禁用。另一個驅動程式可以提供這個功能。 (程式碼 32) 裝置 USB\VID_13FE&PID_4100\070C2647DC139778 在啟動時出現問題。 驅動程式名稱: usbstor.inf 類 GUI

十一、Linux驅動之platform匯流排裝置驅動

1. 基本概念     從Linux2.6開始Linux加入了一套驅動管理和註冊機制—platform平臺匯流排驅動模型。platform平臺匯流排是一條虛擬匯流排,platform_device為相應的裝置,platform_driver為相應的驅動。與傳統的bu

核心程式除錯手段 >>Linux裝置驅動程式

文章目錄 [0x100]常用核心除錯方式 [0x110]核心的DEBUG選項 [0x120]核心列印函式 >>printk [0x121]預設規則 [0x122]終端列印日誌級別配置 [0x12

Linux匯流排裝置驅動模型

Kobjec&Kset Sysfs檔案系統 proc檔案系統是提供一個介面給使用者,讓使用者能夠檢視系統執行的狀態資訊,讓使用者能夠修改核心的一些引數,比如說列印級別 sysfs是基於ram

解決安裝驅動程式時提示“Windows已經找到裝置驅動程式,但在試圖安裝它時遇到錯誤”“系統找不到指定路徑”問題。

作業系統 Windows 8.1 64位 故障現象 一臺掃描器,無法安裝驅動程式,每次搜尋到驅動之後,在安裝時會提示“Windows已經找到裝置的驅動程式,但在試圖安裝它時遇到錯誤”“系統找不到指定路徑”。 解決方案 嘗試更新多種版本的驅動,無效。

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

 源自 http://blog.chinaunix.net/uid-27664726-id-3334923.html  如果你瞭解了前面匯流排、裝置模型,分析匯流排裝置驅動模型的driver相對來說會輕鬆很多。開始也是看看其資料結構。 點選(此處)摺疊或開啟

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

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

驅動程式分層、分隔思想

文章來源:http://blog.csdn.net/zqixiao_09/article/details/51088887  前面我們學習I2C、USB、SD驅動時,有沒有發現一個共性,就是在驅動開發時,每個驅動都分層三部分,由上到下分別是: 1、XXX 裝置驅動

【linux】驅動-5-驅動框架分層分離&實戰

[toc] --- ## 前言 ## 5. 分離分層 本章節記錄實現LED驅動的大概步驟,且程式設計框架實現分離分層。 分離分層: * 上層:**系統** 相關。如模組註冊於登出。 * 下層:**硬體**操作。如提供 file_operations 。**分離**: * **裝置**。提供板卡資

【linux】驅動-6-匯流排-裝置-驅動

[toc] --- ## 前言 ## 6. 匯流排-裝置-驅動 **匯流排-裝置-驅動** 又稱為 **裝置驅動模型**。 ### 6.1 概念 * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-2021033012262324

驅動】第1課、字元裝置驅動

=====節一、字元裝置驅動程式之概念介紹=====1、模組(即某單一驅動)是如何構建的?答:構建一個最基本的驅動模組,只需要4函式+1標頭檔案:模組裝載函式xx_init(), 模組解除安裝函式xx_exit(), module_init(), module_exit(), <linux/init.h

嵌入式linux之塊裝置驅動程式概念,框架

不能像字元裝置驅動那樣,直接提供簡單的讀寫函式,效率過於低下 要將讀寫函式放入佇列,優化後,再去執行 框架: “` 框架: app: open,read,write “1.txt” ——————————————— 檔案的讀寫 檔

分離分層結構與平臺裝置驅動

        本文根據自己的理解分析了分離分層結構和機制,後面也結合點燈例子分析了平臺裝置驅動,水平有限, 錯誤之處歡迎批評指正。同時也希望能對大家有點幫助。 概念:         分層: 核心層和裝置相關層分開,如輸入子系統分核心層input.c 和裝置相關層 e

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

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

linux驅動分離分層概念

bus_drv_dev模型: 簡單說明: 這張圖就是全部了。 device是與硬體相關的程式碼,driver是比較穩定的驅動程式碼。 當修改硬體部分的時候,只修改dev裡面的東西。 =============================================

字元裝置驅動程式的三種寫法

驅動工程師如何去寫驅動程式? 要看原理圖。確定如何去操作硬體。 對於點亮led燈來說,確定引腳,檢視晶片手冊,確定如何去操作引腳,要設定哪些暫存器,如何設定這些暫存器才可以讓這個引腳輸出高電平或者低電平。 寫驅動程式 驅動程式起封裝作用,如何封裝。應用程式要操作硬體需要o

裝置驅動程式之一

一、塊裝置概述 linux支援的兩種重要的裝置型別分別是字元裝置和塊裝置,塊裝置可以隨機地以固定大小的塊傳送資料。與字元裝置相比,塊裝置有以下幾個特殊之處: 塊裝置可以從資料的任何位置進行訪問 塊資料總是以固定長度進行傳輸,即便請求的這是一個位元組 對塊裝置的訪問有大量的快

裝置驅動程式》--Jonathan corbet,Alessandro rubini & Greg kroah-hartman

第二章 構造和執行模組 2.1核心模組與應用程式的對比 1、應用程式可以是C的庫函式,而驅動程式只能使用linux核心原始碼中的函式,而不能使用C的庫函式。 2、應用程式是有main函式的;而驅動程式沒有main函式 3、驅動程式有自己的入口和出口;而應用程式