2016-08-24 57 views
0

我正致力於在Linux下的控創基於Atom的SMARC-sXBTi板上啓動SPI。Intel Atom板上的spidev Linux驅動程序

控創提供了Yocto BSP,但它不包含SPI驅動程序。

我重建了Linux支持SPI。我可以在lspci和sysfs中看到SPI控制器,SPI PCI設備綁定到pca2xx_spi_pci驅動程序。

據我所知,這是一個平臺驅動程序,它不暴露用戶模式API,我需要spidev才能通過/ dev/spidev工作,但當我modeprobe spidev我沒有看到任何事情發生:沒有文件添加到/ dev,dmesg中沒有任何東西。

我需要配置spidev嗎? BSP不包括設備樹。 spidev如何找到並與PCI SPI控制器通話?

+0

請詳細說明使用什麼板的確切的規格。 – 0andriy

+0

@Andy:添加板規格 – jackhab

+0

嗯......沒有看到任何東西,除了名稱。我們都可以谷歌嗎? – 0andriy

回答

0

我發現Valley Island (Baytrail) BSP提供了控創SMARC比控創BSP更好的硬件支持。它配備了訪問Atom外設所需的spidev和其他驅動程序。

沒有直接關係的問題(只通知那些在SXBTI SMARC平臺的開發者):有幾個必需的東西並不是這個BSP的一部分:以太網和eMMC的閃存。前者可以通過在內核中啓用英特爾IGB驅動程序來添加,後者......我仍然試圖弄清楚它。

0

我需要配置spidev嗎? BSP不包括設備樹。 spidev如何找到並與PCI SPI控制器通話?

在當設備樹不工作時,我用下面的代碼(基於的Beagle Board例如,您應該相應地解決您的主板):

弓/ ARM /馬赫OMAP2 /板-omap3beagle.c:

static struct spi_board_info my_spi_board_info[] = { 
... 
     { 
       .modalias  = "spidev", 
       .max_speed_hz = 3000000, //48 Mbps 
       .bus_num  = 3, 
       .chip_select = 1, 
       .mode = 0, 
     }, 
... 
}; 

static void __init omap3_beagle_init(void) 
{ 
... 
    spi_register_board_info(my_spi_board_info, 
          ARRAY_SIZE(my_spi_board_info)); 
... 
} 

正如你可以看到我指定「bus_num」 OMAP CPU有幾個SPI,也是我指定的片選,和速度,在那之後我打電話spi_register_board_info,並重建內核後並重新啓動類似出現/dev/spidev3.1

+0

我很抱歉拒絕投票,但這顯然不是我們想看到的。 – 0andriy

+0

@AndyShevchenko是的,沒有人喜歡現實。 – fghj

+0

我正在準備正確的答案。 – 0andriy

0

首先爲什麼是否需要將SPI設備節點暴露給用戶空間?

我能想象兩種可能:

  1. 您正在創建將使用用戶空間的驅動程序
  2. 您與不同的設備試驗(即顯然沒有內核空間的驅動程序尚)
物聯網軟件

在任何情況下:

  • 根據馬rk Brown(內核中SPI子系統的維護者):

    spidev不應該直接出現在ACPI或DT中,因爲我們關於控制硬件的最佳方法的想法可能會改變。

    查看完整的discussion的詳細信息。

  • 不過馬克用於支持在ACPI特殊SPI節點暴露spidev您可以使用

  • 由於固件是很難改變對市場上現有的主板,您需要升級ACPI表中OS。目前一些工程師正在研究如何使這件事更容易的機制。現在你可以嘗試最新的香草核心。讓我們說V4.8-RC3爲寫這篇文章,並採取其中的一部分以使SPI設備(這只是一個例子,你需要調整它對於正在使用的硬件):

>

/* 
    * Intel Joule 
    * 
    * This adds an SPI test device to the SPI host controller available on 
    * Intel Joule breakout #1 header: 
    * 
    * pin name   pin number 
    * ----------------------------- 
    * SPI_1_MISO_LS  2 
    * SPI_1_MOSI_LS  4 
    * SPI_1_FS2_LS  8 
    * SPI_1_CLK_LS  10 
    * 
    * In Linux you need to set CONFIG_SPI_SPIDEV=y (or m) to be able to use 
    * this device. 
    */ 
DefinitionBlock ("spidev.aml", "SSDT", 5, "INTEL", "SPIDEV", 1) 
{ 
    External (_SB_.PCI0.SPI2, DeviceObj) 

    Scope (\_SB.PCI0.SPI2) 
    { 
     Device (TP0) { 
      Name (_HID, "SPT0001") 
      Name (_DDN, "SPI test device connected to CS2") 
      Name (_CRS, ResourceTemplate() { 
       SpiSerialBus (
        2,      // Chip select 
        PolarityLow,   // Chip select is active low 
        FourWireMode,   // Full duplex 
        8,      // Bits per word is 8 (byte) 
        ControllerInitiated, // Don't care 
        1000000,    // 1 MHz 
        ClockPolarityLow,  // SPI mode 0 
        ClockPhaseFirst,  // SPI mode 0 
        "\\_SB.PCI0.SPI2",  // SPI host controller 
        0      // Must be 0 
       ) 
      }) 
     } 
    } 
} 

既然你沒有指出確切的規格,你可能需要做一個額外的工作。對於較舊的Atom,vanilla Linux內核缺少一個補丁到propagate ACPI handle to the platform driver

+0

至於「爲什麼?」 - 這是一塊嵌入式系統板,應該連接至尚未最終確定並可能在未來發生變化的IC器件。 ...因爲我在ACPI中有零知識 - 這是讓spidev走向何方的唯一途徑嗎? – jackhab

+0

ARM廣告。 – user1244932

+0

@jackhab,對於支持ACPI的開發板,正確的方法是。儘管如此,您可能會按照其他答案中的建議創建一個醜陋的黑客攻擊。 – 0andriy