got it so the BBB at least detects when the cape has out of date code
diff --git a/bbb_cape/src/bbb/hex_byte_reader.h b/bbb_cape/src/bbb/hex_byte_reader.h
index 8f44c9a..8bbbe6d 100644
--- a/bbb_cape/src/bbb/hex_byte_reader.h
+++ b/bbb_cape/src/bbb/hex_byte_reader.h
@@ -15,8 +15,9 @@
   explicit HexByteReader(const ::std::string &filename);
   virtual ~HexByteReader() {}
 
-  virtual ssize_t ReadBytes(uint8_t *dest, size_t max_bytes,
-                            const ::aos::time::Time &timeout) override;
+  virtual ssize_t ReadBytes(
+      uint8_t *dest, size_t max_bytes,
+      const ::aos::time::Time &timeout = ::aos::time::Time(0, 0)) override;
 
   // Returns the total number of bytes that we will eventually read out.
   unsigned int GetSize();
diff --git a/bbb_cape/src/bbb/sensor_reader.cc b/bbb_cape/src/bbb/sensor_reader.cc
index c0e9604..93234c2 100644
--- a/bbb_cape/src/bbb/sensor_reader.cc
+++ b/bbb_cape/src/bbb/sensor_reader.cc
@@ -16,12 +16,20 @@
 
 uint32_t ReadChecksum(const ::std::string &filename) {
   HexByteReader reader(filename);
-  uint32_t r = ::cape::CalculateChecksum(&reader);
-  /*static const uint8_t fill[4] = {0xFF, 0xFF, 0xFF, 0xFF};
-  for (size_t i = reader.GetSize(); i < 0x100000 - 0x4000; i += 4) {
-    r = ::cape::CalculateChecksum(fill, 4, r);
-  }*/
-  return r;
+  {
+    static const size_t kSkipBytes = 0x4000;
+    size_t i = 0;
+    uint8_t buffer[1024];
+    while (i < kSkipBytes) {
+      ssize_t read =
+          reader.ReadBytes(buffer, ::std::min<size_t>(sizeof(buffer), kSkipBytes - i));
+      if (read < 0) {
+        LOG(FATAL, "error skipping bytes before actual data\n");
+      }
+      i += read;
+    }
+  }
+  return ::cape::CalculateChecksum(&reader);
 }
 
 }  // namespace
@@ -53,9 +61,11 @@
     if (packet_finder_.ReadPacket(next_timeout)) {
       last_received_time_ = ::aos::time::Time::Now();
       const DataStruct *data = packet_finder_.get_packet<DataStruct>();
-      if (data->flash_checksum != expected_checksum_ && false) {
-        LOG(WARNING, "Cape code checksum is %" PRIu32 ". Expected %" PRIu32
-                     ". Reflashing.\n",
+      if (data->flash_checksum != expected_checksum_) {
+        // TODO(brians): Fix the custom bootloader stuff and then change this to
+        // WARNING.
+        LOG(FATAL, "Cape code checksum is 0x%" PRIx32 ". Expected 0x%" PRIx32
+                   ". Reflashing.\n",
             data->flash_checksum, expected_checksum_);
         manager_.DownloadHex(hex_filename_);
         ResetHappened();
diff --git a/bbb_cape/src/bbb/uart_reader.h b/bbb_cape/src/bbb/uart_reader.h
index a8edc6e..7861003 100644
--- a/bbb_cape/src/bbb/uart_reader.h
+++ b/bbb_cape/src/bbb/uart_reader.h
@@ -17,8 +17,9 @@
   explicit UartReader(int32_t baud_rate);
   virtual ~UartReader();
 
-  virtual ssize_t ReadBytes(uint8_t *dest, size_t max_bytes,
-                            const ::aos::time::Time &timeout_time) override;
+  virtual ssize_t ReadBytes(
+      uint8_t *dest, size_t max_bytes,
+      const ::aos::time::Time &timeout_time = ::aos::time::Time(0, 0)) override;
   virtual bool WriteBytes(uint8_t *bytes, size_t number_bytes) override;
 
  private:
diff --git a/bbb_cape/src/cape/fill_packet.c b/bbb_cape/src/cape/fill_packet.c
index 8d1f72a..a0b2b13 100644
--- a/bbb_cape/src/cape/fill_packet.c
+++ b/bbb_cape/src/cape/fill_packet.c
@@ -80,9 +80,14 @@
   encoder_init();
   digital_init();
 
-  flash_checksum =
-      crc_calculate((void *)MAIN_FLASH_START,
-                    (size_t)(MAIN_FLASH_END - MAIN_FLASH_START) / 4);
+  {
+    extern uint32_t __flash_end, __data_start__, __data_end__;
+    const uint32_t main_flash_end = (uint32_t) & __flash_end + (uint32_t) &
+                                    __data_end__ - (uint32_t) & __data_start__;
+    flash_checksum =
+        crc_calculate((void *)MAIN_FLASH_START,
+                      (size_t)(main_flash_end - MAIN_FLASH_START) / 4);
+  }
 
   led_set(LED_ERR, 0);
   gyro_init();
diff --git a/bbb_cape/src/cape/gcc_arm.ld b/bbb_cape/src/cape/gcc_arm.ld
index 1a1cb27..26a43e8 100644
--- a/bbb_cape/src/cape/gcc_arm.ld
+++ b/bbb_cape/src/cape/gcc_arm.ld
@@ -142,4 +142,9 @@
 
 	/* Check if data + heap + stack exceeds RAM limit */
 	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+
+	.flash_end :
+	{
+		__flash_end = .;
+	} > FLASH
 }
diff --git a/frc971/prime/prime.gyp b/frc971/prime/prime.gyp
index c4db795..3ad28ba 100644
--- a/frc971/prime/prime.gyp
+++ b/frc971/prime/prime.gyp
@@ -27,11 +27,30 @@
         '<(DEPTH)/bbb_cape/src/flasher/flasher.gyp:stm32_flasher',
         '../output/output.gyp:led_setter',
       ],
+      'variables': {
+        'cape_src': '<(DEPTH)/bbb_cape/src/cape',
+        'cape_hex': '<(cape_src)/.obj/main_comp.hex',
+      },
+      'actions': [
+        {
+          'action_name': 'make_cape',
+          'inputs': [
+            '<!@(find <(cape_src) -name ".*" -prune -o -type f -print)',
+            '<(cape_src)/Makefile',
+          ],
+          'outputs': [
+            '<(cape_hex)',
+          ],
+          'action': ['make', '-C', '<(cape_src)'],
+          'message': 'Building cape code',
+        },
+      ],
       'copies': [
         {
           'destination': '<(rsync_dir)',
           'files': [
             'start_list.txt',
+            '<(cape_hex)',
           ],
         },
       ],