[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 メーリングリストの案内