diff pircharge/abb.c @ 229:84a4f6ef2d28

pirchgdbg: complete enough for first test
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 19 Dec 2017 04:02:32 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pircharge/abb.c	Tue Dec 19 04:02:32 2017 +0000
@@ -0,0 +1,115 @@
+#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;
+}