Mercurial > avr_jtag
comparison src/avr_jtag.c @ 2:abf221bf3ce4
AVR JTAG server.
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Sat, 21 Feb 2009 23:06:50 +0800 |
parents | |
children | e410832c3280 |
comparison
equal
deleted
inserted
replaced
1:f7c60e525801 | 2:abf221bf3ce4 |
---|---|
1 #include <stdio.h> | |
2 #include <stdlib.h> | |
3 #include <string.h> | |
4 #include "avriotools.h" | |
5 #include "cmd_proto.h" | |
6 #include "jtag.h" | |
7 | |
8 #define BAUD_RATE 420000 | |
9 | |
10 static char client_buf[255 + CP_CMD_OVERHEAD]; | |
11 | |
12 static | |
13 void ack(int seq) { | |
14 int i; | |
15 int sz; | |
16 | |
17 sz = cmd_proto_cmd_fill(client_buf, seq, CPCMD_ACK, 0); | |
18 | |
19 for(i = 0; i < sz; i++) | |
20 uart_putc(client_buf[i]); | |
21 } | |
22 | |
23 static | |
24 void nak(int seq, const char *msg) { | |
25 int i; | |
26 int sz; | |
27 | |
28 memcpy(client_buf + CP_CMD_HEAD_SZ, msg, strlen(msg)); | |
29 sz = cmd_proto_cmd_fill(client_buf, seq, CPCMD_NAK, 7); | |
30 | |
31 for(i = 0; i < sz; i++) | |
32 uart_putc(client_buf[i]); | |
33 } | |
34 | |
35 static | |
36 void send_client(const char *buf, int bsz) { | |
37 int i; | |
38 | |
39 for(i = 0; i < bsz; i++) | |
40 uart_putc(buf[i]); | |
41 } | |
42 | |
43 #define GET_DATA_BITS(data) ((data)[0] | ((data)[1] << 8)) | |
44 | |
45 int main(int argc, char * const argv[]) { | |
46 cp_cmd_t *cmd; | |
47 cmd_proto_t *cp; | |
48 int c, nbits; | |
49 int bsz; | |
50 char buf[16]; | |
51 | |
52 jtag_init(); | |
53 uart_init(BAUD_RATE); | |
54 | |
55 cp = cmd_proto_new(); | |
56 | |
57 while(1) { | |
58 uart_getc(c); | |
59 cmd = cmd_proto_rcv(cp, c); | |
60 | |
61 if(cmd == &BAD_CMD) { | |
62 nak(cmd->seq, "BAD CMD"); | |
63 continue; | |
64 } | |
65 | |
66 if(cmd == &CSUM_ERR_CMD) { | |
67 nak(cmd->seq, "CSUM ERR"); | |
68 continue; | |
69 } | |
70 | |
71 switch(cmd->code) { | |
72 case CPCMD_PING: | |
73 memcpy(client_buf + CP_CMD_HEAD_SZ, cmd->data, cmd->data_sz); | |
74 bsz = cmd_proto_cmd_fill(client_buf, cmd->seq, | |
75 CPCMD_PONG, cmd->data_sz); | |
76 send_client(client_buf, bsz); | |
77 break; | |
78 | |
79 case CPCMD_SHIFT_TDI: | |
80 nbits = GET_DATA_BITS(cmd->data); | |
81 jtag_shift(cmd->data + 2, nbits); | |
82 ack(cmd->seq); | |
83 break; | |
84 | |
85 case CPCMD_SHIFT_TMS: | |
86 nbits = GET_DATA_BITS(cmd->data); | |
87 jtag_tms(cmd->data + 2, nbits); | |
88 ack(cmd->seq); | |
89 break; | |
90 | |
91 case CPCMD_SHIFT_TDI_TDO: | |
92 nbits = GET_DATA_BITS(cmd->data); | |
93 jtag_shift_inout(cmd->data + 2, | |
94 client_buf + CP_CMD_HEAD_SZ + 2, | |
95 nbits); | |
96 | |
97 client_buf[CP_CMD_HEAD_SZ] = nbits & 0xff; | |
98 client_buf[CP_CMD_HEAD_SZ + 1] = nbits >> 8; | |
99 | |
100 bsz = cmd_proto_cmd_fill(client_buf, cmd->seq, | |
101 CPCMD_DATA, (nbits + 23) / 8); | |
102 send_client(client_buf, bsz); | |
103 break; | |
104 | |
105 default: | |
106 sprintf(buf, "CODE 0x%02x", cmd->code); | |
107 nak(cmd->seq, buf); | |
108 } | |
109 } | |
110 } |