FreeCalypso > hg > freecalypso-tools
diff rvinterf/tmsh/bsimresp.c @ 817:9706832b740b
fc-tmsh: ETM_BSIM response handling implemented
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 15 May 2021 01:00:52 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/tmsh/bsimresp.c Sat May 15 01:00:52 2021 +0000 @@ -0,0 +1,80 @@ +/* + * Handling of ETM_BSIM responses (FreeCalypso addition to fw) + */ + +#include <sys/types.h> +#include <stdio.h> +#include "bsim_etm_cmd.h" + +extern u_char rvi_msg[]; +extern int rvi_msg_len; + +static char *cmd_names[] = { + "query", "disch", "start", "ci2cv", "complete", "ichg", "start-enable" +}; + +static void +handle_bsim_error() +{ + char *errstr; + char msg[80]; + + if (rvi_msg_len != 6) { + print_etm_pkt_raw("ETM_BSIM long error packet"); + return; + } + switch (rvi_msg[3]) { + case BSIM_ERR_BAD_CMD: + errstr = "bad command opcode"; + break; + case BSIM_ERR_WRONG_STATE: + errstr = "wrong state"; + break; + case BSIM_ERR_INV_PERCENT: + errstr = "invalid percent"; + break; + case BSIM_ERR_INV_DISCHARGE: + errstr = "invalid discharge"; + break; + default: + errstr = "unknown"; + } + sprintf(msg, "bsim %s error 0x%02X (%s)", cmd_names[rvi_msg[4]], + rvi_msg[3], errstr); + async_msg_output(msg); +} + +void +handle_bsim_response() +{ + char msg[80]; + + if (rvi_msg_len == 5 && rvi_msg[3] == 0x3C) { + async_msg_output("bsim: ETM_NOSYS response"); + return; + } + if (rvi_msg_len < 6) { + print_etm_pkt_raw("ETM_BSIM response too short"); + return; + } + if (rvi_msg[4] > BSIM_CMD_START_ENABLE) { + print_etm_pkt_raw("ETM_BSIM unknown opcode"); + return; + } + if (rvi_msg[3]) { + handle_bsim_error(); + return; + } + if (rvi_msg_len == 6) { + sprintf(msg, "bsim %s OK", cmd_names[rvi_msg[4]]); + async_msg_output(msg); + return; + } + if (rvi_msg[4] == BSIM_CMD_QUERY && rvi_msg_len == 9) { + sprintf(msg, "bsim: state=%u percent=%u start_enable=%u", + rvi_msg[5], rvi_msg[6], rvi_msg[7]); + async_msg_output(msg); + return; + } + print_etm_pkt_raw("ETM_BSIM response wrong length"); +}