@@ -1059,6 +1059,87 @@ int deleteFile(const uint8_t command[], uint8_t response[]) {
1059
1059
return 0 ;
1060
1060
}
1061
1061
1062
+ #include < driver/uart.h>
1063
+
1064
+ int applyOTA (const uint8_t command[], uint8_t response[]) {
1065
+ #ifdef UNO_WIFI_REV2
1066
+
1067
+ const char * filename = " /fs/UPDATE.BIN" ;
1068
+ FILE* updateFile = fopen (filename, " rb" );
1069
+
1070
+ // init uart and write update to 4809
1071
+ uart_config_t uart_config;
1072
+
1073
+ uart_config.baud_rate = 115200 ;
1074
+ uart_config.data_bits = UART_DATA_8_BITS;
1075
+ uart_config.parity = UART_PARITY_DISABLE;
1076
+ uart_config.stop_bits = UART_STOP_BITS_1;
1077
+ uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
1078
+ uart_config.rx_flow_ctrl_thresh = 122 ;
1079
+ uart_config.use_ref_tick = true ;
1080
+
1081
+ uart_param_config (UART_NUM_1, &uart_config);
1082
+
1083
+ uart_set_pin (UART_NUM_1,
1084
+ 1 , // tx
1085
+ 3 , // rx
1086
+ UART_PIN_NO_CHANGE, // rts
1087
+ UART_PIN_NO_CHANGE); // cts
1088
+
1089
+ uart_driver_install (UART_NUM_1, 1024 , 0 , 20 , NULL , 0 );
1090
+
1091
+ struct stat st;
1092
+ stat (filename, &st);
1093
+
1094
+ int retries = 0 ;
1095
+
1096
+ size_t remaining = st.st_size % 1024 ;
1097
+ for (int i=0 ; i<st.st_size ; i++) {
1098
+ uint8_t c;
1099
+ uint8_t d;
1100
+
1101
+ fread (&c, 1 , 1 , updateFile);
1102
+ retries = 0 ;
1103
+ while (retries == 0 || (c != d && retries < 100 )) {
1104
+ uart_write_bytes (UART_NUM_1, (const char *)&c, 1 );
1105
+ uart_read_bytes (UART_NUM_1, &d, 1 , 10 );
1106
+ retries++;
1107
+ }
1108
+ if (retries >= 100 ) {
1109
+ goto exit;
1110
+ }
1111
+ }
1112
+ // send remaining bytes (to reach page size) as 0xFF
1113
+ for (int i=0 ; i<remaining + 10 ; i++) {
1114
+ uint8_t c = 0xFF ;
1115
+ uint8_t d;
1116
+ retries = 0 ;
1117
+ while (retries == 0 || (c != d && retries < 100 )) {
1118
+ uart_write_bytes (UART_NUM_1, (const char *)&c, 1 );
1119
+ uart_read_bytes (UART_NUM_1, &d, 1 , 10 );
1120
+ retries++;
1121
+ }
1122
+ }
1123
+
1124
+ // delay a bit before restarting, in case the flashing isn't yet over
1125
+ delay (200 );
1126
+
1127
+ pinMode (19 , OUTPUT);
1128
+ digitalWrite (19 , HIGH);
1129
+ delay (200 );
1130
+ digitalWrite (19 , LOW);
1131
+ pinMode (19 , INPUT);
1132
+
1133
+ exit:
1134
+ fclose (updateFile);
1135
+ unlink (filename);
1136
+
1137
+ return 0 ;
1138
+ #else
1139
+ return 0 ;
1140
+ #endif
1141
+ }
1142
+
1062
1143
int existsFile (const uint8_t command[], uint8_t response[]) {
1063
1144
char filename[32 + 1 ];
1064
1145
size_t len;
@@ -1125,7 +1206,7 @@ const CommandHandlerType commandHandlers[] = {
1125
1206
setPinMode, setDigitalWrite, setAnalogWrite, NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL ,
1126
1207
1127
1208
// 0x60 -> 0x6f
1128
- writeFile, readFile, deleteFile, existsFile, downloadFile, NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL ,
1209
+ writeFile, readFile, deleteFile, existsFile, downloadFile, applyOTA , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL ,
1129
1210
};
1130
1211
1131
1212
#define NUM_COMMAND_HANDLERS (sizeof (commandHandlers) / sizeof (commandHandlers[0 ]))
0 commit comments