La lectura de flash SPI de más de 35 bytes hace que el tiempo de espera del controlador y los resultados se dañen

1

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.

    
pregunta julumme

2 respuestas

1

Creo que es un problema con el controlador SPI. ¿Todavía no funciona con el kernel upstream 3.7? Se aplicaron muchas correcciones allí.

    
respondido por el Marex
2

Esto no es un problema de electrónica. En un bus SPI, el maestro tiene el control completo de la sincronización de cualquier transferencia que se inicie. En particular, en una operación de lectura, el dispositivo esclavo puede devolver datos erróneos 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 totalmente un problema dentro del kernel de Linux o el controlador específico que está usando. En cualquier caso, una respuesta más específica requerirá muchos más detalles de usted: ¿Qué chip flash está usando? ¿Qué placa CPU está utilizando? ¿Qué distribución de Linux estás usando? ¿Cuáles son los números de versión del kernel y los módulos del kernel y / o controladores de dispositivo que está usando? ¿Tiene enlaces a donde se pueden encontrar estos artículos?

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas