From 0c2d907a5d650f1a3b8cbeeb7af7bf840b7db038 Mon Sep 17 00:00:00 2001 From: Ahmed BOUDJELIDA Date: Fri, 22 Dec 2023 10:59:52 +0100 Subject: [PATCH] contrib/firmware: Change USB interruption handling for JTAG/I2C communications Before this change, when we send an I2C Bulk data at the same time while Jtag bitbanging functions execute, the microcontroller puts JTAG bitbanging on wait and executes all I2C bitbanging function, which causes problems like loss of Ack in DAP responses and other errors. With this commit, When I2C interruption occurs, it sets a variable to true and continues JTAG bitbanging, when it finish it executes the I2C bitbang. Change-Id: Ia80bac21f8a259f4a1176b5346bf74ed0aa6e38b Signed-off-by: Ahmed BOUDJELIDA Reviewed-on: https://review.openocd.org/c/openocd/+/8074 Tested-by: jenkins Reviewed-by: Antonio Borneo --- contrib/firmware/angie/c/include/usb.h | 1 + contrib/firmware/angie/c/src/protocol.c | 50 ++++++++++++---------- contrib/firmware/angie/c/src/usb.c | 6 +-- src/jtag/drivers/angie/angie_firmware.bin | Bin 10248 -> 10216 bytes 4 files changed, 31 insertions(+), 26 deletions(-) diff --git a/contrib/firmware/angie/c/include/usb.h b/contrib/firmware/angie/c/include/usb.h index e10947d334..ad8be787e4 100644 --- a/contrib/firmware/angie/c/include/usb.h +++ b/contrib/firmware/angie/c/include/usb.h @@ -129,6 +129,7 @@ struct setup_data { * the USB module */ extern volatile bool ep1_out; extern volatile bool ep1_in; +extern volatile bool ep6_out; extern volatile __xdata __at 0xE6B8 struct setup_data setup_data; diff --git a/contrib/firmware/angie/c/src/protocol.c b/contrib/firmware/angie/c/src/protocol.c index d84534bf2f..e32808db8f 100644 --- a/contrib/firmware/angie/c/src/protocol.c +++ b/contrib/firmware/angie/c/src/protocol.c @@ -157,30 +157,36 @@ void command_loop(void) cmd_id_index = 0; payload_index_in = 0; - /* Wait until host sends EP1 Bulk-OUT packet */ - while (!ep1_out) + /* Wait until host sends Bulk-OUT packet */ + while ((!ep1_out) && (!ep6_out)) ; - ep1_out = false; - - /* Execute the commands */ - last_command = false; - while (!last_command) - last_command = execute_command(); - - /* Send back EP6 Bulk-IN packet if required */ - if (payload_index_in > 0) { - EP1INBC = payload_index_in; + if (ep6_out) { + /* Execute I2C command */ + i2c_recieve(); + ep6_out = false; + } + if (ep1_out) { + ep1_out = false; + /* Execute the commands */ + last_command = false; + while (!last_command) + last_command = execute_command(); + + /* Send back EP1 Bulk-IN packet if required */ + if (payload_index_in > 0) { + EP1INBC = payload_index_in; + syncdelay(3); + + while (!ep1_in) + ; + ep1_in = false; + } + + /* Re-arm EP1-OUT after command execution */ + EP1OUTBC = 0; + syncdelay(3); + EP1OUTBC = 0; syncdelay(3); - - while (!ep1_in) - ; - ep1_in = false; } - - /* Re-arm EP1-OUT after command execution */ - EP1OUTBC = 0; - syncdelay(3); - EP1OUTBC = 0; - syncdelay(3); } } diff --git a/contrib/firmware/angie/c/src/usb.c b/contrib/firmware/angie/c/src/usb.c index a137d3d37e..ed23dcfa5a 100644 --- a/contrib/firmware/angie/c/src/usb.c +++ b/contrib/firmware/angie/c/src/usb.c @@ -25,6 +25,7 @@ */ volatile bool ep1_out; volatile bool ep1_in; +volatile bool ep6_out; volatile __xdata __at 0xE6B8 struct setup_data setup_data; @@ -195,27 +196,24 @@ void ep0out_isr(void)__interrupt EP0OUT_ISR void ep1in_isr(void)__interrupt EP1IN_ISR { ep1_in = true; - EXIF &= ~0x10; /* Clear USBINT: Main global interrupt */ EPIRQ = 0x04; /* Clear individual EP1IN IRQ */ } void ep1out_isr(void)__interrupt EP1OUT_ISR { ep1_out = true; - EXIF &= ~0x10; /* Clear USBINT: Main global interrupt */ EPIRQ = 0x08; /* Clear individual EP1OUT IRQ */ } void ep2_isr(void)__interrupt EP2_ISR { - ep1_out = false; /* Does nothing but required by the compiler */ } void ep4_isr(void)__interrupt EP4_ISR { } void ep6_isr(void)__interrupt EP6_ISR { - i2c_recieve(); + ep6_out = true; EXIF &= ~0x10; /* Clear USBINT: Main global interrupt */ EPIRQ = 0x40; /* Clear individual EP6OUT IRQ */ diff --git a/src/jtag/drivers/angie/angie_firmware.bin b/src/jtag/drivers/angie/angie_firmware.bin index bc85208415324c9d2e92c0639a52433b8b98f5d2..68486ef8f09865c663966cf80cc334ec93405b5c 100644 GIT binary patch delta 4380 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 BRIC61 delta 4302 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