Linux驅動之I2C匯流排設備以及驅動

来源:https://www.cnblogs.com/embInn/archive/2020/07/12/13289367.html
-Advertisement-
Play Games

[ 導讀] 本文通過閱讀內核代碼,來梳理一下I2C子系統的整體視圖。在開發I2C設備驅動程式時,往往缺乏對於系統整體的認識,導致沒有一個清晰的思路。所以從高層級來分析一下I2C系統的設計思路,將有助於設計調試具體的驅動程式。 I2C/SMBUS基礎 I2C是一種晶元間通訊匯流排技術,最早由Philip ...


[ 導讀] 本文通過閱讀內核代碼,來梳理一下I2C子系統的整體視圖。在開發I2C設備驅動程式時,往往缺乏對於系統整體的認識,導致沒有一個清晰的思路。所以從高層級來分析一下I2C系統的設計思路,將有助於設計調試具體的驅動程式。

I2C/SMBUS基礎

I2C是一種晶元間通訊匯流排技術,最早由Philips設計制定。下麵內容參考I2C 2.1 規格書

  • 半雙工通信方式,通信採用主/從結構

  • 支持多主模式,下圖來源於I2C 2.0規格書

  • 其內部電氣實現採用集電極開路(Open-collector)/漏極開路(open-drain)結構以實現線與功能,這是匯流排的實現基礎,多晶元通過查詢匯流排狀態實現介質仲裁以實現匯流排控制。

  • 匯流排信號由兩線實現,串列時鐘線SCL(Serial Clock Line)/串列數據線SDA(serial Data Line)。
  • 具有三種通訊速率模式:
    • standard mode:0-100 kbps (bps: bit/s)
    • Fast mode:0-400 kbps
    • High-speed mode : 0-3.4Mbps
  • 可支持混速模式

  • 不同的速率在硬體設計時需要註意信號的完整性,I2C匯流排等效電容cx
  • 支持7bit/10bit 兩種晶元地址模式
  • I2C匯流排電氣特性,這個非常重要,須嚴格遵守標準的電氣特性

  • SMBUS(system management bus) 。 大多數SMBus系統也符合I2C,電氣約束對於SMBus更為嚴格,並且它標準化了特定的協議消息和習慣用語。 支持I2C的控制器也可以支持大多數SMBus操作,但是SMBus控制器並不支持I2C控制器將支持的所有協議選項。 通過使用I2C原語或通過向不支持這些I2C操作的i2c_adapter設備發出SMBus命令,可以執行各種SMBus協議操作。

    http://smbus.org/

  • I2C bus(Inter-Integrated Circuit bus) https://www.i2c-bus.org/

I2C 在Linux設備中的拓撲結構

  • 在PC體系中,大體如下拓撲:

PC體系中通過橋接晶元,擴展出PCI,在由PCI擴展出I2C適配器,進而得到I2C匯流排,或者橋接晶元直接擴展出SMBUS/I2C匯流排。

  • 在嵌入式應用中,則可能為:

嵌入式應用中,則可能更多的情況是處理器內置了I2C/SMBUS匯流排控制器,直接可得到I2C/SMBUS匯流排。嵌入式系統中常常會設計很多感測器掛載在I2C匯流排上,比如溫度檢測,壓力檢測等等,又或者諸如電容觸摸屏、電源管理IC等等。

代碼實現

  • I2C 的core實現位於./drivers/i2c/下,實現了I2C匯流排設備以及驅動(適配器)和設備驅動的註冊、註銷方法,I2C通信方法algorithm抽象,以及與具體硬體無關的代碼
  • I2C主控制器驅動位於 ./drivers/i2c/busses/,這裡主要實現匯流排控制器,具體體現為i2c_adapter的實現。負責I2C適配器與從設備通信。I2C匯流排驅動由i2c_adapter和i2c_algorithm來抽象描述。
  • 設備驅動則分散在./driver/下,這取決於具體的實現,種類繁多。
    • i2c-dev,大多位於drivers/i2c/i2c-dev.c,這種方法只是封裝了主機(I2Cmaster,一般是SoC中內置的I2C控制器)的I2C基本操作,並且嚮應用層提供相應的操作介面,應用層代碼需要自己去實現對slave的控制和操作,所以這種I2C驅動相當於提供給應用層可以訪問slave硬體設備的介面,本身並未對硬體做任何操作,應用需要實現對硬體的操作。這種模式也稱為應用驅動程式。
    • 另一種I2C驅動是將所有的代碼都放在驅動層實現,直接嚮應用層提供最終結果。應用層甚至不需要知道這裡面有I2C存在,譬如電容式觸摸屏驅動,直接嚮應用層提供/dev/input/event1的操作介面,應用層編程的人根本不知道event1中涉及到了I2C。

I2C子系統的主要目的是,對I2C匯流排以及設備利用面向對象編程思想實現統一建模,以高內聚-低耦合的軟體工程思想,實現一個分層體繫結構,以便於內核統一管理I2C設備,從而可以更容易的在linux下實現I2C設備以及高可移植。

主要數據結構

其內部有幾個關鍵數據結構,來梳理一下:

  • i2c_client, 用於抽象掛載在I2C匯流排上的從設備
  • i2c_driver,用於驅動掛載在I2C匯流排生的從設備,也即從設備的設備驅動程式
  • i2c_adapter,用於抽象I2C的主設備
  • i2c_algorithm,抽象I2C匯流排操作介面

i2c_devinfo

該結構體主要用於板級I2C信息管理

i2c_msg

該結構體主要用於抽象I2C報文,其內容如下:

i2c_timings

主要用於抽象I2C電氣特性,對於支持設備樹的系統構建而言,主要通過以下內核介面函數,從設備樹解析電氣特性參數。

void i2c_parse_fw_timings(struct device *dev, struct i2c_timings *t, bool use_defaults)
{
	int ret;

	memset(t, 0, sizeof(*t));

	ret = device_property_read_u32(dev, "clock-frequency", &t->bus_freq_hz);
	if (ret && use_defaults)
		t->bus_freq_hz = 100000;

	ret = device_property_read_u32(dev, "i2c-scl-rising-time-ns", &t->scl_rise_ns);
	if (ret && use_defaults) {
		if (t->bus_freq_hz <= 100000)
			t->scl_rise_ns = 1000;
		else if (t->bus_freq_hz <= 400000)
			t->scl_rise_ns = 300;
		else
			t->scl_rise_ns = 120;
	}

	ret = device_property_read_u32(dev, "i2c-scl-falling-time-ns", &t->scl_fall_ns);
	if (ret && use_defaults) {
		if (t->bus_freq_hz <= 400000)
			t->scl_fall_ns = 300;
		else
			t->scl_fall_ns = 120;
	}

	device_property_read_u32(dev, "i2c-scl-internal-delay-ns", &t->scl_int_delay_ns);

	ret = device_property_read_u32(dev, "i2c-sda-falling-time-ns", &t->sda_fall_ns);
	if (ret && use_defaults)
		t->sda_fall_ns = t->scl_fall_ns;

	device_property_read_u32(dev, "i2c-sda-hold-time-ns", &t->sda_hold_ns);
}
EXPORT_SYMBOL_GPL(i2c_parse_fw_timings);

i2c_device_identity

該結構體主要用於抽象I2C 設備的ID屬性,通過內核介面函數i2c_get_device_id以獲取設備ID屬性。

總體框架

概述

Linux I2C編程介面支持匯流排交互的主端和從端。從高層級看由兩種驅動程式和兩種設備構成:

  • 適配器設備與適配器設備驅動對:I2C 適配器驅動程式用於抽象控制器硬體;它綁定到一個物理設備(可能是一個PCI設備(PC體系多一些)或platform_device(嵌入式應用居多)),並構建i2c_adapter實體以呈現所管理的1個I2C匯流排段。

    • platform_device。 比如:i2c-s3c2410,如下:
static const struct platform_device_id s3c24xx_driver_ids[] = {
	{
		.name		= "s3c2410-i2c",
		.driver_data	= 0,
	}, {
		.name		= "s3c2440-i2c",
		.driver_data	= QUIRK_S3C2440,
	}, {
		.name		= "s3c2440-hdmiphy-i2c",
		.driver_data	= QUIRK_S3C2440 | QUIRK_HDMIPHY | QUIRK_NO_GPIO,
	}, { },
};
MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids);
  • pci-I2C 適配器設備。如在i2c-ali1535.c中:
/* ALI1535 device address register bits */
#define	ALI1535_RD_ADDR		0x01	/* Read/Write Bit in Device	*/
					/*  Address field		*/
					/*  -> Write = 0		*/
					/*  -> Read  = 1		*/
#define	ALI1535_SMBIO_EN	0x04	/* SMB I/O Space enable		*/
/*PCI 設備驅動*/
static struct pci_driver ali1535_driver;
static unsigned long ali1535_smba;
static unsigned short ali1535_offset;
  • I2C從設備及設備驅動對:每個I2C匯流排段上將有一個由結構i2c_client表示的I2C設備。這些設備將被綁定到一個struct i2c_driver,遵循標準的Linux驅動程式模型。

架構

圖片來源:https://www.kernel.org/doc/html/latest/i2c/slave-interface.html

主端匯流排驅動職責:

  • 適配器和演算法驅動程式,見下麵i2c_algorithm結構體詳細描述
  • 管理I2C匯流排交互

從端設備驅動職責:

  • i2c_client結構體具有設備的I2C匯流排地址以及適配器的驅動程式指針

當用戶程式發出文件操作申請I2C事務時

  1. i2C_transfer (i2C-core.c) 調用 adap_algo_master_xfer,數據或消息以i2c_msg結構體傳入。
  2. 適配器對硬體I / O地址進行讀/寫操作,實現底層的I2C讀寫設備操作。

從應用程式直到底層的大致交互流程如下:

總結一下

I2C匯流排子系統在Linux內核中I2C匯流排模型分為主/從兩端,主端主要有適配器以及適配器驅動負責管理匯流排,從端主要有從設備抽象以及設備驅動實現具體的從設備應用。主端適配器以兩種形式存在於內核代碼PCI橋接適配器或者platform_device形式。從總體理解I2C子系統的驅動模型,以及相應主要數據結構之間的關係,將有助於開發調試驅動程式,快速定位問題。
文章出自微信公眾號:嵌入式客棧,由於時間關係,博客可能無法及時更新,最新內容,請關註本人公眾號,嚴禁商業使用,違法必究


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言: 最近在關註微服務,在 eShop On Containers 項目中存在一個API網關項目,引起想深入瞭解下它的興趣。 一、API網關是什麼 API網關是微服務架構中的唯一入口,它提供一個單獨且統一的API入口用於訪問內部一個或多個API。它可以具有身份驗證,監控,負載均衡,緩存,請求分片與 ...
  • 最近兩天在Linux中調試.NET Core應用程式,同時我發現在Linux中調試.NET Core應用程式並不容易。一直習慣在Visual Studio中進行編碼和調試。現在我想的是可以簡單快速的測試.NET Core應用在Linux。所以通過本篇文章我們能瞭解到如何在Windows中使用Visu ...
  • DirectX與WPF DirectX DirectX(Direct eXtension,簡稱DX)是由微軟公司創建的多媒體編程介面,是一種應用程式介面(API)。DirectX可以讓以windows為平臺的游戲或多媒體程式獲得更高的執行效率,加強3D圖形和聲音效果,並提供設計人員一個共同的硬體驅動 ...
  • 頭文件添加方法:工程 屬性 配置屬性 c/c++ 常規 附加包含目錄(Additional Include Directories):加上頭文件存放目錄。註意:(1)路徑必須指向頭文件所在的子文件夾,而不能直到父文件夾就結束(2)每個路徑不需要加上雙引號,輸入了之後,vs會自動加上雙引號,如果自己加 ...
  • 動態引入技術的設計,對我們來說非常重要。 同時也說明動態語言的使用對我們來說也是非常重要。 沒有動態語言的支撐,有些想法可能不容易實現,或者有替代方案,可能會花更大的代價。 前端開發框架我們規劃設計了 apis文件夾 這個文件夾是用來存放所有的api定義的 規範要求 所有的api定義都是名動詞 同時 ...
  • 最近GRPC很火,感覺整RPC不用GRPC都快跟不上時髦了。 gRPC設計 gRPC是一種與語言無關的高性能遠程過程調用 (RPC) 框架。剛好需要使用一個的RPC應用系統,自然而然就盯上了它,但是它真能夠解決所有問題嗎?不見得,先看看他的優點: gRPC的主要優點: 現代高性能輕量級 RPC 框架 ...
  • 瞭解到了OrchardCore主要由兩個中間件(ModularTenantContainerMiddleware和ModularTenantRouterMiddleware)構成,下麵開始瞭解ModularTenantContainerMiddleware中間件第一行代碼。 瞭解asp.net co ...
  • 什麼是設計模式 ​ 要瞭解設計模式,首先得清楚什麼是模式。什麼是模式?模式即解決一類問題的方法論,簡單得來說,就是將解決某類問題的方法歸納總結到理論高度,就形成了模式。 ​ 設計模式就是將代碼設計經驗歸納總結到理論高度而形成的。其目的就在於:1)可重用代碼,2)讓代碼更容易為他人理解,3)保證代碼的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...