“I2C device tree configuration”的版本间的差异

来自百问网嵌入式Linux wiki
 
(未显示2个用户的13个中间版本)
第1行: 第1行:
[[Category:Linux_Operating_System]]
+
== Article purpose ==
[[Category:Low_speed_interface]]
+
本文介绍了如何配置“ I2C内部外围设备”<ref name="I2C internal peripheral"> [[I2C internal peripheral]] </ref> ''' when the peripheral is assigned to Linux<sup>&reg;</sup> OS''',尤其是:
[[Category:I2C]]
+
* 如何配置STM32 I2C外设
[[Category:DeviceTree]]
+
* 如何配置板上或硬件扩展上存在的STM32外部I2C器件。
 +
 
 +
使用'''设备树机制'''执行配置<ref> [[Device tree]]</ref>.
 +
 
 +
它由“STM32 I2C Linux<sup>&reg;</sup>驱动程序”使用,该驱动程序在 [[I2C overview|I2C]]框架中注册相关信息。
 +
 
 +
如果将外围设备分配给另一个执行上下文,请参阅 [[How to assign an internal peripheral to a runtime context]] 文章,以获取有关外围设备分配和配置的准则。
 +
 
 +
== DT bindings documentation ==
 +
I2C表示为:
 +
* “I2C总线的通用设备树绑定”<ref name="i2c.txt">{{CodeSource | Linux kernel | Documentation/devicetree/bindings/i2c/i2c.txt}}, Generic device tree bindings for I2C busses</ref>
 +
*“STM32 I2C控制器设备树绑定”<ref name="i2c-stm32.txt ">{{CodeSource |Linux kernel | Documentation/devicetree/bindings/i2c/i2c-stm32.txt}}</ref>
 +
 
 +
== DT configuration ==
 +
该硬件描述是'''STM32微处理器'''设备树文件(扩展名为.dtsi)和'''板子'''设备树文件(扩展名为.dts)的组合。 有关设备树文件分割的说明,请参见[[Device tree]]。
 +
 
 +
'''STM32CubeMX'''可用于生成板卡设备树。有关更多详细信息,请参考[[#How_to_configure_the_DT_using_STM32CubeMX|How to configure the DT using STM32CubeMX]]。
 +
 
 +
===DT configuration (STM32 level) ===
 +
 
 +
在设备级,I2C控制器声明如下:
 +
<pre>
 +
i2c2: i2c@40013000 {
 +
compatible = "st,stm32f7-i2c";
 +
reg = <0x5c002000 0x400>;
 +
interrupt-names = "event", "error", "wakeup";
 +
interrupts-extended = <&intc GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
 +
      <&intc GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
 +
      <&exti 22 1>;
 +
clocks = <&rcc I2C2_K>;
 +
resets = <&rcc I2C2_R>;
 +
#address-cells = <1>;
 +
#size-cells = <0>;
 +
dmas = <&dmamux1 35 0x400 0x05>,
 +
      <&dmamux1 36 0x400 0x05>;
 +
power-domains = <&pd_core>;
 +
st,syscfg-fmp = <&syscfg 0x4 0x2>;
 +
st,syscfg-fmp-clr = <&syscfg 0x44 0x2>;
 +
status = "disabled";
 +
};
 +
</pre>
 +
{{Warning|该设备树部分与STM32微处理器有关。 它必须保持原样,而不能由最终用户修改。}}
 +
 
 +
请参考DTS文件: stm32mp157c.dtsi<ref name=DTS>{{CodeSource | Linux kernel | arch/arm/boot/dts/stm32mp157c.dtsi}}</ref>
 +
 
 +
=== DT configuration (board level) ===
 +
<pre>
 +
&i2c3 {
 +
pinctrl-names = "default", "sleep";
 +
pinctrl-0 = <&i2c2_pins_a>;
 +
pinctrl-1 = <&i2c2_pins_sleep_a>;
 +
i2c-scl-rising-time-ns = <185>;
 +
i2c-scl-falling-time-ns = <20>;
 +
        st,smbus-alert;
 +
        st,smbus-host-notify;
 +
status = "okay";
 +
/delete-property/dmas;
 +
/delete-property/dma-names;
 +
 
 +
ov5640: camera@3c {
 +
        [...]
 +
};
 +
};
 +
</pre>
 +
 
 +
设备树配置分为两个级别:
 +
 
 +
==== I²C internal peripheral related properties ====
 +
 
 +
与I2C内部外围设备和I2C节点所属的I²C总线相关的设备树属性
 +
* '''{{highlight|pinctrl-0&1}}''' 配置取决于硬件板配置以及I2C设备如何连接到SCL,SDA(如果设备符合SMBus标准,则连接到SMBA)引脚。<br/> 有关引脚配置的更多详细信息,请参见: [[Pinctrl device tree configuration]]  
 +
* '''{{highlight|clock-frequency}}'''代表I2C总线速度:'''正常(100KHz)''','''快速(400KHz)'''和'''快速+(最高 1MHz)'''。该值以Hz为单位。
 +
* '''{{highlight|dmas}}''' 默认情况下,所有I2C实例均启用DMA。如果不需要,则由用户决定是否“删除”。
 +
''{{highlight|/delete-property/}}'' 用于删除I2C的DMA使用情况。要删除DMA,必须同时插入'''{{highlight|/delete-property/dma-names}}''' 和 '''{{highlight|/delete-property/dmas}}'''。
 +
* '''{{highlight|i2c-scl-rising/falling-time-ns}}'''是可选值,具体取决于板的硬件特性: 导线长度,电阻和电容的硬件设计。<br/> 这些值必须以纳秒为单位提供,并且可以通过观察示波器上的SCL上升和下降斜率来测量。请参见[[I2C device tree configuration#How to measure I2C timings | how to measure I2C timings]].<br/>I2C驱动程序使用此信息根据请求的 ''{{highlight|clock-frequency}}''来计算准确的I2C时序。 <br/>STM32CubeMX实现了遵循I2C标准并考虑用户输入的算法。 <br/>如果未提供这些值,则驱动程序将使用其默认值。 <br/>提供错误的参数将产生不正确的 ''{{highlight|clock-frequency}}''. 如果驱动程序未能根据用户输入计算时序参数(SCL上升/下降和时钟频率),则时钟频率将降级为较低的频率。'''示例''':如果用户将400 kHz指定为时钟频率,但是算法无法为指定的SCL上升和下降时间生成时序,则时钟频率将降至100 kHz。
 +
{{Info| 对于高于100KHz的I2C总线频率,强烈建议使用I2C时序。}}
 +
 
 +
 
 +
* '''{{highlight|st,smbus-alert}}''' 可选属性允许启用驱动程序对SMBus Alert机制的处理。 启用后,只要从设备生成SMBus警报消息,就会调用从驱动程序的警报功能。
 +
* '''{{highlight|st,smbus-host-notify}}''' 可选属性允许启用驱动程序对SMBus Host Notify机制的处理。 启用后,每当从设备发送主机通知消息时,就会调用IRQ处理程序。
 +
{{Info| 请参阅Linux smbus-protocol文档 <ref name="smbus-protocol ">{{CodeSource |Linux kernel | Documentation/i2c/smbus-protocol}}</ref>了解有关SMBus警报和主机通知处理的更多详细信息。}}
 +
 
 +
==== I²C devices related properties ====
 +
 
 +
与连接到指定I²C总线的I²C设备有关的设备树属性。 每个I²C设备均由一个子节点表示。
 +
 
 +
* '''{{highlight|reg}}''' 代表总线上的I2C外设从机地址。<br/> 请注意,某些从地址位对于框架可能具有特殊含义。 例如,31<sup>st</sup> 位表示10位设备功能。<br/> 有关更多详细信息,请参考i2c.txt <ref name="i2c.txt"/>。
 +
 
 +
====How to measure I2C timings====
 +
{{highlight|i2c-scl-rising-time-ns}} is measured on the SCL rising edge and {{highlight|i2c-scl-falling-time-ns}} on the SCL falling edge. On the oscilloscope, measure the time between the 20% to 80% range of amplitude for rising time and falling time in nanoseconds.<br/>
 +
[[File:I2C timings.png|thumb|link=|center|766px|alt=Alternate text|I2C timings]]
 +
 
 +
=== DT configuration examples ===
 +
====Example of an external EEPROM slave device====
 +
<pre>
 +
i2c4: {
 +
    status = "okay";
 +
    i2c-scl-rising-time-ns = <185>;
 +
    i2c-scl-falling-time-ns = <20>;
 +
 
 +
    eeprom@50 {
 +
        compatible = "at,24c256";
 +
        pagesize = <64>;
 +
        reg = <0x50>;
 +
    };
 +
};
 +
</pre>
 +
上面的示例在地址0x50的i2c-X总线(X取决于运行时探测的适配器数量)上注册一个EEPROM设备,并且该实例与使用相同Compatible属性注册的驱动程序兼容。<br/>
 +
请注意,驱动程序将使用MDMA进行数据传输,SCL上升/下降时间已作为输入提供。<br/>
 +
 
 +
====Example of an EEPROM slave device emulator registering on STM32 side====
 +
<pre>
 +
i2c4: {
 +
    eeprom@64 {
 +
        status = "okay";
 +
        compatible = "linux,slave-24c02";
 +
        reg = <0x40000064>;
 +
    };
 +
};
 +
</pre>
 +
上例在STM32侧的从机地址0x64处注册了一个EEPROM仿真器。 <br/>
 +
STM32充当I2C EEPROM,可通过连接在I2C总线上的外部主设备进行访问。
 +
 
 +
====Example of a stts751 thermal sensor with SMBus Alert feature enabled====
 +
 
 +
当达到配置阈值时,stts751热传感器 <ref>https://www.st.com/en/mems-and-sensors/stts751.html</ref> 能够发送SMBus警报。</br>
 +
可以在内核中启用设备驱动程序:</br>
 +
[x] Device Drivers
 +
    [x] Hardware Monitoring support
 +
        [x] ST Microelectronics STTS751
 +
 
 +
这可以在您的内核中手动完成:
 +
 
 +
CONFIG_SENSORS_STTS751=y
 +
 
 +
由于SMBus警报依靠专用引脚来工作,因此必须更新I2C控制器(此处为i2c2)的pinctrl以添加相应的SMBA引脚。</br>
 +
 
 +
对于i2c2控制器:
 +
<pre>
 +
i2c2_pins_a: i2c2-0 {
 +
    pins {
 +
        pinmux = <STM32_PINMUX('H', 4, AF4)>, /* I2C2_SCL */
 +
                        <STM32_PINMUX('H', 5, AF4)>, /* I2C2_SDA */
 +
                        <STM32_PINMUX('H', 6, AF4)>; /* I2C2_SMBA */
 +
        bias-disable;
 +
        drive-open-drain;
 +
        slew-rate = <0>;
 +
    };
 +
};
 +
 
 +
i2c2_pins_sleep_a: i2c2-1 {
 +
    pins {
 +
        pinmux = <STM32_PINMUX('H', 4, ANALOG)>, /* I2C2_SCL */
 +
                        <STM32_PINMUX('H', 5, ANALOG)>, /* I2C2_SDA */
 +
                        <STM32_PINMUX('H', 6, ANALOG)>; /* I2C2_SMBA */
 +
    };
 +
};
 +
</pre>
 +
 
 +
在设备树中,必须添加st,smbus-alert属性以及启用stts751的节点。</br>
 +
 
 +
<pre>
 +
i2c2: {
 +
    st,smbus-alert;
 +
    stts751@3b {
 +
        status = "okay";
 +
        compatible = "stts751";
 +
        reg = <0x3b>;
 +
    };
 +
};
 +
</pre>
 +
 
 +
==How to configure the DT using STM32CubeMX==
 +
The [[STM32CubeMX]]工具可用于配置STM32MPU设备并获取相应的 [[Device_tree#STM32|platform configuration device tree]] 文件。<br />
 +
STM32CubeMX可能不支持以上[[#DT bindings documentation|DT bindings documentation]]段中描述的所有属性。 如果是这样,该工具会在生成的设备树中插入'''用户部分''' 。 然后可以编辑这些部分以添加一些属性,并将它们一代一代地保留下来。 有关更多信息,请参见[[STM32CubeMX]] 用户手册。
 +
 
 +
==References==
 +
请参考以下链接以获取更多信息:
 +
 
 +
<references />

2020年11月8日 (日) 14:39的最新版本

Article purpose

本文介绍了如何配置“ I2C内部外围设备”[1] when the peripheral is assigned to Linux® OS,尤其是:

  • 如何配置STM32 I2C外设
  • 如何配置板上或硬件扩展上存在的STM32外部I2C器件。

使用设备树机制执行配置[2].

它由“STM32 I2C Linux®驱动程序”使用,该驱动程序在 I2C框架中注册相关信息。

如果将外围设备分配给另一个执行上下文,请参阅 How to assign an internal peripheral to a runtime context 文章,以获取有关外围设备分配和配置的准则。

DT bindings documentation

I2C表示为:

  • “I2C总线的通用设备树绑定”[3]
  • “STM32 I2C控制器设备树绑定”[4]

DT configuration

该硬件描述是STM32微处理器设备树文件(扩展名为.dtsi)和板子设备树文件(扩展名为.dts)的组合。 有关设备树文件分割的说明,请参见Device tree

STM32CubeMX可用于生成板卡设备树。有关更多详细信息,请参考How to configure the DT using STM32CubeMX

DT configuration (STM32 level)

在设备级,I2C控制器声明如下:

i2c2: i2c@40013000 {
	compatible = "st,stm32f7-i2c";
	reg = <0x5c002000 0x400>;
	interrupt-names = "event", "error", "wakeup";
	interrupts-extended = <&intc GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
			      <&intc GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
			      <&exti 22 1>;
	clocks = <&rcc I2C2_K>;
	resets = <&rcc I2C2_R>;
	#address-cells = <1>;
	#size-cells = <0>;
	dmas = <&dmamux1 35 0x400 0x05>,
	       <&dmamux1 36 0x400 0x05>;
	power-domains = <&pd_core>;
	st,syscfg-fmp = <&syscfg 0x4 0x2>;
	st,syscfg-fmp-clr = <&syscfg 0x44 0x2>;
	status = "disabled";
};
Warning.png 该设备树部分与STM32微处理器有关。 它必须保持原样,而不能由最终用户修改。

请参考DTS文件: stm32mp157c.dtsi[5]

DT configuration (board level)

&i2c3 {
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&i2c2_pins_a>;
	pinctrl-1 = <&i2c2_pins_sleep_a>;
	i2c-scl-rising-time-ns = <185>;
	i2c-scl-falling-time-ns = <20>;
        st,smbus-alert;
        st,smbus-host-notify;
	status = "okay";
	/delete-property/dmas;
	/delete-property/dma-names;

	ov5640: camera@3c {
         [...]
	};
};

设备树配置分为两个级别:

I²C internal peripheral related properties

与I2C内部外围设备和I2C节点所属的I²C总线相关的设备树属性

  • pinctrl-0&1 配置取决于硬件板配置以及I2C设备如何连接到SCL,SDA(如果设备符合SMBus标准,则连接到SMBA)引脚。
    有关引脚配置的更多详细信息,请参见: Pinctrl device tree configuration
  • clock-frequency代表I2C总线速度:正常(100KHz)快速(400KHz)快速+(最高 1MHz)。该值以Hz为单位。
  • dmas 默认情况下,所有I2C实例均启用DMA。如果不需要,则由用户决定是否“删除”。

/delete-property/ 用于删除I2C的DMA使用情况。要删除DMA,必须同时插入/delete-property/dma-names/delete-property/dmas

  • i2c-scl-rising/falling-time-ns是可选值,具体取决于板的硬件特性: 导线长度,电阻和电容的硬件设计。
    这些值必须以纳秒为单位提供,并且可以通过观察示波器上的SCL上升和下降斜率来测量。请参见 how to measure I2C timings.
    I2C驱动程序使用此信息根据请求的 clock-frequency来计算准确的I2C时序。
    STM32CubeMX实现了遵循I2C标准并考虑用户输入的算法。
    如果未提供这些值,则驱动程序将使用其默认值。
    提供错误的参数将产生不正确的 clock-frequency. 如果驱动程序未能根据用户输入计算时序参数(SCL上升/下降和时钟频率),则时钟频率将降级为较低的频率。示例:如果用户将400 kHz指定为时钟频率,但是算法无法为指定的SCL上升和下降时间生成时序,则时钟频率将降至100 kHz。
Info.png 对于高于100KHz的I2C总线频率,强烈建议使用I2C时序。


  • st,smbus-alert 可选属性允许启用驱动程序对SMBus Alert机制的处理。 启用后,只要从设备生成SMBus警报消息,就会调用从驱动程序的警报功能。
  • st,smbus-host-notify 可选属性允许启用驱动程序对SMBus Host Notify机制的处理。 启用后,每当从设备发送主机通知消息时,就会调用IRQ处理程序。
Info.png 请参阅Linux smbus-protocol文档 [6]了解有关SMBus警报和主机通知处理的更多详细信息。

I²C devices related properties

与连接到指定I²C总线的I²C设备有关的设备树属性。 每个I²C设备均由一个子节点表示。

  • reg 代表总线上的I2C外设从机地址。
    请注意,某些从地址位对于框架可能具有特殊含义。 例如,31st 位表示10位设备功能。
    有关更多详细信息,请参考i2c.txt [3]

How to measure I2C timings

i2c-scl-rising-time-ns is measured on the SCL rising edge and i2c-scl-falling-time-ns on the SCL falling edge. On the oscilloscope, measure the time between the 20% to 80% range of amplitude for rising time and falling time in nanoseconds.

Alternate text
I2C timings

DT configuration examples

Example of an external EEPROM slave device

i2c4: {
    status = "okay";
    i2c-scl-rising-time-ns = <185>;
    i2c-scl-falling-time-ns = <20>;
   
    eeprom@50 {
        compatible = "at,24c256";
        pagesize = <64>;
        reg = <0x50>;
    };
};

上面的示例在地址0x50的i2c-X总线(X取决于运行时探测的适配器数量)上注册一个EEPROM设备,并且该实例与使用相同Compatible属性注册的驱动程序兼容。
请注意,驱动程序将使用MDMA进行数据传输,SCL上升/下降时间已作为输入提供。

Example of an EEPROM slave device emulator registering on STM32 side

i2c4: {
    eeprom@64 {
        status = "okay";
        compatible = "linux,slave-24c02";
        reg = <0x40000064>;
    };
};

上例在STM32侧的从机地址0x64处注册了一个EEPROM仿真器。
STM32充当I2C EEPROM,可通过连接在I2C总线上的外部主设备进行访问。

Example of a stts751 thermal sensor with SMBus Alert feature enabled

当达到配置阈值时,stts751热传感器 [7] 能够发送SMBus警报。
可以在内核中启用设备驱动程序:

[x] Device Drivers
    [x] Hardware Monitoring support
        [x] ST Microelectronics STTS751

这可以在您的内核中手动完成:

CONFIG_SENSORS_STTS751=y

由于SMBus警报依靠专用引脚来工作,因此必须更新I2C控制器(此处为i2c2)的pinctrl以添加相应的SMBA引脚。

对于i2c2控制器:

i2c2_pins_a: i2c2-0 {
    pins {
        pinmux = <STM32_PINMUX('H', 4, AF4)>, /* I2C2_SCL */
                        <STM32_PINMUX('H', 5, AF4)>, /* I2C2_SDA */
                        <STM32_PINMUX('H', 6, AF4)>; /* I2C2_SMBA */
        bias-disable;
        drive-open-drain;
        slew-rate = <0>;
    };
};

i2c2_pins_sleep_a: i2c2-1 {
    pins {
        pinmux = <STM32_PINMUX('H', 4, ANALOG)>, /* I2C2_SCL */
                        <STM32_PINMUX('H', 5, ANALOG)>, /* I2C2_SDA */
                        <STM32_PINMUX('H', 6, ANALOG)>; /* I2C2_SMBA */
    };
};

在设备树中,必须添加st,smbus-alert属性以及启用stts751的节点。

i2c2: {
    st,smbus-alert;
    stts751@3b {
        status = "okay";
        compatible = "stts751";
        reg = <0x3b>;
    };
};

How to configure the DT using STM32CubeMX

The STM32CubeMX工具可用于配置STM32MPU设备并获取相应的 platform configuration device tree 文件。
STM32CubeMX可能不支持以上DT bindings documentation段中描述的所有属性。 如果是这样,该工具会在生成的设备树中插入用户部分 。 然后可以编辑这些部分以添加一些属性,并将它们一代一代地保留下来。 有关更多信息,请参见STM32CubeMX 用户手册。