FreeCalypso > hg > freecalypso-reveng
view pircharge/abb.c @ 259:ea66ce1a0d2e
pirelli/fw-disasm: pwr_cal_timer_process() analyzed
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 26 Dec 2017 04:47:58 +0000 |
parents | 84a4f6ef2d28 |
children |
line wrap: on
line source
#include <sys/types.h> #include <stdio.h> #include <string.h> #include <strings.h> #include <stdlib.h> #include <rvinterf/pktmux.h> #include <rvinterf/limits.h> #include <rvinterf/localsock.h> #include <rvinterf/localtypes.h> #include <rvinterf/etm.h> #include <rvinterf/exitcodes.h> extern u_char rvi_msg[]; extern int rvi_msg_len; extern int adccal_a, adccal_b; struct abbtab { char *name; int regno; int special; } abbtab[] = { {"VBAT", 15, 2}, {"ICHG", 17, 1}, {"CHGREG", 25, 0}, {"BCICTL1", 28, 0}, {"BCICTL2", 29, 0}, {"BCICONF", 32+13, 0}, {0, 0, 0} }; int abbr_in_progress, abbr_index; void issue_abbr() { u_char cmdpkt[5]; int i, c; cmdpkt[0] = RVT_TM_HEADER; cmdpkt[1] = ETM_CORE; cmdpkt[2] = TMCORE_OPC_CODEC_RD; cmdpkt[3] = abbtab[abbr_index].regno; c = 0; for (i = 1; i <= 3; i++) c ^= cmdpkt[i]; cmdpkt[i] = c; send_pkt_to_target(cmdpkt, 5); } void adc_end_process() { if (abbr_in_progress) return; abbr_in_progress = 1; abbr_index = 0; issue_abbr(); } void etm_packet_rx() { int i, c; unsigned val; if (rvi_msg_len != 9) { printf("Received TM packet of wrong length\n"); return; } c = 0; for (i = 2; i < rvi_msg_len; i++) c ^= rvi_msg[i]; if (c) { printf("Received TM packet with bad checksum\n"); return; } if (rvi_msg[2] != ETM_CORE) { printf("Received TM packet that isn't ETM_CORE\n"); return; } if (rvi_msg[4] != TMCORE_OPC_CODEC_RD) { printf("Received ETM_CORE packet that isn't abbr response\n"); return; } if (rvi_msg[3]) { printf("abbr response has error code %02X\n", rvi_msg[3]); return; } if (!abbr_in_progress) { printf("abbr response with no abbr in progress\n"); return; } if (rvi_msg[5] != abbtab[abbr_index].regno) { printf("abbr response for the wrong register\n"); abbr_in_progress = 0; return; } val = rvi_msg[6] | rvi_msg[7] << 8; printf("%s=%03X", abbtab[abbr_index].name, val); switch (abbtab[abbr_index].special) { case 2: val = (val * adccal_a) >> 10; val += adccal_b; /* FALL THRU */ case 1: printf(" (%u)", val); } putchar('\n'); abbr_index++; if (abbtab[abbr_index].name) issue_abbr(); else abbr_in_progress = 0; }