src: https://github.com/sakuraio/SakuraIOArduino/tree/master/examples/FirmwareUpdate

Dependencies:   SakuraIO mbed

Committer:
sakurafan
Date:
Mon Jul 24 02:45:01 2017 +0000
Revision:
0:ad4eb76f11a0
1st build

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sakurafan 0:ad4eb76f11a0 1 #include "mbed.h"
sakurafan 0:ad4eb76f11a0 2 #include "SakuraIO.h"
sakurafan 0:ad4eb76f11a0 3
sakurafan 0:ad4eb76f11a0 4 SakuraIO_I2C sakuraio(p28, p27); // sda, scl (mbed LPC1768)
sakurafan 0:ad4eb76f11a0 5
sakurafan 0:ad4eb76f11a0 6 DigitalOut myled(LED1);
sakurafan 0:ad4eb76f11a0 7 Serial pc(USBTX, USBRX);
sakurafan 0:ad4eb76f11a0 8
sakurafan 0:ad4eb76f11a0 9 uint8_t updateFirmware () {
sakurafan 0:ad4eb76f11a0 10 uint8_t ret;
sakurafan 0:ad4eb76f11a0 11 char version[33] = {0};
sakurafan 0:ad4eb76f11a0 12
sakurafan 0:ad4eb76f11a0 13 // Check module
sakurafan 0:ad4eb76f11a0 14 uint16_t productId = sakuraio.getProductID();
sakurafan 0:ad4eb76f11a0 15 switch(productId){
sakurafan 0:ad4eb76f11a0 16 case 0x0001:
sakurafan 0:ad4eb76f11a0 17 pc.printf("SCM-LTE-Beta\r\n");
sakurafan 0:ad4eb76f11a0 18 break;
sakurafan 0:ad4eb76f11a0 19 default:
sakurafan 0:ad4eb76f11a0 20 pc.printf("Please check connection\r\n");
sakurafan 0:ad4eb76f11a0 21 return 1;
sakurafan 0:ad4eb76f11a0 22 }
sakurafan 0:ad4eb76f11a0 23
sakurafan 0:ad4eb76f11a0 24 wait(1);
sakurafan 0:ad4eb76f11a0 25
sakurafan 0:ad4eb76f11a0 26 // Waiting for online
sakurafan 0:ad4eb76f11a0 27 pc.printf("Waiting for online\r\n");
sakurafan 0:ad4eb76f11a0 28 while (1) {
sakurafan 0:ad4eb76f11a0 29 pc.printf(".");
sakurafan 0:ad4eb76f11a0 30 wait(2);
sakurafan 0:ad4eb76f11a0 31 if((sakuraio.getConnectionStatus() & 0x80) != 0x00){
sakurafan 0:ad4eb76f11a0 32 break;
sakurafan 0:ad4eb76f11a0 33 }
sakurafan 0:ad4eb76f11a0 34 }
sakurafan 0:ad4eb76f11a0 35 pc.printf("\r\n");
sakurafan 0:ad4eb76f11a0 36 pc.printf("Online\r\n");
sakurafan 0:ad4eb76f11a0 37
sakurafan 0:ad4eb76f11a0 38 pc.printf("Get current version\r\n");
sakurafan 0:ad4eb76f11a0 39 ret = sakuraio.getFirmwareVersion(version);
sakurafan 0:ad4eb76f11a0 40 if((ret = sakuraio.getFirmwareVersion(version)) != CMD_ERROR_NONE){
sakurafan 0:ad4eb76f11a0 41 pc.printf("Error code=%d\r\n", ret);
sakurafan 0:ad4eb76f11a0 42 return 1;
sakurafan 0:ad4eb76f11a0 43 }
sakurafan 0:ad4eb76f11a0 44 pc.printf("Current: %s\r\n", version);
sakurafan 0:ad4eb76f11a0 45
sakurafan 0:ad4eb76f11a0 46 wait(1);
sakurafan 0:ad4eb76f11a0 47
sakurafan 0:ad4eb76f11a0 48 // Request unlock
sakurafan 0:ad4eb76f11a0 49 pc.printf("Unlock\r\n");
sakurafan 0:ad4eb76f11a0 50 if((ret = sakuraio.unlock()) != CMD_ERROR_NONE){
sakurafan 0:ad4eb76f11a0 51 pc.printf("Error code=%d\r\n", ret);
sakurafan 0:ad4eb76f11a0 52 return 1;
sakurafan 0:ad4eb76f11a0 53 }
sakurafan 0:ad4eb76f11a0 54
sakurafan 0:ad4eb76f11a0 55 wait(1);
sakurafan 0:ad4eb76f11a0 56
sakurafan 0:ad4eb76f11a0 57 // Request firmware update
sakurafan 0:ad4eb76f11a0 58 pc.printf("Starting update\r\n");
sakurafan 0:ad4eb76f11a0 59 if((ret = sakuraio.updateFirmware()) != CMD_ERROR_NONE){
sakurafan 0:ad4eb76f11a0 60 pc.printf("Error code=%d\r\n", ret);
sakurafan 0:ad4eb76f11a0 61 return 1;
sakurafan 0:ad4eb76f11a0 62 }
sakurafan 0:ad4eb76f11a0 63
sakurafan 0:ad4eb76f11a0 64 wait(1);
sakurafan 0:ad4eb76f11a0 65
sakurafan 0:ad4eb76f11a0 66 // Check update status
sakurafan 0:ad4eb76f11a0 67 uint8_t errCode = 0x00;
sakurafan 0:ad4eb76f11a0 68 pc.printf("Waiting for update\r\n");
sakurafan 0:ad4eb76f11a0 69 while(1){
sakurafan 0:ad4eb76f11a0 70
sakurafan 0:ad4eb76f11a0 71 wait(1);
sakurafan 0:ad4eb76f11a0 72 pc.printf(".");
sakurafan 0:ad4eb76f11a0 73
sakurafan 0:ad4eb76f11a0 74 uint8_t updateStatus = sakuraio.getFirmwareUpdateStatus();
sakurafan 0:ad4eb76f11a0 75 if (updateStatus == 0xff || (updateStatus & 0x80) != 0x00) {
sakurafan 0:ad4eb76f11a0 76 continue;
sakurafan 0:ad4eb76f11a0 77 } else if (updateStatus == 0x00) {
sakurafan 0:ad4eb76f11a0 78 // Success
sakurafan 0:ad4eb76f11a0 79 break;
sakurafan 0:ad4eb76f11a0 80 } else {
sakurafan 0:ad4eb76f11a0 81 // Error
sakurafan 0:ad4eb76f11a0 82 errCode = updateStatus & 0x3f;
sakurafan 0:ad4eb76f11a0 83 break;
sakurafan 0:ad4eb76f11a0 84 }
sakurafan 0:ad4eb76f11a0 85 }
sakurafan 0:ad4eb76f11a0 86
sakurafan 0:ad4eb76f11a0 87 pc.printf("\r\n");
sakurafan 0:ad4eb76f11a0 88 switch(errCode){
sakurafan 0:ad4eb76f11a0 89 case 0x00:
sakurafan 0:ad4eb76f11a0 90 return 0;
sakurafan 0:ad4eb76f11a0 91 case 0x01:
sakurafan 0:ad4eb76f11a0 92 pc.printf("Already updated\r\n");
sakurafan 0:ad4eb76f11a0 93 return 0;
sakurafan 0:ad4eb76f11a0 94 default:
sakurafan 0:ad4eb76f11a0 95 pc.printf("Error code=%d\r\n", errCode);
sakurafan 0:ad4eb76f11a0 96 break;
sakurafan 0:ad4eb76f11a0 97 }
sakurafan 0:ad4eb76f11a0 98
sakurafan 0:ad4eb76f11a0 99 return 1;
sakurafan 0:ad4eb76f11a0 100 }
sakurafan 0:ad4eb76f11a0 101
sakurafan 0:ad4eb76f11a0 102 int main () {
sakurafan 0:ad4eb76f11a0 103
sakurafan 0:ad4eb76f11a0 104 pc.baud(115200);
sakurafan 0:ad4eb76f11a0 105 wait(3);
sakurafan 0:ad4eb76f11a0 106 if (updateFirmware() == 0) {
sakurafan 0:ad4eb76f11a0 107 pc.printf("Update successfull\r\n");
sakurafan 0:ad4eb76f11a0 108 } else {
sakurafan 0:ad4eb76f11a0 109 pc.printf("Update failure\r\n");
sakurafan 0:ad4eb76f11a0 110 }
sakurafan 0:ad4eb76f11a0 111
sakurafan 0:ad4eb76f11a0 112 for (;;) {
sakurafan 0:ad4eb76f11a0 113 myled = !myled;
sakurafan 0:ad4eb76f11a0 114 wait(0.5);
sakurafan 0:ad4eb76f11a0 115 }
sakurafan 0:ad4eb76f11a0 116 }