Skip to main content

I2C

介绍I2C的功能和使用方法。

一共提供9个i2c bus,可支持dma传输,7 bit地址模式,总线支持100k / 400k/ 1.5M三种速度模式。i2c总线配置如下:

配置说明
spacemit,i2c-fast-mode400K速度模式
spacemit,i2c-high-mode1.5M速度模式
spacemit,dma-disable关闭DMA传输

总线默认速率为 100K,如需切换速度模式,在 dts 中加入对应配置即可;

如切换为 fast mode,配置如下:

i2c6: i2c@d4018800 {
spacemit,i2c-fast-mode;
};

“spacemit,dma-disable”配置表示不使用 DMA 传输,在 dts 中去掉该配置即可打开 DMA 传输;

以 i2c6 为例,关闭 DMA 传输,k1-x.dtsi 中配置如下:

i2c6: i2c@d4018800 {
spacemit,dma-disable;
};

pinctrl

查看开发板原理图,找到 i2c 控制器使用的 pin 组。

以 i2c6 为例,假设原理图中分别使用 gpio56/57 作为 SCL/SDA,且配置可使用 k1-x_pinctrl.dtsi 中已定义的 pinctrl_i2c6_2 组,则方案 dts 配置如下。

&i2c6 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c6_2>;
};

i2c 设备配置

以 touchscreen 设备为例分析 i2c 设备的 dts 如何配置。

设备类型

确认设备类型以及使用的驱动。

选择 touchscreen 设备的 compatible 配置为“goodix,gt9xx”。

设备地址

确认设备的 i2c 通信地址(7 bit)。

查询原理图得到 touchscreen 设备地址为 0x5d,配置如下。

gt9xx@5d {
compatible = "goodix,gt9xx";
reg = <0x5d>;
}

通信频率

确认设备通信频率。

touchscreen 通信频率支持 100K,选择挂载在 i2c bus6 下,去掉“spacemit,i2c-fast-mode”,“spacemit,i2c-high-mode”配置,使用默认速率 100K。

设备控制信号

在方案原理图中查询设备所使用的控制信号。

touchscreen 的 reset / irq 信号分别为 gpio 114/58,irq-flags 配置为所需的中断触发方式(2 为下降沿触发),配置如下。

gt9xx@5d {
reset-gpios = <&gpio 114 GPIO_ACTIVE_HIGH>;
irq-gpios = <&gpio 58 GPIO_ACTIVE_HIGH>;
irq-flags = <2>;
};

设备 dts

touchscreen 设备地址为 0x5d,gpio 114/58 分别为 reset/irq 信号,下降沿触发中断,通信频率为 100K,配置触摸屏相应参数。

设备 dts 配置如下:

gt9xx@5d {
compatible = "goodix,gt9xx";
reg = <0x5d>;
reset-gpios = <&gpio 114 GPIO_ACTIVE_HIGH>;
irq-gpios = <&gpio 58 GPIO_ACTIVE_HIGH>;
irq-flags = <2>;
touchscreen-max-id = <11>;
touchscreen-size-x = <1200>;
touchscreen-size-y = <1920>;
touchscreen-max-w = <512>;
touchscreen-max-p = <512>;
};

dts

综合上述信息,i2c6 连接 i2c touchscreen 设备,方案 dts 配置如下。

&i2c6 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c6_2>;
status = "okay";

gt9xx@5d {
compatible = "goodix,gt9xx";
reg = <0x5d>;
reset-gpios = <&gpio 114 GPIO_ACTIVE_HIGH>;
irq-gpios = <&gpio 58 GPIO_ACTIVE_HIGH>;
irq-flags = <2>;
touchscreen-max-id = <11>;
touchscreen-size-x = <1200>;
touchscreen-size-y = <1920>;
touchscreen-max-w = <512>;
touchscreen-max-p = <512>;
};
};