rl78/g13 stuff works, g10 not yet

This commit is contained in:
Triss 2022-07-03 16:38:39 +02:00
parent 760ce1b2cc
commit 8c10b46365
1 changed files with 56 additions and 66 deletions

View File

@ -1107,22 +1107,17 @@ int tool78_ocd_version(struct tool78_hw* hw, uint16_t* ver) {
bytes[0] = tool78ocd_cmd_version;
int rr = hw->send(1, &bytes[0], -1);
// bytes[0] is tool78ocd_cmd_version echoed back
rr = hw->recv(3, bytes, 1000);
if (rr != 3) {
/*printf("OCDver rr: %d\n", rr);
for (int iii = 0; iii < rr; ++iii) {
rr = hw->recv(2, bytes, 1000);
if (rr != 2) {
printf("OCDver rr: %d\n", rr);
/*for (int iii = 0; iii < rr; ++iii) {
printf("0x%02x%c", bytes[iii], (iii==rr-1)?'\n':' ');
}*/
return -1;
}
if (rr == 3) {
*ver = bytes[1] | ((uint16_t)bytes[2] << 8);
} /*else {
*ver = bytes[0] | ((uint16_t)bytes[1] << 8);
}*/
//printf("ver=%04x\n", *ver);
return 0;
}
int tool78_ocd_connect(struct tool78_hw* hw, const uint8_t passwd[10]) {
@ -1133,16 +1128,15 @@ int tool78_ocd_connect(struct tool78_hw* hw, const uint8_t passwd[10]) {
stuff[0] = is_g10 ? tool78ocd_cmdg10_connect : tool78ocd_cmd_connect;
int rr = hw->send(1, &stuff[0], -1);
// stuff[1] is tool78ocd_cmd_connect echoed back
rr = hw->recv(2, &stuff[1], 1000);
if (rr != 2) {
/*printf("OCDconn rr: %d\n", rr);
for (int iii = 0; iii < rr; ++iii) {
rr = hw->recv(1, &stuff[1], 1000);
if (rr != 1) {
printf("OCDconn rr: %d\n", rr);
/*for (int iii = 0; iii < rr; ++iii) {
printf("0x%02x%c", stuff[1+iii], (iii==rr-1)?'\n':' ');
}*/
return -1;
}
connst=stuff[2];
connst=stuff[1];
//printf("connst 1=%02x\n", connst);
if (connst == 0xff) {
rr = hw->recv(1, &connst, 1000);
@ -1161,32 +1155,31 @@ int tool78_ocd_connect(struct tool78_hw* hw, const uint8_t passwd[10]) {
rr = hw->send(is_g10 ? 10 : 11, stuff, -1);
// stuff[9] is the checksum byte echoed back
rr = hw->recv(2, &stuff[9], 100000);
rr = hw->recv(1, &stuff[9], 100000);
//printf("ocdpw 2 = %02x %02x\n", stuff[9], stuff[10]);
if (rr != 2) {
/*printf("OCDconn2 rr: %d\n", rr);
for (int iii = 0; iii < rr; ++iii) {
if (rr != 1) {
printf("OCDconn2 rr: %d\n", rr);
/*for (int iii = 0; iii < rr; ++iii) {
printf("0x%02x%c", stuff[9+iii], (iii==rr-1)?'\n':' ');
}*/
return -2;
}
if (stuff[9] == 0xff && is_g10) { // framing error bullshit
stuff[9] = stuff[10];
rr = hw->recv(1, &stuff[10], 100000);
rr = hw->recv(1, &stuff[9], 100000);
if (rr != 1) return -2;
}
//printf("ocdpw 3 = %02x %02x\n", stuff[9], stuff[10]);
while (stuff[10] == 0) {
rr = hw->recv(1, &stuff[10], 100000);
while (stuff[9] == 0) {
rr = hw->recv(1, &stuff[9], 100000);
if (rr != 1) return -2;
}
//printf("ocdpw 4 = %02x %02x\n", stuff[9], stuff[10]);
/*printf("cksum=0x%02x conn=%02x pw=%02x\n",
cksum, connst, stuff[10]);*/
cksum, connst, stuff[9]);*/
//printf("connst=%u stuff=%u\n", connst, stuff[10]);
return stuff[10];//(uint32_t)connst | ((uint32_t)stuff[10] << 8);
//printf("connst=%u stuff=%u\n", connst, stuff[9]);
return stuff[9];
}
int tool78_ocd_read(struct tool78_hw* hw, uint16_t off, uint8_t len,
uint8_t* data) {
@ -1206,7 +1199,7 @@ int tool78_ocd_read(struct tool78_hw* hw, uint16_t off, uint8_t len,
rr = hw->send(sizeof hdr, hdr, -1);
if (rr != sizeof hdr) return -1;
// command echoed back
/*// command echoed back
rr = hw->recv(4, hdr, 1000);
if (rr != 4) return -2;
if (hdr[0] == 0xff) { // frame error bullshit
@ -1215,7 +1208,7 @@ int tool78_ocd_read(struct tool78_hw* hw, uint16_t off, uint8_t len,
hdr[2] = hdr[3];
rr = hw->recv(1, &hdr[3], 1000);
if (rr != 1) return -2;
}
}*/
// status
rr = hw->recv(1, hdr, 1000);
@ -1227,8 +1220,8 @@ int tool78_ocd_read(struct tool78_hw* hw, uint16_t off, uint8_t len,
rr = hw->send(1, hdr, -1);
if (rr != 1) return -1;
rr = hw->recv(1, hdr, 1000); // command echoed back
if (rr != 1) return -1;
/*rr = hw->recv(1, hdr, 1000); // command echoed back
if (rr != 1) return -1;*/
rr = hw->recv(2, data, 1000*len);
if (rr != 2) return -2;
@ -1242,7 +1235,7 @@ int tool78_ocd_read(struct tool78_hw* hw, uint16_t off, uint8_t len,
if (rr != sizeof hdr) return -1;
//printf("sent hdr\n");
rr = hw->recv(4, hdr, 1000);
/*rr = hw->recv(4, hdr, 1000);
//printf("stat rr=%d hdr=%02x %02x %02x %02x\n", rr, hdr[0], hdr[1], hdr[2], hdr[3]);
if (rr != 4) return -2;
if (hdr[0] == 0xff) { // frame error bullshit
@ -1251,7 +1244,7 @@ int tool78_ocd_read(struct tool78_hw* hw, uint16_t off, uint8_t len,
hdr[2] = hdr[3];
rr = hw->recv(1, &hdr[3], 1000);
if (rr != 1) return -2;
}
}*/
rr = hw->recv(1, hdr, 1000);
//printf("stat rr=%d hdr=%02x\n", rr, hdr[0]);
if (rr != 1) return -1;
@ -1263,9 +1256,9 @@ int tool78_ocd_read(struct tool78_hw* hw, uint16_t off, uint8_t len,
if (rr != 1) return -1;
//printf("sent rdcmd\n");
rr = hw->recv(1, hdr, 1000); // command echoed back
/*rr = hw->recv(1, hdr, 1000); // command echoed back
//printf("recv dd=%d hdr=%02x\n", rr, hdr[0]);
if (rr != 1) return -1;
if (rr != 1) return -1;*/
rr = hw->recv(len, data, 1000*len);
//printf("got data rr=%d data=%02x\n", rr, data[0]);
@ -1281,12 +1274,12 @@ int tool78_ocd_read(struct tool78_hw* hw, uint16_t off, uint8_t len,
int rr = hw->send(sizeof hdr, hdr, -1);
if (rr != sizeof hdr) return -1;
rr = hw->recv(1, &hdr[2], 1000);
/*rr = hw->recv(1, &hdr[2], 1000);
// last byte of header sent echoed back
if (rr != 1 || hdr[2] != hdr[3]) {
//printf("rd recv=%02x\n", hdr[2]);
return -2;
}
}*/
rr = hw->recv(len, data, 1000*len);
//printf("ocd read %d\n", rr);
@ -1313,7 +1306,7 @@ int tool78_ocd_write(struct tool78_hw* hw, uint16_t addr, uint8_t len,
rr = hw->send(sizeof hdr, hdr, -1);
if (rr != sizeof hdr) return -1;
// command echoed back
/*// command echoed back
rr = hw->recv(4, hdr, 1000);
if (rr != 4) return -2;
if (hdr[0] == 0xff) { // frame error bullshit
@ -1322,7 +1315,7 @@ int tool78_ocd_write(struct tool78_hw* hw, uint16_t addr, uint8_t len,
hdr[2] = hdr[3];
rr = hw->recv(1, &hdr[3], 1000);
if (rr != 1) return -2;
}
}*/
// status
rr = hw->recv(1, hdr, 1000);
@ -1336,10 +1329,10 @@ int tool78_ocd_write(struct tool78_hw* hw, uint16_t addr, uint8_t len,
rr = hw->send(2, hdr, -1);
if (rr != 2) return -1;
rr = hw->recv(3, hdr, 1000); // command echoed back + ack
if (rr != 3) return -1;
rr = hw->recv(1, hdr, 1000);
if (rr != 1) return -1;
return (hdr[2] == 0) ? 0 : -2;
return (hdr[0] == 0) ? 0 : -2;
} else {
hdr[0] = tool78ocd_cmdg10_setptr;
hdr[1] = addr & 0xff; // l
@ -1350,7 +1343,7 @@ int tool78_ocd_write(struct tool78_hw* hw, uint16_t addr, uint8_t len,
if (rr != sizeof hdr) return -1;
// command echoed back
rr = hw->recv(4, hdr, 1000);
/*rr = hw->recv(4, hdr, 1000);
//printf("wr p1: rr=%d %02x %02x %02x %02x\n", rr, hdr[0],
// hdr[1], hdr[2], hdr[3]);
if (rr != 4) return -2;
@ -1360,7 +1353,7 @@ int tool78_ocd_write(struct tool78_hw* hw, uint16_t addr, uint8_t len,
hdr[2] = hdr[3];
rr = hw->recv(1, &hdr[3], 1000);
if (rr != 1) return -2;
}
}*/
//printf("wr p1: rr=%d %02x %02x %02x %02x\n", rr, hdr[0],
// hdr[1], hdr[2], hdr[3]);
@ -1382,10 +1375,10 @@ int tool78_ocd_write(struct tool78_hw* hw, uint16_t addr, uint8_t len,
busy_wait_us_32(100);
rr = hw->send(1, hdr, -1);
if (rr != 1) return -1;
rr = hw->recv(1, hdr, 1000); // sigh
/*rr = hw->recv(1, hdr, 1000); // sigh
//printf("wr p3: rr=%d %02x %02x %02x %02x\n", rr, hdr[0],
// hdr[1], hdr[2], hdr[3]);
if (rr != 1) return -1;
if (rr != 1) return -1;*/
for (int i = 0; i < len; i += 8) {
int todo = len - i;
@ -1394,10 +1387,10 @@ int tool78_ocd_write(struct tool78_hw* hw, uint16_t addr, uint8_t len,
busy_wait_us_32(100);
rr = hw->send(todo, &data[i], -1);
if (rr != todo) return -1;
rr = hw->recv(todo, NULL, 1000*todo); // sigh
/*rr = hw->recv(todo, NULL, 1000*todo); // sigh
//printf("wr p4: rr=%d %02x %02x %02x %02x\n", rr, hdr[0],
// hdr[1], hdr[2], hdr[3]);
if (rr != todo) return -1;
if (rr != todo) return -1;*/
}
rr = hw->recv(1, hdr, 1000);
@ -1420,10 +1413,10 @@ int tool78_ocd_write(struct tool78_hw* hw, uint16_t addr, uint8_t len,
if (rr != len) return -1;
// last data byte echoed back
rr = hw->recv(2, hdr, 1000*len);
if (rr != 2) return -1;
///printf("ocd write 0x%02x\n", hdr[1]);
return (hdr[1] == tool78ocd_cmd_write) ? 0 : -2;
rr = hw->recv(1, hdr, 1000*len);
if (rr != 1) return -1;
///printf("ocd write 0x%02x\n", hdr[0]);
return (hdr[0] == tool78ocd_cmd_write) ? 0 : -2;
}
}
int tool78_ocd_exec(struct tool78_hw* hw) {
@ -1436,11 +1429,13 @@ int tool78_ocd_exec(struct tool78_hw* hw) {
int rr = hw->send(1, hdr, -1);
// G13 sends status before exec, G10 sends it after
rr = hw->recv(is_g10 ? 1 : 2, hdr, 1000);
if (rr != 1 && rr != 2) return -1;
// G13 etc send status before exec, G10 sends it after
if (!is_g10) {
rr = hw->recv(1, hdr, 1000);
if (rr != 1) return -1;
//printf("exec r=%d: h[0]=0x%02x, h[1]=0x%02x\n", rr, hdr[0], hdr[1]);
}
return 0;//(hdr[0] == cmd) ? 0 : -2;
}
int tool78_ocd_leave(struct tool78_hw* hw, bool exit_to_ram) {
@ -1459,16 +1454,11 @@ int tool78_ocd_leave(struct tool78_hw* hw, bool exit_to_ram) {
int rr = hw->send(1, hdr, -1);
if (is_g10) {
rr = hw->recv(2, &hdr[0], 1000);
if (rr != 2) return -1;
rr = hw->recv(1, &hdr[0], 1000);
if (rr != 1) return -1;
}
return 0;
} else {
rr = hw->recv(1, &hdr[1], 1000);
if (rr != 1) return -1;
return (hdr[0] == hdr[1]) ? 0 : -2;
}
}
// ----
@ -1505,7 +1495,7 @@ static enum tool78_stat tool78_init_common(struct tool78_hw* hw) {
//printf("baudrate result=0x%02x\n", st);
if (st != tool78_stat_ack) return st;
} else {
// 0x3a/0xc5 is echoed back as well
// 0x3a/0xc5 is echoed back as well // TODO err why does this happen?
uint8_t data[5];
int rr = hw->recv(2, data, 1000);
st = data[1];