Autor Tema: Conectar nuevos dispositivos al bus SPI de la Flash.  (Leído 3631 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2192
Conectar nuevos dispositivos al bus SPI de la Flash.
« en: 21-02-2014, 14:14 (Viernes) »
¿Alguien sabe si se pueden incorporar nuevos dispositivos SPI al mismo bus de la Flash o al bus SPI que tenga el router, añadiendo la línea de chip select CS con algún gpio?
Es decir, quiero saber si puedo añadir un LCD SPI a las mismas líneas que utiliza el router para comunicarse con otros dispositivos SPI, diciéndole qué CS debe activar cuando se quiera comunicar con cada dispositivo.
He visto esto en concreto : ILI9225B LCD on HLK-RM04 WiFi module with OpenWRT pero sería necesario aplicar el parche sobre el driver específico SPI de cada plataforma. Si fuera un parche genérico estaría bien, pero no lo es.

¿Sería posible utilizar spi-gpio-custom definiendo los mismos pines CLK, MISO y MOSI que tuviera la memoria flash? ¿o se haría un lío? Mi intención es agregar nuevos dispositivos al mismo bus utilizando solamente una línea adicional.

He visto que se han conectado memorias externas SPI al mismo bus SPI de una Livebox para leerlas. Yo estoy buscando algo más genérico para poder incorporar LCDs y lectores de SD.

¿Alguna pista de si se puede hacer de forma "poco traumática" utilizando sólo esa línea de más?




danitool

  • Visitante
Re: Conectar nuevos dispositivos al bus SPI de la Flash.
« Respuesta #1 en: 21-02-2014, 15:54 (Viernes) »
En mi opinión SÍ es posible. Habría que modificar el driver SPI para que usase un GPIO como chip select.

Esta misma cuestión la hablé en su momento con Noltari.

Supongo que estás pensando hacerlo en la plataforma bcm63xx. Hay que tener en cuenta que existen dos drivers el HSSPI y el SPI normal. Lo mejor sería probar en placas con HSSPI, ya que al menos el SPI normal es bastante pobre en funcionalidad y seguramente no funcionaría bien.

El HSSPI se encuentra en routers con BCM6328, los cuales usan una flash SPI. Los 6348/6358/6368 usan el SPI normal el cual en ocasiones se usa para conectar al switch, en el caso del 6368 hay alguna placa con flash SPI aunque yo no vi ninguna sé que existen.

Sobre el Livebox 1, decir que todos los pines SPI están expuestos, incluso el CS, pero solo sirve para conectar una flash SPI y haciendo algún apaño para poder leer/escribir correctamente, conectar una memoria SD/MMC para usar el driver MMC over SPI NO funciona, o al menos yo no fui capaz, como ya he dicho este driver es un poco cutre.

Intuyo que los SOCs bcm63xx tienen hasta 4 chip-selects según lo que hay en el código de Broadcom. Pero existir como tal solo existe 1. Pienso que los otros tres son GPIOs que se convierten en SPI chipselect mediante bootstraps. De cuales son estos GPIOs y cual es el bootstrap que los activa, ni idea, ya que no existe absolutamente ningún datasheet de broadcom, ni información relativa a ello.

Así que lo suyo sería usar un BCM6328 tal como el AR5387un, o similar. localizar un gpio sin usar y darle funcionalidad de SPI-CS en el código del kernel.

Ahora solo falta alguien que sepa como hacerlo  >:D

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2192
Re: Conectar nuevos dispositivos al bus SPI de la Flash.
« Respuesta #2 en: 21-02-2014, 18:05 (Viernes) »
En realidad lo que estoy intentando es buscar algo sencillo para tener esa funcionalidad, pero me parece que no va a ser tan fácil.

Si miras en el ejemplo que pongo en el post, el autor ha conseguido dos dispositivos SPI en el mismo bus definiendo los mismos en el archivo dts, utilizando un gpio de un led para el chip select y luego alterando el driver SPI de la plataforma en cuestión, en este caso spi-rt2880.c. Así, tan sólo alterando dos ficheros ha conseguido hablar con los dos dispositivos SPI, siendo uno de ellos la propia flash del router y el otro un LCD.

Por otro lado tenemos el módulo spi-gpio-custom que nos permite tener funcionalidad SPI definiendo los pines para hablar con los dispositivos. No sé todavía si este driver permite que se definan pines que ya están siendo usados por el driver SPI del soc. El caso es que según el código parece que los parámetros que le definamos los introduce en la estructura platform_device que luego va a ser utilizada por el driver SPI, y registra el nuevo dispositivo con el master del SPI. ¿Significa esto que al definir el dispositivo de esta forma el driver SPI del soc se va a hacer cargo de las transferencias de datos? Si esto fuera verdad ya tendríamos todo solucionado.

Una razón por la que pudiera no haberte funcionado la tarjeta SD puede ser por la velocidad del SPI. Si estabas intentando comunicarte a la misma velocidad que la memoria flash puede ser que la SD no te "siguiera". Prueba a ver si le puedes bajar la velocidad del SPI.


danitool

  • Visitante
Re: Conectar nuevos dispositivos al bus SPI de la Flash.
« Respuesta #3 en: 21-02-2014, 19:54 (Viernes) »
Sobre el ejemplo que pones, yo la verdad solo veo un video en el que se ve la modificación, con un montón de cables conectados en la placa y poco más.

Si tienes algún código interesante que has visto por ahí, ponerlo aquí no haría daño  >:D.

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2192
Re: Conectar nuevos dispositivos al bus SPI de la Flash.
« Respuesta #4 en: 21-02-2014, 19:59 (Viernes) »
El código está en el "Show More" del video, sólo hay que darle a la pestaña: http://zdoom.ic.cz/download/ILI9225-HLK-RM04.tar.gz  ;D
« Última modificación: 21-02-2014, 20:00 (Viernes) por Tki2000 »

danitool

  • Visitante
Re: Conectar nuevos dispositivos al bus SPI de la Flash.
« Respuesta #5 en: 02-03-2014, 21:26 (Domingo) »
El problema del código que mencionas es que hace cambios en el driver SPI por lo cual habría que conocer exactamente como funciona el código, lo cual es complicado para la mayoría de mortales aquí presentes.


Otra opción es la que mencioné de activar slave selects adicionales que posee el hardware, y para lo cual tengo código, (sin testear). Ahí va:

Código: [Seleccionar]
6348
u32 val;
/* Enable Extra SPI CS */
/* GPIO 29 is SSx FIXME */
val = bcm_gpio_readl(GPIO_MODE_REG);
val |= GPIO_MODE_6348_G1_SPI_MASTER;
bcm_gpio_writel(val, GPIO_MODE_REG);

6358
u32 val;
/* Enable Overlay for SPI SS Pins */
val = bcm_gpio_readl(GPIO_MODE_REG);
val |= GPIO_MODE_6358_EXTRA_SPI_SS;
bcm_gpio_writel(val, GPIO_MODE_REG);
/* Enable SPI Slave Select as Output Pins */
        /* GPIO 32 is SS2, GPIO 33 is SS3 */
val = bcm_gpio_readl(GPIO_CTL_HI_REG);
val |= 0x0003
bcm_gpio_writel(val, GPIO_CTL_HI_REG);

6368
u32 val;
/* Enable Extra SPI CS */
val = bcm_gpio_readl(GPIO_MODE_REG);
val |= (GPIO_MODE_6368_SPI_SSN2 | GPIO_MODE_6368_SPI_SSN3 | GPIO_MODE_6368_SPI_SSN4 | GPIO_MODE_6368_SPI_SSN5);
bcm_gpio_writel(val, GPIO_MODE_REG);
/* Enable SPI Slave Select as Output Pins */           
        /* GPIO 28 is SS2, GPIO 29 is SS3, GPIO 30 is SS4, GPIO 31 is SS5*/   
val = bcm_gpio_readl(GPIO_CTL_HI_REG);
val |= (GPIO_MODE_6368_SPI_SSN2 | GPIO_MODE_6368_SPI_SSN3 | GPIO_MODE_6368_SPI_SSN4 | GPIO_MODE_6368_SPI_SSN5);
bcm_gpio_writel(val, GPIO_CTL_HI_REG);

Lo que hace es convertir ciertos gpios en slave selects reales, no emulados. Como se puede ver suelen ser gpios del 28 al 33, según de que SoC se trate.

Del bcm6328, no encontré nada todavía.

Y esto está basado en código de broadcom. El cual lo pongo por si alguien quiere compararlo al que he puesto para OpenWrt, o/y hacer alguna correccion.

Código: [Seleccionar]
6348
            /* Enable Extra SPI CS */
            GPIO->GPIOMode |= GROUP1_SPI_MASTER;

6358
        if (GPIOOverlays & BP_OVERLAY_SPI_EXT_CS) {
            /* Enable Overlay for SPI SS Pins */
            GPIO->GPIOMode |= GPIO_MODE_SPI_SS_OVERLAY;
            /* Enable SPI Slave Select as Output Pins */
            /* GPIO 32 is SS2, GPIO 33 is SS3 */
            GPIO->GPIODir_high |= 0x0003;

6368
        if (GPIOOverlays & BP_OVERLAY_SPI_EXT_CS) {           
            /* Enable Overlay for SPI SS Pins */           
            GPIO->GPIOMode |= (GPIO_MODE_SPI_SSN2 | GPIO_MODE_SPI_SSN3);           
            /* Enable SPI Slave Select as Output Pins */           
            /* GPIO 28 is SS2, GPIO 29 is SS3 */           
            GPIO->GPIODir |= (GPIO_MODE_SPI_SSN2 | GPIO_MODE_SPI_SSN3);       
        }


       


Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2192
Re: Conectar nuevos dispositivos al bus SPI de la Flash.
« Respuesta #6 en: 03-03-2014, 09:39 (Lunes) »
El problema del código que mencionas es que hace cambios en el driver SPI por lo cual habría que conocer exactamente como funciona el código, lo cual es complicado para la mayoría de mortales aquí presentes.

Esa es la cuestión. Los driver SPI no tienen contemplado que se les puedan pasar datos creados en tiempo de ejecución para gobernar nuevos dispositivos SPI y cada driver SPI es totalmente distinto al otro. La persona que hizo el hack del LCD tuvo la suerte de escoger un driver SPI que está totalmente ordenado y es intuitivo el seguir su flujo de datos. Sin embargo he estado mirando el driver SPI para Atheros y por ahora no sé ni por dónde meterle mano...  ^-^
El hecho de que el driver SPI Ralink ya tenga en cuenta en su estructura que puede haber varios dispositivos para mandar mensajería, aunque no tuviera en cuenta sus respectivos CS, ya es un logro..., de hecho sólo hay que adaptar dos funciones para reservar y liberar los pines por gpio y la función de lectura escritura para seleccionar el CS correcto antes de las transaccciones.

De todas formas, aunque con el código que pones se pudieran gobernar los CS de otros dispositivos tendríamos la dificultad de que habría que localizar dichos pines y saber cómo engancharlos al nuevo dispositivo que pongamos. La novedad del hack es que utiliza las mismas pistas de conexión que la flash para los datos y un GPIO escogido para hacer el CS del nuevo dispositivo, cuya localización podemos conocer de antemano (por ejemplo un LED del router).

Ojalá existiera alguna forma de incorporar alguna especie de hack genérico para informar al driver SPI de nuevos dispositivos, pero como esto depende de cada driver y cada driver es distinto, es una cosa poco menos que utópica... aunque posible...