He conectado SPI flash a mi placa linux (basada en imx 233) que se ejecuta en su bus SPI. He configurado el kernel, y el bus SPI y el chip flash para ello.
El flash está actualmente en una placa de pruebas. Antes de intentar trabajar en Linux, lo intenté por separado y puedo leer y escribir como me gusta con un chip FT2232H (FT2232 breakout board by dangerousprototypes.com). Sin embargo, linux-board, tuve que agregar resistencias de pull-up (10k) en las líneas de entrada y salida de datos, el chip no fue reconocido correctamente de otra manera.
Mi problema real es que ahora solo intento leer el flash sin formato a través del controlador mtd, y todo parece correcto, si leo menos de 35 bytes. Inmediatamente si leo más de 35 bytes (36 o más), el controlador se queja sobre el error DMA:
[ 521.700000] mxs-spi 80034000.ssp: DMA transfer timeout
[ 521.700000] spi_master spi32766: failed to transfer one message from queue
También cuando esto sucede, la mayoría de los bytes (si no todos) serán incorrectos .. La lectura de menos de 35 bytes devolverá "inmediatamente" (sin tiempo de espera), y todos los bytes leídos serán correctos.
Mi código C es directamente del ejemplo de lectura de MTD:
int main(int argc, char * argv[])
{
if (argc != 2)
{
printf("Need arguments how many chars to read\nExiting...\n");
return 1;
}
int amount = atoi(argv[1]);
printf("reading (%d) chars\n", amount);
mtd_info_t mtd_info;
int fd = open("/dev/mtd0", O_RDONLY);
ioctl(fd, MEMGETINFO, &mtd_info);
printf("MTD type: %u\n", mtd_info.type);
printf("MTD total size : %u bytes\n", mtd_info.size);
printf("MTD erase size : %u bytes\n", mtd_info.erasesize);
/* read buffer */
unsigned char buf[amount];
read(fd, buf, sizeof(buf));
int i = 0;
for (i = 0; i < amount; i++)
{
printf("%i: %X\n",i,buf[i]);
}
return 0;
}
El tiempo de espera pasa "como se esperaba" (10 segundos) en spi-mxs.c:
drivers/spi/spi-msx.c:
static int mxs_spi_txrx_dma(...):
....
ret = wait_for_completion_timeout(&spi->c, msecs_to_jiffies(SSP_TIMEOUT));
¿Alguna idea de lo que podría estar mal? No soy tan bueno con la electrónica, así que por favor todas las sugerencias son bienvenidas.