annotate pircharge/abb.c @ 262:db000ea183a5

pirelli/fw-disasm: CV charging analyzed
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 26 Dec 2017 12:26:23 +0000
parents 84a4f6ef2d28
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
229
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 #include <sys/types.h>
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 #include <stdio.h>
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 #include <string.h>
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 #include <strings.h>
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 #include <stdlib.h>
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 #include <rvinterf/pktmux.h>
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 #include <rvinterf/limits.h>
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include <rvinterf/localsock.h>
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <rvinterf/localtypes.h>
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <rvinterf/etm.h>
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include <rvinterf/exitcodes.h>
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 extern u_char rvi_msg[];
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 extern int rvi_msg_len;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 extern int adccal_a, adccal_b;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 struct abbtab {
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 char *name;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 int regno;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 int special;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 } abbtab[] = {
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 {"VBAT", 15, 2},
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 {"ICHG", 17, 1},
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 {"CHGREG", 25, 0},
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 {"BCICTL1", 28, 0},
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 {"BCICTL2", 29, 0},
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 {"BCICONF", 32+13, 0},
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 {0, 0, 0}
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 };
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 int abbr_in_progress, abbr_index;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 void
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 issue_abbr()
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 {
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 u_char cmdpkt[5];
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 int i, c;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 cmdpkt[0] = RVT_TM_HEADER;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 cmdpkt[1] = ETM_CORE;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 cmdpkt[2] = TMCORE_OPC_CODEC_RD;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 cmdpkt[3] = abbtab[abbr_index].regno;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 c = 0;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 for (i = 1; i <= 3; i++)
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 c ^= cmdpkt[i];
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 cmdpkt[i] = c;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 send_pkt_to_target(cmdpkt, 5);
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 }
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 void
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 adc_end_process()
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 {
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 if (abbr_in_progress)
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 return;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 abbr_in_progress = 1;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 abbr_index = 0;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 issue_abbr();
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 }
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 void
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 etm_packet_rx()
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 {
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 int i, c;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 unsigned val;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 if (rvi_msg_len != 9) {
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 printf("Received TM packet of wrong length\n");
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 return;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 }
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 c = 0;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 for (i = 2; i < rvi_msg_len; i++)
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 c ^= rvi_msg[i];
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 if (c) {
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 printf("Received TM packet with bad checksum\n");
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 return;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 }
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 if (rvi_msg[2] != ETM_CORE) {
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 printf("Received TM packet that isn't ETM_CORE\n");
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 return;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 }
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 if (rvi_msg[4] != TMCORE_OPC_CODEC_RD) {
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 printf("Received ETM_CORE packet that isn't abbr response\n");
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 return;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 }
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 if (rvi_msg[3]) {
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 printf("abbr response has error code %02X\n", rvi_msg[3]);
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 return;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 }
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 if (!abbr_in_progress) {
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 printf("abbr response with no abbr in progress\n");
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 return;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 }
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 if (rvi_msg[5] != abbtab[abbr_index].regno) {
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 printf("abbr response for the wrong register\n");
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 abbr_in_progress = 0;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 return;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 }
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 val = rvi_msg[6] | rvi_msg[7] << 8;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 printf("%s=%03X", abbtab[abbr_index].name, val);
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 switch (abbtab[abbr_index].special) {
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 case 2:
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 val = (val * adccal_a) >> 10;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 val += adccal_b;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 /* FALL THRU */
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 case 1:
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 printf(" (%u)", val);
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 }
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 putchar('\n');
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 abbr_index++;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 if (abbtab[abbr_index].name)
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 issue_abbr();
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 else
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 abbr_in_progress = 0;
84a4f6ef2d28 pirchgdbg: complete enough for first test
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 }