aboutsummaryrefslogtreecommitdiff
path: root/bootloaders/optiboot/optiboot.c
diff options
context:
space:
mode:
authorWestfW <westfw@gmail.com>2011-06-10 17:47:47 -0700
committerWestfW <westfw@gmail.com>2011-06-10 17:47:47 -0700
commit2a83ee55b38c81df04d7d3b83d6bf68ed72936e4 (patch)
tree053e124f7d6352bd29c115d245be75a2270a5d3a /bootloaders/optiboot/optiboot.c
parent64be388f3eb3ce662000d7c14e44047458f55875 (diff)
Add a version number to the optiboot source and binary.
http://code.google.com/p/arduino/issues/detail?id=554 end of flash memory where they can be read (at least in theory) by device programmers, hex-file examination, or application programs. This is done by putting the version number in a separate section (".version"), and using linker/objcopy magic to locate that section as appropriate for the target chip. (See http://lists.gnu.org/archive/html/avr-gcc-list/2011-02/msg00016.html for some discussion on the details.) Start the version at 4.1 (the last "packaged" version of optiboot was called version 3, so the "top of source" would be 4.0, and adding the version number makes 4.1) Refactor LDSECTION in the Makefile to LDSECTIONS so that multiple section start addresses can be defined. Change the _isp makefile definitions to make the bootloader section readable (but not writable) by the application section. (This would need to be done elsewhere as well to handle all bootloader programming techniques. Notably Arduino's boards.txt Note that this change does not change the "code" portion of optiboot at all. The only diffs in the .hex files are the added version word at the end of flash memory.
Diffstat (limited to 'bootloaders/optiboot/optiboot.c')
-rw-r--r--bootloaders/optiboot/optiboot.c38
1 files changed, 34 insertions, 4 deletions
diff --git a/bootloaders/optiboot/optiboot.c b/bootloaders/optiboot/optiboot.c
index 4b4a10a..ece8b43 100644
--- a/bootloaders/optiboot/optiboot.c
+++ b/bootloaders/optiboot/optiboot.c
@@ -114,7 +114,37 @@
/* 500,1000,2000,4000,8000 supported. */
/* */
/**********************************************************/
+
+/**********************************************************/
+/* Version Numbers! */
+/* */
+/* Arduino Optiboot now includes this Version number in */
+/* the source and object code. */
+/* */
+/* Version 3 was released as zip from the optiboot */
+/* repository and was distributed with Arduino 0022. */
+/* Version 4 starts with the arduino repository commit */
+/* that brought the arduino repository up-to-date with */
+/* the optiboot source tree changes since v3. */
+/* */
+/**********************************************************/
+
+/**********************************************************/
+/* Edit History: */
+/* */
+/* 4.1 WestfW: put version number in binary. */
+/**********************************************************/
+
+#define OPTIBOOT_MAJVER 4
+#define OPTIBOOT_MINVER 1
+#define MAKESTR(a) #a
+#define MAKEVER(a, b) MAKESTR(a*256+b)
+
+asm(" .section .version\n"
+ "optiboot_version: .word " MAKEVER(OPTIBOOT_MAJVER, OPTIBOOT_MINVER) "\n"
+ " .section .text\n");
+
#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
@@ -324,7 +354,7 @@ int main(void) {
// If we are in RWW section, immediately start page erase
if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address);
-
+
// While that is going on, read in page contents
bufPtr = buff;
do *bufPtr++ = getch();
@@ -336,7 +366,7 @@ int main(void) {
// Read command terminator, start reply
verifySpace();
-
+
// If only a partial page is to be programmed, the erase might not be complete.
// So check that here
boot_spm_busy_wait();
@@ -371,7 +401,7 @@ int main(void) {
__boot_page_fill_short((uint16_t)(void*)addrPtr,a);
addrPtr += 2;
} while (--ch);
-
+
// Write from programming buffer
__boot_page_write_short((uint16_t)(void*)address);
boot_spm_busy_wait();
@@ -489,7 +519,7 @@ uint8_t getch(void) {
" rcall uartDelay\n" // Wait 1 bit period
" clc\n"
" sbic %[uartPin],%[uartBit]\n"
- " sec\n"
+ " sec\n"
" dec %[bitCnt]\n"
" breq 3f\n"
" ror %[ch]\n"