aboutsummaryrefslogtreecommitdiff
path: root/src/platforms/libftdi/platform.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/platforms/libftdi/platform.c')
-rw-r--r--src/platforms/libftdi/platform.c71
1 files changed, 48 insertions, 23 deletions
diff --git a/src/platforms/libftdi/platform.c b/src/platforms/libftdi/platform.c
index d7f11dd..37f876b 100644
--- a/src/platforms/libftdi/platform.c
+++ b/src/platforms/libftdi/platform.c
@@ -17,14 +17,12 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "platform.h"
+#include "general.h"
#include "gdb_if.h"
-#include "jtag_scan.h"
+#include "version.h"
-#include <stdio.h>
-#include <string.h>
#include <assert.h>
-#include <unistd.h>
+#include <sys/time.h>
struct ftdi_context *ftdic;
@@ -49,6 +47,15 @@ static struct cable_desc_s {
.interface = INTERFACE_A,
.dbus_data = 0x08,
.dbus_ddr = 0x1B,
+ .description = "FLOSS-JTAG",
+ .name = "flossjtag"
+ },
+ {
+ .vendor = 0x0403,
+ .product = 0x6010,
+ .interface = INTERFACE_A,
+ .dbus_data = 0x08,
+ .dbus_ddr = 0x1B,
.description = "FTDIJTAG",
.name = "ftdijtag"
},
@@ -112,11 +119,11 @@ static struct cable_desc_s {
},
};
-int platform_init(int argc, char **argv)
-{
+void platform_init(int argc, char **argv)
+{
int err;
int c;
- int index = 0;
+ unsigned index = 0;
char *serial = NULL;
char * cablename = "ftdi";
uint8_t ftdi_init[9] = {TCK_DIVISOR, 0x01, 0x00, SET_BITS_LOW, 0,0,
@@ -140,7 +147,7 @@ int platform_init(int argc, char **argv)
if (index == sizeof(cable_desc)/sizeof(cable_desc[0])){
fprintf(stderr, "No cable matching %s found\n",cablename);
- return -1;
+ exit(-1);
}
if (cable_desc[index].dbus_data)
@@ -152,46 +159,51 @@ int platform_init(int argc, char **argv)
if(cable_desc[index].cbus_ddr)
ftdi_init[8]= cable_desc[index].cbus_ddr;
+ printf("\nBlack Magic Probe (" FIRMWARE_VERSION ")\n");
+ printf("Copyright (C) 2015 Black Sphere Technologies Ltd.\n");
+ printf("License GPLv3+: GNU GPL version 3 or later "
+ "<http://gnu.org/licenses/gpl.html>\n\n");
+
if(ftdic) {
ftdi_usb_close(ftdic);
ftdi_free(ftdic);
ftdic = NULL;
}
if((ftdic = ftdi_new()) == NULL) {
- fprintf(stderr, "ftdi_new: %s\n",
+ fprintf(stderr, "ftdi_new: %s\n",
ftdi_get_error_string(ftdic));
abort();
}
if((err = ftdi_set_interface(ftdic, cable_desc[index].interface)) != 0) {
- fprintf(stderr, "ftdi_set_interface: %d: %s\n",
+ fprintf(stderr, "ftdi_set_interface: %d: %s\n",
err, ftdi_get_error_string(ftdic));
abort();
}
if((err = ftdi_usb_open_desc(
ftdic, cable_desc[index].vendor, cable_desc[index].product,
cable_desc[index].description, serial)) != 0) {
- fprintf(stderr, "unable to open ftdi device: %d (%s)\n",
+ fprintf(stderr, "unable to open ftdi device: %d (%s)\n",
err, ftdi_get_error_string(ftdic));
abort();
}
if((err = ftdi_set_latency_timer(ftdic, 1)) != 0) {
- fprintf(stderr, "ftdi_set_latency_timer: %d: %s\n",
+ fprintf(stderr, "ftdi_set_latency_timer: %d: %s\n",
err, ftdi_get_error_string(ftdic));
abort();
}
if((err = ftdi_set_baudrate(ftdic, 1000000)) != 0) {
- fprintf(stderr, "ftdi_set_baudrate: %d: %s\n",
+ fprintf(stderr, "ftdi_set_baudrate: %d: %s\n",
err, ftdi_get_error_string(ftdic));
abort();
}
if((err = ftdi_usb_purge_buffers(ftdic)) != 0) {
- fprintf(stderr, "ftdi_set_baudrate: %d: %s\n",
+ fprintf(stderr, "ftdi_set_baudrate: %d: %s\n",
err, ftdi_get_error_string(ftdic));
abort();
}
if((err = ftdi_write_data_set_chunksize(ftdic, BUF_SIZE)) != 0) {
- fprintf(stderr, "ftdi_write_data_set_chunksize: %d: %s\n",
+ fprintf(stderr, "ftdi_write_data_set_chunksize: %d: %s\n",
err, ftdi_get_error_string(ftdic));
abort();
}
@@ -203,12 +215,7 @@ int platform_init(int argc, char **argv)
}
assert(ftdi_write_data(ftdic, ftdi_init, 9) == 9);
-
assert(gdb_if_init() == 0);
-
- jtag_scan(NULL);
-
- return 0;
}
void platform_buffer_flush(void)
@@ -241,9 +248,9 @@ int vasprintf(char **strp, const char *fmt, va_list ap)
int size = 128, ret = 0;
*strp = malloc(size);
- while(*strp && ((ret = vsnprintf(*strp, size, fmt, ap)) == size))
+ while(*strp && ((ret = vsnprintf(*strp, size, fmt, ap)) == size))
*strp = realloc(*strp, size <<= 1);
-
+
return ret;
}
#endif
@@ -258,3 +265,21 @@ void platform_delay(uint32_t delay)
usleep(delay * 100000);
}
+static uint32_t timeout_time;
+static uint32_t time_ms(void)
+{
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ return (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
+}
+
+void platform_timeout_set(uint32_t ms)
+{
+ timeout_time = time_ms() + ms;
+}
+
+bool platform_timeout_is_expired(void)
+{
+ return time_ms() > timeout_time;
+}
+