亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么進行Linux的I2C驅動框架分析

發布時間:2021-10-21 17:28:55 來源:億速云 閱讀:146 作者:柒染 欄目:互聯網科技

本篇文章為大家展示了怎么進行Linux的I2C驅動框架分析,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

1.基本概念

總線

總線代表著同類設備需要共同遵守的工作時序,不同的總線對于物理電平的要求是不一樣的,對于每個比特的電平維持寬度也是不一樣,而總線上傳遞的命令也會有自己的格式約束。如I2C總線、USB總線、PCI總線等等。以I2C總線為例,在同一組I2C總線上連接著不同的I2C設備。

設備

設備代表真實的、具體的物理器件,在軟件上用器件的獨特的參數屬性來代表該器件。如I2C總線上連接的I2C從設備都有一個標識自己的設備地址,由這個設備地址來確定主設備發過來的命令是否該由它來響應。

驅動

簡單的說驅動代表著操作設備的方式和流程。

Linux總線設備框架的工作原理

如果想要弄清楚I2C驅動框架,必須深刻的理解Linux的總線設備框架。之所以會形成這樣的框架,很重要的原因是為了代碼的復用性。因為驅動和設備的關系是一對多的,對于相同類型的不同的設備,可共用同一套驅動程序接口。為了提高驅動的可移植性,Linux抽象出一套管理資源的函數。設備是存在的硬件,在設備里包含自己的屬性,也包含需要用到的資源。

總線的作用就是在軟件層面上對設備和驅動進行管理,設備要讓系統感知到自己的存在,所以需要向總線去注冊設備,驅動同樣也要向總線去注冊。對于總線,有I2C總線,Platform總線等等。但是Platform是虛擬總線。

對于總線上設備與驅動的匹配,由總線負責,設備在注冊的時候,總線會遍歷注冊在總線上的驅動,如果名字相同,則匹配上了,此時調用驅動程序的probe函數。同樣的驅動在注冊的時候,也會遍歷總線上的設備,如果匹配上(名字一樣),則也會調用驅動程序的probe函數。

2.I2C傳輸協議


對于I2C來說,有如下的特點:

1.一條串行數據線(SDA),一條串行時鐘線(SCL)

2.每個接到總線上的器件都可以使用軟件根據它的唯一地址來識別。

3.串行的8位雙向數據傳輸,位速率在標志模式下可達100kbit/s,在快速模式下可達400kbit/s。在高速模式下可達3.4Mbit/s。

下面來看一下具體的硬件連接

怎么進行Linux的I2C驅動框架分析

以上是TFS上的攝像頭I2C的連接方式,只有兩根線即可實現數據的傳輸。在傳輸過程中,需要注意以下三種類型的信號:

(1)開始信號(S):SCL為高電平時,SDA由高向低電平跳變,開始傳輸數據

(2)結束信號(P):SCL為高電平時,SDA由低向高電平跳變,結束傳輸數據

(3)響應信號(ACK):接收器在接收到8位數據后,在第9個時鐘周期,拉低SDA的電平

怎么進行Linux的I2C驅動框架分析

以上就是I2C的硬件層與協議層的基本概述,這部分可以作為基本認知。

3.Linux下I2C驅動程序的體系結構


對于Linux下的I2C驅動,其體系結構的組成主要分為三個部分

(1)I2C核心:I2C核心提供了I2C總線驅動和設備驅動的注冊,注銷方法,I2C通信方法(”algorithm”)上層的,與具體適配器無關的代碼以及探測設備,檢測設備地址的上層代碼等。

(2)I2C總線驅動:I2C總線驅動是對I2C硬件體系結構中適配器端的實現,適配器可由CPU控制,甚至可以直接集成在CPU內部。

(3)I2C設備驅動:I2C設備驅動(也稱為客戶驅動)是對I2C硬件體系結構中設備端的實現,設備一般掛接在受CPU控制的I2C適配器上,通過I2C適配器與CPU交換數據。

怎么進行Linux的I2C驅動框架分析

比較重要的文件

\kernel\drivers\i2c\i2c-core.c

這個文件實現了 I2C 核心的功能以及/proc/bus/i2c*接口。同時對I2C底層的收發函數進行封裝。會調用i2c_transfer ,里面實現了adap->algo->master_xfer(adap, msgs, num)

kernel\drivers\i2c\i2c-dev.c

該函數注冊了一個設備文件的功能,也就是注冊了一個字符設備驅動程序,可以通過/dev/i2c-0(i2c-0, i2c-1,…, i2c-10,…)找到具體的I2C適配器,這個I2C設備的主設備號為89,次設備號0~255。通過訪問這個接口,可以通過open()、 write()、 read()、 ioctl()和 close()等來訪問這個設備。

kernel\drivers\i2c\busses\i2c-v12-jz.c

該函數對君正的x1000底層的I2C操作控制函數,通過設置寄存器來進行I2C的控制。其最底層的收發函數都在該文件里定義。重要的是i2c_jz_algorithm,其中algorithm實現了對底層寄存器的操作。

比較重要的結構體

i2c_driver、 i2c_client、 i2c_adapter 和 i2c_algorithm這四個結構體十分的關鍵

i2c_driver

對應一套驅動方法,是純粹的用于輔助作用的數據結構,它不對應于任何的物理實體。

i2c_client

對應于真實的物理設備,每個 I2C 設備都需要一個 i2c_client 來描述。i2c_client 一般被包含在 I2C 字符設備的私有信息結構體中。

i2c_adpater

用來匹配i2c_driver與i2c_client。即 i2c_client 依附于 i2c_adpater。由于一個適配器上可以連接多個 I2C 設備, 所以一個 i2c_adpater 也可以被多個 i2c_client 依附, i2c_adpater 中包括依附于它的 i2c_client 的鏈表 。

i2c_algorithm

struct i2c_algorithm{
    //i2c模式下,收發函數接口
     int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,int num);
    //用于SMBUS模式下,收發函數接口
     int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,  unsigned short flags, char read_write,  u8 command, int size, union i2c_smbus_data *data);
    //用于檢查I2C主控制器所支持訪問接口,如I2C_FUNC_SMBUS_BYTE,查看是否支持smbus單字節讀取和寫操作
     u32 (*functionality) (struct i2c_adapter *);
}

該函數主要實現其I2C底層的操作

4.GC0328攝像頭I2C實例分析


對于攝像頭驅動程序,首先要知道如何讓攝像頭能夠正常工作。

第一步:攝像頭上電

在這一步的工作中,可以控制相關的GPIO進行攝像頭使能,控制RESET及POWERON來讓攝像頭正常工作。

GC0328的上電時序如下圖所示:

怎么進行Linux的I2C驅動框架分析

第二步:給攝像頭提供時鐘

這一步也比較的關鍵,對于攝像頭來說,其時鐘就是心跳,如果要讓攝像頭正常的工作,則需要x1000的CIM提供24MHz的時鐘給攝像頭。

第三步:配置攝像頭的寄存器

對于一個攝像頭sensor,需要其輸出指定大小及指定格式的圖片,則需要配置攝像頭的寄存器。而配置攝像頭寄存器就是需要通過I2C來進行配置。

第四步:配置CIM

x1000內部的攝像頭接口控制模塊,可以將攝像頭數據進行處理,可以進行幀錯誤檢查以及數據的傳輸。這部分的控制需要那些CIM相關的寄存器來完成。

第五步:啟動CIM

配置及初始化完成后就可以啟動攝像頭了,CIM負責數據傳輸及產生相應的中斷。

以上是攝像頭初始化的一個完整的過程,對于攝像頭初始化部分,I2C又是如何進行初始化及設置的呢?這也是本文的重點。

根據前面的總線設備驅動的框架,有driver那么肯定會有device。這兩者的匹配靠的是.id_table

對于gc0308,具體可以通過kernel/arch/mips/xburst/soc-x1000/chip-x1000/halley2/common/i2c_bus.c

可以看到向I2C總線注冊的device的是gc0308

怎么進行Linux的I2C驅動框架分析

如果匹配上了,則調用driver的.probe函數。下面我們來看一下該函數具體做了什么事情。

怎么進行Linux的I2C驅動框架分析

在probe函數中,主要向v412_i2c_subdev提供了一個可操作的client,也就是相當于I2C的操作函數的接口交給V4L2視頻驅動框架來進行管理。向V4L2視頻驅動框架提供的函數如下:

第一個結構體是有關視頻操作的接口,比如設備gc0328的輸出格式,得到當前的視頻輸出格式等等

怎么進行Linux的I2C驅動框架分析

第二個結構體是控制camera上電與斷電,以及控制白平衡,對焦的其他的參數

怎么進行Linux的I2C驅動框架分析

通過V4L2的I2C子設備控制來進行設置。下面來基本分析一下其調用過程:

當應用程序通過ioctl傳遞VIDIO_S_FMT,是可以設置攝像頭輸出的格式

怎么進行Linux的I2C驅動框架分析

然后看一下寫寄存器的過程

怎么進行Linux的I2C驅動框架分析

調用了i2c_smbus_write_byte_data該函數在kernel\drivers\i2c\i2c-core.c,這樣就進入了i2c總線操作函數中。

怎么進行Linux的I2C驅動框架分析

該函數會調用i2c_smbus_xfer

怎么進行Linux的I2C驅動框架分析

為什么不滿足條件,可以看注冊的i2c的平臺設備,在kernel\drivers\i2c\busses\i2c-v12-jz.c路徑下

有個i2c_algorithm的結構體

struct i2c_algorithm{
    //i2c模式下,收發函數接口
     int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,int num);
   //用于SMBUS模式下,收發函數接口
     int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,  unsigned short flags, char read_write,  u8 command, int size, union i2c_smbus_data *data);
    //用于檢查I2C主控制器所支持訪問接口,如I2C_FUNC_SMBUS_BYTE,查看是否支持smbus單字節讀取和寫操作
     u32 (*functionality) (struct i2c_adapter *);
}
怎么進行Linux的I2C驅動框架分析

所以只會向下執行,當執行到i2c_smbus_xfer_emulated ,會調用

怎么進行Linux的I2C驅動框架分析

該函數會調用

怎么進行Linux的I2C驅動框架分析

最后調用到kernel\drivers\i2c\busses\i2c-v12-jz.c的最底層的實現

怎么進行Linux的I2C驅動框架分析

在kernel\drivers\i2c\busses\i2c-v12-jz.c函數中

怎么進行Linux的I2C驅動框架分析

這個函數指向i2c_jz_xfer

在這個函數中,實現了I2C的讀寫,可以根據傳遞的flag進行判斷是讀操作函數寫操作

怎么進行Linux的I2C驅動框架分析

最底層操作寄存器來實現其讀寫函數

怎么進行Linux的I2C驅動框架分析

到這里,一個I2C完整的傳輸流程就完成了。

5.總結


對于I2C完整的傳輸協議,最重要的是弄清楚總線驅動程序的框架,因為I2C也是屬于總線框架。對于I2C總線設備框架的模型,可以用下圖來說明:

怎么進行Linux的I2C驅動框架分析

也就是device與driver同時向i2c總線上注冊。當注冊在總線上時,可以通過id_table進行匹配,匹配上之后會調用driver的.probe函數。對于一般的I2C設備,可以在probe函數中注冊一個字符設備驅動,從而應用層可以通過open函數打開/dev/i2c-0等設備節點。從而對I2C設備進行讀寫操作。而攝像頭部分,直接將控制接口傳遞給V4L2進行管理,這樣通過視頻設備驅動框架進行攝像頭調節,從而達到控制的目的。

上述內容就是怎么進行Linux的I2C驅動框架分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

元朗区| 防城港市| 英德市| 麦盖提县| 曲水县| 聂拉木县| 津市市| 博野县| 通江县| 中牟县| 江山市| 奉节县| 阳原县| 辽源市| 汨罗市| 甘德县| 木里| 三河市| 南京市| 万载县| 若羌县| 柘荣县| 肥西县| 新巴尔虎左旗| 乃东县| 石嘴山市| 汉沽区| 新民市| 云林县| 革吉县| 云安县| 长治县| 罗甸县| 康保县| 岳池县| 东山县| 临泽县| 株洲市| 阿勒泰市| 玉林市| 称多县|