15 #include <usb.h> /* this is libusb, see http://libusb.sourceforge.net/ */
17 extern char * progname
;
20 static usb_dev_handle
*usbhandle
;
23 * wrapper for usb_control_msg call
25 static int usbasp_transmit(unsigned char receive
, unsigned char functionid
,
26 unsigned char send
[4], unsigned char * buffer
, int buffersize
)
29 nbytes
= usb_control_msg(usbhandle
,
30 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
| (receive
<< 7),
32 (send
[1] << 8) | send
[0],
33 (send
[3] << 8) | send
[2],
37 fprintf(stderr
, "%s: error: usbasp_transmit: %s\n", progname
, usb_strerror());
44 static int usbasp_open(PROGRAMMER
* pgm
, char * port
)
47 struct usb_device
*dev
= 0;
52 for(bus
=usb_busses
; bus
; bus
=bus
->next
){
53 for(dev
=bus
->devices
; dev
; dev
=dev
->next
){
54 if(dev
->descriptor
.idVendor
== USBDEV_VENDOR
&& dev
->descriptor
.idProduct
== USBDEV_PRODUCT
)
61 fprintf(stderr
, "%s: error: could not find USB device vendor=0x%x product=0x%x\n",
62 progname
, USBDEV_VENDOR
, USBDEV_PRODUCT
);
66 usbhandle
= usb_open(dev
);
68 fprintf(stderr
, "%s: error: opening usb device: %s\n",
69 progname
, usb_strerror());
77 static void usbasp_close(PROGRAMMER
* pgm
)
79 unsigned char temp
[4];
80 memset(temp
, 0, sizeof(temp
));
81 usbasp_transmit(1, USBASP_FUNC_DISCONNECT
, temp
, temp
, sizeof(temp
));
87 static int usbasp_initialize(PROGRAMMER
* pgm
, AVRPART
* p
)
90 unsigned char temp
[4];
91 memset(temp
, 0, sizeof(temp
));
92 usbasp_transmit(1, USBASP_FUNC_CONNECT
, temp
, temp
, sizeof(temp
));
96 pgm
->program_enable(pgm
, p
);
100 static void usbasp_disable(PROGRAMMER
* pgm
)
107 static void usbasp_enable(PROGRAMMER
* pgm
)
114 static void usbasp_display(PROGRAMMER
* pgm
, char * p
)
120 static int usbasp_cmd(PROGRAMMER
* pgm
, unsigned char cmd
[4],
121 unsigned char res
[4])
124 usbasp_transmit(1, USBASP_FUNC_TRANSMIT
, cmd
, res
, sizeof(res
));
127 fprintf(stderr
, "%s: error: wrong responds size\n",
136 static int usbasp_program_enable(PROGRAMMER
* pgm
, AVRPART
* p
)
138 unsigned char res
[4];
139 unsigned char cmd
[4];
140 memset(cmd
, 0, sizeof(cmd
));
141 memset(res
, 0, sizeof(res
));
146 usbasp_transmit(1, USBASP_FUNC_ENABLEPROG
, cmd
, res
, sizeof(res
));
148 if ((nbytes
!= 1) | (res
[0] != 0)) {
149 fprintf(stderr
, "%s: error: programm enable: target doesn't answer. %x \n",
158 static int usbasp_chip_erase(PROGRAMMER
* pgm
, AVRPART
* p
)
160 unsigned char cmd
[4];
161 unsigned char res
[4];
163 if (p
->op
[AVR_OP_CHIP_ERASE
] == NULL
) {
164 fprintf(stderr
, "chip erase instruction not defined for part \"%s\"\n",
169 memset(cmd
, 0, sizeof(cmd
));
171 avr_set_bits(p
->op
[AVR_OP_CHIP_ERASE
], cmd
);
172 pgm
->cmd(pgm
, cmd
, res
);
173 usleep(p
->chip_erase_delay
);
174 pgm
->initialize(pgm
, p
);
180 static int usbasp_paged_load(PROGRAMMER
* pgm
, AVRPART
* p
, AVRMEM
* m
,
181 int page_size
, int n_bytes
)
184 unsigned char cmd
[4];
186 int wbytes
= n_bytes
;
188 unsigned char * buffer
= m
->buf
;
191 if (strcmp(m
->desc
, "flash") == 0) {
192 function
= USBASP_FUNC_READFLASH
;
193 } else if (strcmp(m
->desc
, "eeprom") == 0) {
194 function
= USBASP_FUNC_READEEPROM
;
200 if (wbytes
> USBASP_READBLOCKSIZE
) {
201 blocksize
= USBASP_READBLOCKSIZE
;
202 wbytes
-= USBASP_READBLOCKSIZE
;
208 cmd
[0] = address
& 0xFF;
209 cmd
[1] = address
>> 8;
211 n
= usbasp_transmit(1, function
, cmd
, buffer
, blocksize
);
213 if (n
!= blocksize
) {
214 fprintf(stderr
, "%s: error: wrong reading bytes %x\n",
220 address
+= blocksize
;
222 report_progress (address
, n_bytes
, NULL
);
228 static int usbasp_paged_write(PROGRAMMER
* pgm
, AVRPART
* p
, AVRMEM
* m
,
229 int page_size
, int n_bytes
)
232 unsigned char cmd
[4];
234 int wbytes
= n_bytes
;
236 unsigned char * buffer
= m
->buf
;
237 unsigned char blockflags
= USBASP_BLOCKFLAG_FIRST
;
240 if (strcmp(m
->desc
, "flash") == 0) {
241 function
= USBASP_FUNC_WRITEFLASH
;
242 } else if (strcmp(m
->desc
, "eeprom") == 0) {
243 function
= USBASP_FUNC_WRITEEEPROM
;
249 if (wbytes
> USBASP_WRITEBLOCKSIZE
) {
250 blocksize
= USBASP_WRITEBLOCKSIZE
;
251 wbytes
-= USBASP_WRITEBLOCKSIZE
;
255 blockflags
|= USBASP_BLOCKFLAG_LAST
;
258 cmd
[0] = address
& 0xFF;
259 cmd
[1] = address
>> 8;
260 cmd
[2] = page_size
& 0xFF;
264 n
= usbasp_transmit(0, function
, cmd
, buffer
, blocksize
);
266 if (n
!= blocksize
) {
267 fprintf(stderr
, "%s: error: wrong count at writing %x\n",
274 address
+= blocksize
;
276 report_progress (address
, n_bytes
, NULL
);
282 void usbasp_initpgm(PROGRAMMER
* pgm
)
284 strcpy(pgm
->type
, "usbasp");
287 * mandatory functions
290 pgm
->initialize
= usbasp_initialize
;
291 pgm
->display
= usbasp_display
;
292 pgm
->enable
= usbasp_enable
;
293 pgm
->disable
= usbasp_disable
;
294 pgm
->program_enable
= usbasp_program_enable
;
295 pgm
->chip_erase
= usbasp_chip_erase
;
296 pgm
->cmd
= usbasp_cmd
;
297 pgm
->open
= usbasp_open
;
298 pgm
->close
= usbasp_close
;
304 pgm
->paged_write
= usbasp_paged_write
;
305 pgm
->paged_load
= usbasp_paged_load
;
310 #else /* HAVE_LIBUSB */
312 extern char * progname
;
314 static int usbasp_nousb_open (struct programmer_t
*pgm
, char * name
)
316 fprintf(stderr
, "%s: error: no usb support. please compile again with libusb installed.\n",
322 void usbasp_initpgm(PROGRAMMER
* pgm
)
324 strcpy(pgm
->type
, "usbasp");
326 pgm
->open
= usbasp_nousb_open
;
329 #endif /* HAVE_LIBUSB */