[Armadillo:09005] Re: A-4x0 にSPIでSDカードスロットを増設

Yasuhisa Nakamura email@hidden
2013年 7月 10日 (水) 14:25:06 JST


中村@自己レスです。

先週金曜日に[Armadillo:08970]で
> Armadillo-4x0で、SPIを使ってSDカードスロット(複数)を増設することを
> 考えています。
と書いた後、時間が取れないのでほとんど進んでいないのですが、
arch/arm/mach-mx25/armadillo400.c に
static struct spi_board_info armadillo400_spi1_board_info[] __initdata = {
#if defined(CONFIG_MMC_SPI)
        {
                .modalias = "mmc_spi",
                .max_speed_hz = 10000000,
                .bus_num = 1,
                .chip_select = 0,
                .mode = SPI_MODE_0,
        }
#endif /* defined(CONFIG_MMC_SPI) */
};

こんなのを書いてみたところ、ブート時に
mmc_spi spi1.0: ASSUMING SPI bus stays unshared!
mmc_spi spi1.0: ASSUMING 3.2-3.4 V slot power
mmc_spi spi1.0: SD/MMC host mmc1, no DMA, no WP, no poweroff
というメッセージは出るようになりました。

ここで"複数のSDカードスロット"のために、chip_selectを変えて
もう1つ追加してみたところ、
mmc_spi spi1.0: can't share SPI bus
mmc_spi: probe of spi1.0 failed with error -16
mmc_spi spi1.1: can't share SPI bus
mmc_spi: probe of spi1.1 failed with error -16
というエラーになってしまいました。

ソースコードを調べると、どうやら、このバージョンの
ドライバでは、SD over SPI では1つのバスに複数の
デバイスをつなぐことができないようです。

drivers/mmc/host/mmc_spi.cに次のようなコメントとコードがありました。

static int mmc_spi_probe(struct spi_device *spi)
{
   ...
        /* We can use the bus safely iff nobody else will interfere with us.
         * Most commands consist of one SPI message to issue a command, then
         * several more to collect its response, then possibly more for data
         * transfer.  Clocking access to other devices during that period will
         * corrupt the command execution.
         *
         * Until we have software primitives which guarantee non-interference,
         * we'll aim for a hardware-level guarantee.
         *
         * REVISIT we can't guarantee another device won't be added later...
         */
        if (spi->master->num_chipselect > 1) {
                struct count_children cc;

                cc.n = 0;
                cc.bus = spi->dev.bus;
                status = device_for_each_child(spi->dev.parent, &cc,
                                maybe_count_child);
                if (status < 0) {
                        dev_err(&spi->dev, "can't share SPI bus\n");
                        return status;
                }

                dev_warn(&spi->dev, "ASSUMING SPI bus stays unshared!\n");
        }
  ...
}

複数は絶対に無理なのか?と、最新のmmc_spi.cをみてみると、
このコードはなくなっています。

2010-07-04のこの修正がそれのようです。
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/drivers/mmc/host/mmc_spi.c?id=4751c1c74bc7b596db5de0c93be1a22a570145c0

spi/mmc_spi: mmc_spi adaptations for SPI bus locking API
 Modification of the mmc_spi driver to use the SPI bus
 locking API. With this, the mmc_spi driver can be used
 together with other SPI devices on the same SPI bus.
 The exclusive access to the SPI bus is now managed in
 the SPI layer. The counting of chip selects in the probe
 function is no longer needed.

-- 
なかむら




armadillo メーリングリストの案内