Firmware updater for SCM-LTE-01 and SCM-LTE-BETA

Dependencies:   SakuraIO mbed

Committer:
misodengaku
Date:
Tue Apr 17 02:39:48 2018 +0000
Revision:
5:4781c5333252
Parent:
4:dcdbc20449ec
fix SPI pinmap

Who changed what in which revision?

UserRevisionLine numberNew contents of line
misodengaku 0:d48db604880f 1 #include "mbed.h"
misodengaku 0:d48db604880f 2 #include "SakuraIO.h"
misodengaku 0:d48db604880f 3
misodengaku 0:d48db604880f 4 Serial pc(USBTX, USBRX);
misodengaku 0:d48db604880f 5 DigitalOut myled(LED1);
misodengaku 0:d48db604880f 6
misodengaku 0:d48db604880f 7 #if defined(TARGET_NUCLEO_F042K6) || defined(TARGET_NUCLEO_F303K8)
misodengaku 0:d48db604880f 8 // Nucleo-32 series
misodengaku 0:d48db604880f 9 SPI spi(A6, A5, A4); // mosi, miso, sclk
misodengaku 0:d48db604880f 10 DigitalOut cs(A3);
misodengaku 0:d48db604880f 11 I2C i2c(D4, D5); // sda, scl
misodengaku 0:d48db604880f 12 #elif defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F446RE) || defined(TARGET_NUCLEO_L476RG)
misodengaku 0:d48db604880f 13 // Nucleo-64 series
misodengaku 0:d48db604880f 14 SPI spi(D11, D12, D13); // mosi, miso, sclk
misodengaku 0:d48db604880f 15 DigitalOut cs(D10);
misodengaku 2:fe531746e3f4 16 I2C i2c(D14, D15);
misodengaku 2:fe531746e3f4 17 #elif defined(TARGET_SAKURAIO_EVB_01)
misodengaku 2:fe531746e3f4 18 // sakura.io Evaluation Board(SCO-EVB-01)
misodengaku 4:dcdbc20449ec 19 SPI spi(PB_15, PB_14, PB_13); // mosi, miso, sclk
misodengaku 4:dcdbc20449ec 20 DigitalOut cs(PB_12);
misodengaku 2:fe531746e3f4 21 I2C i2c(PC_9, PA_8);
misodengaku 0:d48db604880f 22 #else
misodengaku 0:d48db604880f 23 // LPC1768 or others.
misodengaku 0:d48db604880f 24 SPI spi(p5, p6, p7); // mosi, miso, sclk
misodengaku 0:d48db604880f 25 DigitalOut cs(p8);
misodengaku 0:d48db604880f 26 I2C i2c(p9, p10); // sda, scl
misodengaku 0:d48db604880f 27 #endif
misodengaku 0:d48db604880f 28
misodengaku 5:4781c5333252 29 //SakuraIO_SPI sakuraio( spi, cs );
misodengaku 5:4781c5333252 30 SakuraIO_I2C sakuraio(i2c);
misodengaku 0:d48db604880f 31
misodengaku 0:d48db604880f 32 uint8_t updateFirmware()
misodengaku 0:d48db604880f 33 {
misodengaku 0:d48db604880f 34 uint8_t ret;
misodengaku 0:d48db604880f 35 char version[33] = {0};
misodengaku 0:d48db604880f 36
misodengaku 3:4793e04b9f3b 37 wait(1);
misodengaku 3:4793e04b9f3b 38
misodengaku 0:d48db604880f 39 // Check module
misodengaku 0:d48db604880f 40 uint16_t productId = sakuraio.getProductID();
misodengaku 0:d48db604880f 41 switch(productId) {
misodengaku 0:d48db604880f 42 case 0x0001:
misodengaku 0:d48db604880f 43 pc.printf("SCM-LTE-Beta\r\n");
misodengaku 0:d48db604880f 44 break;
misodengaku 0:d48db604880f 45 case 0x0002:
misodengaku 0:d48db604880f 46 pc.printf("SCM-LTE-01\r\n");
misodengaku 0:d48db604880f 47 break;
misodengaku 0:d48db604880f 48 default:
misodengaku 1:f5ba096817a0 49 pc.printf("Please check connection %d\r\n", productId);
misodengaku 0:d48db604880f 50 return 1;
misodengaku 0:d48db604880f 51 }
misodengaku 3:4793e04b9f3b 52
misodengaku 3:4793e04b9f3b 53
misodengaku 3:4793e04b9f3b 54 pc.printf("Get current version\r\n");
misodengaku 3:4793e04b9f3b 55 ret = sakuraio.getFirmwareVersion(version);
misodengaku 3:4793e04b9f3b 56 if((ret = sakuraio.getFirmwareVersion(version)) != CMD_ERROR_NONE) {
misodengaku 3:4793e04b9f3b 57 pc.printf("Error code=%d\r\n", ret);
misodengaku 3:4793e04b9f3b 58 return 1;
misodengaku 3:4793e04b9f3b 59 }
misodengaku 3:4793e04b9f3b 60 pc.printf("Current: %s\r\n", version);
misodengaku 0:d48db604880f 61
misodengaku 0:d48db604880f 62
misodengaku 0:d48db604880f 63 // Waiting for online
misodengaku 0:d48db604880f 64 pc.printf("Waiting for online\r\n");
misodengaku 0:d48db604880f 65 while(1) {
misodengaku 0:d48db604880f 66 pc.printf(".");
misodengaku 0:d48db604880f 67 wait_ms(2000);
misodengaku 0:d48db604880f 68 if((sakuraio.getConnectionStatus() & 0x80) != 0x00) {
misodengaku 0:d48db604880f 69 break;
misodengaku 0:d48db604880f 70 }
misodengaku 0:d48db604880f 71 }
misodengaku 0:d48db604880f 72 pc.printf("\r\nOnline\r\n");
misodengaku 0:d48db604880f 73
misodengaku 0:d48db604880f 74
misodengaku 0:d48db604880f 75 wait_ms(1000);
misodengaku 0:d48db604880f 76
misodengaku 0:d48db604880f 77
misodengaku 0:d48db604880f 78 // Request unlock
misodengaku 0:d48db604880f 79 pc.printf("Unlock\r\n");
misodengaku 0:d48db604880f 80 if((ret = sakuraio.unlock()) != CMD_ERROR_NONE) {
misodengaku 0:d48db604880f 81 pc.printf("Error code=%d\r\n", ret);
misodengaku 0:d48db604880f 82 return 1;
misodengaku 0:d48db604880f 83 }
misodengaku 0:d48db604880f 84
misodengaku 0:d48db604880f 85 wait_ms(1000);
misodengaku 0:d48db604880f 86
misodengaku 0:d48db604880f 87 // Request firmware update
misodengaku 0:d48db604880f 88 pc.printf("Starting update\r\n");
misodengaku 0:d48db604880f 89 if((ret = sakuraio.updateFirmware()) != CMD_ERROR_NONE) {
misodengaku 0:d48db604880f 90 pc.printf("Error code=%d\r\n", ret);
misodengaku 0:d48db604880f 91 return 1;
misodengaku 0:d48db604880f 92 }
misodengaku 0:d48db604880f 93
misodengaku 0:d48db604880f 94 wait_ms(1000);
misodengaku 0:d48db604880f 95
misodengaku 0:d48db604880f 96 // Check update status
misodengaku 0:d48db604880f 97 uint8_t errCode = 0x00;
misodengaku 0:d48db604880f 98 pc.printf("Waiting for update\r\n");
misodengaku 0:d48db604880f 99 while(1) {
misodengaku 0:d48db604880f 100
misodengaku 0:d48db604880f 101 wait_ms(1000);
misodengaku 0:d48db604880f 102 pc.printf(".");
misodengaku 0:d48db604880f 103
misodengaku 0:d48db604880f 104 uint8_t updateStatus = sakuraio.getFirmwareUpdateStatus();
misodengaku 0:d48db604880f 105 if(updateStatus == 0xff || (updateStatus & 0x80) != 0x00) {
misodengaku 0:d48db604880f 106 continue;
misodengaku 0:d48db604880f 107 } else if(updateStatus == 0x00) {
misodengaku 0:d48db604880f 108 // Success
misodengaku 0:d48db604880f 109 break;
misodengaku 0:d48db604880f 110 } else {
misodengaku 0:d48db604880f 111 // Error
misodengaku 0:d48db604880f 112 errCode = updateStatus & 0x3f;
misodengaku 0:d48db604880f 113 break;
misodengaku 0:d48db604880f 114 }
misodengaku 0:d48db604880f 115 }
misodengaku 0:d48db604880f 116
misodengaku 0:d48db604880f 117 pc.printf("\r\n");
misodengaku 0:d48db604880f 118 switch(errCode) {
misodengaku 0:d48db604880f 119 case 0x00:
misodengaku 0:d48db604880f 120 return 0;
misodengaku 0:d48db604880f 121 case 0x01:
misodengaku 0:d48db604880f 122 pc.printf("Already updated\r\n");
misodengaku 0:d48db604880f 123 return 0;
misodengaku 0:d48db604880f 124 default:
misodengaku 0:d48db604880f 125 pc.printf("Error code=%d\r\n", errCode);
misodengaku 0:d48db604880f 126 break;
misodengaku 0:d48db604880f 127 }
misodengaku 0:d48db604880f 128
misodengaku 0:d48db604880f 129 return 1;
misodengaku 0:d48db604880f 130 }
misodengaku 0:d48db604880f 131
misodengaku 0:d48db604880f 132 int main()
misodengaku 0:d48db604880f 133 {
misodengaku 0:d48db604880f 134 if(updateFirmware() == 0) {
misodengaku 0:d48db604880f 135 pc.printf("Update successfull\r\n");
misodengaku 0:d48db604880f 136 } else {
misodengaku 0:d48db604880f 137 pc.printf("Update failure\r\n");
misodengaku 0:d48db604880f 138 }
misodengaku 0:d48db604880f 139 while(1) {
misodengaku 0:d48db604880f 140 myled = !myled;
misodengaku 0:d48db604880f 141 wait(1);
misodengaku 0:d48db604880f 142 }
misodengaku 0:d48db604880f 143
misodengaku 0:d48db604880f 144 }