2 * This file is part of the libsigrok project.
4 * Copyright (C) 2010-2012 Bert Vermeulen <bert@biot.com>
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 * Helper functions for the Cypress EZ-USB / FX2 series chips.
27 #include <glib/gstdio.h>
31 #include <libsigrok/libsigrok.h>
32 #include "libsigrok-internal.h"
34 #define LOG_PREFIX "ezusb"
36 #define FW_CHUNKSIZE (4 * 1024)
38 SR_PRIV
int ezusb_reset(struct libusb_device_handle
*hdl
, int set_clear
)
43 sr_info("setting CPU reset mode %s...",
44 set_clear
? "on" : "off");
45 buf
[0] = set_clear
? 1 : 0;
46 ret
= libusb_control_transfer(hdl
, LIBUSB_REQUEST_TYPE_VENDOR
, 0xa0,
47 0xe600, 0x0000, buf
, 1, 100);
49 sr_err("Unable to send control request: %s.",
50 libusb_error_name(ret
));
55 SR_PRIV
int ezusb_install_firmware(struct sr_context
*ctx
,
56 libusb_device_handle
*hdl
,
59 unsigned char *firmware
;
60 size_t length
, offset
, chunksize
;
63 /* Max size is 64 kiB since the value field of the setup packet,
64 * which holds the firmware offset, is only 16 bit wide.
66 firmware
= sr_resource_load(ctx
, SR_RESOURCE_FIRMWARE
,
67 name
, &length
, 1 << 16);
71 sr_info("Uploading firmware '%s'.", name
);
75 while (offset
< length
) {
76 chunksize
= MIN(length
- offset
, FW_CHUNKSIZE
);
78 ret
= libusb_control_transfer(hdl
, LIBUSB_REQUEST_TYPE_VENDOR
|
79 LIBUSB_ENDPOINT_OUT
, 0xa0, offset
,
80 0x0000, firmware
+ offset
,
83 sr_err("Unable to send firmware to device: %s.",
84 libusb_error_name(ret
));
88 sr_info("Uploaded %zu bytes.", chunksize
);
93 sr_info("Firmware upload done.");
98 SR_PRIV
int ezusb_upload_firmware(struct sr_context
*ctx
, libusb_device
*dev
,
99 int configuration
, const char *name
)
101 struct libusb_device_handle
*hdl
;
104 sr_info("uploading firmware to device on %d.%d",
105 libusb_get_bus_number(dev
), libusb_get_device_address(dev
));
107 if ((ret
= libusb_open(dev
, &hdl
)) < 0) {
108 sr_err("failed to open device: %s.", libusb_error_name(ret
));
113 * The libusb Darwin backend is broken: it can report a kernel driver being
114 * active, but detaching it always returns an error.
116 #if !defined(__APPLE__)
117 if (libusb_kernel_driver_active(hdl
, 0) == 1) {
118 if ((ret
= libusb_detach_kernel_driver(hdl
, 0)) < 0) {
119 sr_err("failed to detach kernel driver: %s",
120 libusb_error_name(ret
));
126 if ((ret
= libusb_set_configuration(hdl
, configuration
)) < 0) {
127 sr_err("Unable to set configuration: %s",
128 libusb_error_name(ret
));
132 if ((ezusb_reset(hdl
, 1)) < 0)
135 if (ezusb_install_firmware(ctx
, hdl
, name
) < 0)
138 if ((ezusb_reset(hdl
, 0)) < 0)