DFSDM device tree configuration

来自百问网嵌入式Linux wiki

Article purpose

本文的目的是说明在将外围设备分配给Linux® OS时如何配置 DFSDM internal peripheral尤其是:

  • 如何配置DFSDM外设以启用过滤器和关联的通道
  • 如何配置电路板,例如 串行接口输入/输出引脚

使用 device tree mechanism执行配置。

DFSDM Linux driver 使用它在IIOALSA框架中注册相关信息。

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

DT bindings documentation

DFSDM可以用作各种功能:ADC和DMIC(用于音频)。

每一个都由单独的兼容字符串表示,在此处记录:

  • STM32 DFSDM ADC设备树绑定[1]
  • 音频DFSDM设备树绑定[2]

外部模拟前端(例如,Sigma-Delta调制器)记录如下:

  • 用于Sigma增量调制器的设备树绑定[3]

DT configuration

该硬件描述是STM32微处理器和电路板设备树文件的组合。 有关设备树文件分割的更多说明,请参见 Device tree

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

DT configuration (STM32 level)

DFSDM节点在stm32mp157c.dtsi中声明[4].

  • DT根节点('dfsdm')描述ADC硬件模块参数,例如寄存器区域,时钟。
  • DT子节点('dfsdm0', 'dfsdm1', ...) 分别描述每个过滤器:兼容的字符串,中断,DMA。
dfsdm: dfsdm@4400d000 {
	compatible = "st,stm32mp1-dfsdm";
	...                                                                            /* common resources in 'dfsdm' root node. */
	dfsdm0: filter@0 {
		compatible = "st,stm32-dfsdm-adc";                                     /* can either be st,stm32-dfsdm-(adc or dmic) */
		...                                                                    /* private resources in 'dfsdm0' child node. */
	}
	dfsdm1: filter@1 {
		...
	}
Warning.png 该设备树部分与STM32微处理器有关。它应该保持原样,而不要由最终用户修改。

DT configuration (board level)

请按照以下章节中描述的顺序在板上配置和启用DFSDM。

Common resources for all DFSDM filters

配置'dfsdm'DT根节点

  • 通过设置status =“ okay”为DFSDM启用DT根节点。
  • 通过设置pinctrl-0pinctrl-1pinctrl-names,通过pinctrl配置使用中的引脚。
  • 通过设置spi-max-frequency(可选:仅用于SPI主模式),配置SPI时钟输出频率。
  • 通过设置clocksclock-names(可选:为音频使用更准确的时钟),配置要使用的音频时钟。


Private resources for each DFSDM filter

配置过滤器 DT子节点

  • 通过设置status =“ okay”,为正在使用的DFSDM过滤器启用DT子节点。
  • 通过设置“ st,stm32-dfsdm-dmic”(可选:仅适用于音频数字麦克风)覆盖compatible字符串。
  • 通过设置st,adc-channels = <0 1 2 ...>来启用通道。
  • 通过设置st,adc-channel-namesst,adc-channel-types(例如SPI或曼彻斯特)和st,adc-channel来配置通道 -clk-src(例如外部或内部)。
  • 通过设置st,filter-order配置过滤器顺序。

Additional configuration for DFSDM ADC

DFSDM ADC器件具有一个外部模拟前端“ sigma delta调制器”。

为每个通道配置外部sigma delta调制器(可选,音频数字麦克风不需要):

  • 在板载dts文件中添加your_sd_modulatorDT节点(请参见下面的通用sd-modulator[3] 示例)。
  • io-channels = <&your_sd_modulator> 添加到DFSDM过滤器子节点,以便将其分配给过滤器通道。

Additional configuration for DFSDM audio

必须为音频soundcard configuration添加其他子节点。

DT configuration examples

下面的示例显示如何配置分配给DFSDM过滤器0的DFSDM ADC通道1:

  • 声明pinctrl DT节点中使用的引脚 (请参见Pinctrl device tree configuration):
    • 将PB13配置为DFSDM CLKOUT备用功能(默认情况下为AF3,对于低功耗模式为ANALOG)。
    • 将PC3配置为DFSDM DATA1备用功能(默认情况下为AF3,对于低功耗模式为ANALOG)。
dfsdm_clkout_pins_a: dfsdm-clkout-pins-0 {
	pins {
		pinmux = <STM32_PINMUX('B', 13, AF3)>;     /* DFSDM_CKOUT */
		bias-disable;
		drive-push-pull;
		slew-rate = <1>;
	};
};

dfsdm_clkout_sleep_pins_a: dfsdm-clkout-sleep-pins-0 {
	pins {
		pinmux = <STM32_PINMUX('B', 13, ANALOG)>;  /* DFSDM_CKOUT */
	};
};
dfsdm_data1_pins_a: dfsdm-data1-pins-0 {
	pins {
		pinmux = <STM32_PINMUX('C', 3, AF3)>;      /* DFSDM_DATA1 */
	};
};

dfsdm_data1_sleep_pins_a: dfsdm-data1-sleep-pins-0 {
	pins {
		pinmux = <STM32_PINMUX('C', 3, ANALOG)>;   /* DFSDM_DATA1 */
	};
};
  • 在板dts文件中添加sd-modulator [3]
sd_adc1: adc-1 {
	compatible = "sd-modulator";
	#io-channel-cells = <0>;
};
  • 配置并启用DFSDM,将channel 1配置为使用SPI(上升沿),并将其关联到filter0
&dfsdm {
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&dfsdm_clkout_pins_a &dfsdm_data1_pins_a>;                        /* default pins */
	pinctrl-1 = <&dfsdm_clkout_sleep_pins_a &dfsdm_data1_sleep_pins_a>;            /* sleep pins for low-power mode */
	spi-max-frequency = <2048000>;                                                 /* desired maximum clock rate */
	status = "okay";
	dfsdm0: filter@0 {
		st,adc-channels = <1>;                                                 /* Assign channel 1 to this filter */
		st,adc-channel-names = "in1";                                          /* Give it a name */
		st,adc-channel-types = "SPI_R";                                        /* SPI data on rising edge */
		st,adc-channel-clk-src = "CLKOUT_F";                                   /* internal clock source used for conversion */
		io-channels = <&sd_adc1>;                                              /* phandle to the external sd-modulator */
		st,filter-order = <1>;
		status = "okay";
	};
};

How to configure the DT using STM32CubeMX

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