avrdude/qi_lb60-patches/001-nanonote.patch |
1 | | diff --git a/Makefile.am b/Makefile.am |
2 | | index 895c80c..82068a4 100644 |
3 | | +++ b/Makefile.am |
4 | | @@ -111,6 +111,8 @@ libavrdude_a_SOURCES = \ |
5 | | lists.c \ |
6 | | lists.h \ |
7 | | my_ddk_hidsdi.h \ |
8 | | + nanonote.c \ |
9 | | + nanonote.h \ |
10 | | par.c \ |
11 | | par.h \ |
12 | | pgm.c \ |
13 | | diff --git a/config_gram.y b/config_gram.y |
14 | | index 99956c0..2837965 100644 |
15 | | +++ b/config_gram.y |
16 | | @@ -48,6 +48,7 @@ |
17 | | #include "avr.h" |
18 | | #include "jtagmkI.h" |
19 | | #include "jtagmkII.h" |
20 | | +#include "nanonote.h" |
21 | | |
22 | | #if defined(WIN32NATIVE) |
23 | | #define strtok_r( _s, _sep, _lasts ) \ |
24 | | @@ -99,6 +100,7 @@ static int parse_cmdbits(OPCODE * op); |
25 | | %token K_DRAGON_JTAG |
26 | | %token K_DRAGON_PDI |
27 | | %token K_DRAGON_PP |
28 | | +%token K_NANONOTE |
29 | | %token K_STK500_DEVCODE |
30 | | %token K_AVR910_DEVCODE |
31 | | %token K_EEPROM |
32 | | @@ -551,6 +553,12 @@ prog_parm : |
33 | | } |
34 | | } | |
35 | | |
36 | | + K_TYPE TKN_EQUAL K_NANONOTE { |
37 | | + { |
38 | | + nanonote_initpgm(current_prog); |
39 | | + } |
40 | | + } | |
41 | | + |
42 | | K_DESC TKN_EQUAL TKN_STRING { |
43 | | strncpy(current_prog->desc, $3->value.string, PGM_DESCLEN); |
44 | | current_prog->desc[PGM_DESCLEN-1] = 0; |
45 | | diff --git a/lexer.l b/lexer.l |
46 | | index c5ce360..5ffe36a 100644 |
47 | | +++ b/lexer.l |
48 | | @@ -164,6 +164,7 @@ memory { yylval=NULL; return K_MEMORY; } |
49 | | min_write_delay { yylval=NULL; return K_MIN_WRITE_DELAY; } |
50 | | miso { yylval=NULL; return K_MISO; } |
51 | | mosi { yylval=NULL; return K_MOSI; } |
52 | | +nanonote { yylval=NULL; return K_NANONOTE; } |
53 | | num_banks { yylval=NULL; return K_NUM_PAGES; } |
54 | | num_pages { yylval=NULL; return K_NUM_PAGES; } |
55 | | nvm_base { yylval=NULL; return K_NVM_BASE; } |
56 | | diff --git a/nanonote.c b/nanonote.c |
57 | | new file mode 100644 |
58 | | index 0000000..ff6ee81 |
59 | | +++ b/nanonote.c |
60 | | @@ -0,0 +1,290 @@ |
61 | | +/* |
62 | | + * avrdude - A Downloader/Uploader for AVR device programmers |
63 | | + * Copyright (C) 2000, 2001, 2002, 2003 Brian S. Dean <bsd@bsdhome.com> |
64 | | + * Copyright (C) 2005 Michael Holzt <kju-avr@fqdn.org> |
65 | | + * Copyright (C) 2006 Joerg Wunsch <j@uriah.heep.sax.de> |
66 | | + * |
67 | | + * This program is free software; you can redistribute it and/or modify |
68 | | + * it under the terms of the GNU General Public License as published by |
69 | | + * the Free Software Foundation; either version 2 of the License, or |
70 | | + * (at your option) any later version. |
71 | | + * |
72 | | + * This program is distributed in the hope that it will be useful, |
73 | | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
74 | | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
75 | | + * GNU General Public License for more details. |
76 | | + * |
77 | | + * You should have received a copy of the GNU General Public License |
78 | | + * along with this program; if not, write to the Free Software |
79 | | + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
80 | | + */ |
81 | | + |
82 | | +/* |
83 | | + * Posix serial bitbanging interface for avrdude. |
84 | | + */ |
85 | | + |
86 | | + |
87 | | +#include <stdint.h> |
88 | | +#include <stdlib.h> |
89 | | +#include <stdio.h> |
90 | | +#include <unistd.h> |
91 | | +#include <string.h> |
92 | | +#include <fcntl.h> |
93 | | +#include <sys/mman.h> |
94 | | + |
95 | | +#include "avr.h" |
96 | | +#include "pgm.h" |
97 | | +#include "bitbang.h" |
98 | | + |
99 | | + |
100 | | + |
101 | | +static volatile void *mem; |
102 | | + |
103 | | + |
104 | | +#define POWER_OFF 3, 2 /* PD02, drive low to enable power */ |
105 | | +#define CMD 3, 8 /* PD08, CMD */ |
106 | | +#define CLK 3, 9 /* PD09, CLK */ |
107 | | +#define DAT0 3, 10 /* PD10, DAT0 */ |
108 | | +#define DAT1 3, 11 /* PD11, DAT1 */ |
109 | | +#define DAT2 3, 12 /* PD12, DAT2 */ |
110 | | +#define DAT3 3, 13 /* PD13, DAT3 */ |
111 | | + |
112 | | + |
113 | | +static struct { |
114 | | + unsigned port; |
115 | | + unsigned bit; |
116 | | +} pin_map[] = { |
117 | | + { 0, 0}, /* 0: not assigned */ |
118 | | + { 3, 11 }, /* 1: PD11, DAT1 */ |
119 | | + { 3, 10 }, /* 2: PD12, DAT0 */ |
120 | | + { 0, 0 }, /* 3: VSS */ |
121 | | + { 0, 0 }, /* 4: PD09, CLK (reserved) */ |
122 | | + { 0, 0 }, /* 5: VDD */ |
123 | | + { 3, 8 }, /* 6: PD08, CMD */ |
124 | | + { 3, 13 }, /* 7: PD13, DAT3 */ |
125 | | + { 3, 12 } /* 8: PD13, DAT2 */ |
126 | | +}; |
127 | | + |
128 | | + |
129 | | +#define BASE 0x10010000 |
130 | | + |
131 | | +#define REG(off) (*(volatile uint32_t *) (mem+(off))) |
132 | | + |
133 | | +#define port_pin(port) REG(port*0x100) |
134 | | +#define port_dats(port) REG(port*0x100+0x14) |
135 | | +#define port_datc(port) REG(port*0x100+0x18) |
136 | | +#define port_func(port) REG(port*0x100+0x48) |
137 | | +#define port_dirs(port) REG(port*0x100+0x64) |
138 | | +#define port_dirc(port) REG(port*0x100+0x68) |
139 | | + |
140 | | + |
141 | | +static inline void gpio_high(unsigned port, unsigned bit) |
142 | | +{ |
143 | | + port_dats(port) = 1 << bit; |
144 | | +} |
145 | | + |
146 | | + |
147 | | +static void gpio_low(unsigned port, unsigned bit) |
148 | | +{ |
149 | | + port_datc(port) = 1 << bit; |
150 | | +} |
151 | | + |
152 | | + |
153 | | +static void gpio_set(unsigned port, unsigned bit, int value) |
154 | | +{ |
155 | | + if (value) |
156 | | + gpio_high(port, bit); |
157 | | + else |
158 | | + gpio_low(port, bit); |
159 | | +} |
160 | | + |
161 | | + |
162 | | +static int gpio_get(unsigned port, unsigned bit) |
163 | | +{ |
164 | | + return (port_pin(port) >> bit) & 1; |
165 | | +} |
166 | | + |
167 | | + |
168 | | +static void gpio_output(unsigned port, unsigned bit) |
169 | | +{ |
170 | | + port_dirs(port) = 1 << bit; |
171 | | +} |
172 | | + |
173 | | + |
174 | | +static void gpio_input(unsigned port, unsigned bit) |
175 | | +{ |
176 | | + port_dirc(port) = 1 << bit; |
177 | | +} |
178 | | + |
179 | | + |
180 | | +static int nanonote_setpin(PROGRAMMER *pgm, int pin, int value) |
181 | | +{ |
182 | | + if (pin & PIN_INVERSE) { |
183 | | + value = !value; |
184 | | + pin &= PIN_MASK; |
185 | | + } |
186 | | + |
187 | | + if (pin < 1 || pin >= sizeof(pin_map)/sizeof(*pin_map)) |
188 | | + return -1; |
189 | | + if (!pin_map[pin].port) |
190 | | + return -1; |
191 | | + |
192 | | +#if 0 |
193 | | +fprintf(stderr, "pin %d (%u, %u) = %d\n", |
194 | | +pin, pin_map[pin].port, pin_map[pin].bit, value); |
195 | | +#endif |
196 | | + gpio_set(pin_map[pin].port, pin_map[pin].bit, value); |
197 | | + |
198 | | + /* |
199 | | + * We get unstable results with values <= 16 but stable results |
200 | | + * with 17 and above. |
201 | | + */ |
202 | | + bitbang_delay(pgm->ispdelay+20); |
203 | | + |
204 | | + return 0; |
205 | | +} |
206 | | + |
207 | | + |
208 | | +static int nanonote_getpin(PROGRAMMER *pgm, int pin) |
209 | | +{ |
210 | | + int invert = 0; |
211 | | + int v; |
212 | | + |
213 | | + if (pin & PIN_INVERSE) { |
214 | | + invert = 1; |
215 | | + pin &= PIN_MASK; |
216 | | + } |
217 | | + |
218 | | + if (pin < 1 || pin >= sizeof(pin_map)/sizeof(*pin_map)) |
219 | | + return -1; |
220 | | + if (!pin_map[pin].port) |
221 | | + return -1; |
222 | | + |
223 | | + gpio_input(pin_map[pin].port, pin_map[pin].bit); /* @@@ hack */ |
224 | | + v = gpio_get(pin_map[pin].port, pin_map[pin].bit); |
225 | | +#if 0 |
226 | | +fprintf(stderr, "pin %d (%u, %u): %d\n", |
227 | | +pin, pin_map[pin].port, pin_map[pin].bit, v); |
228 | | +#endif |
229 | | + return pin & PIN_INVERSE ? !v : v; |
230 | | +} |
231 | | + |
232 | | + |
233 | | +static int nanonote_highpulsepin(PROGRAMMER *pgm, int pin) |
234 | | +{ |
235 | | + return -1; |
236 | | +} |
237 | | + |
238 | | + |
239 | | +static void nanonote_display(PROGRAMMER *pgm, const char *p) |
240 | | +{ |
241 | | + /* nothing */ |
242 | | +} |
243 | | + |
244 | | + |
245 | | +static void misc_high(PROGRAMMER *pgm) |
246 | | +{ |
247 | | + gpio_high(POWER_OFF); |
248 | | + gpio_high(DAT1); |
249 | | + gpio_high(DAT0); |
250 | | + gpio_high(CMD); |
251 | | + gpio_high(DAT3); |
252 | | + gpio_high(DAT2); |
253 | | +} |
254 | | + |
255 | | + |
256 | | +static void nanonote_enable(PROGRAMMER *pgm) |
257 | | +{ |
258 | | + misc_high(pgm); |
259 | | + /* @@@ set CLK to function and output clock */ |
260 | | +} |
261 | | + |
262 | | + |
263 | | +static void nanonote_disable(PROGRAMMER *pgm) |
264 | | +{ |
265 | | + misc_high(pgm); |
266 | | + /* @@@ set CLK to GPIO */ |
267 | | + gpio_high(CLK); |
268 | | +} |
269 | | + |
270 | | + |
271 | | +static void nanonote_powerup(PROGRAMMER *pgm) |
272 | | +{ |
273 | | + gpio_low(POWER_OFF); |
274 | | +} |
275 | | + |
276 | | + |
277 | | +static void nanonote_powerdown(PROGRAMMER *pgm) |
278 | | +{ |
279 | | + gpio_input(DAT0); |
280 | | + gpio_input(CLK); |
281 | | + gpio_input(CMD); |
282 | | + gpio_input(DAT3); |
283 | | + gpio_input(DAT2); |
284 | | + gpio_input(DAT1); |
285 | | + gpio_high(POWER_OFF); |
286 | | +} |
287 | | + |
288 | | + |
289 | | +static int nanonote_open(PROGRAMMER *pgm, char *port) |
290 | | +{ |
291 | | + bitbang_check_prerequisites(pgm); |
292 | | + |
293 | | + pgm->fd.ifd = open("/dev/mem", O_RDWR | O_SYNC); |
294 | | + if (pgm->fd.ifd < 0) { |
295 | | + perror("/dev/mem"); |
296 | | + return -1; |
297 | | + } |
298 | | + mem = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, |
299 | | + pgm->fd.ifd, BASE); |
300 | | + if (mem == MAP_FAILED) { |
301 | | + perror("mmap"); |
302 | | + return -1; |
303 | | + } |
304 | | + |
305 | | + gpio_output(POWER_OFF); |
306 | | + gpio_output(DAT0); |
307 | | + gpio_output(CLK); |
308 | | + gpio_output(CMD); |
309 | | + gpio_output(DAT3); |
310 | | + gpio_output(DAT2); |
311 | | + gpio_output(DAT1); |
312 | | + |
313 | | + nanonote_disable(pgm); |
314 | | + |
315 | | + return 0; |
316 | | +} |
317 | | + |
318 | | + |
319 | | +static void nanonote_close(PROGRAMMER *pgm) |
320 | | +{ |
321 | | + if (pgm->fd.ifd != -1) |
322 | | + close(pgm->fd.ifd); |
323 | | +} |
324 | | + |
325 | | + |
326 | | +void nanonote_initpgm(PROGRAMMER *pgm) |
327 | | +{ |
328 | | + strcpy(pgm->type, "NANONOTE"); |
329 | | + |
330 | | + pgm->rdy_led = bitbang_rdy_led; |
331 | | + pgm->err_led = bitbang_err_led; |
332 | | + pgm->pgm_led = bitbang_pgm_led; |
333 | | + pgm->vfy_led = bitbang_vfy_led; |
334 | | + pgm->initialize = bitbang_initialize; |
335 | | + pgm->display = nanonote_display; |
336 | | + pgm->enable = nanonote_enable; |
337 | | + pgm->disable = nanonote_disable; |
338 | | + pgm->powerup = nanonote_powerup; |
339 | | + pgm->powerdown = nanonote_powerdown; |
340 | | + pgm->program_enable = bitbang_program_enable; |
341 | | + pgm->chip_erase = bitbang_chip_erase; |
342 | | + pgm->cmd = bitbang_cmd; |
343 | | + pgm->open = nanonote_open; |
344 | | + pgm->close = nanonote_close; |
345 | | + pgm->setpin = nanonote_setpin; |
346 | | + pgm->getpin = nanonote_getpin; |
347 | | + pgm->highpulsepin = nanonote_highpulsepin; |
348 | | + pgm->read_byte = avr_read_byte_default; |
349 | | + pgm->write_byte = avr_write_byte_default; |
350 | | +} |
351 | | diff --git a/nanonote.h b/nanonote.h |
352 | | new file mode 100644 |
353 | | index 0000000..bfd9333 |
354 | | +++ b/nanonote.h |
355 | | @@ -0,0 +1,6 @@ |
356 | | +#ifndef nanonote_h |
357 | | +#define nanonote_h |
358 | | + |
359 | | +void nanonote_initpgm(PROGRAMMER *pgm); |
360 | | + |
361 | | +#endif |
362 | | 1.7.0.4 |
363 | | |
avrdude/qi_lb60-patches/004-atmega32u2.patch |
1 | | diff --git a/avrdude.conf.in b/avrdude.conf.in |
2 | | index bcc26cd..4868bd3 100644 |
3 | | +++ b/avrdude.conf.in |
4 | | @@ -13033,6 +13033,191 @@ part |
5 | | ; |
6 | | |
7 | | #------------------------------------------------------------ |
8 | | +# ATmega32U2 |
9 | | +#------------------------------------------------------------ |
10 | | + |
11 | | +# |
12 | | +# This is a rough adaptation of the AT90USB162 definition. May contain all |
13 | | +# sorts of errors. |
14 | | +# |
15 | | + |
16 | | +part |
17 | | + id = "m32u2"; |
18 | | + desc = "ATmega32U2"; |
19 | | + has_jtag = no; |
20 | | + has_debugwire = yes; |
21 | | + signature = 0x1e 0x95 0x8a; |
22 | | + chip_erase_delay = 9000; |
23 | | + reset = io; |
24 | | + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", |
25 | | + "x x x x x x x x x x x x x x x x"; |
26 | | + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", |
27 | | + "x x x x x x x x x x x x x x x x"; |
28 | | + pagel = 0xD7; |
29 | | + bs2 = 0xC6; |
30 | | + |
31 | | + timeout = 200; |
32 | | + stabdelay = 100; |
33 | | + cmdexedelay = 25; |
34 | | + synchloops = 32; |
35 | | + bytedelay = 0; |
36 | | + pollindex = 3; |
37 | | + pollvalue = 0x53; |
38 | | + predelay = 1; |
39 | | + postdelay = 1; |
40 | | + pollmethod = 1; |
41 | | + pp_controlstack = |
42 | | + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, |
43 | | + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, |
44 | | + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, |
45 | | + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; |
46 | | + hventerstabdelay = 100; |
47 | | + progmodedelay = 0; |
48 | | + latchcycles = 5; |
49 | | + togglevtg = 1; |
50 | | + poweroffdelay = 15; |
51 | | + resetdelayms = 1; |
52 | | + resetdelayus = 0; |
53 | | + hvleavestabdelay = 15; |
54 | | + chiperasepulsewidth = 0; |
55 | | + chiperasepolltimeout = 10; |
56 | | + programfusepulsewidth = 0; |
57 | | + programfusepolltimeout = 5; |
58 | | + programlockpulsewidth = 0; |
59 | | + programlockpolltimeout = 5; |
60 | | + |
61 | | + memory "eeprom" |
62 | | + paged = no; /* leave this "no" */ |
63 | | + page_size = 4; /* for parallel programming */ |
64 | | + size = 1024; |
65 | | + num_pages = 256; |
66 | | + min_write_delay = 9000; |
67 | | + max_write_delay = 9000; |
68 | | + readback_p1 = 0x00; |
69 | | + readback_p2 = 0x00; |
70 | | + read = " 1 0 1 0 0 0 0 0", |
71 | | + " 0 0 0 0 a11 a10 a9 a8", |
72 | | + " a7 a6 a5 a4 a3 a2 a1 a0", |
73 | | + " o o o o o o o o"; |
74 | | + |
75 | | + write = " 1 1 0 0 0 0 0 0", |
76 | | + " 0 0 0 0 a11 a10 a9 a8", |
77 | | + " a7 a6 a5 a4 a3 a2 a1 a0", |
78 | | + " i i i i i i i i"; |
79 | | + |
80 | | + loadpage_lo = " 1 1 0 0 0 0 0 1", |
81 | | + " 0 0 0 0 0 0 0 0", |
82 | | + " 0 0 0 0 0 0 a1 a0", |
83 | | + " i i i i i i i i"; |
84 | | + |
85 | | + writepage = " 1 1 0 0 0 0 1 0", |
86 | | + " 0 0 0 0 a11 a10 a9 a8", |
87 | | + " a7 a6 a5 a4 a3 a2 0 0", |
88 | | + " x x x x x x x x"; |
89 | | + |
90 | | + mode = 0x41; |
91 | | + delay = 20; |
92 | | + blocksize = 4; |
93 | | + readsize = 256; |
94 | | + ; |
95 | | + |
96 | | + memory "flash" |
97 | | + paged = yes; |
98 | | + size = 32768; |
99 | | + page_size = 128; |
100 | | + num_pages = 256; |
101 | | + min_write_delay = 4500; |
102 | | + max_write_delay = 4500; |
103 | | + readback_p1 = 0x00; |
104 | | + readback_p2 = 0x00; |
105 | | + read_lo = " 0 0 1 0 0 0 0 0", |
106 | | + "a15 a14 a13 a12 a11 a10 a9 a8", |
107 | | + " a7 a6 a5 a4 a3 a2 a1 a0", |
108 | | + " o o o o o o o o"; |
109 | | + |
110 | | + read_hi = " 0 0 1 0 1 0 0 0", |
111 | | + "a15 a14 a13 a12 a11 a10 a9 a8", |
112 | | + " a7 a6 a5 a4 a3 a2 a1 a0", |
113 | | + " o o o o o o o o"; |
114 | | + |
115 | | + loadpage_lo = " 0 1 0 0 0 0 0 0", |
116 | | + " x x x x x x x x", |
117 | | + " x x a5 a4 a3 a2 a1 a0", |
118 | | + " i i i i i i i i"; |
119 | | + |
120 | | + loadpage_hi = " 0 1 0 0 1 0 0 0", |
121 | | + " x x x x x x x x", |
122 | | + " x x a5 a4 a3 a2 a1 a0", |
123 | | + " i i i i i i i i"; |
124 | | + |
125 | | + writepage = " 0 1 0 0 1 1 0 0", |
126 | | + "a15 a14 a13 a12 a11 a10 a9 a8", |
127 | | + " a7 a6 x x x x x x", |
128 | | + " x x x x x x x x"; |
129 | | + |
130 | | + mode = 0x41; |
131 | | + delay = 6; |
132 | | + blocksize = 128; |
133 | | + readsize = 256; |
134 | | + ; |
135 | | + |
136 | | + memory "lfuse" |
137 | | + size = 1; |
138 | | + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", |
139 | | + "x x x x x x x x i i i i i i i i"; |
140 | | + |
141 | | + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", |
142 | | + "x x x x x x x x o o o o o o o o"; |
143 | | + min_write_delay = 9000; |
144 | | + max_write_delay = 9000; |
145 | | + ; |
146 | | + |
147 | | + memory "hfuse" |
148 | | + size = 1; |
149 | | + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", |
150 | | + "x x x x x x x x i i i i i i i i"; |
151 | | + |
152 | | + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", |
153 | | + "x x x x x x x x o o o o o o o o"; |
154 | | + min_write_delay = 9000; |
155 | | + max_write_delay = 9000; |
156 | | + ; |
157 | | + |
158 | | + memory "efuse" |
159 | | + size = 1; |
160 | | + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", |
161 | | + "x x x x x x x x i i i i i i i i"; |
162 | | + |
163 | | + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", |
164 | | + "x x x x x x x x o o o o o o o o"; |
165 | | + min_write_delay = 9000; |
166 | | + max_write_delay = 9000; |
167 | | + ; |
168 | | + |
169 | | + memory "lock" |
170 | | + size = 1; |
171 | | + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", |
172 | | + "x x x x x x x x x x o o o o o o"; |
173 | | + |
174 | | + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", |
175 | | + "x x x x x x x x 1 1 i i i i i i"; |
176 | | + min_write_delay = 9000; |
177 | | + max_write_delay = 9000; |
178 | | + ; |
179 | | + |
180 | | + memory "calibration" |
181 | | + size = 1; |
182 | | + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", |
183 | | + "0 0 0 0 0 0 0 0 o o o o o o o o"; |
184 | | + ; |
185 | | + memory "signature" |
186 | | + size = 3; |
187 | | + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", |
188 | | + "x x x x x x a1 a0 o o o o o o o o"; |
189 | | + ; |
190 | | + ; |
191 | | + |
192 | | +#------------------------------------------------------------ |
193 | | # AT90USB82 |
194 | | #------------------------------------------------------------ |
195 | | # Changes against AT90USB162 (beside IDs) |
196 | | 1.7.0.4 |
197 | | |