He conectado SPI flash a mi placa Linux (basada en imx 233) ejecutándose en su bus SPI. He configurado el kernel, el bus SPI y el chip flash.
El flash se encuentra actualmente en una placa de prueba. Antes de intentar trabajar en Linux, lo intenté por separado y puedo leer y escribir como quiero con un chip FT2232H (placa de conexión FT2232 de dangerprototypes.com). Sin embargo, en la placa Linux, tuve que agregar resistencias pull-up (10k) en las líneas de entrada y salida de datos; de lo contrario, el chip no se reconocía correctamente.
Mi problema real es que ahora estoy tratando de leer flash sin procesar 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 del error de DMA:
[ 521.700000] mxs-spi 80034000.ssp: DMA transfer timeout
[ 521.700000] spi_master spi32766: failed to transfer one message from queue
Además, cuando esto sucede, la mayoría de los bytes (si no todos) serán incorrectos. La lectura de menos de 35 bytes se 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 ocurre "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 todas las sugerencias son bienvenidas.
Creo que es un problema con el controlador SPI. ¿Sigue sin funcionar con el kernel ascendente 3.7? Allí se aplicaron muchas correcciones.
Esto no es un problema de electrónica. En un bus SPI, el maestro tiene el control total del tiempo de cualquier transferencia que se inicie. En particular, en una operación de lectura, el dispositivo esclavo puede devolver datos incorrectos o ningún dato, pero no puede afectar si la transferencia se completa o no.
En otras palabras, el error de tiempo de espera de DMA que está recibiendo es completamente un problema dentro del kernel de Linux o el controlador específico que está utilizando. En cualquier caso, una respuesta más específica requerirá muchos más detalles de su parte: ¿Qué chip flash está usando? ¿Qué placa de CPU estás usando? ¿Qué distribución de Linux estás usando? ¿Cuáles son los números de versión del kernel y de los módulos del kernel y/o controladores de dispositivos que está utilizando? ¿Tiene enlaces a donde se pueden encontrar estos artículos?
Juan U.
Kaz
read
llamada al sistema regresó-1
. Ignora el valor devuelto y, en ese caso, su ciclo imprime datos no inicializados de la matriz de longitud variable.ratones
julumme