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
(1.0)通過bus_register()函式註冊IIC匯流排。我們看引數i2c_bus_type,它被定義為: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; }
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原始碼分