b48f8bb153848521d44e0027d082c863066db6bd
[fw/altos] / lib / ccdbg-manual.c
1 /*
2  * Copyright © 2008 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17  */
18
19 #include "ccdbg.h"
20
21 /*
22  * Manual bit-banging to debug the low level protocol
23  */
24
25 static void
26 get_bit(char *line, int i, char on, uint8_t bit, uint8_t *bits, uint8_t *masks)
27 {
28         if (line[i] == on) {
29                 *bits |= bit;
30                 *masks |= bit;
31                 return;
32         }
33         if (line[i] == '.') {
34                 *masks |= bit;
35                 return;
36         }
37         if (line[i] == '-') {
38                 return;
39         }
40         fprintf(stderr, "bad line %s\n", line);
41         exit (1);
42 }
43
44 void
45 ccdbg_manual(struct ccdbg *dbg, FILE *input)
46 {
47         char    line[80];
48         uint8_t set, mask;
49
50         while (fgets(line, sizeof line, input)) {
51                 if (line[0] == '#' || line[0] == '\n') {
52                         printf ("%s", line);
53                         continue;
54                 }
55                 set = 0;
56                 mask = 0;
57                 get_bit(line, 0, 'C', CC_CLOCK, &set, &mask);
58                 get_bit(line, 2, 'D', CC_DATA, &set, &mask);
59                 get_bit(line, 4, 'R', CC_RESET_N, &set, &mask);
60                 if (mask != (CC_CLOCK|CC_DATA|CC_RESET_N)) {
61                         uint8_t read;
62                         ccdbg_read(dbg, &read);
63                         ccdbg_print("\t%c %c %c", CC_CLOCK|CC_DATA|CC_RESET_N, read);
64                         if ((set & CC_CLOCK) == 0)
65                                 printf ("\t%d", (read&CC_DATA) ? 1 : 0);
66                         printf ("\n");
67                 }
68                 ccdbg_send(dbg, mask, set);
69         }
70 }