SAKURA Internet
/
SakuraIO_FirmwareUpdate
Firmware updater for SCM-LTE-01 and SCM-LTE-BETA
main.cpp@3:4793e04b9f3b, 2018-04-16 (annotated)
- Committer:
- misodengaku
- Date:
- Mon Apr 16 03:00:02 2018 +0000
- Revision:
- 3:4793e04b9f3b
- Parent:
- 2:fe531746e3f4
- Child:
- 4:dcdbc20449ec
show current version before linkup
Who changed what in which revision?
User | Revision | Line number | New 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 | 2:fe531746e3f4 | 19 | SPI spi(PA_10, PA_12, PB_0); // mosi, miso, sclk |
misodengaku | 2:fe531746e3f4 | 20 | DigitalOut cs(PB_1); |
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 | 0:d48db604880f | 29 | //SakuraIO_SPI sakuraio( spi, cs ); |
misodengaku | 0:d48db604880f | 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 | } |