[PATCH v2 11/15] Add code to send upgrade firmware command to OSTC3
Anton Lundin
glance at acc.umu.se
Wed Dec 17 14:11:08 PST 2014
This function triggers a reboot into the bootloader which flashes the
new firmware to Prom.
This code is inspired by JeanDo ostc-companion.
Reviewed-by: Jef Driesen <jef at libdivecomputer.org>
Signed-off-by: Anton Lundin <glance at acc.umu.se>
---
src/hw_ostc3.c | 32 +++++++++++++++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)
diff --git a/src/hw_ostc3.c b/src/hw_ostc3.c
index 35df0c7..06e3827 100644
--- a/src/hw_ostc3.c
+++ b/src/hw_ostc3.c
@@ -57,6 +57,7 @@
#define S_ERASE 0x42
#define S_READY 0x4C
#define READY 0x4D
+#define S_UPGRADE 0x50
#define HEADER 0x61
#define CLOCK 0x62
#define CUSTOMTEXT 0x63
@@ -73,6 +74,7 @@ typedef enum hw_ostc3_state_t {
OPEN,
DOWNLOAD,
SERVICE,
+ REBOOTING,
} hw_ostc3_state_t;
typedef struct hw_ostc3_device_t {
@@ -329,7 +331,7 @@ hw_ostc3_device_close (dc_device_t *abstract)
dc_status_t rc = DC_STATUS_SUCCESS;
// Send the exit command
- if (device->state != OPEN) {
+ if (device->state != REBOOTING && device->state != OPEN) {
rc = hw_ostc3_transfer (device, NULL, EXIT, NULL, 0, NULL, 0);
if (rc != DC_STATUS_SUCCESS) {
ERROR (abstract->context, "Failed to send the command.");
@@ -917,3 +919,31 @@ hw_ostc3_firmware_block_write (hw_ostc3_device_t *device, unsigned int addr, uns
return hw_ostc3_transfer (device, NULL, S_BLOCK_WRITE, buffer, sizeof(buffer), NULL, 0);
}
+
+static dc_status_t
+hw_ostc3_firmware_upgrade (dc_device_t *abstract, unsigned int checksum)
+{
+ dc_status_t rc = DC_STATUS_SUCCESS;
+ hw_ostc3_device_t *device = (hw_ostc3_device_t *) abstract;
+ dc_context_t *context = (abstract ? abstract->context : NULL);
+ unsigned char buffer[5];
+ array_uint32_le_set(buffer, checksum);
+
+ // Compute a one byte checksum, so the device can validate the firmware image.
+ buffer[4] = 0x55;
+ for(int i = 0; i < 4; i++) {
+ buffer[4] ^= buffer[i];
+ buffer[4] = (buffer[4]<<1 | buffer[4]>>7);
+ }
+
+ rc = hw_ostc3_transfer(device, NULL, S_UPGRADE, buffer, sizeof(buffer), NULL, 0);
+ if (rc != DC_STATUS_SUCCESS) {
+ ERROR (context, "Failed to send flash firmware command");
+ return rc;
+ }
+
+ // Now the device resets, and if everything is well, it reprograms.
+ device->state = REBOOTING;
+
+ return DC_STATUS_SUCCESS;
+}
--
2.1.0
More information about the devel
mailing list