我对设备树有一些奇怪的问题。我发现改变.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,即使它是假的(我用示波器检查过)。
那么可能是什么问题?
提前致谢
答案 0 :(得分:1)
将P9_42B设置为模式4 w /高阻抗(0x2C) - 否则,默认为模式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位已清零[主机],PIN34位清零[ SPIEN用作芯片选择],并且SINGLE位清零[更多MCSPI_MODULCTRL寄存器(SPI1:0x481A0128)中使用的通道]
答案 1 :(得分:1)
好吧,我再次回答我的问题。实际上,问题是:我无法使用SPI通道1的第二个芯片选择(spidev.1.1)。当我试图这样做时,出现了dtbo名称的问题,我发布了这个问题。但名称问题尚未解决。
但
的问题但是这次spidev1.0并没有正常工作。 MISO线(因此BBB的输入)只看到0,即使它是假的(我用示波器检查过)。
已通过更改时钟模式解决:0x33而不是0x13。虽然它是一个输出,但是将0x33设置为RXACTIVE_PULLUP。它必须以这种方式接收数据。
奇怪的是,0x13与BB-SPIDEV1完美配合......
感谢TekuConcept对寄存器的帮助,如果我有一些额外的时间,我会尝试挖掘寄存器。