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

Dependencies:   SakuraIO mbed

Committer:
misodengaku
Date:
Thu Sep 07 07:30:12 2017 +0000
Revision:
1:f5ba096817a0
Parent:
0:d48db604880f
Child:
2:fe531746e3f4
v1.0.0

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 1:f5ba096817a0 16 I2C i2c(D14, D15);
misodengaku 0:d48db604880f 17 #else
misodengaku 0:d48db604880f 18 // LPC1768 or others.
misodengaku 0:d48db604880f 19 SPI spi(p5, p6, p7); // mosi, miso, sclk
misodengaku 0:d48db604880f 20 DigitalOut cs(p8);
misodengaku 0:d48db604880f 21 I2C i2c(p9, p10); // sda, scl
misodengaku 0:d48db604880f 22 #endif
misodengaku 0:d48db604880f 23
misodengaku 0:d48db604880f 24 //SakuraIO_SPI sakuraio( spi, cs );
misodengaku 0:d48db604880f 25 SakuraIO_I2C sakuraio(i2c);
misodengaku 0:d48db604880f 26
misodengaku 0:d48db604880f 27 uint8_t updateFirmware()
misodengaku 0:d48db604880f 28 {
misodengaku 0:d48db604880f 29 uint8_t ret;
misodengaku 0:d48db604880f 30 char version[33] = {0};
misodengaku 0:d48db604880f 31
misodengaku 0:d48db604880f 32 // Check module
misodengaku 0:d48db604880f 33 uint16_t productId = sakuraio.getProductID();
misodengaku 0:d48db604880f 34 switch(productId) {
misodengaku 0:d48db604880f 35 case 0x0001:
misodengaku 0:d48db604880f 36 pc.printf("SCM-LTE-Beta\r\n");
misodengaku 0:d48db604880f 37 break;
misodengaku 0:d48db604880f 38 case 0x0002:
misodengaku 0:d48db604880f 39 pc.printf("SCM-LTE-01\r\n");
misodengaku 0:d48db604880f 40 break;
misodengaku 0:d48db604880f 41 default:
misodengaku 1:f5ba096817a0 42 pc.printf("Please check connection %d\r\n", productId);
misodengaku 0:d48db604880f 43 return 1;
misodengaku 0:d48db604880f 44 }
misodengaku 0:d48db604880f 45
misodengaku 0:d48db604880f 46 wait_ms(1000);
misodengaku 0:d48db604880f 47
misodengaku 0:d48db604880f 48
misodengaku 0:d48db604880f 49 // Waiting for online
misodengaku 0:d48db604880f 50 pc.printf("Waiting for online\r\n");
misodengaku 0:d48db604880f 51 while(1) {
misodengaku 0:d48db604880f 52 pc.printf(".");
misodengaku 0:d48db604880f 53 wait_ms(2000);
misodengaku 0:d48db604880f 54 if((sakuraio.getConnectionStatus() & 0x80) != 0x00) {
misodengaku 0:d48db604880f 55 break;
misodengaku 0:d48db604880f 56 }
misodengaku 0:d48db604880f 57 }
misodengaku 0:d48db604880f 58 pc.printf("\r\nOnline\r\n");
misodengaku 0:d48db604880f 59
misodengaku 0:d48db604880f 60
misodengaku 0:d48db604880f 61 pc.printf("Get current version\r\n");
misodengaku 0:d48db604880f 62 ret = sakuraio.getFirmwareVersion(version);
misodengaku 0:d48db604880f 63 if((ret = sakuraio.getFirmwareVersion(version)) != CMD_ERROR_NONE) {
misodengaku 0:d48db604880f 64 pc.printf("Error code=%d\r\n", ret);
misodengaku 0:d48db604880f 65 return 1;
misodengaku 0:d48db604880f 66 }
misodengaku 1:f5ba096817a0 67 pc.printf("Current: %s\r\n", version);
misodengaku 0:d48db604880f 68
misodengaku 0:d48db604880f 69
misodengaku 0:d48db604880f 70 wait_ms(1000);
misodengaku 0:d48db604880f 71
misodengaku 0:d48db604880f 72
misodengaku 0:d48db604880f 73 // Request unlock
misodengaku 0:d48db604880f 74 pc.printf("Unlock\r\n");
misodengaku 0:d48db604880f 75 if((ret = sakuraio.unlock()) != CMD_ERROR_NONE) {
misodengaku 0:d48db604880f 76 pc.printf("Error code=%d\r\n", ret);
misodengaku 0:d48db604880f 77 return 1;
misodengaku 0:d48db604880f 78 }
misodengaku 0:d48db604880f 79
misodengaku 0:d48db604880f 80 wait_ms(1000);
misodengaku 0:d48db604880f 81
misodengaku 0:d48db604880f 82 // Request firmware update
misodengaku 0:d48db604880f 83 pc.printf("Starting update\r\n");
misodengaku 0:d48db604880f 84 if((ret = sakuraio.updateFirmware()) != CMD_ERROR_NONE) {
misodengaku 0:d48db604880f 85 pc.printf("Error code=%d\r\n", ret);
misodengaku 0:d48db604880f 86 return 1;
misodengaku 0:d48db604880f 87 }
misodengaku 0:d48db604880f 88
misodengaku 0:d48db604880f 89 wait_ms(1000);
misodengaku 0:d48db604880f 90
misodengaku 0:d48db604880f 91 // Check update status
misodengaku 0:d48db604880f 92 uint8_t errCode = 0x00;
misodengaku 0:d48db604880f 93 pc.printf("Waiting for update\r\n");
misodengaku 0:d48db604880f 94 while(1) {
misodengaku 0:d48db604880f 95
misodengaku 0:d48db604880f 96 wait_ms(1000);
misodengaku 0:d48db604880f 97 pc.printf(".");
misodengaku 0:d48db604880f 98
misodengaku 0:d48db604880f 99 uint8_t updateStatus = sakuraio.getFirmwareUpdateStatus();
misodengaku 0:d48db604880f 100 if(updateStatus == 0xff || (updateStatus & 0x80) != 0x00) {
misodengaku 0:d48db604880f 101 continue;
misodengaku 0:d48db604880f 102 } else if(updateStatus == 0x00) {
misodengaku 0:d48db604880f 103 // Success
misodengaku 0:d48db604880f 104 break;
misodengaku 0:d48db604880f 105 } else {
misodengaku 0:d48db604880f 106 // Error
misodengaku 0:d48db604880f 107 errCode = updateStatus & 0x3f;
misodengaku 0:d48db604880f 108 break;
misodengaku 0:d48db604880f 109 }
misodengaku 0:d48db604880f 110 }
misodengaku 0:d48db604880f 111
misodengaku 0:d48db604880f 112 pc.printf("\r\n");
misodengaku 0:d48db604880f 113 switch(errCode) {
misodengaku 0:d48db604880f 114 case 0x00:
misodengaku 0:d48db604880f 115 return 0;
misodengaku 0:d48db604880f 116 case 0x01:
misodengaku 0:d48db604880f 117 pc.printf("Already updated\r\n");
misodengaku 0:d48db604880f 118 return 0;
misodengaku 0:d48db604880f 119 default:
misodengaku 0:d48db604880f 120 pc.printf("Error code=%d\r\n", errCode);
misodengaku 0:d48db604880f 121 break;
misodengaku 0:d48db604880f 122 }
misodengaku 0:d48db604880f 123
misodengaku 0:d48db604880f 124 return 1;
misodengaku 0:d48db604880f 125 }
misodengaku 0:d48db604880f 126
misodengaku 0:d48db604880f 127 int main()
misodengaku 0:d48db604880f 128 {
misodengaku 0:d48db604880f 129 if(updateFirmware() == 0) {
misodengaku 0:d48db604880f 130 pc.printf("Update successfull\r\n");
misodengaku 0:d48db604880f 131 } else {
misodengaku 0:d48db604880f 132 pc.printf("Update failure\r\n");
misodengaku 0:d48db604880f 133 }
misodengaku 0:d48db604880f 134 while(1) {
misodengaku 0:d48db604880f 135 myled = !myled;
misodengaku 0:d48db604880f 136 wait(1);
misodengaku 0:d48db604880f 137 }
misodengaku 0:d48db604880f 138
misodengaku 0:d48db604880f 139 }