summaryrefslogtreecommitdiff
path: root/xpp/utils/fpga_load.c
diff options
context:
space:
mode:
Diffstat (limited to 'xpp/utils/fpga_load.c')
-rw-r--r--xpp/utils/fpga_load.c117
1 files changed, 63 insertions, 54 deletions
diff --git a/xpp/utils/fpga_load.c b/xpp/utils/fpga_load.c
index c7ce907..e28f9a8 100644
--- a/xpp/utils/fpga_load.c
+++ b/xpp/utils/fpga_load.c
@@ -33,6 +33,52 @@ static char *progname;
#define PACKET_SIZE 512
#define EEPROM_SIZE 16
#define SERIAL_SIZE 8
+#define TIMEOUT 5000
+
+
+/* My device parameters */
+#define MY_EP_OUT 0x04
+#define MY_EP_IN 0x88
+
+#define FPGA_EP_OUT 0x02
+#define FPGA_EP_IN 0x86
+
+/* USB firmware types */
+#define USB_11xx 0
+#define USB_FIRMWARE_II 1
+
+#define TYPE_ENTRY(t,ni,n,ne,out,in,...) \
+ [t] = { \
+ .type_code = (t), \
+ .num_interfaces = (ni), \
+ .my_interface_num = (n), \
+ .num_endpoints = (ne), \
+ .my_ep_in = (in), \
+ .my_ep_out = (out), \
+ .name = #t, \
+ .endpoints = { __VA_ARGS__ }, \
+ }
+
+static const struct astribank_type {
+ int type_code;
+ int num_interfaces;
+ int my_interface_num;
+ int num_endpoints;
+ int my_ep_out;
+ int my_ep_in;
+ char *name;
+ int endpoints[4]; /* for matching */
+} astribank_types[] = {
+ TYPE_ENTRY(USB_11xx, 1, 0, 4, MY_EP_OUT, MY_EP_IN,
+ FPGA_EP_OUT,
+ MY_EP_OUT,
+ FPGA_EP_IN,
+ MY_EP_IN),
+ TYPE_ENTRY(USB_FIRMWARE_II, 2, 1, 2, MY_EP_OUT, MY_EP_IN,
+ MY_EP_OUT,
+ MY_EP_IN),
+};
+#undef TYPE_ENTRY
enum fpga_load_packet_types {
PT_STATUS_REPLY = 0x01,
@@ -98,6 +144,7 @@ struct my_usb_device {
char iInterface[BUFSIZ];
int is_usb2;
struct myeeprom eeprom;
+ const struct astribank_type *abtype;
};
const char *load_status2str(enum fpga_load_status s)
@@ -191,52 +238,6 @@ int get_usb_string(char *buf, unsigned int len, uint16_t item, usb_dev_handle *h
return snprintf(buf, len, "%s", tmp);
}
-/* My device parameters */
-#define MY_EP_OUT 0x04
-#define MY_EP_IN 0x88
-
-#define FPGA_EP_OUT 0x02
-#define FPGA_EP_IN 0x86
-
-/* USB firmware types */
-#define USB_11xx 0
-#define USB_FIRMWARE_II 1
-
-#define TYPE_ENTRY(t,ni,n,ne,out,in,...) \
- [t] = { \
- .type_code = (t), \
- .num_interfaces = (ni), \
- .my_interface_num = (n), \
- .num_endpoints = (ne), \
- .my_ep_in = (in), \
- .my_ep_out = (out), \
- .name = #t, \
- .endpoints = { __VA_ARGS__ }, \
- }
-
-static const struct astribank_type {
- int type_code;
- int num_interfaces;
- int my_interface_num;
- int num_endpoints;
- int my_ep_out;
- int my_ep_in;
- char *name;
- int endpoints[4]; /* for matching */
-} astribank_types[] = {
- TYPE_ENTRY(USB_11xx, 1, 0, 4, MY_EP_OUT, MY_EP_IN,
- FPGA_EP_OUT,
- MY_EP_OUT,
- FPGA_EP_IN,
- MY_EP_IN),
- TYPE_ENTRY(USB_FIRMWARE_II, 2, 1, 2, MY_EP_OUT, MY_EP_IN,
- MY_EP_OUT,
- MY_EP_IN),
-};
-#undef TYPE_ENTRY
-
-#define TIMEOUT 5000
-
void my_usb_device_cleanup(struct my_usb_device *mydev, const struct astribank_type *abtype)
{
assert(mydev != NULL);
@@ -260,6 +261,7 @@ static void show_device_info(const struct my_usb_device *mydev)
eeprom = &mydev->eeprom;
memset(data, 0, SERIAL_SIZE + 1);
memcpy(data, eeprom->serial, SERIAL_SIZE);
+ printf("USB Firmware Type: [%s]\n", mydev->abtype->name);
printf("USB iManufacturer: [%s]\n", mydev->iManufacturer);
printf("USB iProduct: [%s]\n", mydev->iProduct);
printf("USB iSerialNumber: [%s]\n", mydev->iSerialNumber);
@@ -556,10 +558,6 @@ int my_usb_device_init(const char devpath[], struct my_usb_device *mydev, const
ERR("usb_claim_interface: %s\n", usb_strerror());
return 0;
}
- if(usb_reset(mydev->handle) != 0) {
- ERR("usb_reset: %s\n", usb_strerror());
- return 0;
- }
dev_desc = &mydev->dev->descriptor;
config_desc = mydev->dev->config;
interface = &config_desc->interface[abtype->my_interface_num];
@@ -578,6 +576,7 @@ int my_usb_device_init(const char devpath[], struct my_usb_device *mydev, const
}
}
}
+ mydev->abtype = abtype;
mydev->my_ep_in = abtype->my_ep_in;
mydev->my_ep_out = abtype->my_ep_out;
ret = get_usb_string(mydev->iManufacturer, BUFSIZ, dev_desc->iManufacturer, mydev->handle);
@@ -591,12 +590,12 @@ int my_usb_device_init(const char devpath[], struct my_usb_device *mydev, const
mydev->iProduct,
mydev->iSerialNumber,
mydev->iInterface);
- if(usb_resetep(mydev->handle, mydev->my_ep_out) != 0) {
- ERR("Failed to reset usb output endpoint: %s\n", usb_strerror());
+ if(usb_clear_halt(mydev->handle, mydev->my_ep_out) != 0) {
+ ERR("Clearing output endpoint: %s\n", usb_strerror());
return 0;
}
- if(usb_resetep(mydev->handle, mydev->my_ep_in) != 0) {
- ERR("Failed to reset usb input endpoint: %s\n", usb_strerror());
+ if(usb_clear_halt(mydev->handle, mydev->my_ep_in) != 0) {
+ ERR("Clearing input endpoint: %s\n", usb_strerror());
return 0;
}
return 1;
@@ -614,6 +613,16 @@ int renumerate_device(struct my_usb_device *mydev, enum fpga_load_packet_types p
ret = send_usb("renumerate[W]", mydev, phead, 1, TIMEOUT);
if(ret < 0)
return ret;
+#if 0
+ /*
+ * FIXME: we count on our USB firmware to reset the device... should we?
+ */
+ ret = usb_reset(mydev->handle);
+ if(ret < 0) {
+ ERR("usb_reset: %s\n", usb_strerror());
+ return -ENODEV;
+ }
+#endif
return 0;
}