1. 程式人生 > >一步一步教你構建一個MPU6050(I2C類)驅動(一)

一步一步教你構建一個MPU6050(I2C類)驅動(一)

1 i2c基本協議和時序

i2c基礎的知識這裡就不提了,直接從時序開始,直接來看看i2c的波形

2 i2c子系統軟體框架

先來看看i2c匯流排的分層思想:

在分層圖中我們可以看到,driver和device在核心層中分別成為了2條連結串列,核心層會按一定的規則匹配兩條連結串列中的元素。

檢視核心原始碼 i2c-core.c ,找到了匹配的函式如下:

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

	if (!client)
		return 0;

	/* Attempt an OF style match */
	if (of_driver_match_device(dev, drv))
		return 1;

	/* Then ACPI style match */
	if (acpi_driver_match_device(dev, drv))
		return 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;

	return 0;
}

在這個函式中我們很清楚的看到I2c有三種匹配規則。第一種是按裝置樹匹配,第二種是按ACPT匹配,第三種則是按id_table匹配(實際上id_table匹配就是匹配dev和drv的名字)。

3  I2c子系統中涉及到的裝置樹檔案

這次我們按裝置樹來匹配,首先進入核心的裝置樹原始碼,新增我們的硬體

[email protected]:~/Myfile/linux-3.14-fs4412$ vi arch/arm/boot/dts/exynos4412-fs4412.dts

圖中的[email protected]部分就是我們這次要手動新增的。可以通過:/i2c來搜尋別的i2c裝置寫在哪個位置,在它的附近新增我們的程式碼。圖中程式碼在 pinctrl-0 = <&i2c5_bus>; 這句中寫錯了,應該是掛載在5號i2c總線上。

這次我們新增的程式碼如下:

[email protected]{
            #address-cells = <1>;
            #size-cells = <0>;
            samsung,i2c-sda-delay = <100>;
            samsung,i2c-max-bus-freq = <20000>;
            pinctrl-0 = <&i2c5_bus>;
            pinctrl-names = "default";
            status = "okay";

            //板子電路原理圖上,6050的掛載匯流排是低電平,因此是0x68,若是高電平就是0x69
            
[email protected]
{ compatible = "InvenSense,mpu6050"; reg = <0x68>; }; };

新增完後輸入   make dtbs   命令生成新的裝置樹檔案,然後燒寫到我們板子上。

這樣,i2c類驅動的前期準備工作就做好了。