1. 程式人生 > >linux IIC子系統分析(四)——I2c bus初始化

linux IIC子系統分析(四)——I2c bus初始化

這裡的I2C Bus 並不是通訊上的匯流排,而是linux系統為了管理裝置和驅動而虛擬出來的,在I2C Bus用來掛載後面將會使用到的I2C 介面卡(adapter)和I2C裝置(client)。另外,我們即將會使用到platform device和platform driver。注意這裡的i2c bus與platform bus不是屬於同一個型別的匯流排,platform bus用來管理platform driver 和platform device。這裡不要弄混淆了。.在整個linux 系統中只有一條platform bus,它在核心啟動時初始化:

start_kernel ->

rest_init ->

kernel_thread(建立系統程序) -> 

kernel_init -> do_basic_setup -> 

driver_init -> platform_bus_init -> 

device_register(&platform_bus)

根據上一章我們知道linux iic子系統我們首先初始化的是i2c_init() 函式,IIC Bus 就是在該函式中初始化的。

/dricer/i2c/i2c-core.c

static int __init i2c_init(void)
{
	int retval;

	retval = bus_register(&i2c_bus_type);                                (1.0)
	if (retval)
		return retval;
#ifdef CONFIG_I2C_COMPAT                                                     (2.0)
	i2c_adapter_compat_class = class_compat_register("i2c-adapter");     
	if (!i2c_adapter_compat_class) {
		retval = -ENOMEM;
		goto bus_err;
	}
#endif
	retval = i2c_add_driver(&dummy_driver);                               (3.0)
	if (retval)
		goto class_err;
	return 0;

class_err:
#ifdef CONFIG_I2C_COMPAT
	class_compat_unregister(i2c_adapter_compat_class);
bus_err:
#endif
	bus_unregister(&i2c_bus_type);
	return retval;
}
(1.0)通過bus_register()函式註冊IIC匯流排。我們看引數i2c_bus_type,它被定義為:
struct bus_type i2c_bus_type = {
	.name		= "i2c",
	.match		= i2c_device_match,                 (1.1)
	.probe		= i2c_device_probe,                 (1.2)
	.remove		= i2c_device_remove,
	.shutdown	= i2c_device_shutdown,
	.suspend	= i2c_device_suspend,
	.resume		= i2c_device_resume,
};

(1.1)匯流排提供的match方法:match方法用來進行 device 和driver 的匹配,在向匯流排註冊裝置或是驅動的的時候會呼叫此方法。

其函式定義為:

static int i2c_device_match(struct device *dev, struct device_driver *drv)
{
	struct i2c_client	*client = i2c_verify_client(dev);            (1.1.0)
	struct i2c_driver	*driver;

	if (!client)
		return 0;                                                    (1.1.1)

	driver = to_i2c_driver(drv);
	/* match on an id table if there is one */
	if (driver->id_table)
		return i2c_match_id(driver->id_table, client) != NULL;       (1.1.2)

	return 0;
}
(1.1.0)用struct i2c_client 來描述一個具體的IIC裝置,這裡指的是client device   。
(1.1.1)如果在裝置樹中沒有搜尋到裝置引數就直接返回。表示匹配不成功。

(1.1.2)如果IIC驅動的id_table 存在的話,使用i2c_match_id 進行函式進行匹配。匹配的方法是拿id_table 中的每一項與client 的name 進行匹配,如果名字相同則匹配成功。從這裡我們可以看出IIC匯流排的匹配方式與platform 匯流排的匹配方式是不同的:

IIC匯流排根據裝置名字和驅動中的id_table進行匹配

platform匯流排根據裝置名字和裝置驅動名字進行匹配

(1.2)匯流排提供的probe方法:probe方法在完成裝置和驅動的配對之後呼叫執行。

static int i2c_device_probe(struct device *dev)
{
	struct i2c_client	*client = i2c_verify_client(dev);
	struct i2c_driver	*driver;
	int status;

	if (!client)
		return 0;

	driver = to_i2c_driver(dev->driver);
	if (!driver->probe || !driver->id_table)
		return -ENODEV;
	client->driver = driver;
	if (!device_can_wakeup(&client->dev))                                       (1.2.0)
		device_init_wakeup(&client->dev,
					client->flags & I2C_CLIENT_WAKE);
	dev_dbg(dev, "probe\n");

	status = driver->probe(client, i2c_match_id(driver->id_table, client));     (1.2.1)
	if (status)
		client->driver = NULL;
	return status;
}
(1.2.0)IIC的電源管理
(1.2.1)呼叫IIC裝置驅動中的Probe 函式

(2.0)CONFIG_I2C_COMPAT 這個巨集不知道它具體是起什麼作用,沒看明白,請高人指點。在操作eeprom 的過程中,該巨集是沒有被定義的。

(3.0)這裡是新增一個虛假的iic client 驅動,實際裡面沒有做任何的事情,不知為何要定義它。

相關推薦

linux IIC子系統分析()——I2c bus初始

這裡的I2C Bus 並不是通訊上的匯流排,而是linux系統為了管理裝置和驅動而虛擬出來的,在I2C Bus用來掛載後面將會使用到的I2C 介面卡(adapter)和I2C裝置(client)。另外,

linux IIC子系統分析(二)—— linux i2c 架構概述

I2C匯流排因為它及簡單的硬體連線和通訊方式,在現在的很多裝置上它是一種不可或缺的通訊匯流排。如果用當微控制器直接操作I2C,其實很簡單,只要正確把握IIC的操作時序就可以了。但是在linux系統中,I

linux IIC子系統分析(九)——例項分析通過裝置節點訪問I2c裝置

在《 linux IIC子系統分析(四)——I2c bus初始化》 中我們建立了I2C 匯流排驅動,I2C adapter device 和adapter drivers也在這時建立在我們實際開發中,I2C 匯流排驅動一般晶片原廠會提供,我們開發一般是設計裝置驅動。在訪問I2

Linux檔案子系統( VFS)的初始

目錄   概述 檔案的描述 VFS系統的資料型別 各個資料結構之間的關係 VFS初始化 概述 Linux世界中一切都是檔案,Linux檔案子系統VFS(Virtual Filesystem)為使用者提供了檔案和檔案系統的相關介面,系統中所有檔案系統依賴V

Linux EMMC子系統分析-初始流程(轉載)

最近在解EMMC的一個bug,發現Linux EMMC有點小複雜,先整理個文件出來吧 用的是TI 平臺,僅分析MMC,不分析SD和SDIO mmc_init 2769 static int __init mmc_init(void

Linux時間子系統:定時器的引擎:clock_event_device

到來 開始 register 工作模式 統一 10個 net 說過 序列 早期的內核版本中,進程的調度基於一個稱之為tick的時鐘滴答,通常使用時鐘中斷來定時地產生tick信號,每次tick定時中斷都會進行進程的統計和調度,並對tick進行計數,記錄在一個jiffies變量

Linux時間子系統(十) tick broadcast framework

sub 之間 中斷處理 blog oca cast sso truct first 一、前言 在內核中,有cpuidle framework可以控制cpu的節電:當沒有進程調度到該cpu上執行的時候,swapper進程粉墨登場,將該cpu會被推入到idle狀態。當然CPU的

Linux IIO子系統分析-1-概述

http://blog.chinaunix.net/uid-20543672-id-2976189.html 分類: LINUX2011-10-20 15:33:25 最近稍微看了下LKML,發現裡面有一個子系統叫做“IIO”。以前沒有接觸過,所以Google了下。 IIO子系統全稱是 In

Linux 輸入子系統分析 Linux之輸入子系統分析(詳解)

為什麼要引入輸入子系統? 在前面我們寫了一些簡單的字元裝置的驅動程式,我們是怎麼樣開啟一個裝置並操作的呢? 一般都是在執行應用程式時,open一個特定的裝置檔案,如:/dev/buttons 1 ..... 2 int main(int argc, char **argv) 3 {

轉《Linux input子系統分析之一:軟體層次》

本文轉自:https://blog.csdn.net/yueqian_scut/article/details/47903853 輸入輸出是使用者和產品互動的手段,因此輸入驅動開發在Linux驅動開發中很常見。同時,input子系統的分層架構思想在Linux驅動設計中極

【原創】Linux中斷子系統)-Workqueue

# 背景 - `Read the fucking source code!` --By 魯迅 - `A picture is worth a thousand words.` --By 高爾基 說明: 1. Kernel版本:4.14 2. ARM64處理器,Contex-A53,雙核 3. 使用工具:S

Spring IOC 源碼簡單分析 04 - bean的初始

-s 示例 classpath 設置 isp 開始 follow spl abs ### 準備 ## 目標 了解 Spring 如何初始化 bean 實例 ##測試代碼 gordon.study.spring.ioc.IOC04_I

從零開始學習比特幣開發()--網路初始,載入區塊鏈和錢包,匯入區塊啟動節點

寫在前面: 本篇文章接續 從零開始學習區塊鏈技術(三)-接入比特幣網路的關鍵步驟解析、建立比特幣錢包,以及重要rpc指令 從零開始學習區塊鏈技術(二)–如何接入比特幣網路以及其原理分析 以及從零開始學習區塊鏈技術(一)–從原始碼編譯比特幣 如果這篇文章看不明白,請務必先閱讀之前的文章

Linux驅動開發(6)——GPIO初始

gpio-exynos4.c檔案的最後一行core_initcall(exynos4_gpiolib_init); core_initcall代表在linux初始化過程中會呼叫 exynos4_gpiolib_init函式中包括chip = exynos4_gpio_

NSQ原始碼分析(一)——nsqd的初始及啟動流程

nsq原始碼地址:https://github.com/nsqio/nsq 版本1.1.0  NSQ原始碼分析系列是我通過閱讀nsq的原始碼及結合網上的相關文章整理而成,由於在網上沒有找到很詳細和完整的文章,故自己親自整理了一份。如果有錯誤的地方,還請指正,希望這系列的文章給您帶來

SpringBoot(十):CommandLineRunner-初始資源

版權宣告 本文作者:低調小熊貓 本文連結:https://aodeng.cc/archives/springbootshi-si 版權宣告:本文采用知識共享署名 4.0 國際許可協議進行許可。轉載請註明出處! 參考:純潔的微笑:Spring Boot 如何解決

【kubernetes/k8s原始碼分析】kubelet原始碼分析之容器網路初始原始碼分析

一. 網路基礎   1.1 網路名稱空間的操作 建立網路名稱空間: ip netns add 名稱空間內執行命令: ip netns exec 進入名稱空間: ip netns exec bash   1.2 bridge-nf-c

Java--對接微信第篇之初始底部選單

第一步、新建一些實體類: Menu>Button>ComplexButton>CommonButton /** * 選單 */ public class Menu { private Button[] button; public B

dubbo原始碼分析-消費端啟動初始過程-筆記

消費端的程式碼解析是從下面這段程式碼開始的 <dubbo:reference id="xxxService" interface="xxx.xxx.Service"/> ReferenceBean(afterPropertiesSet) ->getObject() ->ge

【spring原始碼分析】IOC容器初始(二)

前言:在【spring原始碼分析】IOC容器初始化(一)中已經分析了匯入bean階段,本篇接著分析bean解析階段。 1.解析bean程式呼叫鏈 同樣,先給出解析bean的程式呼叫鏈: 根據程式呼叫鏈,整理出在解析bean過程中主要涉及的類和相關方法。 2.解析bean原始碼分