1 、不使用设备树文件
当开始编写 I2C 设备驱动时,首先要添加设备信息。先来看一下在不使用设备树,使用平台文件时,
如何在平台文件中添加 I2C 设备信息。
在平台文件中通过 i2c_board_info 结构体来描述一个具体的 I2C 设备。i2c_board_info 结构体如下:
295 struct i2c_board_info {
296 char type[I2C_NAME_SIZE]; /* I2C 设备名字 */
297 unsigned short flags; /* 标志 */
298 unsigned short addr; /* I2C 器件地址 */
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 mag3110@0e {
8 compatible = "fsl,mag3110";
9 reg = <0x0e>;
10 position = <2>;
11 };
......
20 };
第 7~11 行,向 i2c1 添加 mag3110 子节点,第 7 行“mag3110@0e”是子节点名字,“@”后面的
“0e”就是 mag3110 的 I2C 器件地址。第 8 行设置 compatible 属性值为“fsl,mag3110”。第 9 行的 reg
属性也是设置 mag3110 的器件地址的,因此值为 0x0e。I2C 设备节点的创建重点是 compatible 属性和 reg
属性的设置,一个用于匹配驱动,一个用于设置器件地址。
更多了解: