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)',
],
},
],