Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: BaseEmuISP.cpp
- Revision:
- 3:ccc673a10485
- Parent:
- 2:e3c085ac77f1
- Child:
- 4:05f33cc747fd
diff -r e3c085ac77f1 -r ccc673a10485 BaseEmuISP.cpp
--- a/BaseEmuISP.cpp Sat Mar 12 09:34:38 2016 +0900
+++ b/BaseEmuISP.cpp Tue Mar 22 16:25:41 2016 +0900
@@ -1,4 +1,4 @@
-// BaseEmuISP.cpp 2016/3/10
+// BaseEmuISP.cpp 2016/3/22
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -12,12 +12,13 @@
void BaseEmuISP::Poll() {
Mode_t prev_mode = mode;
int result;
- int c;
char buf[32];
switch(mode) {
case M_RESET:
echoFlag = true;
lockFlag = true;
+ version.major = BootCodeVersion() >>8;
+ version.minor = BootCodeVersion() & 0xff;
mode = M_SYNC;
break;
case M_SYNC:
@@ -34,25 +35,12 @@
}
break;
case M_CMD_W_DATA:
- if (count > 0) {
- c = Getch();
- if (c != (-1)) {
- if (echoFlag) {
- Putch(c);
- }
- WriteData(addr++, c);
- count--;
- }
- } else {
+ if (cmd_w_data()) {
mode = M_CMD;
}
break;
case M_CMD_R_DATA:
- if (count > 0) {
- c = ReadData(addr++);
- Putch(c);
- count--;
- } else {
+ if (cmd_r_data()) {
mode = M_CMD;
}
break;
@@ -62,8 +50,10 @@
mode = M_CMD;
break;
case M_CMD_K:
- putln("0");
- putln("0");
+ snprintf(buf, sizeof(buf), "%d", version.major);
+ putln(buf);
+ snprintf(buf, sizeof(buf), "%d", version.minor);
+ putln(buf);
mode = M_CMD;
break;
case M_CMD_N:
@@ -179,7 +169,7 @@
return COUNT_ERROR;
}
addr = param[1];
- count = param[2];
+ dataCount = param[2];
mode = M_CMD_W_DATA;
return CMD_SUCCESS;
}
@@ -195,7 +185,7 @@
return COUNT_ERROR;
}
addr = param[1];
- count = param[2];
+ dataCount = param[2];
mode = M_CMD_R_DATA;
return CMD_SUCCESS;
}
@@ -298,6 +288,126 @@
return CMD_SUCCESS;
}
+void uudecode(std::vector<uint8_t> &dst, const char* src) {
+ dst.clear();
+ int len = strlen(src);
+ if (len > 0) {
+ size_t size = (src[0]^0x20)&0x3f;
+ uint8_t b[4];
+ int k = 0;
+ for(int i = 1; i < len && dst.size() < size; i++) {
+ b[k] = (src[i]^0x20)&0x3f;
+ if (k == 0) {
+ k++;
+ } else if (k == 1) {
+ dst.push_back(b[0]<<2|b[1]>>4);
+ k++;
+ } else if (k == 2) {
+ dst.push_back(b[1]<<4|b[2]>>2);
+ k++;
+ } else {
+ dst.push_back(b[2]<<6|b[3]);
+ k = 0;
+ }
+ }
+ }
+}
+
+bool BaseEmuISP::cmd_w_data() {
+ int c;
+ switch(seq) {
+ case 0:
+ dataCurrent = 0;
+ if (UuencodeMode()) {
+ seq = 2;
+ } else {
+ seq = 1;
+ }
+ break;
+ case 1: // binary mode
+ if (dataCurrent >= dataCount) {
+ return true;
+ }
+ c = Getch();
+ if (c != (-1)) {
+ if (echoFlag) {
+ Putch(c);
+ }
+ WriteData(addr++, c);
+ dataCurrent++;
+ }
+ break;
+ case 2: // uuencode mode
+ dataLine = 0;
+ dataCksum = 0;
+ line.clear();
+ seq++;
+ break;
+ case 3: // uu data start
+ if (line_proc()) {
+ vbyte_t data;
+ uudecode(data, line.c_str());
+ for(size_t i = 0; i < data.size(); i++) {
+ int c = data[i];
+ WriteData(addr++, c);
+ dataCksum += c;
+ dataCurrent++;
+ }
+ dataLine++;
+ if (dataLine >= 20 || dataCurrent>= dataCount) {
+ seq++;
+ }
+ line.clear();
+ }
+ break;
+ case 4: // check sum
+ if (line_proc()) {
+ if (atoi(line.c_str()) == dataCksum) {
+ putln("OK");
+ if (dataCurrent >= dataCount) {
+ mode = M_CMD;
+ } else {
+ seq = 2;
+ }
+ } else {
+ putln("RESEND");
+ seq = 2;
+ }
+ }
+ break;
+ }
+ return false;
+}
+
+bool BaseEmuISP::cmd_r_data() {
+ int c;
+ switch(seq) {
+ case 0:
+ dataCurrent = 0;
+ if (UuencodeMode()) {
+ dataLine = 0;
+ dataCksum = 0;
+ line.clear();
+ seq = 2;
+ } else {
+ seq = 1;
+ }
+ break;
+ case 1: // binary mode
+ if (dataCurrent >= dataCount) {
+ return true;
+ }
+ c = ReadData(addr++);
+ Putch(c);
+ dataCurrent++;
+ break;
+ case 2:
+ break;
+ }
+ return false;
+}
+
+
void BaseEmuISP::putln(const char *s) {
debugPrintf("send: %s<CR><LF>\n", s);
while(*s) {
@@ -311,7 +421,9 @@
int c = Getch();
if (c != (-1)) {
if (echoFlag) {
- Putch(c);
+ if (version.major >= 4 || c != '\n') {
+ Putch(c);
+ }
}
if (c == '\n') {
debugPrintf("<LF>\n");