0

Linux で Kontron の Atom ベースの SMARC-sXBTi ボードで SPI を起動する作業を行っています。

Kontron は Yocto BSP を提供しましたが、SPI ドライバーは含まれていません。

Linux を SPI サポート付きで再構築しました。lspci で SPI コントローラーを確認でき、sysfs で SPI PCI デバイスが pca2xx_spi_pci ドライバーにバインドされています。

私が理解しているように、これはユーザー モード API を公開しないプラットフォーム ドライバーであり、/dev/spidev を介して動作できるように spidev が必要ですが、modeprobe spidev何も起こっていない場合: /dev にファイルが追加されず、dmesg に何もありません。 .

spidev を構成する必要がありますか? BSP にはデバイス ツリーは含まれません。spidev はどのようにして PCI SPI コントローラーを見つけて通信することができますか?

4

3 に答える 3

2

まず、SPI デバイス ノードをユーザー空間に公開する必要があるのはなぜですか?

2つの可能性を想像できました:

  1. ユーザー空間ドライバーを使用する IoT ソフトウェアを作成している
  2. さまざまなデバイスを試しています(明らかにカーネルスペースドライバーはまだありません)

いかなる場合でも:

  • Mark Brown (カーネルの SPI サブシステムのメンテナー) によると:

    ハードウェアを制御する最善の方法に関する私たちの考えは変わる可能性があるため、spidev は ACPI または DT に直接表示されるべきではありません。

    詳細については、完全なディスカッションを参照してください。

  • それにもかかわらず、マークは ACPI の特別な SPI ノードのサポートを適用して、使用できるspidevを公開しました

  • 市販されている既存のボードではファームウェアを変更することはほとんどないため、OS の ACPI テーブルをアップグレードする必要があります。一部のエンジニアは現在、この作業を人々にとってより簡単にするためのメカニズムに取り組んでいます。今のところ、最新のバニラ カーネルを試してみてください。この記事では 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 の場合、バニラ Linux カーネルには、ACPI ハンドルをプラットフォーム ドライバーに伝達するためのパッチが 1 つ欠けています。

于 2016-08-24T11:17:08.000 に答える