99
111
CMD_SEND(PROTO_QUERY),
100
112
CMD_SEND(STATUS_GET),
101
CMD_SEND(STATUS_GET_REPLY),
102
CMD_SEND(EEPROM_SET),
104
CMD_RECV(CAPS_GET_REPLY),
106
CMD_SEND(EXTRAINFO_GET),
107
CMD_SEND(EXTRAINFO_GET_REPLY),
108
CMD_SEND(EXTRAINFO_SET),
109
CMD_RECV(PROTO_REPLY),
111
CMD_SEND(EEPROM_BLK_RD),
112
CMD_RECV(EEPROM_BLK_RD_REPLY),
113
CMD_SEND(DEV_SEND_SEG),
114
CMD_SEND(DEV_SEND_START),
115
CMD_SEND(DEV_SEND_END),
117
CMD_SEND(HALF_RESET),
121
CMD_SEND(TWS_WD_MODE_SET),
122
CMD_SEND(TWS_WD_MODE_GET),
123
CMD_RECV(TWS_WD_MODE_GET_REPLY),
124
CMD_SEND(TWS_PORT_SET),
125
CMD_SEND(TWS_PORT_GET),
126
CMD_RECV(TWS_PORT_GET_REPLY),
127
CMD_SEND(TWS_PWR_GET),
128
CMD_RECV(TWS_PWR_GET_REPLY),
113
CMD_RECV(STATUS_GET_REPLY),
114
CMD_SEND(EEPROM_SET),
116
CMD_RECV(CAPS_GET_REPLY),
118
CMD_SEND(EXTRAINFO_GET),
119
CMD_RECV(EXTRAINFO_GET_REPLY),
120
CMD_SEND(EXTRAINFO_SET),
121
CMD_RECV(PROTO_REPLY),
123
CMD_SEND(EEPROM_BLK_RD),
124
CMD_RECV(EEPROM_BLK_RD_REPLY),
125
CMD_SEND(DEV_SEND_SEG),
126
CMD_SEND(DEV_SEND_START),
127
CMD_SEND(DEV_SEND_END),
129
CMD_SEND(HALF_RESET),
133
CMD_SEND(TWS_WD_MODE_SET),
134
CMD_SEND(TWS_WD_MODE_GET),
135
CMD_RECV(TWS_WD_MODE_GET_REPLY),
136
CMD_SEND(TWS_PORT_SET),
137
CMD_SEND(TWS_PORT_GET),
138
CMD_RECV(TWS_PORT_GET_REPLY),
139
CMD_SEND(TWS_PWR_GET),
140
CMD_RECV(TWS_PWR_GET_REPLY),
143
static const struct command_desc command_table_V13[] = {
145
CMD_SEND(PROTO_QUERY),
146
CMD_SEND(STATUS_GET),
147
CMD_RECV(STATUS_GET_REPLY_V13),
148
CMD_SEND(EEPROM_SET),
150
CMD_RECV(CAPS_GET_REPLY),
152
CMD_SEND(EXTRAINFO_GET),
153
CMD_RECV(EXTRAINFO_GET_REPLY),
154
CMD_SEND(EXTRAINFO_SET),
155
CMD_RECV(PROTO_REPLY),
157
CMD_SEND(EEPROM_BLK_RD),
158
CMD_RECV(EEPROM_BLK_RD_REPLY),
159
CMD_SEND(DEV_SEND_SEG),
160
CMD_SEND(DEV_SEND_START),
161
CMD_SEND(DEV_SEND_END),
163
CMD_SEND(HALF_RESET),
167
CMD_SEND(TWS_WD_MODE_SET),
168
CMD_SEND(TWS_WD_MODE_GET),
169
CMD_RECV(TWS_WD_MODE_GET_REPLY),
170
CMD_SEND(TWS_PORT_SET),
171
CMD_SEND(TWS_PORT_GET),
172
CMD_RECV(TWS_PORT_GET_REPLY),
173
CMD_SEND(TWS_PWR_GET),
174
CMD_RECV(TWS_PWR_GET_REPLY),
151
struct mpp_command *new_command(uint8_t op, uint16_t extra_data)
198
const struct command_desc *get_command_desc(uint8_t protocol_version, uint8_t op)
200
const struct command_desc *desc;
202
switch(protocol_version) {
203
case MK_PROTO_VERSION(1,3):
204
if(op > sizeof(command_table_V13)/sizeof(command_table_V13[0])) {
205
//ERR("Invalid op=0x%X. Bigger than max valid op\n", op);
208
desc = &command_table_V13[op];
213
if(op > sizeof(command_table)/sizeof(command_table[0])) {
214
//ERR("Invalid op=0x%X. Bigger than max valid op\n", op);
217
desc = &command_table[op];
225
struct mpp_command *new_command(uint8_t protocol_version, uint8_t op, uint16_t extra_data)
153
227
struct mpp_command *cmd;
154
228
const struct command_desc *desc;
157
DBG("OP=0x%X (extra_data %d)\n", op, extra_data);
158
if(op > sizeof(command_table)/sizeof(command_table[0])) {
159
ERR("Invalid op=0x%X. Bigger than max valid op\n", op);
162
desc = &command_table[op];
231
desc = get_command_desc(protocol_version, op);
164
233
ERR("Unknown op=0x%X.\n", op);
236
DBG("OP=0x%X [%s] (extra_data %d)\n", op, desc->name, extra_data);
167
237
len = desc->len + extra_data;
168
238
if((cmd = malloc(len)) == NULL) {
169
239
ERR("Out of memory\n");
178
const struct command_desc *get_command_desc(uint8_t op)
180
const struct command_desc *desc;
182
if(op > sizeof(command_table)/sizeof(command_table[0])) {
183
//ERR("Invalid op=0x%X. Bigger than max valid op\n", op);
186
desc = &command_table[op];
192
const char *get_command_name(uint8_t op)
194
const struct command_desc *desc;
196
if((desc = get_command_desc(op)) == NULL)
201
248
void dump_command(struct mpp_command *cmd)
240
287
ret = send_usb(astribank, (char *)cmd, len, timeout);
242
ERR("send_usb failed ret=%d\n", ret);
289
DBG("send_usb failed ret=%d\n", ret);
244
291
astribank->tx_sequenceno++;
329
__attribute__((warn_unused_result))
280
330
int process_command(struct astribank_device *astribank, struct mpp_command *cmd, struct mpp_command **reply_ref)
282
332
struct mpp_command *reply = NULL;
283
333
const struct command_desc *reply_desc;
284
334
const struct command_desc *expected;
335
const struct command_desc *cmd_desc;
285
336
uint8_t reply_op;
289
340
*reply_ref = NULL; /* So the caller knows if a reply was received */
290
341
reply_op = cmd->header.op | 0x80;
291
expected = get_command_desc(reply_op);
342
if(cmd->header.op == MPP_PROTO_QUERY)
343
astribank->mpp_proto_version = MPP_PROTOCOL_VERSION; /* bootstrap */
344
cmd_desc = get_command_desc(astribank->mpp_proto_version, cmd->header.op);
345
expected = get_command_desc(astribank->mpp_proto_version, reply_op);
292
346
//printf("%s: len=%d\n", __FUNCTION__, cmd->header.len);
293
347
ret = send_command(astribank, cmd, TIMEOUT);
295
ERR("send_command failed: %d\n", ret);
299
349
DBG("No reply requested\n");
353
ERR("send_command failed: %d\n", ret);
302
356
reply = recv_command(astribank, TIMEOUT);
304
358
ERR("recv_command failed\n");
314
368
DBG("REPLY OP: 0x%X\n", reply->header.op);
315
reply_desc = get_command_desc(reply->header.op);
369
reply_desc = get_command_desc(astribank->mpp_proto_version, reply->header.op);
316
370
if(!reply_desc) {
317
371
ERR("Unknown reply op=0x%02X\n", reply->header.op);
384
445
assert(astribank != NULL);
385
if((cmd = new_command(MPP_PROTO_QUERY, 0)) == NULL) {
446
if((cmd = new_command(astribank->mpp_proto_version, MPP_PROTO_QUERY, 0)) == NULL) {
386
447
ERR("new_command failed\n");
395
456
astribank->mpp_proto_version = CMD_FIELD(reply, PROTO_REPLY, proto_version);
396
if(astribank->mpp_proto_version != MPP_PROTOCOL_VERSION) {
457
if(! MPP_SUPPORTED_VERSION(astribank->mpp_proto_version)) {
397
458
ERR("Got mpp protocol version: %02x (expected %02x)\n",
398
459
astribank->mpp_proto_version,
399
460
MPP_PROTOCOL_VERSION);
403
INFO("Protocol version: %02x\n", astribank->mpp_proto_version);
464
if(astribank->mpp_proto_version != MPP_PROTOCOL_VERSION) {
465
ERR("Deprecated (but working) MPP protocol version [%X]. Please upgrade to [%X] ASAP\n",
466
astribank->mpp_proto_version, MPP_PROTOCOL_VERSION);
468
DBG("Protocol version: %02x\n", astribank->mpp_proto_version);
469
ret = astribank->mpp_proto_version;
404
470
free_command(reply);
416
482
assert(astribank != NULL);
417
if((cmd = new_command(MPP_STATUS_GET, 0)) == NULL) {
483
if((cmd = new_command(astribank->mpp_proto_version, MPP_STATUS_GET, 0)) == NULL) {
418
484
ERR("new_command failed\n");
426
492
astribank->eeprom_type = 0x3 & (CMD_FIELD(reply, STATUS_GET_REPLY, i2cs_data) >> 3);
427
493
astribank->status = CMD_FIELD(reply, STATUS_GET_REPLY, status);
494
astribank->fw_versions = CMD_FIELD(reply, STATUS_GET_REPLY, fw_versions);
428
495
DBG("EEPROM TYPE: %02x\n", astribank->eeprom_type);
429
496
DBG("FPGA Firmware: %s\n", (astribank->status & 0x1) ? "Loaded" : "Empty");
497
DBG("Firmware Versions: USB='%s' FPGA='%s' EEPROM='%s'\n",
498
astribank->fw_versions.usb,
499
astribank->fw_versions.fpga,
500
astribank->fw_versions.eeprom);
430
501
free_command(reply);
441
512
assert(astribank != NULL);
442
if((cmd = new_command(MPP_EEPROM_SET, 0)) == NULL) {
513
if((cmd = new_command(astribank->mpp_proto_version, MPP_EEPROM_SET, 0)) == NULL) {
443
514
ERR("new_command failed\n");
462
533
assert(astribank != NULL);
463
if((cmd = new_command(MPP_RENUM, 0)) == NULL) {
534
if((cmd = new_command(astribank->mpp_proto_version, MPP_RENUM, 0)) == NULL) {
464
535
ERR("new_command failed\n");
485
556
assert(astribank != NULL);
486
if((cmd = new_command(MPP_CAPS_GET, 0)) == NULL) {
557
if((cmd = new_command(astribank->mpp_proto_version, MPP_CAPS_GET, 0)) == NULL) {
487
558
ERR("new_command failed\n");
523
594
assert(astribank != NULL);
524
if((cmd = new_command(MPP_CAPS_SET, 0)) == NULL) {
595
if((cmd = new_command(astribank->mpp_proto_version, MPP_CAPS_SET, 0)) == NULL) {
525
596
ERR("new_command failed\n");
547
618
assert(astribank != NULL);
548
if((cmd = new_command(MPP_EXTRAINFO_GET, 0)) == NULL) {
619
if((cmd = new_command(astribank->mpp_proto_version, MPP_EXTRAINFO_GET, 0)) == NULL) {
549
620
ERR("new_command failed\n");
572
643
assert(astribank != NULL);
573
if((cmd = new_command(MPP_EXTRAINFO_SET, 0)) == NULL) {
644
if((cmd = new_command(astribank->mpp_proto_version, MPP_EXTRAINFO_SET, 0)) == NULL) {
574
645
ERR("new_command failed\n");
594
665
DBG("len = %d, offset = %d\n", len, offset);
595
666
assert(astribank != NULL);
596
if((cmd = new_command(MPP_EEPROM_BLK_RD, 0)) == NULL) {
667
if((cmd = new_command(astribank->mpp_proto_version, MPP_EEPROM_BLK_RD, 0)) == NULL) {
597
668
ERR("new_command failed\n");
679
size = reply->header.len - sizeof(struct mpp_header) - sizeof(struct d_EEPROM_BLK_RD_REPLY);
608
680
INFO("size=%d offset=0x%X\n", size, CMD_FIELD(reply, EEPROM_BLK_RD_REPLY, offset));
609
681
dump_packet(LOG_DEBUG, "BLK_RD", (char *)reply, ret);
610
size = reply->header.len - sizeof(struct mpp_header) - sizeof(struct d_EEPROM_BLK_RD_REPLY);
612
683
ERR("Truncating reply (was %d, now %d)\n", size, len);
621
int mpp_send_start(struct astribank_device *astribank, enum dev_dest dest)
692
int mpp_send_start(struct astribank_device *astribank, enum dev_dest dest, const char *ihex_version)
623
694
struct mpp_command *cmd;
624
695
struct mpp_command *reply = NULL;
627
DBG("dest = %d\n", dest);
698
DBG("dest = %s ihex_version = '%s'\n", dev_dest2str(dest), ihex_version);
628
699
assert(astribank != NULL);
629
if((cmd = new_command(MPP_DEV_SEND_START, 0)) == NULL) {
700
if((cmd = new_command(astribank->mpp_proto_version, MPP_DEV_SEND_START, 0)) == NULL) {
630
701
ERR("new_command failed\n");
634
705
CMD_FIELD(cmd, DEV_SEND_START, dest) = dest;
706
set_ihex_version(CMD_FIELD(cmd, DEV_SEND_START, ihex_version), ihex_version);
635
707
ret = process_command(astribank, cmd, &reply);
637
709
ERR("process_command failed: %d\n", ret);
656
728
assert(astribank != NULL);
657
if((cmd = new_command(MPP_DEV_SEND_END, 0)) == NULL) {
729
if((cmd = new_command(astribank->mpp_proto_version, MPP_DEV_SEND_END, 0)) == NULL) {
658
730
ERR("new_command failed\n");
687
759
DBG("len = %d, offset = %d (0x%02X, 0x%02X)\n", len, offset, *data, *(data + 1));
688
760
assert(astribank != NULL);
689
if((cmd = new_command(MPP_DEV_SEND_SEG, len)) == NULL) {
761
if((cmd = new_command(astribank->mpp_proto_version, MPP_DEV_SEND_SEG, len)) == NULL) {
690
762
ERR("new_command failed\n");
724
796
DBG("full = %s\n", (full_reset) ? "YES" : "NO");
725
797
assert(astribank != NULL);
726
if((cmd = new_command(op, 0)) == NULL) {
798
if((cmd = new_command(astribank->mpp_proto_version, op, 0)) == NULL) {
727
799
ERR("new_command failed\n");
745
817
DBG("len=%d\n", len);
746
818
assert(astribank != NULL);
747
if((cmd = new_command(MPP_SER_SEND, len)) == NULL) {
819
if((cmd = new_command(astribank->mpp_proto_version, MPP_SER_SEND, len)) == NULL) {
748
820
ERR("new_command failed\n");
804
876
assert(astribank != NULL);
805
if((cmd = new_command(MPP_TWS_WD_MODE_GET, 0)) == NULL) {
877
if((cmd = new_command(astribank->mpp_proto_version, MPP_TWS_WD_MODE_GET, 0)) == NULL) {
806
878
ERR("new_command failed\n");
826
898
DBG("%s\n", (yes) ? "YES" : "NO");
827
899
assert(astribank != NULL);
828
if((cmd = new_command(MPP_TWS_WD_MODE_SET, 0)) == NULL) {
900
if((cmd = new_command(astribank->mpp_proto_version, MPP_TWS_WD_MODE_SET, 0)) == NULL) {
829
901
ERR("new_command failed\n");
849
921
assert(astribank != NULL);
850
if((cmd = new_command(MPP_TWS_PWR_GET, 0)) == NULL) {
922
if((cmd = new_command(astribank->mpp_proto_version, MPP_TWS_PWR_GET, 0)) == NULL) {
851
923
ERR("new_command failed\n");
872
944
assert(astribank != NULL);
873
if((cmd = new_command(MPP_TWS_PORT_GET, 0)) == NULL) {
945
if((cmd = new_command(astribank->mpp_proto_version, MPP_TWS_PORT_GET, 0)) == NULL) {
874
946
ERR("new_command failed\n");
897
968
ERR("Invalid portnum (%d)\n", portnum);
900
if((cmd = new_command(MPP_TWS_PORT_SET, 0)) == NULL) {
971
if((cmd = new_command(astribank->mpp_proto_version, MPP_TWS_PORT_SET, 0)) == NULL) {
901
972
ERR("new_command failed\n");
904
975
CMD_FIELD(cmd, TWS_PORT_SET, portnum) = portnum;
905
ret = process_command(astribank, cmd, &reply);
976
ret = process_command(astribank, cmd, NULL);
907
978
ERR("process_command failed: %d\n", ret);
982
1052
void show_astribank_status(struct astribank_device *astribank, FILE *fp)
984
fprintf(fp, "Astribank: EEPROM : %s\n", eeprom_type2str(astribank->eeprom_type));
1054
char version_buf[BUFSIZ];
1055
int is_loaded = STATUS_FPGA_LOADED(astribank->status);
1057
fprintf(fp, "Astribank: EEPROM : %s\n",
1058
eeprom_type2str(astribank->eeprom_type));
985
1059
fprintf(fp, "Astribank: FPGA status : %s\n",
986
STATUS_FPGA_LOADED(astribank->status) ? "Loaded" : "Empty");
1060
is_loaded ? "Loaded" : "Empty");
1062
memset(version_buf, 0, sizeof(version_buf));
1063
memcpy(version_buf, astribank->fw_versions.fpga, VERSION_LEN);
1064
fprintf(fp, "Astribank: FPGA version: %s\n",
989
1069
void show_extrainfo(const struct extrainfo *extrainfo, FILE *fp)