Program an AVR microcontroller using mbed.

Dependencies:   mbed

Revision:
1:276f6df4be7a
Parent:
0:3066745764a5
Child:
2:99c56829a2a8
--- a/AVR910.cpp	Tue Aug 31 14:09:53 2010 +0000
+++ b/AVR910.cpp	Wed Sep 01 10:22:51 2010 +0000
@@ -60,7 +60,7 @@
 
     //Issue a programming enable command.
     response = enableProgramming();
-    
+
     //Simple debugging to see if we get trapped
     //in an infinite loop.
     DigitalOut working(LED1);
@@ -79,12 +79,12 @@
         response = enableProgramming();
 
     }
-    
+
     working = 0;
 
 }
 
-int AVR910::program(FILE* binary) {
+int AVR910::program(FILE* binary, int pageSize, int numPages) {
 
     //Clear memory contents.
     chipErase();
@@ -93,27 +93,60 @@
     int  pageNumber = 0;
     int  c          = 0;
     int  highLow    = 0;
-    
-    while ((c = getc(binary)) != EOF) {
+
+    //We're dealing with paged memory.
+    if (numPages > 1) {
+
+        while ((c = getc(binary)) != EOF) {
+
+            //Page is fully loaded, time to write it to flash.
+            if (pageOffset == (pageSize)) {
+                writeFlashMemoryPage(pageNumber);
 
-        //Page is fully loaded, time to write it to flash.
-        if (pageOffset == (PAGE_SIZE)) {
-            writeFlashMemoryPage(pageNumber);
+                pageNumber++;
+                if (pageNumber > numPages) {
+                    break;
+                }
+                pageOffset = 0;
+            }
 
-            pageNumber++;
-            pageOffset = 0;
+            //Write low byte.
+            if (highLow == 0) {
+                loadMemoryPage(WRITE_LOW_BYTE, pageOffset, c);
+                highLow = 1;
+            }
+            //Write high byte.
+            else {
+                loadMemoryPage(WRITE_HIGH_BYTE, pageOffset, c);
+                highLow = 0;
+                pageOffset++;
+            }
+
         }
 
-        //Write low byte.
-        if (highLow == 0) {
-            loadMemoryPage(WRITE_LOW_BYTE, pageOffset, c);
-            highLow = 1;
-        }
-        //Write high byte.
-        else {
-            loadMemoryPage(WRITE_HIGH_BYTE, pageOffset, c);
-            highLow = 0;
-            pageOffset++;
+    }
+    //We're dealing with non-paged memory.
+    else {
+
+        while ((c = getc(binary)) != EOF) {
+
+            //Write low byte.
+            if (highLow == 0) {
+                loadMemoryPage(WRITE_LOW_BYTE, pageOffset, c);
+                highLow = 1;
+            }
+            //Write high byte.
+            else {
+                loadMemoryPage(WRITE_HIGH_BYTE, pageOffset, c);
+                highLow = 0;
+                pageOffset++;
+
+                if (pageOffset > pageSize) {
+                    break;
+                }
+
+            }
+
         }
 
     }