ao-tools: Add cc_usb_write function
[fw/altos] / ao-tools / 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 #include "cc-bitbang.h"
21
22 /*
23  * Manual bit-banging to debug the low level protocol
24  */
25
26 static void
27 get_bit(char *line, int i, char on, uint8_t bit, uint8_t *bits, uint8_t *masks)
28 {
29         if (line[i] == on) {
30                 *bits |= bit;
31                 *masks |= bit;
32                 return;
33         }
34         if (line[i] == '.') {
35                 *masks |= bit;
36                 return;
37         }
38         if (line[i] == '-') {
39                 return;
40         }
41         fprintf(stderr, "bad line %s\n", line);
42         exit (1);
43 }
44
45 void
46 ccdbg_manual(struct ccdbg *dbg, FILE *input)
47 {
48         char    line[80];
49         uint8_t set, mask;
50
51         if (dbg->bb == NULL) {
52                 fprintf(stderr, "Must use bitbang API for manual mode\n");
53                 return;
54         }
55         while (fgets(line, sizeof line, input)) {
56                 if (line[0] == '#' || line[0] == '\n') {
57                         printf ("%s", line);
58                         continue;
59                 }
60                 set = 0;
61                 mask = 0;
62                 get_bit(line, 0, 'C', CC_CLOCK, &set, &mask);
63                 get_bit(line, 2, 'D', CC_DATA, &set, &mask);
64                 get_bit(line, 4, 'R', CC_RESET_N, &set, &mask);
65                 if (mask != (CC_CLOCK|CC_DATA|CC_RESET_N)) {
66                         uint8_t read;
67                         cc_bitbang_read(dbg->bb, &read);
68                         cc_bitbang_sync(dbg->bb);
69                         cc_bitbang_print("\t%c %c %c", CC_CLOCK|CC_DATA|CC_RESET_N, read);
70                         if ((set & CC_CLOCK) == 0)
71                                 printf ("\t%d", (read&CC_DATA) ? 1 : 0);
72                         printf ("\n");
73                 }
74                 cc_bitbang_send(dbg->bb, mask, set);
75                 cc_bitbang_sync(dbg->bb);
76         }
77 }