1 、不使用裝置樹檔案
當開始編寫 I2C 裝置驅動時,首先要添加裝置資訊。先來看一下在不使用裝置樹,使用平台檔案時,
如何在平台檔案中添加 I2C 裝置資訊。
在平台檔案中通過 i2c_board_info 結構體來描述一個具體的 I2C 裝置。i2c_board_info 結構體如下:
295 struct i2c_board_info {
296 char type[I2C_NAME_SIZE];
297 unsigned short flags;
298 unsigned short addr;
299 void *platform_data;
300 struct dev_archdata *archdata;
301 struct device_node *of_node;
302 struct fwnode_handle *fwnode;
303 int irq;
304 };
其中 type 和 addr 這兩個成員變量是必須要設定的,一個是 I2C 裝置的名字,一個是 I2C 裝置的器
件位址。打開 arch/arm/mach-imx/mach-mx27_3ds.c 檔案,此檔案中關于 OV2640 的 I2C 裝置資訊描述如
下:
392 static struct i2c_board_info mx27_3ds_i2c_camera = {
393 I2C_BOARD_INFO("ov2640", 0x30),
394 };
I2C_BOARD_INFO 來完成 mx27_3ds_i2c_camera 的初始化工作,I2C_BOARD_INFO 是一個宏,定義如下:
316 #define I2C_BOARD_INFO(dev_type, dev_addr) \
317 .type = dev_type, .addr = (dev_addr)
可以看出,I2C_BOARD_INFO 宏其實就是設定 i2c_board_info 的 type 和 addr 這兩個成員變量。可以
在平台檔案中找到許多類似的 I2C 裝置,在平台檔案中不僅有 I2C 裝置,還有其他許多不同類型的裝置,
而且裝置越多,越顯得平台檔案非常混亂,是以就産生了裝置樹檔案。
2 、使用裝置樹檔案
在使用裝置樹檔案時,隻需要在裝置樹檔案中添加相應的 I2C 裝置節點就可以了,比如 NXP 官方的 EVK
開發闆在 I2C1 上接了 mag3110 這個磁力計晶片,是以必須在 i2c1 節點下建立 mag3110 子節點,然後
在這個子節點内描述 mag3110 這個晶片的相關資訊。打開 imx6ull-14x14-evk.dts 這個裝置樹檔案,然後找
到如下内容:
1 &i2c1 {
2 clock-frequency = <100000>;
3 pinctrl-names = "default";
4 pinctrl-0 = <&pinctrl_i2c1>;
5 status = "okay";
6
7 [email protected] {
8 compatible = "fsl,mag3110";
9 reg = <0x0e>;
10 position = <2>;
11 };
......
20 };
第 7~11 行,向 i2c1 添加 mag3110 子節點,第 7 行“[email protected]”是子節點名字,“@”後面的
“0e”就是 mag3110 的 I2C 器件位址。第 8 行設定 compatible 屬性值為“fsl,mag3110”。第 9 行的 reg
屬性也是設定 mag3110 的器件位址的,是以值為 0x0e。I2C 裝置節點的建立重點是 compatible 屬性和 reg
屬性的設定,一個用于比對驅動,一個用于設定器件位址。
更多了解: