簡體   English   中英

SPI在Odroid-C1上的MODE_0中無法正常工作。 Linux內核pinctrl子系統。

[英]SPI doesn't work as expected in MODE_0 on Odroid-C1. Linux Kernel pinctrl subsystem.

我正試圖在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模式

這似乎不對。 如果我沒弄錯,SCL應該在交易之間被驅動。

我試圖通過在spicc.ko內核模塊中拉下SCL行來解決這個問題(我使用這個內核和RT-patch來編譯模塊.RT-patch實際上沒有任何區別。這個問題在vanilla上經歷過內核也是如此)。

因此,主要的問題是:正在把這個引腳拉下來做正確的事情嗎?

當我進一步查看代碼時,我注意到spicc_set_mode()確實設置了Amlogic S805數據表中描述的模式(第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模式容忍的

也許此PIN的PIN配置已激活一些內部上拉。 您可以嘗試檢查是否有任何SPI模式正在工作。 另一點是檢查系統中是否有任何上拉。 並且可能值得測量空閑狀態下的電壓。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM