typedef uint32_t stm32_addr_t;
-struct stlink {
+enum transport_type
+{
+ TRANSPORT_TYPE_ZERO = 0,
+#if CONFIG_USE_LIBSG
+ TRANSPORT_TYPE_LIBSG,
+#endif /* CONFIG_USE_LIBSG */
+#if CONFIG_USE_LIBUSB
+ TRANSPORT_TYPE_LIBUSB,
+#endif /* CONFIG_USE_LIBUSB */
+ TRANSPORT_TYPE_INVALID
+};
+
+struct stlink_libusb
+{
+ libusb_device_handle* usb_handle;
+ struct libusb_transfer* req_trans;
+ struct libusb_transfer* rep_trans;
+ unsigned int ep_req;
+ unsigned int ep_rep;
+};
+
+struct stlink_libsg {
int sg_fd;
int do_scsi_pt_err;
// sg layer verboseness: 0 for no debug info, 10 for lots
size_t sram_size;
};
-struct stlink* stlink_quirk_open(const char *dev_name, const int verbose);
+struct stlink
+{
+ enum transport_type tt;
+ union {
+#if CONFIG_USE_LIBUSB
+ struct stlink_libusb *libusb;
+#endif /* CONFIG_USE_LIBUSB */
+#if CONFIG_USE_LIBSG
+ struct stlink_libsg *libsg;
+#endif /* CONFIG_USE_LIBSG */
+ } transport;
+
+ unsigned char q_buf[64];
+ size_t q_len;
+
+ /* layer independant */
+ uint32_t core_id;
+};
+
+
+struct stlink* stlink_quirk_open(enum transport_type tt, const char *dev_name, const int verbose);
int stlink_current_mode(struct stlink *sl);
void stlink_enter_swd_mode(struct stlink *sl);
void stlink_enter_jtag_mode(struct stlink *sl);
libusb_context* libusb_ctx = NULL;
-struct stlink_libusb
-{
- libusb_device_handle* usb_handle;
- struct libusb_transfer* req_trans;
- struct libusb_transfer* rep_trans;
- unsigned int ep_req;
- unsigned int ep_rep;
-};
-
struct trans_ctx
{
#define TRANS_FLAGS_IS_DONE (1 << 0)
}
-/* stlink layer independant interface */
-
-enum transport_type
-{
- TRANSPORT_TYPE_ZERO = 0,
-#if CONFIG_USE_LIBSG
- TRANSPORT_TYPE_LIBSG,
-#endif /* CONFIG_USE_LIBSG */
-#if CONFIG_USE_LIBUSB
- TRANSPORT_TYPE_LIBUSB,
-#endif /* CONFIG_USE_LIBUSB */
- TRANSPORT_TYPE_INVALID
-};
-
-struct stlink
-{
- enum transport_type tt;
- union
- {
-#if CONFIG_USE_LIBUSB
- struct stlink_libusb libusb;
-#endif /* CONFIG_USE_LIBUSB */
-#if CONFIG_USE_LIBSG
- void* libsg;
-#endif /* CONFIG_USE_LIBSG */
- } transport;
-
- unsigned char q_buf[64];
- size_t q_len;
-
- /* layer independant */
- uint32_t core_id;
-};
-
+// KARL - fixme, common code! (or, one per backend)
int stlink_initialize(enum transport_type tt)
{
switch (tt)
return 0;
}
+// candidate for common code...
void stlink_finalize(enum transport_type tt)
{
switch (tt)
}
#endif /* CONFIG_USE_LIBUSB */
-/* fwd decl */
-void stlink_close(struct stlink*);
struct stlink* stlink_quirk_open
(enum transport_type tt, const char *dev_name, const int verbose)
{
struct stlink* sl = NULL;
+ struct stlink_libusb* slu = NULL;
sl = malloc(sizeof(struct stlink));
+ slu = malloc(sizeof(struct stlink_libusb));
if (sl == NULL) goto on_error;
sl->tt = tt;
#if CONFIG_USE_LIBUSB
case TRANSPORT_TYPE_LIBUSB:
{
- struct stlink_libusb* const slu = &sl->transport.libusb;
int error = -1;
}
if (i == count) return NULL;
- if (libusb_open(dev, &slu->usb_handle))
+ if (libusb_open(dev, &(slu->usb_handle)))
{
printf("libusb_open()\n");
goto on_libusb_error;
stlink_close(sl);
return NULL;
}
+ sl->transport.libusb = slu;
break ;
}
#if CONFIG_USE_LIBUSB
case TRANSPORT_TYPE_LIBUSB:
{
- struct stlink_libusb* const handle = &sl->transport.libusb;
+ struct stlink_libusb* const handle = sl->transport.libusb;
if (handle->req_trans != NULL)
libusb_free_transfer(handle->req_trans);
#if CONFIG_USE_LIBUSB
case TRANSPORT_TYPE_LIBUSB:
{
- struct stlink_libusb* const slu = &sl->transport.libusb;
+ struct stlink_libusb* const slu = sl->transport.libusb;
unsigned char* const buf = sl->q_buf;
ssize_t size;
#if CONFIG_USE_LIBUSB
case TRANSPORT_TYPE_LIBUSB:
{
- struct stlink_libusb* const slu = &sl->transport.libusb;
+ struct stlink_libusb* const slu = sl->transport.libusb;
unsigned char* const buf = sl->q_buf;
ssize_t size;
#if CONFIG_USE_LIBUSB
case TRANSPORT_TYPE_LIBUSB:
{
- struct stlink_libusb* const slu = &sl->transport.libusb;
+ struct stlink_libusb* const slu = sl->transport.libusb;
unsigned char* const buf = sl->q_buf;
ssize_t size;
#if CONFIG_USE_LIBUSB
case TRANSPORT_TYPE_LIBUSB:
{
- struct stlink_libusb* const slu = &sl->transport.libusb;
+ struct stlink_libusb* const slu = sl->transport.libusb;
unsigned char* const buf = sl->q_buf;
ssize_t size;
#if CONFIG_USE_LIBUSB
case TRANSPORT_TYPE_LIBUSB:
{
- struct stlink_libusb* const slu = &sl->transport.libusb;
+ struct stlink_libusb* const slu = sl->transport.libusb;
unsigned char* const buf = sl->q_buf;
ssize_t size;
#if CONFIG_USE_LIBUSB
case TRANSPORT_TYPE_LIBUSB:
{
- struct stlink_libusb* const slu = &sl->transport.libusb;
+ struct stlink_libusb* const slu = sl->transport.libusb;
unsigned char* const buf = sl->q_buf;
ssize_t size;
#if CONFIG_USE_LIBUSB
case TRANSPORT_TYPE_LIBUSB:
{
- struct stlink_libusb* const slu = &sl->transport.libusb;
+ struct stlink_libusb* const slu = sl->transport.libusb;
unsigned char* const buf = sl->q_buf;
ssize_t size;
#if CONFIG_USE_LIBUSB
case TRANSPORT_TYPE_LIBUSB:
{
- struct stlink_libusb* const slu = &sl->transport.libusb;
+ struct stlink_libusb* const slu = sl->transport.libusb;
unsigned char* const buf = sl->q_buf;
ssize_t size;
#if CONFIG_USE_LIBUSB
case TRANSPORT_TYPE_LIBUSB:
{
- struct stlink_libusb* const slu = &sl->transport.libusb;
+ struct stlink_libusb* const slu = sl->transport.libusb;
unsigned char* const buf = sl->q_buf;
ssize_t size;
#if CONFIG_USE_LIBUSB
case TRANSPORT_TYPE_LIBUSB:
{
- struct stlink_libusb* const slu = &sl->transport.libusb;
+ struct stlink_libusb* const slu = sl->transport.libusb;
unsigned char* const buf = sl->q_buf;
ssize_t size;
#if CONFIG_USE_LIBUSB
case TRANSPORT_TYPE_LIBUSB:
{
- struct stlink_libusb* const slu = &sl->transport.libusb;
+ struct stlink_libusb* const slu = sl->transport.libusb;
unsigned char* const buf = sl->q_buf;
ssize_t size;