From 18d5ea95e59e83ebee8379f0de459d2f8f0482f4 Mon Sep 17 00:00:00 2001 From: Ahmed BOUDJELIDA Date: Wed, 15 Jan 2025 16:44:28 +0100 Subject: [PATCH] contrib/firmware/angie: correct usb descriptor issues Correct the issue of usb descriptor does not appear near the PID and VID, Cypress USB controller cannot handle direct pointers to memory CODE area, so we copy the data in the external RAM area and point to it. Change-Id: I3221627dc8576f6341b444acd9c554fd5cc47918 Signed-off-by: Ahmed BOUDJELIDA Reviewed-on: https://review.openocd.org/c/openocd/+/8736 Tested-by: jenkins Reviewed-by: Antonio Borneo --- contrib/firmware/angie/c/include/usb.h | 2 +- contrib/firmware/angie/c/src/usb.c | 100 ++++++---------------- src/jtag/drivers/angie/angie_firmware.bin | Bin 4487 -> 4478 bytes 3 files changed, 29 insertions(+), 73 deletions(-) diff --git a/contrib/firmware/angie/c/include/usb.h b/contrib/firmware/angie/c/include/usb.h index 37d3b8ae2..dbf41fe8e 100644 --- a/contrib/firmware/angie/c/include/usb.h +++ b/contrib/firmware/angie/c/include/usb.h @@ -104,7 +104,7 @@ struct usb_endpoint_descriptor { struct usb_language_descriptor { uint8_t blength; /**< Size of this descriptor in bytes. */ uint8_t bdescriptortype; /**< STRING descriptor type. */ - uint16_t wlangid[]; /**< LANGID codes. */ + uint16_t wlangid; /**< LANGID codes. */ }; /** USB String Descriptor. See USB 2.0 Spec */ diff --git a/contrib/firmware/angie/c/src/usb.c b/contrib/firmware/angie/c/src/usb.c index 9b48e8353..6a07cc5d3 100644 --- a/contrib/firmware/angie/c/src/usb.c +++ b/contrib/firmware/angie/c/src/usb.c @@ -19,6 +19,7 @@ #include "i2c.h" #include #include +#include // #define PRINTF_DEBUG @@ -122,7 +123,7 @@ __code struct usb_endpoint_descriptor bulk_ep8_in_endpoint_descriptor = { __code struct usb_language_descriptor language_descriptor = { .blength = 4, .bdescriptortype = DESCRIPTOR_TYPE_STRING, - .wlangid = {0x0409} /* US English */ + .wlangid = 0x0409 /* US English */ }; __code struct usb_string_descriptor strmanufacturer = @@ -134,15 +135,11 @@ __code struct usb_string_descriptor strproduct = __code struct usb_string_descriptor strserialnumber = STR_DESCR(6, '0', '0', '0', '0', '0', '1'); -__code struct usb_string_descriptor strconfigdescr = - STR_DESCR(12, 'J', 'T', 'A', 'G', ' ', 'A', 'd', 'a', 'p', 't', 'e', 'r'); - /* Table containing pointers to string descriptors */ -__code struct usb_string_descriptor *__code en_string_descriptors[4] = { +__code struct usb_string_descriptor *__code en_string_descriptors[3] = { &strmanufacturer, &strproduct, - &strserialnumber, - &strconfigdescr + &strserialnumber }; void sudav_isr(void)__interrupt SUDAV_ISR { @@ -196,7 +193,6 @@ void ep6_isr(void)__interrupt EP6_ISR i2c_recieve(); /* Execute I2C communication */ EXIF &= ~0x10; /* Clear USBINT: Main global interrupt */ EPIRQ = 0x40; /* Clear individual EP6OUT IRQ */ - REVCTL = 0x3; /* REVCTL.0 and REVCTL.1 set to 1 */ } void ep8_isr(void)__interrupt EP8_ISR { @@ -328,63 +324,6 @@ void usb_reset_data_toggle(uint8_t ep) TOGCTL |= BMRESETTOGGLE; } -/** - * Handle GET_STATUS request. - * - * @return on success: true - * @return on failure: false - */ -bool usb_handle_get_status(void) -{ - uint8_t *ep_cs; - switch (setup_data.bmrequesttype) { - case GS_DEVICE: - /* Two byte response: Byte 0, Bit 0 = self-powered, Bit 1 = remote wakeup. - * Byte 1: reserved, reset to zero */ - EP0BUF[0] = 0; - EP0BUF[1] = 0; - - /* Send response */ - EP0BCH = 0; - syncdelay(3); - EP0BCL = 2; - syncdelay(3); - break; - case GS_INTERFACE: - /* Always return two zero bytes according to USB 1.1 spec, p. 191 */ - EP0BUF[0] = 0; - EP0BUF[1] = 0; - - /* Send response */ - EP0BCH = 0; - syncdelay(3); - EP0BCL = 2; - syncdelay(3); - break; - case GS_ENDPOINT: - /* Get stall bit for endpoint specified in low byte of wIndex */ - ep_cs = usb_get_endpoint_cs_reg(setup_data.windex & 0xff); - - if (*ep_cs & EPSTALL) - EP0BUF[0] = 0x01; - else - EP0BUF[0] = 0x00; - - /* Second byte sent has to be always zero */ - EP0BUF[1] = 0; - - /* Send response */ - EP0BCH = 0; - syncdelay(3); - EP0BCL = 2; - syncdelay(3); - break; - default: - return false; - } - return true; -} - /** * Handle CLEAR_FEATURE request. * @@ -480,12 +419,17 @@ bool usb_handle_get_descriptor(void) case DESCRIPTOR_TYPE_STRING: if (setup_data.windex == 0) { /* Supply language descriptor */ - SUDPTRH = HI8(&language_descriptor); - SUDPTRL = LO8(&language_descriptor); + __xdata struct usb_language_descriptor temp_descriptor; + memcpy(&temp_descriptor, &language_descriptor, sizeof(language_descriptor)); + SUDPTRH = HI8(&temp_descriptor); + SUDPTRL = LO8(&temp_descriptor); } else if (setup_data.windex == 0x0409 /* US English */) { /* Supply string descriptor */ - SUDPTRH = HI8(en_string_descriptors[descriptor_index - 1]); - SUDPTRL = LO8(en_string_descriptors[descriptor_index - 1]); + __xdata uint8_t temp_descriptors[3]; + memcpy(temp_descriptors, en_string_descriptors[descriptor_index - 1], + ((struct usb_string_descriptor *)en_string_descriptors[descriptor_index - 1])->blength); + SUDPTRH = HI8(temp_descriptors); + SUDPTRL = LO8(temp_descriptors); } else { return false; } @@ -610,6 +554,8 @@ bool usb_handle_vcommands(void) ; /* wait to finish transferring in EP0BUF, until not busy */ gcnt = ((uint32_t)(eptr[0]) << 24) | ((uint32_t)(eptr[1]) << 16) | ((uint32_t)(eptr[2]) << 8) | (uint32_t)(eptr[3]); + /* REVCTL.0 and REVCTL.1 set to 1 */ + REVCTL = 0x3; /* Angie board FPGA bitstream download */ PIN_RDWR_B = 0; /* Initialize GPIF interface transfer count */ @@ -632,6 +578,10 @@ bool usb_handle_vcommands(void) EP4AUTOINLENL = (uint8_t)((uint32_t)(gcnt) & 0x000000ff); /* Trigger GPIF IN transfer on EP4 */ GPIFTRIG = BMGPIFREAD | GPIF_EP4; + while (!(GPIFTRIG & BMGPIFDONE)) // poll GPIFTRIG.7 GPIF Done bit + ; + /* REVCTL.0 and REVCTL.1 set to 0 */ + REVCTL = 0; break; default: return true; /* Error: unknown VR command */ @@ -646,8 +596,12 @@ void usb_handle_setup_data(void) { switch (setup_data.brequest) { case GET_STATUS: - if (!usb_handle_get_status()) - STALL_EP0(); + EP0BUF[0] = 0; + EP0BUF[1] = 0; + /* Send response */ + EP0BCH = 0; + EP0BCL = 2; + syncdelay(3); break; case CLEAR_FEATURE: if (!usb_handle_clear_feature()) @@ -880,7 +834,9 @@ void interrupt_init(void) /* Clear SUDAV interrupt */ USBIRQ = SUDAVI; - /* Enable Interrupts */ + /* Enable Interrupts (Do not confuse this with + * EA External Access pin, see ANGIE Schematic) + */ EA = 1; } diff --git a/src/jtag/drivers/angie/angie_firmware.bin b/src/jtag/drivers/angie/angie_firmware.bin index 6ba2babb1731581b81e23560c39ccd8164733627..ecf2cfd513eab13f1ba03e2f88052804ac32f99f 100644 GIT binary patch delta 2046 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