2016-08-24 72 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