天天看點

迅為IMX6ULL開發闆Linux I2C裝置驅動編寫流程-資訊描述

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

屬性的設定,一個用于比對驅動,一個用于設定器件位址。

更多了解: