2015-04-06 44 views
3

我想在Odroid-C1主板上使用UBlox NEO-7M GPS接收器。在Odroid-C1的MODE_0中,SPI無法正常工作。 Linux內核pinctrl子系統。

默認情況下,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); 
    } 

之後,我試圖讀取一個字節,並將其發送到標準輸出。儘管如此,它並不奏效。

經過一番思考我插入我的Salaea的邏輯分析儀,並得到這幅畫

spi mode

這看起來不正確的。如果我沒有弄錯,交易之間的SCL應該被拉低。

我試圖通過在spicc.ko內核模塊中拉下SCL線來修復這個問題(我使用this內核和一個RT補丁來編譯模塊,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); 

從設備樹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:我在RPi上使用相同的用戶空間代碼和相同的UBlox,並且代碼不工作,模式按預期切換。

我試圖把另一個SPI驅動的設備連接到Odroid-C1(它是Invensense的MPU9260,如果這很重要的話),並且它工作。我猜測它只是更多的SPI模式容忍

回答

0

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