SPI在Odroid-C1上的MODE_0中没有按预期工作。 Linux内核pinctrl子系统。

时间:2015-04-06 20:26:28

标签: c linux linux-kernel spi odroid

我试图在Odroid-C1主板上使用UBlox NEO-7M GPS接收器。

默认情况下,GPS模块工作在SPI的第一模式。这就是我使用此用户空间代码段选择正确的SPI模式的原因。

    int mode = SPI_MODE_0;

    ret = ioctl(spi_fd, SPI_IOC_WR_MODE, &mode);

    if (ret < 0) {
        perror("can't set spi mode");        
        exit(1);
    }   

之后,我尝试一次读取一个字节并将其发送到stdout。但是,它并没有成功。

经过一番思考后,我插上了我的Salaea逻辑分析仪并得到了这张照片

spi mode

这看起来并不正确。如果我没弄错,SCL应该在交易之间被驱动。

我尝试通过在spicc.ko内核模块中拉下SCL行来解决这个问题(我使用带有RT-patch的this内核来编译模块.RT-patch并没有真正做到差异。这个问题也体现在香草内核上。

因此,主要的问题是:正在把这个引脚拉下来做正确的事情吗?

当我进一步查看代码时,我注意到spicc_set_mode()确实设置了Amlogic S805 datasheet中描述的模式(第15.5.3节描述了CONREG寄存器布局)。也许这还不够?

无论哪种方式,使用Linux下拉引脚的预期方法是什么? pinctrl界面?

我也试图了解spicc的代码。它使用

ret = of_property_read_string(pdev->dev.of_node, "pinctrl-names", &prop_name);
if(ret || IS_ERR(prop_name)) {
    dev_err(&pdev->dev, "match pinctrl-names failed!\n");
    return -ENODEV;
}
pdata->pinctrl = devm_pinctrl_get_select(&pdev->dev, prop_name);
if(IS_ERR(pdata->pinctrl)) {
    dev_err(&pdev->dev, "pinmux error\n");
    return -ENODEV;
}
dev_info(&pdev->dev, "pinctrl_name = %s\n", prop_name);

从Device Tree Blob获取pinctrl句柄,不是吗?我应该编辑.dts文件来拉下引脚还是可以在运行时完成?

起初我试图通过愚蠢的野蛮强制代码使用它,但它没有工作(pinctrl已经在spicc部分的.dts文件中使用此引脚)。

static void spicc_sclk_init(void)
{
    int ret;
    int gpio;
    char *owner = "spicc_sclk";
    char *pin_name = "GPIOX_8";

    gpio = amlogic_gpio_name_map_num(pin_name);

    if (gpio < 0) {
        printk(KERN_ERR "amlogic_gpio_name_map_num() failed. gpio: %d\n", gpio);
        goto out_map;
    }

    ret = amlogic_gpio_request(gpio, owner);

    if (ret < 0) {
        printk(KERN_ERR "amlogic_gpio_request_one() failed. ret: %d\n", ret);
        goto out_request;
    }

    ret = amlogic_set_pull_up_down(gpio, 0, owner);

    if (ret < 0) {
        printk(KERN_ERR "amlogic_set_pull_up_down() failed. ret: %d\n", ret);
        goto out_pull_up_down;
    }

out_pull_up_down:
out_request:
out_map:
    ;
}

有没有人有任何建议可以解决这个问题的建议?

PS:我在具有相同UBlox的RPi上使用相同的用户空间代码,代码可以工作,模式按预期切换。

我试图将另一个SPI驱动的设备连接到Odroid-C1(如果重要的话,它是Invensense的MPU9260。)并且确实有效。我猜它只是 SPI模式容忍

1 个答案:

答案 0 :(得分:0)

此PIN的PIN配置可能已激活了一些内部Pull-UP。您可以尝试检查SPI Modes是否有效。另一点是检查系统中是否有任何上拉。并且可能值得测量空闲状态下的电压。