设备树结点描述的设备的硬件信息,最简单的设备树结点描述的是GPIO结点,相对复杂的是需要有通信协议的设备节点,下面就通过分析音频模块的设备节点来解析这类设备的设备树结点结构。
音频模块分为三个部分:音频数据接口,控制接口,普通IO接口。
音频模块的描述代码如下:
sound {
compatible = "fsl,imx6ul-evk-wm8960",
"fsl,imx-audio-wm8960";
model = "wm8960-audio";
cpu-dai = <&sai2>;
audio-codec = <&codec>;
asrc-controller = <&asrc>;
codec-master;
gpr = <&gpr 4 0x100000 0x100000>;
hp-det = <3 0>;
hp-det-gpios = <&gpio5 4 0>;
mic-det-gpios = <&gpio5 4 0>;
audio-routing =
"Headphone Jack", "HP_L",
"Headphone Jack", "HP_R",
"Ext Spk", "SPK_LP",
"Ext Spk", "SPK_LN",
"Ext Spk", "SPK_RP",
"Ext Spk", "SPK_RN",
"LINPUT2", "Mic Jack",
"LINPUT3", "Mic Jack",
"RINPUT1", "Main MIC",
"RINPUT2", "Main MIC",
"Mic Jack", "MICB",
"Main MIC", "MICB",
"CPU-Playback", "ASRC-Playback",
"Playback", "CPU-Playback",
"ASRC-Capture", "CPU-Capture",
"CPU-Capture", "Capture";
status = "okay";
}
节点中指出:音频数据接口使用sai2节点,而控制接口使用codec节点,还有一个耳机探测使用hp-det-gpios节点。
(1)音频数据节点的代码如下
&sai2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sai2>;
assigned-clocks = <&clks IMX6UL_CLK_SAI2_SEL>,
<&clks IMX6UL_CLK_SAI2>;
assigned-clock-parents = <&clks IMX6UL_CLK_PLL4_AUDIO_DIV>;
assigned-clock-rates = <0>, <12288000>;
status = "okay";
};
在节点中使用pinctrl子系统来定义引脚属性,相关引脚的属性在pinctrl_sai2节点中定义,而pinctrl_sai2节点的代码如下
pinctrl_sai2: sai2grp {
fsl,pins = <
MX6UL_PAD_JTAG_TDI__SAI2_TX_BCLK 0x17088
MX6UL_PAD_JTAG_TDO__SAI2_TX_SYNC 0x17088
MX6UL_PAD_JTAG_TRST_B__SAI2_TX_DATA 0x11088
MX6UL_PAD_JTAG_TCK__SAI2_RX_DATA 0x11088
MX6UL_PAD_JTAG_TMS__SAI2_MCLK 0x17088
>;
};
(2)控制接口节点,控制接口使用I2C通信协议,定义如下
&i2c2 {
clock_frequency = <100000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c2>;
status = "okay";
codec: wm8960@1a {
compatible = "wlf,wm8960";
reg = <0x1a>;
clocks = <&clks IMX6UL_CLK_SAI2>;
clock-names = "mclk";
wlf,shared-lrclk;
};
}
使用哪个I2C控制器,就要在哪个i2c节点下填入设备节点,i2c设备节点描述主要包括时钟频率和地址。
(3)耳机接口
耳机探测接口使用的是PINCTRL节点来定义引脚属性,使用GPIO子系统,方便使用同一的API来输出制定的电平。
总结起来,使用协议的模块通过放在不同的控制器节点下来适配电路板上使用的pin脚,gpio功能的引脚使用pinctrl子系统来定义对应引脚功能,之后定义gpio节点,定义使用什么接口和什么电平是有效电平。
版权声明:本文为ada_song原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。