Hola. Tengo un proyecto funcionando con bootloader que yo mismo hice utilizando xtea de tiny. Permite que el usuario pueda actualizar firmware con un cable usb.
Todo perfecto hasta que se me ha presentado una causa que me exige cambiar el bootloader a todas las placas. Esto está basado en pic18f26k20.
Para solucionarlo os cuento como lo he hecho y ya a ver si alguien me aclara otras opciones más sencillas..
El bootloader tiene reservados desde la posición 0x0000 hasta la 0x0c7f. (Mucho) pero lo necesito, aunque ocupa algo menos, le dejé memori reservada por si pasaba esto de tener que modificarlo en un futuro y que ocupase más. El resto de la flash es para la app que arranca en vector 0xc80 con interrupt en 0x0c88.
Pues bien. Lo que he hecho es crear una app (programa) que se carga aquí, a partir del vector de arranque. El bootloader se inicia y salta a esta aplicación que lo que va a hacer es leer la flash a partir de la posición 0xf000, casi al final y luego copiar su contenido a partir de la posición 0 machacando el bootloader existente. A la misma vez, cada bloque de 64 bytes (erase_size) de mi pic una vez que es leído y copiado al principio de la flash lo que hago es verificar la copia y luego borrar ese bloque de la zona alta de la flash. Así sucesivamente con todos los bloques.
¿Por que leemos a partir de la 0xf000? Pues por que supone que de alguna manera ahí tendré grabado el bootloader nuevo. Será lo primero que compruebe la app, escaneara el primer bloque en busca de datos. Si los hay comienza la copia. Si está todo a FF se cancela todo. Así evito machacar el bootloader con valores FF, ya que eso dejaría la placa “brickeada” y entonces ya solo sería posible resucitar por icsp.
El marrón de todo no es esto, sino el cómo consigo que el bootloader cargue la aplicación en el vector de arranque Y ADEMÁS cargue todo el contenido del nuevo bootloader al final de la flash. Para que luego la app los lea y sobreescriba el bootloader.
Lo que he hecho es compilar el nuevo bootloader normal, editar el fichero *.hex y modificar a mano las posiciones de memoria a donde apunta cada línea. Pasando la 0x0000 a 0xf000. La 0x0001 a la 0xf001 y así sucesivamente. Elimino las líneas de los fuses (no me interesa modificarlos) y las de los datos de la eeprom (si los hubiere).
Ahora cojo el fichero *.hex de la aplicación la cual es compilada para que arranque en la posición 0x0c80. Lo edito y al final del hex, justo antes de la línea :00000001FF (fin de fichero) pues pego todo lo del bootloader nuevo.
Así obtengo un solo HEX que lo contiene todo.
Eso lo cargo con mi actual bootloader y.... Bingo.... todo funciona a la perfección.
La pregunta es: ¿ se puede de forma más fácil que andar editando los HEX copiando y pegando trozos de unos a otros?? Vamos, lo que se llama un hex franskestein xd xd...