linux的I2C驅動 讀寫操作

2021-08-05 19:03:37 字數 3148 閱讀 3530

接下來開始整體的介紹i2c,主要參考《linux裝置驅動開發詳解》。
1、i2c核心

i2c核心提供了i2c匯流排驅動和裝置驅動的註冊、登出方法,i2c通訊方法。

2、i2c匯流排驅動

i2c匯流排驅動是對i2c硬體體系結構中介面卡的實現。

i2c匯流排驅動主要包含i2c介面卡資料結構i2c_adapter、i2c介面卡的algorithm資料結構i2c_algorithm和控制i2c介面卡產生通訊訊號的函式。

經由i2c匯流排驅動的**,我們可以控制i2c介面卡以主控方式產生開始位、停止位、讀寫週期,以及以從裝置方式被讀寫、產生ack等。

3、i2c裝置驅動

i2c裝置驅動主要包含資料結構i2c_driver和i2c_client。

**路徑:drivers/i2c/busses/i2c_tegra.c

每個**架構都有他對應的匯流排**,下面介紹i2c_adapter、i2c_algorithm、i2c_msg三個結構體

定義匯流排介面卡

struct i2c_adapter ;
資料傳輸結構體,決定i2c的通訊方式

struct i2c_algorithm ;
資料格式

struct i2c_msg ;
i2c匯流排的初始化

static

int __init tegra_i2c_init_driver(void)

subsys_initcall(tegra_i2c_init_driver);

int platform_driver_register(struct platform_driver *drv)

export_symbol_gpl(platform_driver_register);

匯流排會像普通裝置那個去註冊驅動,並呼叫probe函式。

tegra_i2c_probe函式用於初始化i2c_adapter和i2c_algorithm結構體

static int tegra_i2c_probe(struct platform_device *pdev)

i2c_dev->base = base;

i2c_dev->clk = clk;

i2c_dev->i2c_clk = i2c_clk;

i2c_dev->iomem = iomem;

i2c_dev->adapter.algo =

&tegra_i2c_algo;

i2c_dev->irq = irq;

i2c_dev->cont_id = pdev->id;

i2c_dev->dev =

&pdev->dev;

i2c_dev->bus_clk_rate = pdata ? pdata->bus_clk_rate : 100000;

if (pdev->id ==

3) i2c_dev->is_dvc =

1; init_completion(&i2c_dev->msg_complete);

platform_set_drvdata(pdev, i2c_dev);

ret = tegra_i2c_init(i2c_dev);

……i2c_set_adapdata(&i2c_dev->adapter, i2c_dev);

i2c_dev->adapter.owner = this_module;

i2c_dev->adapter.class = i2c_class_hwmon;

strlcpy(i2c_dev->adapter.name, "tegra i2c adapter",

sizeof(i2c_dev->adapter.name));

i2c_dev->adapter.algo =

&tegra_i2c_algo;

i2c_dev->adapter.dev.

parent

=&pdev->dev;

i2c_dev->adapter.nr = pdev->id;

ret = i2c_add_numbered_adapter(&i2c_dev->adapter);

if (ret)

return

0; ……

}

通過i2c_set_adapdata函式設定i2c_adapter;

通過i2c_dev->adapter.algo = &tegra_i2c_algo去指定i2c_algorithm結構體

/*drivers/i2c/busses/i2c-tegra.c*/

static

const

struct i2c_algorithm tegra_i2c_algo = ;

master_xfer定義了資料傳輸函式。

上層通過read、write介面函式去呼叫驅動中對應的函式,在驅動中會定義file_operations
struct file_operations at24cxx_fops = 

;

在at24cxx_read函式中會呼叫i2c_transfer函式,進行資料的讀取。

/*drivers/i2c/i2c-core.c*/

int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)

else

/* retry automatically on arbitration loss */

orig_jiffies = jiffies;

for (ret = 0, try = 0; try

<= adap->retries; try++)

i2c_unlock_adapter(adap);

return ret;

} else

}export_symbol(i2c_transfer);

在i2c_transfer函式中呼叫adap->algo->master_xfer所指定的函式進行資料的傳輸。即呼叫匯流排去傳輸資料。

I2C驅動(2) 讀寫eeprom

include include include include include include include include include static unsigned short ignore static unsigned short normal addr 位址值是7位 改為0x60的話...

Linux驅動 I2C匯流排

這裡以rk3288為例子,使用的是linux4.14,根據裝置樹節點i2c 與rk3x i2c driver,match之後,就會呼叫對應的probe rk3x i2c probe 這裡主要就是註冊乙個adapt i2c add adapter 也就是i2c控制器,或者說是i2c主裝置,既然是主裝置...

Linux驅動之I2C裝置驅動

核心 4.20 晶元 hym8563 rtc 下面的 分析主要都在注釋中,會按照驅動中函式的執行順序分析。static const struct i2c device id hym8563 id module device table i2c,hym8563 id static const stru...