|
From: openocd-gerrit <ope...@us...> - 2024-01-21 21:27:12
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via d8499687f8d2899508cb7cab3de750d944181b6a (commit)
from 43e1d60e77b7984e21a9250a530a34f64bab78c0 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit d8499687f8d2899508cb7cab3de750d944181b6a
Author: Ahmed BOUDJELIDA <abo...@na...>
Date: Mon Jan 15 15:45:49 2024 +0100
jtag/drivers: Correct ANGIE driver and GPIO Extender configuration
Correct GPIO Extender configuration, after reconsideration,
we need to configure the IO extender 0x23 pins as all inputs.
Add more LOG_ERRORs to the code to better track bugs.
Re-organize angie_init function
Change-Id: I1fcf4919ba9ea95576803dd35cce7dafa26853b4
Signed-off-by: Ahmed BOUDJELIDA <abo...@na...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8079
Tested-by: jenkins
Reviewed-by: Antonio Borneo <bor...@gm...>
diff --git a/src/jtag/drivers/angie.c b/src/jtag/drivers/angie.c
index dfe65a208..62079f015 100644
--- a/src/jtag/drivers/angie.c
+++ b/src/jtag/drivers/angie.c
@@ -168,7 +168,7 @@ static int angie_load_firmware_and_renumerate(struct angie *device, const char *
static int angie_load_firmware(struct angie *device, const char *filename);
static int angie_load_bitstream(struct angie *device, const char *filename);
static int angie_i2c_write(struct angie *device, uint8_t *i2c_data, uint8_t i2c_data_size);
-static void angie_io_extender_config(struct angie *device, uint8_t i2c_adr, uint8_t cfg_value, uint8_t value);
+static int angie_io_extender_config(struct angie *device, uint8_t i2c_adr, uint8_t cfg_value);
static int angie_write_firmware_section(struct angie *device,
struct image *firmware_image, int section_index);
@@ -262,8 +262,10 @@ static int angie_usb_open(struct angie *device)
int ret = jtag_libusb_open(vids, pids, NULL, &usb_device_handle, NULL);
- if (ret != ERROR_OK)
+ if (ret != ERROR_OK) {
+ LOG_ERROR("Could not find and open ANGIE");
return ret;
+ }
device->usb_device_handle = usb_device_handle;
device->type = ANGIE;
@@ -281,8 +283,10 @@ static int angie_usb_open(struct angie *device)
static int angie_usb_close(struct angie *device)
{
if (device->usb_device_handle) {
- if (libusb_release_interface(device->usb_device_handle, 0) != 0)
+ if (libusb_release_interface(device->usb_device_handle, 0) != 0) {
+ LOG_ERROR("Could not release interface 0");
return ERROR_FAIL;
+ }
jtag_libusb_close(device->usb_device_handle);
device->usb_device_handle = NULL;
@@ -383,8 +387,10 @@ static int angie_load_firmware(struct angie *device, const char *filename)
/* Download all sections in the image to ANGIE */
for (unsigned int i = 0; i < angie_firmware_image.num_sections; i++) {
ret = angie_write_firmware_section(device, &angie_firmware_image, i);
- if (ret != ERROR_OK)
+ if (ret != ERROR_OK) {
+ LOG_ERROR("Could not write firmware section");
return ret;
+ }
}
image_close(&angie_firmware_image);
@@ -477,7 +483,7 @@ static int angie_load_bitstream(struct angie *device, const char *filename)
ret = jtag_libusb_control_transfer(device->usb_device_handle,
0x00, 0xB1, 0, 0, NULL, 0, LIBUSB_TIMEOUT_MS, &transferred);
if (ret != ERROR_OK) {
- LOG_INFO("error cfgclose");
+ LOG_ERROR("Failed cfgclose");
/* Abort if libusb sent less data than requested */
return ERROR_FAIL;
}
@@ -509,12 +515,10 @@ static int angie_i2c_write(struct angie *device, uint8_t *i2c_data, uint8_t i2c_
i2c_data_size + 2, 1000, &transferred);
if (ret != ERROR_OK) {
LOG_ERROR("Error in i2c clock gen configuration : ret ERROR");
- angie_quit();
return ret;
}
if (transferred != i2c_data_size + 2) {
LOG_ERROR("Error in i2c clock gen configuration : bytes transferred");
- angie_quit();
return ERROR_FAIL;
}
@@ -524,7 +528,6 @@ static int angie_i2c_write(struct angie *device, uint8_t *i2c_data, uint8_t i2c_
ret = jtag_libusb_bulk_write(device->usb_device_handle, 0x88, buffer_received, 1, 1000, &transferred);
if (ret != ERROR_OK) {
LOG_ERROR("Error in i2c clock gen configuration : ret ERROR");
- angie_quit();
return ret;
}
return ERROR_OK;
@@ -541,13 +544,15 @@ static int angie_i2c_write(struct angie *device, uint8_t *i2c_data, uint8_t i2c_
* @return on success: ERROR_OK
* @return on failure: ERROR_FAIL
*/
-static void angie_io_extender_config(struct angie *device, uint8_t i2c_adr, uint8_t cfg_value, uint8_t value)
+static int angie_io_extender_config(struct angie *device, uint8_t i2c_adr, uint8_t cfg_value)
{
uint8_t ioconfig[3] = {i2c_adr, 3, cfg_value};
- angie_i2c_write(device, ioconfig, 3);
- uint8_t iovalue[3] = {i2c_adr, 1, value};
- angie_i2c_write(device, iovalue, 3);
+ int ret = angie_i2c_write(device, ioconfig, 3);
+ if (ret != ERROR_OK)
+ return ret;
+
usleep(500);
+ return ret;
}
/**
@@ -851,19 +856,27 @@ static int angie_execute_queued_commands(struct angie *device, int timeout_ms)
/* Send packet to ANGIE */
ret = jtag_libusb_bulk_write(device->usb_device_handle, device->ep_out,
(char *)buffer, count_out, timeout_ms, &transferred);
- if (ret != ERROR_OK)
+ if (ret != ERROR_OK) {
+ LOG_ERROR("Libusb bulk write queued commands failed.");
return ret;
- if (transferred != count_out)
+ }
+ if (transferred != count_out) {
+ LOG_ERROR("Libusb bulk write queued commands failed: transferred byte count");
return ERROR_FAIL;
+ }
/* Wait for response if commands contain IN payload data */
if (count_in > 0) {
ret = jtag_libusb_bulk_write(device->usb_device_handle, device->ep_in,
(char *)buffer, count_in, timeout_ms, &transferred);
- if (ret != ERROR_OK)
- return ret;
- if (transferred != count_in)
- return ERROR_FAIL;
+ if (ret != ERROR_OK) {
+ LOG_ERROR("Libusb bulk write input payload data failed");
+ return ret;
+ }
+ if (transferred != count_in) {
+ LOG_ERROR("Libusb bulk write input payload data failed: transferred byte count");
+ return ERROR_FAIL;
+ }
/* Write back IN payload data */
index_in = 0;
@@ -2230,7 +2243,6 @@ static int angie_init(void)
ret = angie_usb_open(angie_handle);
if (ret != ERROR_OK) {
- LOG_ERROR("Could not open ANGIE device");
free(angie_handle);
angie_handle = NULL;
return ret;
@@ -2249,10 +2261,10 @@ static int angie_init(void)
if (download_firmware) {
LOG_INFO("Loading ANGIE firmware. This is reversible by power-cycling ANGIE device.");
-
- if (libusb_claim_interface(angie_handle->usb_device_handle, 0) != LIBUSB_SUCCESS)
- LOG_ERROR("Could not claim interface");
-
+ if (libusb_claim_interface(angie_handle->usb_device_handle, 0) != LIBUSB_SUCCESS) {
+ LOG_ERROR("Could not claim interface 0");
+ return ERROR_FAIL;
+ }
ret = angie_load_firmware_and_renumerate(angie_handle,
ANGIE_FIRMWARE_FILE, ANGIE_RENUMERATION_DELAY_US);
if (ret != ERROR_OK) {
@@ -2266,45 +2278,29 @@ static int angie_init(void)
angie_quit();
return ret;
}
+ if (libusb_release_interface(angie_handle->usb_device_handle, 0) != LIBUSB_SUCCESS) {
+ LOG_ERROR("Fail release interface 0");
+ return ERROR_FAIL;
+ }
if (libusb_claim_interface(angie_handle->usb_device_handle, 1) != LIBUSB_SUCCESS) {
LOG_ERROR("Could not claim interface 1");
- angie_quit();
return ERROR_FAIL;
}
- angie_io_extender_config(angie_handle, 0x22, 0xFF, 0xFF);
- if (ret != ERROR_OK) {
- LOG_ERROR("Could not configure io extender 22");
- angie_quit();
- return ret;
- }
- angie_io_extender_config(angie_handle, 0x23, 0xFF, 0xFF);
+ /* Configure io extender 23: all input */
+ ret = angie_io_extender_config(angie_handle, 0x23, 0xFF);
if (ret != ERROR_OK) {
LOG_ERROR("Could not configure io extender 23");
- angie_quit();
- return ret;
- }
- angie_io_extender_config(angie_handle, 0x24, 0x1F, 0x9F);
- if (ret != ERROR_OK) {
- LOG_ERROR("Could not configure io extender 24");
- angie_quit();
- return ret;
- }
- angie_io_extender_config(angie_handle, 0x25, 0x07, 0x00);
- if (ret != ERROR_OK) {
- LOG_ERROR("Could not configure io extender 25");
- angie_quit();
return ret;
}
if (libusb_release_interface(angie_handle->usb_device_handle, 1) != LIBUSB_SUCCESS) {
LOG_ERROR("Fail release interface 1");
- angie_quit();
return ERROR_FAIL;
}
} else {
LOG_INFO("ANGIE device is already running ANGIE firmware");
}
- /* Get ANGIE USB IN/OUT endpoints and claim the interface */
+ /* Get ANGIE USB IN/OUT endpoints and claim the interface 0 */
ret = jtag_libusb_choose_interface(angie_handle->usb_device_handle,
&angie_handle->ep_in, &angie_handle->ep_out, 0xFF, 0, 0, -1);
if (ret != ERROR_OK) {
@@ -2319,6 +2315,7 @@ static int angie_init(void)
/* Issue one test command with short timeout */
ret = angie_append_test_cmd(angie_handle);
if (ret != ERROR_OK) {
+ LOG_ERROR("Append test command failed.");
angie_quit();
return ret;
}
@@ -2345,14 +2342,16 @@ static int angie_init(void)
angie_clear_queue(angie_handle);
+ /* Execute get signals command */
ret = angie_append_get_signals_cmd(angie_handle);
if (ret != ERROR_OK) {
+ LOG_ERROR("Append get signals command failed");
angie_quit();
return ret;
}
-
ret = angie_execute_queued_commands(angie_handle, 200);
if (ret != ERROR_OK) {
+ LOG_ERROR("Execute get signals command failed");
angie_quit();
return ret;
}
-----------------------------------------------------------------------
Summary of changes:
src/jtag/drivers/angie.c | 93 ++++++++++++++++++++++++------------------------
1 file changed, 46 insertions(+), 47 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|