Equipos y materiales > Openwrt & LEDE
Conectar nuevos dispositivos al bus SPI de la Flash.
<< < (2/2)
danitool:
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: ---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);
--- Fin del código ---

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: ---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);       
        }


       
--- Fin del código ---

Tki2000:

--- Cita de: danitool 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.

--- Fin de la cita ---

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...
Navegación
Índice de Mensajes
Página Anterior

Ir a la versión completa