如何在 Linux 3.8 设备树结构 (DTS) 文件中定义 platform_data
How to define platform_data in a Linux 3.8 device tree structure (DTS) file
我正在尝试在 BeagleBone Black 上获取 at86rf230
内核驱动程序 运行 以与我的收音机通信。我已经确认我能够使用一些用户空间 SPI 代码与设备进行交互。这是我正在使用的 DTS 文件的片段:
fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
spi1_pins_s0: spi1_pins_s0 {
pinctrl-single,pins = <
0x040 0x37 /* DIG2 GPIO_9.15 I_PULLUP | MODE7-GPIO1_16 */
0x044 0x17 /* SLPTR GPIO_9.23 O_PULLUP | MODE7-GPIO1_17 */
0x1AC 0x17 /* RSTN GPIO_9.25 O_PULLUP | MODE7-GPIO3_21 */
0x1A4 0x37 /* IRQ GPIO_9.26 I_PULLUP | MODE7-GPIO3_19 */
0x190 0x33 /* SCLK mcasp0_aclkx.spi1_sclk, INPUT_PULLUP | MODE3 */
0x194 0x33 /* MISO mcasp0_fsx.spi1_d0, INPUT_PULLUP | MODE3 */
0x198 0x13 /* MOSI mcasp0_axr0.spi1_d1, OUTPUT_PULLUP | MODE3 */
0x19c 0x13 /* SCS0 mcasp0_ahclkr.spi1_cs0, OUTPUT_PULLUP | MODE3 */
>;
};
};
};
fragment@3 {
target = <&spi1>;
__overlay__ {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&spi1_pins_s0>;
at86rf230@0 {
spi-max-frequency = <1000000>;
reg = <0>;
compatible = "at86rf230";
interrupts = <19>;
interrupt-parent = <&gpio3>;
};
};
};
加载模块时,我在 dmesg
中收到以下错误:
[ 352.668833] at86rf230 spi1.0: no platform_data
[ 352.668945] at86rf230: probe of spi1.0 failed with error -22
我正在尝试找到将 platform_data
附加到 SPI 覆盖层的正确方法。这是我要附加的内容:
platform_data {
rstn = <&gpio3 21 0>;
slp_tr = <&gpio1 17 0>;
dig2 = <&gpio1 16 0>;
};
不幸的是,当我使用 dtc
编译 DTS 时,按原样粘贴它并不能很好地工作。我收到以下错误:
syntax error: properties must precede subnodes
FATAL ERROR: Unable to parse input tree
我觉得我离解决这个问题已经快得离谱了,我只需要朝着正确的方向稍微推动一下 ;)
首先,您摘录中的 GPIO 名称是错误的。据此最新代码在linux-接下来有
pdata->rstn = of_get_named_gpio(spi->dev.of_node, "reset-gpio", 0);
pdata->slp_tr = of_get_named_gpio(spi->dev.of_node, "sleep-gpio", 0);
只有两个。
其次,您必须针对您的具体主板调整 DTS。整个 DTS 必须被视为板上所有设备的平台数据(有些支持,有些可能不支持)。特定设备的部分应描述为设备节点。
所以,好的开始是检查上游中已经存在的内容,即在 arch/arm/boot/dts/am335x-boneblack.dts
中,不要忘记检查包含的文件。
此特定驱动程序的示例在 Documentation/devicetree/bindings/net/ieee802154/at86rf230.txt
。
我正在尝试在 BeagleBone Black 上获取 at86rf230
内核驱动程序 运行 以与我的收音机通信。我已经确认我能够使用一些用户空间 SPI 代码与设备进行交互。这是我正在使用的 DTS 文件的片段:
fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
spi1_pins_s0: spi1_pins_s0 {
pinctrl-single,pins = <
0x040 0x37 /* DIG2 GPIO_9.15 I_PULLUP | MODE7-GPIO1_16 */
0x044 0x17 /* SLPTR GPIO_9.23 O_PULLUP | MODE7-GPIO1_17 */
0x1AC 0x17 /* RSTN GPIO_9.25 O_PULLUP | MODE7-GPIO3_21 */
0x1A4 0x37 /* IRQ GPIO_9.26 I_PULLUP | MODE7-GPIO3_19 */
0x190 0x33 /* SCLK mcasp0_aclkx.spi1_sclk, INPUT_PULLUP | MODE3 */
0x194 0x33 /* MISO mcasp0_fsx.spi1_d0, INPUT_PULLUP | MODE3 */
0x198 0x13 /* MOSI mcasp0_axr0.spi1_d1, OUTPUT_PULLUP | MODE3 */
0x19c 0x13 /* SCS0 mcasp0_ahclkr.spi1_cs0, OUTPUT_PULLUP | MODE3 */
>;
};
};
};
fragment@3 {
target = <&spi1>;
__overlay__ {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&spi1_pins_s0>;
at86rf230@0 {
spi-max-frequency = <1000000>;
reg = <0>;
compatible = "at86rf230";
interrupts = <19>;
interrupt-parent = <&gpio3>;
};
};
};
加载模块时,我在 dmesg
中收到以下错误:
[ 352.668833] at86rf230 spi1.0: no platform_data
[ 352.668945] at86rf230: probe of spi1.0 failed with error -22
我正在尝试找到将 platform_data
附加到 SPI 覆盖层的正确方法。这是我要附加的内容:
platform_data {
rstn = <&gpio3 21 0>;
slp_tr = <&gpio1 17 0>;
dig2 = <&gpio1 16 0>;
};
不幸的是,当我使用 dtc
编译 DTS 时,按原样粘贴它并不能很好地工作。我收到以下错误:
syntax error: properties must precede subnodes
FATAL ERROR: Unable to parse input tree
我觉得我离解决这个问题已经快得离谱了,我只需要朝着正确的方向稍微推动一下 ;)
首先,您摘录中的 GPIO 名称是错误的。据此最新代码在linux-接下来有
pdata->rstn = of_get_named_gpio(spi->dev.of_node, "reset-gpio", 0);
pdata->slp_tr = of_get_named_gpio(spi->dev.of_node, "sleep-gpio", 0);
只有两个。
其次,您必须针对您的具体主板调整 DTS。整个 DTS 必须被视为板上所有设备的平台数据(有些支持,有些可能不支持)。特定设备的部分应描述为设备节点。
所以,好的开始是检查上游中已经存在的内容,即在 arch/arm/boot/dts/am335x-boneblack.dts
中,不要忘记检查包含的文件。
此特定驱动程序的示例在 Documentation/devicetree/bindings/net/ieee802154/at86rf230.txt
。