一步一步教你構建一個MPU6050(I2C類)驅動(一)
阿新 • • 發佈:2019-01-03
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類驅動的前期準備工作就做好了。