El BikeLight está basado en un microcontrolador MSP430g2553 de Texas Instruments, que además de ejecutar el código necesario, utiliza parte de su memoria flash como medio de almacenamiento para los mensajes y animaciones. Para la visualización, se utiliza un driver de leds Max7219 que controla una matriz de leds de 8×8. Para la comunicación, un chip ftdi ft323rl hace de puente USB-Serie, empleando un sencillo protocolo de mensajes de dos bytes. Además se incorpora un max1555 como cargador de baterías de litio, y un regulador LDO de 3.3V, además de los pasivos necesarios para todo el sistema.
Los últimos archivos (KiCAD) del hardware, en gitorious: https://gitorious.org/bikelight/bikelight-hardware
El código fuente del firmware está disponible en: https://github.com/ladecadence/BikeLight-Firmware
La memoria principal de msp430g2553 es una memoria flash dividida en segmentos de 512 bytes. Estos segmentos deben de ser borrados antes de ser escritos. En principio se usarán casi todos los 8kB superiores (menos los últimos 512 bytes) de los 16kB de microcontrolador para almacenar datos. Los 8kB superiores empiezan en 0x0E000.
El orden de los datos en la flash es:
Los datos se organizan de la siguiente manera
Flash magic number. Indica el fin de la memoria programada. Útil para comprobar que los datos son correctos.
Cada frame ocupa 10 bytes. Los dos primeros bytes son el ancho y el alto del frame en pixels (nomalmente 8×8) y luego 8 bytes por frame, cada byte representando una columna de la matriz.
El protocolo de comunicaciones es sencillo. Se utilizan paquetes de dos bytes, siendo el primer byte el tipo de paquete y el segundo byte el dato.
Los tipos de paquetes son los siguientes:
Los comandos especificados por el paquete comando son:
El procedimiento de enviar nuevos datos al BikeLight, se inicia enviándole un comando de flasheo, y a partir de aqui, y teniendo en cuenta sus respuestas, se deben de enviar los datos a flashear en bloques de 128 bytes, enviando un comando de CMD_END para terminar. El algoritmo es el siguiente:
1: enviar comando CMD_PRG_FLASH 2: esperamos respuesta (el BL está borrando la memoria) 3: la respuesta es estado STAT_OK? 4: si: 5: enviamos un bloque de 128 bytes (directamente, sin protocolo) 6: esperamos respuesta 7: la respuesta es un PKT_DATA conteniendo la suma acumulada de (byte n enviado+1)? 8: si: 9: hay que enviar más datos? 10: si: 11: enviamos comando CMD_PRG_FLASH 12: seguimos en 5: 13: no: 14: enviamos comando CMD_PRG_END y salimos correctamente 15: no: 16: error en el checksum 17: enviamos comando CMD_PRG_END y salimos con error 18: no: 19: error en el borrado 20: enviamos comando CMD_PRG_END y salimos con error