Skip to content

Commit

Permalink
contrib/firmware: Change USB interruption handling for JTAG/I2C commu…
Browse files Browse the repository at this point in the history
…nications

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 <aboudjelida@nanoxplore.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/8074
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
  • Loading branch information
Ahmed BOUDJELIDA authored and en-sc committed Jan 29, 2024
1 parent ba860ab commit 0c2d907
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 26 deletions.
1 change: 1 addition & 0 deletions contrib/firmware/angie/c/include/usb.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
50 changes: 28 additions & 22 deletions contrib/firmware/angie/c/src/protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
6 changes: 2 additions & 4 deletions contrib/firmware/angie/c/src/usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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 */

Expand Down
Binary file modified src/jtag/drivers/angie/angie_firmware.bin
Binary file not shown.

0 comments on commit 0c2d907

Please sign in to comment.