diff options
author | tzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2007-10-16 17:55:05 +0000 |
---|---|---|
committer | tzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2007-10-16 17:55:05 +0000 |
commit | 6bc1dbffe9f77eb3c85a655ffeaff64d963c6b43 (patch) | |
tree | e94ccfa1c5bf43ffac9eb4ec251eee58ae8fe39a /xpp/utils/fpga_load.c | |
parent | 37886eb9069e5a088d721f41202e7c3dd4ca0a09 (diff) |
xpp r4892:
* Zaptel/Hardware perl modules:
- Use sysfs directly. Don't rely on lspci/lsusb.
- Each device has a description and driver name.
- Zaptel::Hardware::drivers() to show the list of required drivers
for this system (see zaptel_drivers).
- zaptel_hardware shows a description and a (suggested?) driver.
* zt_registration sorts by Serial first and only then by connector.
* USB_FW.hex replaces all the USB_11x0.hex .
- Separate USB interface for the management processor.
- Hence fpga_load can now work even with drivers loaded.
* Fix firmware upgrading.
* Fix manual firmware loading while auto-loading.
git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.2@3142 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'xpp/utils/fpga_load.c')
-rw-r--r-- | xpp/utils/fpga_load.c | 117 |
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; } |