【问题标题】:Trouble with SPIDEV, device tree and .dtbo name with Beaglebone BlackBeaglebone Black 的 SPIDEV、设备树和 .dtbo 名称出现问题
【发布时间】:2014-06-10 10:33:04
【问题描述】:

我对设备树有一些奇怪的问题。我发现更改 .dtbo 的名称会改变内核的行为!

我已经用 Angstrom 修改了 /lib/firmware 中给出的 BB-SPIDEV1-00A0.dts:

/*
 * Copyright (C) 2013 CircuitCo
 *
 * Virtual cape for SPI1 on connector pins P9.29 P9.31 P9.30 P9.28
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
/dts-v1/;
/plugin/;

/ {
    compatible = "ti,beaglebone", "ti,beaglebone-black";

    /* identification */
    part-number = "BB-SPI1-01";
    version = "00A0";

    /* state the resources this cape uses */
    exclusive-use =
        /* the pin header uses */
        "P9.31",    /* spi1_sclk */
        "P9.29",    /* spi1_d0 */
        "P9.30",    /* spi1_d1 */
        "P9.28",    /* spi1_cs0 */
            "P9.42",    /* spi1_cs1 */
        /* the hardware ip uses */
        "spi1";

    fragment@0 {
        target = <&am33xx_pinmux>;
        __overlay__ {
            /* default state has all gpios released and mode set to uart1 */
            bb_spi1_pins: pinmux_bb_spi1_pins {
                pinctrl-single,pins = <
                    0x190 0x13  /* mcasp0_aclkx.spi1_sclk,  OUTPUT_PULLUP | MODE3 */
                    0x194 0x33  /* mcasp0_fsx.spi1_d0,      INPUT_PULLUP | MODE3 */
                    0x198 0x13  /* mcasp0_axr0.spi1_d1,     OUTPUT_PULLUP | MODE3 */
                    0x19c 0x13  /* mcasp0_ahclkr.spi1_cs0,      OUTPUT_PULLUP | MODE3 */
                    0x164 0x12  /* eCAP0_in_PWM0_out.spi1_cs1   OUTPUT_PULLUP | MODE2 */
                    0x1A0 0x32  /* Other P42 pin, INPUT_PULLUP */
                >;
            };
        };
    };

    fragment@1 {
        target = <&spi1>;   /* spi1 is numbered correctly */
        __overlay__ {
            status = "okay";
            pinctrl-names = "default";
            pinctrl-0 = <&bb_spi1_pins>;

            #address-cells = <1>;
            #size-cells = <0>;

            spi1_0{
                #address-cells = <1>;
                #size-cells = <0>;

                compatible = "spidev";

                reg = <0>;
                spi-max-frequency = <16000000>;
            };


            spi1_1{
                #address-cells = <1>;
                #size-cells = <0>;

                compatible = "spidev";

                reg = <1>;
                spi-max-frequency = <16000000>;
            };
        };
    };
};

我把它编译成两个名字:BB-SPIDEV1-00A0.dtbo 和 BB-SPI1-01-00A0.dtbo

当我在 /sys/devices/bone_capemgr.9/slots 中加载其中一个时,spidev 的行为会有所不同!

使用 BB-SPIDEV1,spidev1.0 运行良好,没有任何问题。但是spidev1.1的片选不行! 42号管脚模式错误,管脚没有分配spi1

另一方面,对于 BB-SPI1-01(这个名字不重要,取另一个名字是一样的,只是必须和 BB-SPIDEV1 不同),引脚 42 分配得当:

root@beaglebone:/sys/kernel/debug/pinctrl/44e10800.pinmux# cat pinmux-pins | grep spi
pin 89 (44e10964): 481a0000.spi (GPIO UNCLAIMED) function pinctrl_spi1_pins group pinctrl_spi1_pins
pin 100 (44e10990): 481a0000.spi (GPIO UNCLAIMED) function pinctrl_spi1_pins group pinctrl_spi1_pins
pin 101 (44e10994): 481a0000.spi (GPIO UNCLAIMED) function pinctrl_spi1_pins group pinctrl_spi1_pins
pin 102 (44e10998): 481a0000.spi (GPIO UNCLAIMED) function pinctrl_spi1_pins group pinctrl_spi1_pins
pin 103 (44e1099c): 481a0000.spi (GPIO UNCLAIMED) function pinctrl_spi1_pins group pinctrl_spi1_pins
pin 104 (44e109a0): 481a0000.spi (GPIO UNCLAIMED) function pinctrl_spi1_pins group pinctrl_spi1_pins

并且处于良好模式:

root@beaglebone:/sys/kernel/debug/pinctrl/44e10800.pinmux# cat pins | grep 964
pin 89 (44e10964) 00000012 pinctrl-single 

但是这次 spidev1.0 不能正常工作。 MISO 线(因此 BBB 的输入)只看到 0,即使它是假的(我用示波器检查过)。

那么可能是什么问题?

提前致谢

【问题讨论】:

  • 您的 dts 看起来与原始 BB-SPIDEV1-00A0 源几乎相同,除了缺少一行:spi-cpha; 位于片段 1,通道 0,spi-max-frequency 下,并且有几个引脚复用的差异:SPI1_SCLK 可能是 INPUT_PULLUP,我也看不出 P9_42B (0x1A0) 和 SPI 子系统之间有任何关系 - 你可能将它与具有 SPI1_SCLK (模式 4) 的 P9_42A (0x164) 和SPI1_CS1(模式 2)。 P9_42B 的模式 2 是“MCASPO_AXR2”。
  • 我看到 P9_42B 必须设置为 'INPUT' 所以改为尝试模式 4(将其路由到空):0x34 ...或模式 7,即 gpio 0x37
  • 没有任何效果...我尝试了模式 4、模式 7,将 SPI1_SCLK 设置为 INPUT_PULLUP,添加 spi-cpha,同样的行为。无论如何,第二个芯片选择在启动时并不高,与第一个相反。
  • 感谢您的回复!无论如何,它并没有解决不同的名称问题
  • 我相信我可能知道问题出在哪里:作为 BB-BONELT-HDMIN 覆盖的一部分,在启动时引脚 100-103 和 89 都复用到了multichannel audio serial port subsystem 0 [mcasp0]。要移除 HDMI 覆盖层,请按照本页底部的说明进行操作:tekuconcept.blogspot.com/2014/02/gpio-beaglebone-and-bash.html,然后看看会发生什么。

标签: kernel spi beagleboneblack device-tree


【解决方案1】:

将 P9_42B 设置为 Mode 4 w/High Impedance (0x2C) - 否则,默认为 Mode 4 Fast-In Pull-Down。除非此引脚被另一个覆盖修改,否则 P9_42B 不需要多路复用。

当我访问它们的寄存器时,SPI1(以及 SPI0、I2C 和 GPIO2)寄存器给我带来了总线错误,尽管在各自的叠加层中将它们的状态设置为“正常”,但仍导致设备被禁用。所以我检查了 CM_PER 寄存器,果然:IDLEST=3 [disabled]MODULEMODE=0 [disabled]。虽然这些测试是在 Debian 系统上完成的,但我很确定 Angstrom 和所有其他发行版也是如此。

要启用它们,您需要通过您选择的首选语言访问用于电源和时钟管理的内存地址:

通过 PRU 组装:

.origin 0
.entrypoint START

START:
    MOV  r0, 0x44E00050 // CM_PER_SPI1_CLKCTRL Register [reset = 30000h / disabled]
    LBBO r1, r0, 0, 4   // load register value
    CLR  r1.t16         // set IDLEST to FUNC
    CLR  r1.t17
    SET  r1.t1          // set MODULEMODE to ENABLE
    SBBO r1, r0, 0, 4   // store value
    HALT

通过 Python:
Beaglebone IO using Python mmap

通过 C/C++:(类似于上面的 python 示例)
引用自:vabi-robotics.blogspot.com

#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <stdio.h>
#include <iostream>
#define CM_PER 0x44E00000 //PG 157

using namespace std;

int main(){
    int fd = open("/dev/mem",O_RDWR | O_SYNC);
    ulong* pinconf1 =  (ulong*) mmap(NULL, 0x0FFF, PROT_READ | PROT_WRITE, MAP_SHARED, fd, CM_PER);

    printf("INFO: %X\n", pinconf1[0x50/4]);
    pinconf1[0x50/4] = 0x00000002;
    printf("INFO: %X\n", pinconf1[0x50/4]); // conf. initialized

    return 0;
}

注意:如果这不是问题,并且一个频道实际上可以正常工作,请确保在启用下一个频道之前禁用该频道。另外,确认MS位清零[master],PIN34位清零[SPIEN用作片选],SINGLE位清零[更多MCSPI_MODULCTRL 寄存器(SPI1: 0x481A0128)中的一个通道]

【讨论】:

  • 抱歉,回答晚了,我必须阅读您所说的所有寄存器。好吧,寄存器 0x​​44E00050 在我读取它时是 3000h(重置),但是在与 spidev 传输期间读取它时,它是 02h,因此 spidev 必须在需要时启用寄存器 itslef。
  • 关于 MCSPI_MODULCTRL 寄存器,我无法在没有传输的情况下读取它(“总线错误”)。当我读到它时,它是 1h,这意味着:“1h = 只有一个通道将用于主模式。该位必须在 Force SPIEN 模式下设置。”。事实上,我正在使用一个通道,我只想选择另一个芯片选择(文档中的 SPIEN)。但我找不到寄存器谈论不同的芯片选择 (SPIEN) 及其用法。
  • 从骨骼上的以下链接编译 *.c 文件:github.com/TekuConcept/BBB_Backup/tree/master/workspace/…,将 *.sh 脚本加载到终端(> source script.sh),然后运行命令:“ > readm 0x44E00000 0"(从 CM_PER_L4LS_CLKSTCTRL 寄存器读取)并给我它返回的十六进制值。如果该值类似于 0x4102,则原因是 ICLK 和 FCLK 被门控并且设备处于空闲模式。 (ICLK 允许访问设备寄存器)
  • 和以前一样,当我的 SPI 程序正在运行和不运行时,值是不同的。未运行时为 0x4102,如果正在运行则为 0x2004102(表示 spidev 正在使用中)。
  • "> 写入 0x44E00000 0 0; 写入 0x44E00000 50 2;"然后,您将能够访问 McSPI 接口,而无需“使用”(无需多路复用)。 0x481A0000 12C & 140 [MCSPI_CHXCONF.FORCE/.EPOL] 是控制 SPIEN 的通道特定寄存器。此外,从寄存器 MCSPI_MODULCTRL 读取会产生 0x4,这意味着设备处于 Master/ChipSelect 模式,但默认情况下也处于 SYSTEST 模式。
【解决方案2】:

好吧,我再次自己回答我的问题。实际上,问题是:我无法使用 SPI 通道 1 (spidev.1.1) 的第二个芯片选择。当我尝试这样做时,出现了 dtbo 名称的问题,我发布了这个问题。但是名称问题尚未解决。

但是问题

但是这次 spidev1.0 不能正常工作。 MISO 线(所以 BBB 的输入)只看到 0,即使它是假的(我用示波器检查过)。

已通过更改时钟模式解决:0x33 而不是 0x13。虽然它是一个输出,但将引脚设置为 0x33 将其更改为 RXACTIVE_PULLUP。必须启用这种方式才能接收数据。

奇怪的是 0x13 与 BB-SPIDEV1 完美配合...

感谢 TekuConcept 对寄存器的帮助,如果我有一些额外的时间,我会尝试挖掘寄存器。

【讨论】:

    猜你喜欢
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2015-03-06
    • 2019-06-01
    相关资源
    最近更新 更多