I2C
介绍I2C的功能和使用方法。
一共提供9个i2c bus,可支持dma传输,7 bit地址模式,总线支持100k / 400k/ 1.5M三种速度模式。i2c总线配置如下:
配置 | 说明 |
---|---|
spacemit,i2c-fast-mode | 400K速度模式 |
spacemit,i2c-high-mode | 1.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>;
};
};