diff --git a/contrib/firmware/angie/c/include/jtag.h b/contrib/firmware/angie/c/include/jtag.h deleted file mode 100644 index 6d5df6480..000000000 --- a/contrib/firmware/angie/c/include/jtag.h +++ /dev/null @@ -1,31 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ -/**************************************************************************** - File : jtag.h * - Contents : Jtag handling functions header file for NanoXplore * - USB-JTAG ANGIE adapter hardware. * - Based on openULINK project code by: Martin Schmoelzer. * - Copyright 2023, Ahmed Errached BOUDJELIDA, NanoXplore SAS. * - * - * -*****************************************************************************/ - -#ifndef __JTAG_H -#define __JTAG_H - -#include - -uint16_t jtag_get_signals(void); -void jtag_configure_tck_delay(uint8_t scan_in, uint8_t scan_out, - uint8_t scan_io, uint8_t tck, uint8_t tms); -void jtag_clock_tms(uint8_t count, uint8_t sequence); -void jtag_slow_clock_tms(uint8_t count, uint8_t sequence); -void jtag_set_signals(uint8_t low, uint8_t high); -void jtag_clock_tck(uint16_t count); -void jtag_slow_clock_tck(uint16_t count); -void jtag_scan_in(uint8_t out_offset, uint8_t in_offset); -void jtag_scan_out(uint8_t out_offset); -void jtag_scan_io(uint8_t out_offset, uint8_t in_offset); -void jtag_slow_scan_in(uint8_t out_offset, uint8_t in_offset); -void jtag_slow_scan_out(uint8_t out_offset); -void jtag_slow_scan_io(uint8_t out_offset, uint8_t in_offset); -#endif diff --git a/contrib/firmware/angie/c/include/protocol.h b/contrib/firmware/angie/c/include/protocol.h deleted file mode 100644 index a12644b27..000000000 --- a/contrib/firmware/angie/c/include/protocol.h +++ /dev/null @@ -1,20 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ -/**************************************************************************** - File : protocol.h * - Contents : Jtag commands handling protocol header file for NanoXplore * - USB-JTAG ANGIE adapter hardware. * - Based on openULINK project code by: Martin Schmoelzer. * - Copyright 2023, Ahmed Errached BOUDJELIDA, NanoXplore SAS. * - * - * -*****************************************************************************/ - -#ifndef __PROTOCOL_H -#define __PROTOCOL_H - -#include - -bool execute_command(void); -void command_loop(void); - -#endif diff --git a/contrib/firmware/angie/c/src/jtag.c b/contrib/firmware/angie/c/src/jtag.c deleted file mode 100644 index 9a44cd0bf..000000000 --- a/contrib/firmware/angie/c/src/jtag.c +++ /dev/null @@ -1,674 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -/**************************************************************************** - File : jtag.c * - Contents : Jtag handling functions code for NanoXplore * - USB-JTAG ANGIE adapter hardware. * - Based on openULINK project code by: Martin Schmoelzer. * - Copyright 2023, Ahmed Errached BOUDJELIDA, NanoXplore SAS. * - * - * -*****************************************************************************/ - -#include "jtag.h" -#include "io.h" -#include "msgtypes.h" -#include "reg_ezusb.h" -#include -#include -#include - -/** Delay value for SCAN_IN operations with less than maximum TCK frequency */ -uint8_t delay_scan_in; - -/** Delay value for SCAN_OUT operations with less than maximum TCK frequency */ -uint8_t delay_scan_out; - -/** Delay value for SCAN_IO operations with less than maximum TCK frequency */ -uint8_t delay_scan_io; - -/** Delay value for CLOCK_TCK operations with less than maximum frequency */ -uint8_t delay_tck; - -/** Delay value for CLOCK_TMS operations with less than maximum frequency */ -uint8_t delay_tms; - -/** - * Perform JTAG SCAN-IN operation at maximum TCK frequency. - * - * Dummy data is shifted into the JTAG chain via TDI, TDO data is sampled and - * stored in the EP2 IN buffer. - * - * Maximum achievable TCK frequency is 182 kHz for ANGIE clocked at 24 MHz. - * - * @param out_offset offset in EP1OUTBUF where payload data starts - * @param in_offset - */ -void jtag_scan_in(uint8_t out_offset, uint8_t in_offset) -{ - uint8_t scan_size_bytes, bits_last_byte; - uint8_t tms_count_start, tms_count_end; - uint8_t tms_sequence_start, tms_sequence_end; - uint8_t tdo_data, i, j; - - uint8_t outb_buffer; - - /* Get parameters from EP1OUTBUF */ - scan_size_bytes = EP1OUTBUF[out_offset]; - bits_last_byte = EP1OUTBUF[out_offset + 1]; - tms_count_start = (EP1OUTBUF[out_offset + 2] >> 4) & 0x0F; - tms_count_end = EP1OUTBUF[out_offset + 2] & 0x0F; - tms_sequence_start = EP1OUTBUF[out_offset + 3]; - tms_sequence_end = EP1OUTBUF[out_offset + 4]; - - if (tms_count_start > 0) - jtag_clock_tms(tms_count_start, tms_sequence_start); - - outb_buffer = IOB & ~(bmbit1 | bmbit2 | bmbit3); - - /* Shift all bytes except the last byte */ - for (i = 0; i < scan_size_bytes - 1; i++) { - tdo_data = 0; - - for (j = 0; j < 8; j++) { - IOB = outb_buffer; /* TCK changes here */ - tdo_data = tdo_data >> 1; - IOB = (outb_buffer | bmbit2); - - if (PIN_TDO) - tdo_data |= 0x80; - } - - /* Copy TDO data to EP1INBUF */ - EP1INBUF[i + in_offset] = tdo_data; - } - tdo_data = 0; - - /* Shift the last byte */ - for (j = 0; j < bits_last_byte; j++) { - /* Assert TMS signal if requested and this is the last bit */ - if (j == (bits_last_byte - 1) && tms_count_end > 0) { - outb_buffer |= bmbit1; - tms_count_end--; - tms_sequence_end = tms_sequence_end >> 1; - } - - IOB = outb_buffer; /* TCK changes here */ - tdo_data = tdo_data >> 1; - IOB = (outb_buffer | bmbit2); - - if (PIN_TDO) - tdo_data |= 0x80; - } - tdo_data = tdo_data >> (8 - bits_last_byte); - - /* Copy TDO data to EP1INBUF */ - EP1INBUF[i + in_offset] = tdo_data; - - /* Move to correct end state */ - if (tms_count_end > 0) - jtag_clock_tms(tms_count_end, tms_sequence_end); -} - - -/** - * Perform JTAG SCAN-IN operation at variable TCK frequency. - * - * Dummy data is shifted into the JTAG chain via TDI, TDO data is sampled and - * stored in the EP2 IN buffer. - * - * Maximum achievable TCK frequency is 113 kHz for ANGIE clocked at 24 MHz. - * - * @param out_offset offset in EP1OUTBUF where payload data starts - * @param in_offset - */ -void jtag_slow_scan_in(uint8_t out_offset, uint8_t in_offset) -{ - uint8_t scan_size_bytes, bits_last_byte; - uint8_t tms_count_start, tms_count_end; - uint8_t tms_sequence_start, tms_sequence_end; - uint8_t tdo_data, i, j, k; - uint8_t outb_buffer; - - /* Get parameters from EP1OUTBUF */ - scan_size_bytes = EP1OUTBUF[out_offset]; - bits_last_byte = EP1OUTBUF[out_offset + 1]; - tms_count_start = (EP1OUTBUF[out_offset + 2] >> 4) & 0x0F; - tms_count_end = EP1OUTBUF[out_offset + 2] & 0x0F; - tms_sequence_start = EP1OUTBUF[out_offset + 3]; - tms_sequence_end = EP1OUTBUF[out_offset + 4]; - - if (tms_count_start > 0) - jtag_slow_clock_tms(tms_count_start, tms_sequence_start); - - outb_buffer = IOB & ~(bmbit3 | bmbit2 | bmbit1); - - /* Shift all bytes except the last byte */ - for (i = 0; i < scan_size_bytes - 1; i++) { - tdo_data = 0; - - for (j = 0; j < 8; j++) { - IOB = outb_buffer; /* TCK changes here */ - for (k = 0; k < delay_scan_in; k++) - ; - tdo_data = tdo_data >> 1; - - IOB = (outb_buffer | bmbit2); - for (k = 0; k < delay_scan_in; k++) - ; - - if (PIN_TDO) - tdo_data |= 0x80; - } - - /* Copy TDO data to EP1INBUF */ - EP1INBUF[i + in_offset] = tdo_data; - } - - tdo_data = 0; - - /* Shift the last byte */ - for (j = 0; j < bits_last_byte; j++) { - /* Assert TMS signal if requested and this is the last bit */ - if (j == (bits_last_byte - 1) && tms_count_end > 0) { - outb_buffer |= bmbit1; - tms_count_end--; - tms_sequence_end = tms_sequence_end >> 1; - } - - IOB = outb_buffer; /* TCK changes here */ - for (k = 0; k < delay_scan_in; k++) - ; - tdo_data = tdo_data >> 1; - - IOB = (outb_buffer | bmbit2); - for (k = 0; k < delay_scan_in; k++) - ; - - if (PIN_TDO) - tdo_data |= 0x80; - } - tdo_data = tdo_data >> (8 - bits_last_byte); - - /* Copy TDO data to EP1INBUF */ - EP1INBUF[i + in_offset] = tdo_data; - - /* Move to correct end state */ - if (tms_count_end > 0) - jtag_slow_clock_tms(tms_count_end, tms_sequence_end); -} - - -/** - * Perform JTAG SCAN-OUT operation at maximum TCK frequency. - * - * Data stored in EP2 OUT buffer is shifted into the JTAG chain via TDI, TDO - * data is not sampled. - * The TAP-FSM state is always left in the PAUSE-DR/PAUSE-IR state. - * - * Maximum achievable TCK frequency is 142 kHz for ANGIE clocked at 24 MHz. - * - * @param out_offset offset in EP1OUTBUF where payload data starts - */ -void jtag_scan_out(uint8_t out_offset) -{ - uint8_t scan_size_bytes, bits_last_byte; - uint8_t tms_count_start, tms_count_end; - uint8_t tms_sequence_start, tms_sequence_end; - uint8_t tdi_data, i, j; - uint8_t outb_buffer; - - /* Get parameters from EP1OUTBUF */ - scan_size_bytes = EP1OUTBUF[out_offset]; - bits_last_byte = EP1OUTBUF[out_offset + 1]; - tms_count_start = (EP1OUTBUF[out_offset + 2] >> 4) & 0x0F; - tms_count_end = EP1OUTBUF[out_offset + 2] & 0x0F; - tms_sequence_start = EP1OUTBUF[out_offset + 3]; - tms_sequence_end = EP1OUTBUF[out_offset + 4]; - - if (tms_count_start > 0) - jtag_clock_tms(tms_count_start, tms_sequence_start); - outb_buffer = IOB & ~(bmbit2 | bmbit1); - - /* Shift all bytes except the last byte */ - for (i = 0; i < scan_size_bytes - 1; i++) { - tdi_data = EP1OUTBUF[i + out_offset + 5]; - - for (j = 0; j < 8; j++) { - if (tdi_data & 0x01) - outb_buffer |= bmbit3; - else - outb_buffer &= ~bmbit3; - - IOB = outb_buffer; /* TDI and TCK change here */ - tdi_data = tdi_data >> 1; - IOB = (outb_buffer | bmbit2); - } - } - tdi_data = EP1OUTBUF[i + out_offset + 5]; - - /* Shift the last byte */ - for (j = 0; j < bits_last_byte; j++) { - if (tdi_data & 0x01) - outb_buffer |= bmbit3; - else - outb_buffer &= ~bmbit3; - - /* Assert TMS signal if requested and this is the last bit */ - if (j == (bits_last_byte - 1) && tms_count_end > 0) { - outb_buffer |= bmbit1; - tms_count_end--; - tms_sequence_end = tms_sequence_end >> 1; - } - IOB = outb_buffer; /* TDI and TCK change here */ - tdi_data = tdi_data >> 1; - IOB = (outb_buffer | bmbit2); - } - - /* Move to correct end state */ - if (tms_count_end > 0) - jtag_clock_tms(tms_count_end, tms_sequence_end); -} - -/** - * Perform JTAG SCAN-OUT operation at maximum TCK frequency. - * - * Data stored in EP2 OUT buffer is shifted into the JTAG chain via TDI, TDO - * data is not sampled. - * The TAP-FSM state is always left in the PAUSE-DR/PAUSE-IR state. - * - * Maximum achievable TCK frequency is 97 kHz for ANGIE clocked at 24 MHz. - * - * @param out_offset offset in EP1OUTBUF where payload data starts - */ -void jtag_slow_scan_out(uint8_t out_offset) -{ - uint8_t scan_size_bytes, bits_last_byte; - uint8_t tms_count_start, tms_count_end; - uint8_t tms_sequence_start, tms_sequence_end; - uint8_t tdi_data, i, j, k; - uint8_t outb_buffer; - - /* Get parameters from EP1OUTBUF */ - scan_size_bytes = EP1OUTBUF[out_offset]; - bits_last_byte = EP1OUTBUF[out_offset + 1]; - tms_count_start = (EP1OUTBUF[out_offset + 2] >> 4) & 0x0F; - tms_count_end = EP1OUTBUF[out_offset + 2] & 0x0F; - tms_sequence_start = EP1OUTBUF[out_offset + 3]; - tms_sequence_end = EP1OUTBUF[out_offset + 4]; - - if (tms_count_start > 0) - jtag_slow_clock_tms(tms_count_start, tms_sequence_start); - outb_buffer = IOB & ~(bmbit2 | bmbit1); - - /* Shift all bytes except the last byte */ - for (i = 0; i < scan_size_bytes - 1; i++) { - tdi_data = EP1OUTBUF[i + out_offset + 5]; - - for (j = 0; j < 8; j++) { - if (tdi_data & 0x01) - outb_buffer |= bmbit3; - else - outb_buffer &= ~bmbit3; - IOB = outb_buffer; /* TDI and TCK change here */ - for (k = 0; k < delay_scan_out; k++) - ; - tdi_data = tdi_data >> 1; - IOB = (outb_buffer | bmbit2); - for (k = 0; k < delay_scan_out; k++) - ; - } - } - tdi_data = EP1OUTBUF[i + out_offset + 5]; - - /* Shift the last byte */ - for (j = 0; j < bits_last_byte; j++) { - if (tdi_data & 0x01) - outb_buffer |= bmbit3; - else - outb_buffer &= ~bmbit3; - - /* Assert TMS signal if requested and this is the last bit */ - if (j == (bits_last_byte - 1) && tms_count_end > 0) { - outb_buffer |= bmbit1; - tms_count_end--; - tms_sequence_end = tms_sequence_end >> 1; - } - IOB = outb_buffer; /* TDI and TCK change here */ - for (k = 0; k < delay_scan_out; k++) - ; - tdi_data = tdi_data >> 1; - IOB = (outb_buffer | bmbit2); - for (k = 0; k < delay_scan_out; k++) - ; - } - - /* Move to correct end state */ - if (tms_count_end > 0) - jtag_slow_clock_tms(tms_count_end, tms_sequence_end); -} - - -/** - * Perform bidirectional JTAG SCAN operation at maximum TCK frequency. - * - * Data stored in EP2 OUT buffer is shifted into the JTAG chain via TDI, TDO - * data is sampled and stored in the EP2 IN buffer. - * The TAP-FSM state is always left in the PAUSE-DR/PAUSE-IR state. - * - * Maximum achievable TCK frequency is 100 kHz for ANGIE clocked at 24 MHz. - * - * @param out_offset offset in EP1OUTBUF where payload data starts - * @param in_offset - */ -int it; -void jtag_scan_io(uint8_t out_offset, uint8_t in_offset) -{ - uint8_t scan_size_bytes, bits_last_byte; - uint8_t tms_count_start, tms_count_end; - uint8_t tms_sequence_start, tms_sequence_end; - uint8_t tdi_data, tdo_data, i, j; - uint8_t outb_buffer; - - it++; - /* Get parameters from EP1OUTBUF */ - scan_size_bytes = EP1OUTBUF[out_offset]; - bits_last_byte = EP1OUTBUF[out_offset + 1]; - tms_count_start = (EP1OUTBUF[out_offset + 2] >> 4) & 0x0F; - tms_count_end = EP1OUTBUF[out_offset + 2] & 0x0F; - tms_sequence_start = EP1OUTBUF[out_offset + 3]; - tms_sequence_end = EP1OUTBUF[out_offset + 4]; - - if (tms_count_start > 0) - jtag_clock_tms(tms_count_start, tms_sequence_start); - outb_buffer = IOB & ~(bmbit2 | bmbit1); - - /* Shift all bytes except the last byte */ - for (i = 0; i < scan_size_bytes - 1; i++) { - tdi_data = EP1OUTBUF[i + out_offset + 5]; - tdo_data = 0; - for (j = 0; j < 8; j++) { - if (tdi_data & 0x01) - outb_buffer |= bmbit3; - else - outb_buffer &= ~bmbit3; - IOB = outb_buffer; /* TDI and TCK change here */ - tdi_data = tdi_data >> 1; - IOB = (outb_buffer | bmbit2); - tdo_data = tdo_data >> 1; - if (PIN_TDO) - tdo_data |= 0x80; - } - - /* Copy TDO data to EP1INBUF */ - EP1INBUF[i + in_offset] = tdo_data; - } - tdi_data = EP1OUTBUF[i + out_offset + 5]; - tdo_data = 0; - - /* Shift the last byte */ - for (j = 0; j < bits_last_byte; j++) { - if (tdi_data & 0x01) - outb_buffer |= bmbit3; - else - outb_buffer &= ~bmbit3; - - /* Assert TMS signal if requested and this is the last bit */ - if (j == (bits_last_byte - 1) && tms_count_end > 0) { - outb_buffer |= bmbit1; - tms_count_end--; - tms_sequence_end = tms_sequence_end >> 1; - } - IOB = outb_buffer; /* TDI and TCK change here */ - tdi_data = tdi_data >> 1; - IOB = (outb_buffer | bmbit2); - tdo_data = tdo_data >> 1; - if (PIN_TDO) - tdo_data |= 0x80; - } - tdo_data = tdo_data >> (8 - bits_last_byte); - - /* Copy TDO data to EP1INBUF */ - EP1INBUF[i + in_offset] = tdo_data; - - /* Move to correct end state */ - if (tms_count_end > 0) - jtag_clock_tms(tms_count_end, tms_sequence_end); -} - -/** - * Perform bidirectional JTAG SCAN operation at maximum TCK frequency. - * - * Data stored in EP2 OUT buffer is shifted into the JTAG chain via TDI, TDO - * data is sampled and stored in the EP2 IN buffer. - * The TAP-FSM state is always left in the PAUSE-DR/PAUSE-IR state. - * - * Maximum achievable TCK frequency is 78 kHz for ANGIE clocked at 24 MHz. - * - * @param out_offset offset in EP1OUTBUF where payload data starts - * @param in_offset - */ -void jtag_slow_scan_io(uint8_t out_offset, uint8_t in_offset) -{ - uint8_t scan_size_bytes, bits_last_byte; - uint8_t tms_count_start, tms_count_end; - uint8_t tms_sequence_start, tms_sequence_end; - uint8_t tdi_data, tdo_data, i, j, k; - uint8_t outb_buffer; - - /* Get parameters from EP1OUTBUF */ - scan_size_bytes = EP1OUTBUF[out_offset]; - bits_last_byte = EP1OUTBUF[out_offset + 1]; - tms_count_start = (EP1OUTBUF[out_offset + 2] >> 4) & 0x0F; - tms_count_end = EP1OUTBUF[out_offset + 2] & 0x0F; - tms_sequence_start = EP1OUTBUF[out_offset + 3]; - tms_sequence_end = EP1OUTBUF[out_offset + 4]; - - if (tms_count_start > 0) - jtag_slow_clock_tms(tms_count_start, tms_sequence_start); - outb_buffer = IOB & ~(bmbit2 | bmbit1); - - /* Shift all bytes except the last byte */ - for (i = 0; i < scan_size_bytes - 1; i++) { - tdi_data = EP1OUTBUF[i + out_offset + 5]; - tdo_data = 0; - for (j = 0; j < 8; j++) { - if (tdi_data & 0x01) - outb_buffer |= bmbit3; - else - outb_buffer &= ~bmbit3; - IOB = outb_buffer; /* TDI and TCK change here */ - for (k = 0; k < delay_scan_io; k++) - ; - tdi_data = tdi_data >> 1; - IOB = (outb_buffer | bmbit2); - for (k = 0; k < delay_scan_io; k++) - ; - tdo_data = tdo_data >> 1; - if (PIN_TDO) - tdo_data |= 0x80; - } - - /* Copy TDO data to EP1INBUF */ - EP1INBUF[i + in_offset] = tdo_data; - } - tdi_data = EP1OUTBUF[i + out_offset + 5]; - tdo_data = 0; - - /* Shift the last byte */ - for (j = 0; j < bits_last_byte; j++) { - if (tdi_data & 0x01) - outb_buffer |= bmbit3; - else - outb_buffer &= ~bmbit3; - - /* Assert TMS signal if requested and this is the last bit */ - if (j == (bits_last_byte - 1) && tms_count_end > 0) { - outb_buffer |= bmbit1; - tms_count_end--; - tms_sequence_end = tms_sequence_end >> 1; - } - IOB = outb_buffer; /* TDI and TCK change here */ - for (k = 0; k < delay_scan_io; k++) - ; - tdi_data = tdi_data >> 1; - IOB = (outb_buffer | bmbit2); - for (k = 0; k < delay_scan_io; k++) - ; - tdo_data = tdo_data >> 1; - if (PIN_TDO) - tdo_data |= 0x80; - } - tdo_data = tdo_data >> (8 - bits_last_byte); - - /* Copy TDO data to EP1INBUF */ - EP1INBUF[i + in_offset] = tdo_data; - - /* Move to correct end state */ - if (tms_count_end > 0) - jtag_slow_clock_tms(tms_count_end, tms_sequence_end); -} - -/** - * Generate TCK clock cycles. - * - * Maximum achievable TCK frequency is 375 kHz for ANGIE clocked at 24 MHz. - * - * @param count number of TCK clock cycles to generate. - */ -void jtag_clock_tck(uint16_t count) -{ - uint16_t i; - uint8_t outb_buffer = IOB & ~(bmbit2); - - for (i = 0; i < count; i++) { - IOB = outb_buffer; - IOB = outb_buffer | bmbit2; - } -} - -/** - * Generate TCK clock cycles at variable frequency. - * - * Maximum achievable TCK frequency is 166.6 kHz for ANGIE clocked at 24 MHz. - * - * @param count number of TCK clock cycles to generate. - */ -void jtag_slow_clock_tck(uint16_t count) -{ - uint16_t i; - uint8_t j; - uint8_t outb_buffer = IOB & ~(bmbit2); - - for (i = 0; i < count; i++) { - IOB = outb_buffer; - for (j = 0; j < delay_tck; j++) - ; - IOB = outb_buffer | bmbit2; - for (j = 0; j < delay_tck; j++) - ; - } -} - -/** - * Perform TAP FSM state transitions at maximum TCK frequency. - * - * Maximum achievable TCK frequency is 176 kHz for ANGIE clocked at 24 MHz. - * - * @param count the number of state transitions to perform. - * @param sequence the TMS pin levels for each state transition, starting with - * the least-significant bit. - */ -void jtag_clock_tms(uint8_t count, uint8_t sequence) -{ - uint8_t outb_buffer = IOB & ~(bmbit2); - uint8_t i; - - for (i = 0; i < count; i++) { - /* Set TMS pin according to sequence parameter */ - if (sequence & 0x1) - outb_buffer |= bmbit1; - else - outb_buffer &= ~bmbit1; - IOB = outb_buffer; - sequence = sequence >> 1; - IOB = outb_buffer | bmbit2; - } -} - -/** - * Perform TAP-FSM state transitions at less than maximum TCK frequency. - * - * Maximum achievable TCK frequency is 117 kHz for ANGIE clocked at 24 MHz. - * - * @param count the number of state transitions to perform. - * @param sequence the TMS pin levels for each state transition, starting with - * the least-significant bit. - */ -void jtag_slow_clock_tms(uint8_t count, uint8_t sequence) -{ - uint8_t outb_buffer = IOB & ~(bmbit2); - uint8_t i, j; - - for (i = 0; i < count; i++) { - /* Set TMS pin according to sequence parameter */ - if (sequence & 0x1) - outb_buffer |= bmbit1; - else - outb_buffer &= ~bmbit1; - IOB = outb_buffer; - for (j = 0; j < delay_tms; j++) - ; - sequence = sequence >> 1; - IOB = outb_buffer | bmbit2; - for (j = 0; j < delay_tms; j++) - ; - } -} - -uint16_t jtag_get_signals(void) -{ - uint8_t input_signal_state, output_signal_state; - input_signal_state = 0; - output_signal_state = 0; - - /* Get states of input pins */ - if (PIN_TDO) - input_signal_state |= SIGNAL_TDO; - - /* Get states of output pins */ - output_signal_state = IOB & MASK_PORTB_DIRECTION_OUT; - - return ((uint16_t)input_signal_state << 8) | ((uint16_t)output_signal_state); -} - -/** - * Set state of JTAG output signals. - * - * @param low signals which should be de-asserted. - * @param high signals which should be asserted. - */ -void jtag_set_signals(uint8_t low, uint8_t high) -{ - IOB &= ~(low & MASK_PORTB_DIRECTION_OUT); - IOB |= (high & MASK_PORTB_DIRECTION_OUT); -} - -/** - * Configure TCK delay parameters. - * - * @param scan_in number of delay cycles in scan_in operations. - * @param scan_out number of delay cycles in scan_out operations. - * @param scan_io number of delay cycles in scan_io operations. - * @param tck number of delay cycles in clock_tck operations. - * @param tms number of delay cycles in clock_tms operations. - */ -void jtag_configure_tck_delay(uint8_t scan_in, uint8_t scan_out, - uint8_t scan_io, uint8_t tck, uint8_t tms) -{ - delay_scan_in = scan_in; - delay_scan_out = scan_out; - delay_scan_io = scan_io; - delay_tck = tck; - delay_tms = tms; -} diff --git a/contrib/firmware/angie/c/src/protocol.c b/contrib/firmware/angie/c/src/protocol.c deleted file mode 100644 index e32808db8..000000000 --- a/contrib/firmware/angie/c/src/protocol.c +++ /dev/null @@ -1,192 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -/**************************************************************************** - File : protocol.c * - Contents : Jtag commands handling protocol code for NanoXplore * - USB-JTAG ANGIE adapter hardware. * - Based on openULINK project code by: Martin Schmoelzer. * - Copyright 2023, Ahmed Errached BOUDJELIDA, NanoXplore SAS. * - * - * -*****************************************************************************/ - -#include "usb.h" -#include "protocol.h" -#include "jtag.h" -#include "delay.h" -#include "io.h" -#include "msgtypes.h" -#include "reg_ezusb.h" -#include -#include - -/** Index in EP1 Bulk-OUT data buffer that contains the current command ID */ -volatile uint8_t cmd_id_index; - -/** Number of data bytes already in EP1 Bulk-IN buffer */ -volatile uint8_t payload_index_in; - -/** - * Executes one command and updates global command indexes. - * - * @return true if this command was the last command. - * @return false if there are more commands within the current contents of the - * Bulk EP1-OUT data buffer. - */ -bool execute_command(void) -{ - uint8_t usb_out_bytecount, usb_in_bytecount; - uint16_t signal_state = 0; - uint16_t count; - - /* Most commands do not transfer IN data. To save code space, we write 0 to - * usb_in_bytecount here, then modify it in the switch statement below where - * necessary */ - usb_in_bytecount = 0; - - switch (EP1OUTBUF[cmd_id_index] /* Command ID */) { - case CMD_SCAN_IN: - usb_out_bytecount = 5; - usb_in_bytecount = EP1OUTBUF[cmd_id_index + 1]; - jtag_scan_in((cmd_id_index + 1), payload_index_in); - break; - case CMD_SCAN_OUT: - usb_out_bytecount = EP1OUTBUF[cmd_id_index + 1] + 5; - jtag_scan_out(cmd_id_index + 1); - break; - case CMD_SCAN_IO: - usb_in_bytecount = EP1OUTBUF[cmd_id_index + 1]; - usb_out_bytecount = usb_in_bytecount + 5; - jtag_scan_io((cmd_id_index + 1), payload_index_in); - break; - case CMD_CLOCK_TMS: - usb_out_bytecount = 2; - jtag_clock_tms(EP1OUTBUF[cmd_id_index + 1], EP1OUTBUF[cmd_id_index + 2]); - break; - case CMD_CLOCK_TCK: - usb_out_bytecount = 2; - count = (uint16_t)EP1OUTBUF[cmd_id_index + 1]; - count |= ((uint16_t)EP1OUTBUF[cmd_id_index + 2]) << 8; - jtag_clock_tck(count); - break; - case CMD_SLOW_SCAN_IN: - usb_out_bytecount = 5; - usb_in_bytecount = EP1OUTBUF[cmd_id_index + 1]; - jtag_slow_scan_in(cmd_id_index + 1, payload_index_in); - break; - case CMD_SLOW_SCAN_OUT: - usb_out_bytecount = EP1OUTBUF[cmd_id_index + 1] + 5; - jtag_slow_scan_out(cmd_id_index + 1); - break; - case CMD_SLOW_SCAN_IO: - usb_in_bytecount = EP1OUTBUF[cmd_id_index + 1]; - usb_out_bytecount = usb_in_bytecount + 5; - jtag_slow_scan_io(cmd_id_index + 1, payload_index_in); - break; - case CMD_SLOW_CLOCK_TMS: - usb_out_bytecount = 2; - jtag_slow_clock_tms(EP1OUTBUF[cmd_id_index + 1], EP1OUTBUF[cmd_id_index + 2]); - break; - case CMD_SLOW_CLOCK_TCK: - usb_out_bytecount = 2; - count = (uint16_t)EP1OUTBUF[cmd_id_index + 1]; - count |= ((uint16_t)EP1OUTBUF[cmd_id_index + 2]) << 8; - jtag_slow_clock_tck(count); - break; - case CMD_SLEEP_US: - usb_out_bytecount = 2; - count = (uint16_t)EP1OUTBUF[cmd_id_index + 1]; - count |= ((uint16_t)EP1OUTBUF[cmd_id_index + 2]) << 8; - delay_us(count); - break; - case CMD_SLEEP_MS: - usb_out_bytecount = 2; - count = (uint16_t)EP1OUTBUF[cmd_id_index + 1]; - count |= ((uint16_t)EP1OUTBUF[cmd_id_index + 2]) << 8; - delay_ms(count); - break; - case CMD_GET_SIGNALS: - usb_out_bytecount = 0; - usb_in_bytecount = 2; - signal_state = jtag_get_signals(); - EP1INBUF[payload_index_in] = (signal_state >> 8); - EP1INBUF[payload_index_in + 1] = (signal_state & 0xFF); - break; - case CMD_SET_SIGNALS: - usb_out_bytecount = 2; - jtag_set_signals(EP1OUTBUF[cmd_id_index + 1], EP1OUTBUF[cmd_id_index + 2]); - break; - case CMD_CONFIGURE_TCK_FREQ: - usb_out_bytecount = 5; - jtag_configure_tck_delay(EP1OUTBUF[cmd_id_index + 1], /* scan_in */ - EP1OUTBUF[cmd_id_index + 2], /* scan_out */ - EP1OUTBUF[cmd_id_index + 3], /* scan_io */ - EP1OUTBUF[cmd_id_index + 4], /* clock_tck */ - EP1OUTBUF[cmd_id_index + 5]); /* clock_tms */ - break; - case CMD_TEST: - usb_out_bytecount = 1; - /* Do nothing... This command is only used to test if the device is ready - * to accept new commands */ - break; - default: - /* Should never be reached */ - usb_out_bytecount = 0; - break; - } - - /* Update EP1 Bulk-IN data byte count */ - payload_index_in += usb_in_bytecount; - - /* Determine if this was the last command */ - if ((cmd_id_index + usb_out_bytecount + 1) >= EP1OUTBC) - return true; - - /* Not the last command, update cmd_id_index */ - cmd_id_index += (usb_out_bytecount + 1); - return false; -} - -/** - * Forever wait for commands and execute them as they arrive. - */ -void command_loop(void) -{ - bool last_command; - while (1) { - cmd_id_index = 0; - payload_index_in = 0; - - /* Wait until host sends Bulk-OUT packet */ - while ((!ep1_out) && (!ep6_out)) - ; - 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); - } - } -} diff --git a/contrib/firmware/angie/c/src/usb.c b/contrib/firmware/angie/c/src/usb.c index ed23dcfa5..35f011f4e 100644 --- a/contrib/firmware/angie/c/src/usb.c +++ b/contrib/firmware/angie/c/src/usb.c @@ -20,124 +20,108 @@ #include #include "i2c.h" -/* Also update external declarations in "include/usb.h" if making changes to - * these variables! - */ -volatile bool ep1_out; -volatile bool ep1_in; -volatile bool ep6_out; - volatile __xdata __at 0xE6B8 struct setup_data setup_data; /* Define number of endpoints (except Control Endpoint 0) in a central place. * Be sure to include the necessary endpoint descriptors! */ -#define NUM_ENDPOINTS 3 +#define NUM_ENDPOINTS 2 + __code struct usb_device_descriptor device_descriptor = { - .blength = sizeof(struct usb_device_descriptor), - .bdescriptortype = DESCRIPTOR_TYPE_DEVICE, - .bcdusb = 0x0200, /* BCD: 02.00 (Version 2.0 USB spec) */ - .bdeviceclass = 0xEF, - .bdevicesubclass = 0x02, - .bdeviceprotocol = 0x01, - .bmaxpacketsize0 = 64, - .idvendor = 0x584e, - .idproduct = 0x414f, - .bcddevice = 0x0000, - .imanufacturer = 1, - .iproduct = 2, - .iserialnumber = 3, + .blength = sizeof(struct usb_device_descriptor), + .bdescriptortype = DESCRIPTOR_TYPE_DEVICE, + .bcdusb = 0x0200, /* BCD: 02.00 (Version 2.0 USB spec) */ + .bdeviceclass = 0xEF, + .bdevicesubclass = 0x02, + .bdeviceprotocol = 0x01, + .bmaxpacketsize0 = 64, + .idvendor = 0x584e, + .idproduct = 0x414f, + .bcddevice = 0x0000, + .imanufacturer = 1, + .iproduct = 2, + .iserialnumber = 3, .bnumconfigurations = 1 }; /* WARNING: ALL config, interface and endpoint descriptors MUST be adjacent! */ - __code struct usb_config_descriptor config_descriptor = { - .blength = sizeof(struct usb_config_descriptor), - .bdescriptortype = DESCRIPTOR_TYPE_CONFIGURATION, - .wtotallength = sizeof(struct usb_config_descriptor) + - 3 * sizeof(struct usb_interface_descriptor) + - ((NUM_ENDPOINTS + 2) * sizeof(struct usb_endpoint_descriptor)), - .bnuminterfaces = 2, + .blength = sizeof(struct usb_config_descriptor), + .bdescriptortype = DESCRIPTOR_TYPE_CONFIGURATION, + .wtotallength = sizeof(struct usb_config_descriptor) + + 2 * sizeof(struct usb_interface_descriptor) + + ((NUM_ENDPOINTS * 2) * sizeof(struct usb_endpoint_descriptor)), + .bnuminterfaces = 2, .bconfigurationvalue = 1, - .iconfiguration = 1, /* String describing this configuration */ - .bmattributes = 0x80, /* Only MSB set according to USB spec */ - .maxpower = 50 /* 100 mA */ + .iconfiguration = 4, /* String describing this configuration */ + .bmattributes = 0x80, /* Only MSB set according to USB spec */ + .maxpower = 50 /* 100 mA */ }; __code struct usb_interface_descriptor interface_descriptor00 = { - .blength = sizeof(struct usb_interface_descriptor), - .bdescriptortype = DESCRIPTOR_TYPE_INTERFACE, - .binterfacenumber = 0, + .blength = sizeof(struct usb_interface_descriptor), + .bdescriptortype = DESCRIPTOR_TYPE_INTERFACE, + .binterfacenumber = 0, .balternatesetting = 0, - .bnumendpoints = NUM_ENDPOINTS, - .binterfaceclass = 0XFF, + .bnumendpoints = NUM_ENDPOINTS, + .binterfaceclass = 0XFF, .binterfacesubclass = 0x00, .binterfaceprotocol = 0x00, - .iinterface = 4 -}; - -__code struct usb_endpoint_descriptor bulk_ep1_out_endpoint_descriptor = { - .blength = sizeof(struct usb_endpoint_descriptor), - .bdescriptortype = 0x05, - .bendpointaddress = (1 | USB_DIR_OUT), - .bmattributes = 0x02, - .wmaxpacketsize = 64, - .binterval = 0 -}; - -__code struct usb_endpoint_descriptor bulk_ep1_in_endpoint_descriptor = { - .blength = sizeof(struct usb_endpoint_descriptor), - .bdescriptortype = 0x05, - .bendpointaddress = (1 | USB_DIR_IN), - .bmattributes = 0x02, - .wmaxpacketsize = 64, - .binterval = 0 + .iinterface = 5 }; __code struct usb_endpoint_descriptor bulk_ep2_endpoint_descriptor = { - .blength = sizeof(struct usb_endpoint_descriptor), - .bdescriptortype = 0x05, - .bendpointaddress = (2 | USB_DIR_OUT), - .bmattributes = 0x02, - .wmaxpacketsize = 512, - .binterval = 0 + .blength = sizeof(struct usb_endpoint_descriptor), + .bdescriptortype = 0x05, + .bendpointaddress = (2 | USB_DIR_OUT), + .bmattributes = 0x02, + .wmaxpacketsize = 512, + .binterval = 0 +}; + +__code struct usb_endpoint_descriptor bulk_ep4_endpoint_descriptor = { + .blength = sizeof(struct usb_endpoint_descriptor), + .bdescriptortype = 0x05, + .bendpointaddress = (4 | USB_DIR_IN), + .bmattributes = 0x02, + .wmaxpacketsize = 512, + .binterval = 0 }; __code struct usb_interface_descriptor interface_descriptor01 = { - .blength = sizeof(struct usb_interface_descriptor), - .bdescriptortype = DESCRIPTOR_TYPE_INTERFACE, - .binterfacenumber = 1, + .blength = sizeof(struct usb_interface_descriptor), + .bdescriptortype = DESCRIPTOR_TYPE_INTERFACE, + .binterfacenumber = 1, .balternatesetting = 0, - .bnumendpoints = 2, - .binterfaceclass = 0x0A, + .bnumendpoints = NUM_ENDPOINTS, + .binterfaceclass = 0x0A, .binterfacesubclass = 0x00, .binterfaceprotocol = 0x00, - .iinterface = 0x00 + .iinterface = 6 }; __code struct usb_endpoint_descriptor bulk_ep6_out_endpoint_descriptor = { - .blength = sizeof(struct usb_endpoint_descriptor), - .bdescriptortype = 0x05, - .bendpointaddress = (6 | USB_DIR_OUT), - .bmattributes = 0x02, - .wmaxpacketsize = 512, - .binterval = 0 + .blength = sizeof(struct usb_endpoint_descriptor), + .bdescriptortype = 0x05, + .bendpointaddress = (6 | USB_DIR_OUT), + .bmattributes = 0x02, + .wmaxpacketsize = 512, + .binterval = 0 }; __code struct usb_endpoint_descriptor bulk_ep8_in_endpoint_descriptor = { - .blength = sizeof(struct usb_endpoint_descriptor), - .bdescriptortype = 0x05, - .bendpointaddress = (8 | USB_DIR_IN), - .bmattributes = 0x02, - .wmaxpacketsize = 512, - .binterval = 0 + .blength = sizeof(struct usb_endpoint_descriptor), + .bdescriptortype = 0x05, + .bendpointaddress = (8 | USB_DIR_IN), + .bmattributes = 0x02, + .wmaxpacketsize = 512, + .binterval = 0 }; __code struct usb_language_descriptor language_descriptor = { - .blength = 4, - .bdescriptortype = DESCRIPTOR_TYPE_STRING, - .wlangid = {0x0409} /* US English */ + .blength = 4, + .bdescriptortype = DESCRIPTOR_TYPE_STRING, + .wlangid = {0x0409} /* US English */ }; __code struct usb_string_descriptor strmanufacturer = @@ -195,15 +179,9 @@ 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 { @@ -213,10 +191,11 @@ void ep4_isr(void)__interrupt EP4_ISR } void ep6_isr(void)__interrupt EP6_ISR { - ep6_out = true; + REVCTL = 0; /* REVCTL.0 and REVCTL.1 set to 0 */ + 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 { @@ -523,15 +502,28 @@ bool usb_handle_get_descriptor(void) void usb_handle_set_interface(void) { /* Reset Data Toggle */ - usb_reset_data_toggle(USB_DIR_IN | 4); usb_reset_data_toggle(USB_DIR_OUT | 2); - - /* Unstall & clear busy flag of all valid IN endpoints */ - EP1INCS = 0 | EPBSY; + usb_reset_data_toggle(USB_DIR_IN | 4); + usb_reset_data_toggle(USB_DIR_OUT | 6); + usb_reset_data_toggle(USB_DIR_IN | 8); /* Unstall all valid OUT endpoints, reset bytecounts */ - EP1OUTCS = 0; - EP1OUTBC = 0; + EP2CS = 0; + EP4CS = 0; + EP6CS = 0; + EP8CS = 0; + syncdelay(3); + EP2BCH = 0; + EP2BCL = 0x80; + syncdelay(3); + EP4BCH = 0; + EP4BCL = 0x80; + syncdelay(3); + EP6BCH = 0; + EP6BCL = 0x80; + syncdelay(3); + EP8BCH = 0; + EP8BCL = 0x80; syncdelay(3); } @@ -672,8 +664,9 @@ void usb_handle_setup_data(void) case GET_INTERFACE: /* ANGIE only has one interface, return its number */ EP0BUF[0] = interface_descriptor00.binterfacenumber; + EP0BUF[1] = interface_descriptor01.binterfacenumber; EP0BCH = 0; - EP0BCL = 1; + EP0BCL = 2; syncdelay(3); break; case SET_INTERFACE: @@ -695,29 +688,21 @@ void usb_handle_setup_data(void) */ void ep_init(void) { - EP1INCFG = 0xA0; + EP1INCFG = 0x00; /* non VALID */ syncdelay(3); - EP1OUTCFG = 0xA0; - syncdelay(3); - EP2CFG = 0xA0; - syncdelay(3); - EP4CFG = 0x00; - syncdelay(3); - EP6CFG = 0xA2; - syncdelay(3); - EP8CFG = 0xE2; + EP1OUTCFG = 0x00; /* non VALID */ syncdelay(3); - /* arm EP1-OUT */ - EP1OUTBC = 0; + /* JTAG */ + EP2CFG = 0xA2; /* VALID | OUT | BULK | 512 Bytes | Double buffer */ syncdelay(3); - EP1OUTBC = 0; + EP4CFG = 0xE2; /* VALID | IN | BULK | 512 Bytes | Double buffer */ syncdelay(3); - /* arm EP1-IN */ - EP1INBC = 0; + /* I2C */ + EP6CFG = 0xA2; /* VALID | OUT | BULK | 512 Bytes | Double buffer */ syncdelay(3); - EP1INBC = 0; + EP8CFG = 0xE2; /* VALID | IN | BULK | 512 Bytes | Double buffer */ syncdelay(3); /* arm EP6-OUT */ @@ -726,16 +711,30 @@ void ep_init(void) EP6BCL = 0x80; syncdelay(3); + /* REVCTL.0 and REVCTL.1 set to 1 */ + REVCTL = 0x3; + /* Arm both EP2 buffers to “prime the pump” */ + OUTPKTEND = 0x82; + syncdelay(3); + OUTPKTEND = 0x82; + syncdelay(3); + /* Standard procedure to reset FIFOs */ FIFORESET = BMNAKALL; /* NAK all transfers during the reset */ syncdelay(3); - FIFORESET = 0x02; /* reset EP2 FIFO */ + FIFORESET = BMNAKALL | 0x02; /* reset EP2 FIFO */ + syncdelay(3); + FIFORESET = BMNAKALL | 0x04; /* reset EP4 FIFO */ syncdelay(3); FIFORESET = 0x00; /* deactivate the NAK all */ syncdelay(3); + + /* configure EP2 in AUTO mode with 8-bit interface */ EP2FIFOCFG = 0x00; syncdelay(3); - EP2FIFOCFG = BMAUTOOUT; /* Automatic 8-bit GPIF OUT mode */ + EP2FIFOCFG = BMAUTOOUT; /* 8-bit Auto OUT mode */ + syncdelay(3); + EP4FIFOCFG = BMAUTOIN | BMZEROLENIN; /* 8-bit Auto IN mode */ syncdelay(3); } @@ -841,9 +840,6 @@ void i2c_recieve(void) **/ void interrupt_init(void) { - /* Enable Interrupts */ - EA = 1; - /* Enable USB interrupt (EIE register) */ EUSB = 1; EICON |= 0x20; @@ -851,17 +847,20 @@ void interrupt_init(void) /* Enable INT 2 & 4 Autovectoring */ INTSETUP |= (AV2EN | AV4EN); - /* Enable individual EP1OUT&IN & EP6&8 interrupts */ - EPIE |= 0xCC; + /* Enable individual EP6&8 interrupts */ + EPIE |= 0xC0; /* Clear individual USB interrupt IRQ */ - EPIRQ = 0xCC; + EPIRQ = 0xC0; /* Enable SUDAV interrupt */ USBIEN |= SUDAVI; /* Clear SUDAV interrupt */ USBIRQ = SUDAVI; + + /* Enable Interrupts */ + EA = 1; } /** @@ -870,25 +869,12 @@ void interrupt_init(void) void io_init(void) { /* PORT A */ - PORTACFG = 0x01; /* 0: normal ou 1: alternate function (each bit) */ - OEA = 0xEF; /* all OUT exept INIT_B IN */ + PORTACFG = 0x0; /* 0: normal ou 1: alternate function (each bit) */ + OEA = 0xEF; IOA = 0xFF; - /* PORT B */ - OEB = 0xEF; /* all OUT exept TDO */ - IOB = 0xFF; - PIN_TRST = 1; - PIN_TMS = 0; - PIN_TCK = 0; - PIN_TDI = 0; - PIN_SRST = 1; - /* PORT C */ - PORTCCFG = 0x00; /* 0: normal ou 1: alternate function (each bit) */ + PORTCCFG = 0x0; /* 0: normal ou 1: alternate function (each bit) */ OEC = 0xFF; IOC = 0xFF; - - /* PORT D */ - OED = 0xFF; - IOD = 0xFF; }