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

Yasuhisa Nakamura email@hidden
2013年 7月 18日 (木) 04:52:03 JST


中村です。

現在のArmadillo-400用のカーネルでは、SPIの1つのバスに複数のSDカードを
ぶら下げることができないことは前に書きましたが、1つですら、現在の
ドライバではダメなような感じです。

ちょっと時間ができたので[Armadillo:09005]の続きを調べてみました。

過去記事の[Armadillo:06883]
http://lists.atmark-techno.com/pipermail/armadillo/2011-March/006886.html
の
| ....                                        i.MX25のSPIコントローラ
| の制限として、一回のバーストで転送可能なデータは最大2^10(1024)バイト
| となっております。

をみて、てっきり行けるかな?なんて思っていたのですが、
8バイトしか送ってくれないみたいです。

ソースを追ってみて、この話の続きの[Armadillo:06887]
http://lists.atmark-techno.com/pipermail/armadillo/2011-March/006890.html
をもう一度読み直してみると、あー、ダメなのか・・・と。

mxc_spi.cにある下の方の処理は、

#define MXC_SPI_FIFO_DEPTH (8)
int mxc_spi_transfer(struct spi_device *spi, struct spi_transfer *t)
{
        ...
        mxc_spi->transfer.len = min_t(u32, t->len, MXC_SPI_FIFO_DEPTH);
        ...
        /* Load up TX FIFO */
        for (i = 0; i < mxc_spi->transfer.len; i++) {
                tx_tmp = mxc_spi->transfer.tx_get(mxc_spi, i);
                spi_put_tx_data(mxc_spi->base, tx_tmp);
        }
        ...
        return mxc_spi->transfer.count;
}

となっていて、t->lenが8を超えると8バイトしか送ってくれません。

で、この関数の上位にあるspi_bitbang.cのbitbang_work()では、

                        if (t->len) {
                                if (!m->is_dma_mapped)
                                        t->rx_dma = t->tx_dma = 0;
                                status = bitbang->txrx_bufs(spi, t);
                        }
                        if (status > 0)
                                m->actual_length += status;
                        if (status != t->len) {
                                /* always report some kind of error */
                                if (status >= 0)
                                        status = -EREMOTEIO;
                                break;
                        }

となっていて、t->lenが8を超えると -EREMOTEIO になってしまいます。
(上のコードの bitbang->txrx_bufs() が mxc_spi_transfer()になります)

この-EREMOTEIOで、mmc_spi.cのmmc_spi_readbytes()やmmc_spi_command_send()が
エラーで終わってました。

さて、どうするか・・・

-- 
なかむら




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