【问题标题】:How to define platform_data in a Linux 3.8 device tree structure (DTS) file如何在 Linux 3.8 设备树结构 (DTS) 文件中定义 platform_data
【发布时间】:2015-02-27 21:29:05
【问题描述】:

我正在尝试让at86rf230 内核驱动程序在 BeagleBone Black 上运行以与我的收音机通信。我已经确认我能够使用一些用户空间 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

我觉得我离解决这个问题已经非常接近了,我只需要朝正确的方向努力一点;)

【问题讨论】:

    标签: linux-device-driver


    【解决方案1】:

    首先,您摘录中的 GPIO 名称是错误的。根据linux-next中的最新代码有

    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

    【讨论】:

    • 谢谢!我正在使用Linux 3.8.13,我认为它早于该文档,并且可能是对 at86rf230 驱动程序的更新。我可能不得不挑选更新的驱动程序才能工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    相关资源
    最近更新 更多