]> git.sur5r.net Git - openocd/blobdiff - src/jtag/drivers/usbprog.c
jtag_interface: .speed can be NULL when not needed
[openocd] / src / jtag / drivers / usbprog.c
index f6d8a97289454b6b1abe1311d08d97fac10e8638..77e7a7a824448a104b95f432a37f74afe24adf77 100644 (file)
 #include <jtag/commands.h>
 #include "usb_common.h"
 
-
 #define VID 0x1781
 #define PID 0x0c63
 
 /* Pins at usbprog */
-#define TDO_BIT                        0
-#define TDI_BIT                        3
-#define TCK_BIT                        2
-#define TMS_BIT                        1
+#define TDO_BIT                 0
+#define TDI_BIT                 3
+#define TCK_BIT                 2
+#define TMS_BIT                 1
 
 static void usbprog_end_state(tap_state_t state);
 static void usbprog_state_move(void);
@@ -54,33 +53,32 @@ static void usbprog_path_move(struct pathmove_command *cmd);
 static void usbprog_runtest(int num_cycles);
 static void usbprog_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, int scan_size);
 
-#define UNKOWN_COMMAND 0x00
-#define PORT_DIRECTION 0x01
-#define PORT_SET               0x02
-#define PORT_GET               0x03
-#define PORT_SETBIT            0x04
-#define PORT_GETBIT            0x05
-#define WRITE_TDI              0x06
-#define READ_TDO               0x07
-#define WRITE_AND_READ 0x08
-#define WRITE_TMS              0x09
-#define WRITE_TMS_CHAIN        0x0A
-
-struct usbprog_jtag
-{
-       struct usb_dev_handle* usb_handle;
+#define UNKNOWN_COMMAND 0x00
+#define PORT_DIRECTION  0x01
+#define PORT_SET                0x02
+#define PORT_GET                0x03
+#define PORT_SETBIT             0x04
+#define PORT_GETBIT             0x05
+#define WRITE_TDI               0x06
+#define READ_TDO                0x07
+#define WRITE_AND_READ  0x08
+#define WRITE_TMS               0x09
+#define WRITE_TMS_CHAIN 0x0A
+
+struct usbprog_jtag {
+       struct usb_dev_handle *usb_handle;
 };
 
-static struct usbprog_jtag * usbprog_jtag_handle;
+static struct usbprog_jtag *usbprog_jtag_handle;
 
-static struct usbprog_jtagusbprog_jtag_open(void);
-//static void usbprog_jtag_close(struct usbprog_jtag *usbprog_jtag);
+static struct usbprog_jtag *usbprog_jtag_open(void);
+/* static void usbprog_jtag_close(struct usbprog_jtag *usbprog_jtag); */
 static void usbprog_jtag_init(struct usbprog_jtag *usbprog_jtag);
 static unsigned char usbprog_jtag_message(struct usbprog_jtag *usbprog_jtag, char *msg, int msglen);
 
-static void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buffer, int size);
-static void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buffer, int size);
-static void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char * buffer, int size);
+static void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char *buffer, int size);
+static void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char *buffer, int size);
+static void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char *buffer, int size);
 static void usbprog_jtag_write_tms(struct usbprog_jtag *usbprog_jtag, char tms_scan);
 
 static char tms_chain[64];
@@ -93,80 +91,76 @@ static void usbprog_write(int tck, int tms, int tdi);
 static void usbprog_reset(int trst, int srst);
 
 static void usbprog_jtag_set_direction(struct usbprog_jtag *usbprog_jtag, unsigned char direction);
-static void usbprog_jtag_write_slice(struct usbprog_jtag *usbprog_jtag,unsigned char value);
-//static unsigned char usbprog_jtag_get_port(struct usbprog_jtag *usbprog_jtag);
-static void usbprog_jtag_set_bit(struct usbprog_jtag *usbprog_jtag,int bit, int value);
-//static int usbprog_jtag_get_bit(struct usbprog_jtag *usbprog_jtag, int bit);
-
-static int usbprog_speed(int speed)
-{
-       return ERROR_OK;
-}
+static void usbprog_jtag_write_slice(struct usbprog_jtag *usbprog_jtag, unsigned char value);
+/* static unsigned char usbprog_jtag_get_port(struct usbprog_jtag *usbprog_jtag); */
+static void usbprog_jtag_set_bit(struct usbprog_jtag *usbprog_jtag, int bit, int value);
+/* static int usbprog_jtag_get_bit(struct usbprog_jtag *usbprog_jtag, int bit); */
 
 static int usbprog_execute_queue(void)
 {
-       struct jtag_command *cmd = jtag_command_queue; /* currently processed command */
+       struct jtag_command *cmd = jtag_command_queue;  /* currently processed command */
        int scan_size;
        enum scan_type type;
        uint8_t *buffer;
 
-       while (cmd)
-       {
-               switch (cmd->type)
-               {
-                       case JTAG_RESET:
+       while (cmd) {
+               switch (cmd->type) {
+                   case JTAG_RESET:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
+                           LOG_DEBUG("reset trst: %i srst %i",
+                               cmd->cmd.reset->trst,
+                               cmd->cmd.reset->srst);
 #endif
-                               if (cmd->cmd.reset->trst == 1)
-                               {
-                                       tap_set_state(TAP_RESET);
-                               }
-                               usbprog_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
-                               break;
-                       case JTAG_RUNTEST:
+                           if (cmd->cmd.reset->trst == 1)
+                                   tap_set_state(TAP_RESET);
+                           usbprog_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
+                           break;
+                   case JTAG_RUNTEST:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->end_state);
+                           LOG_DEBUG("runtest %i cycles, end in %i",
+                               cmd->cmd.runtest->num_cycles,
+                               cmd->cmd.runtest->end_state);
 #endif
-                               usbprog_end_state(cmd->cmd.runtest->end_state);
-                               usbprog_runtest(cmd->cmd.runtest->num_cycles);
-                               break;
-                       case JTAG_STATEMOVE:
+                           usbprog_end_state(cmd->cmd.runtest->end_state);
+                           usbprog_runtest(cmd->cmd.runtest->num_cycles);
+                           break;
+                   case JTAG_TLR_RESET:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("statemove end in %i", cmd->cmd.statemove->end_state);
+                           LOG_DEBUG("statemove end in %i", cmd->cmd.statemove->end_state);
 #endif
-                               usbprog_end_state(cmd->cmd.statemove->end_state);
-                               usbprog_state_move();
-                               break;
-                       case JTAG_PATHMOVE:
+                           usbprog_end_state(cmd->cmd.statemove->end_state);
+                           usbprog_state_move();
+                           break;
+                   case JTAG_PATHMOVE:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("pathmove: %i states, end in %i", cmd->cmd.pathmove->num_states,
-                                       cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
+                           LOG_DEBUG("pathmove: %i states, end in %i",
+                               cmd->cmd.pathmove->num_states,
+                               cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
 #endif
-                               usbprog_path_move(cmd->cmd.pathmove);
-                               break;
-                       case JTAG_SCAN:
+                           usbprog_path_move(cmd->cmd.pathmove);
+                           break;
+                   case JTAG_SCAN:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("scan end in %i", cmd->cmd.scan->end_state);
+                           LOG_DEBUG("scan end in %i", cmd->cmd.scan->end_state);
 #endif
-                               usbprog_end_state(cmd->cmd.scan->end_state);
-                               scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
-                               type = jtag_scan_type(cmd->cmd.scan);
-                               usbprog_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size);
-                               if (jtag_read_buffer(buffer, cmd->cmd.scan) != ERROR_OK)
-                                       return ERROR_JTAG_QUEUE_FAILED;
-                               if (buffer)
-                                       free(buffer);
-                               break;
-                       case JTAG_SLEEP:
+                           usbprog_end_state(cmd->cmd.scan->end_state);
+                           scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
+                           type = jtag_scan_type(cmd->cmd.scan);
+                           usbprog_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size);
+                           if (jtag_read_buffer(buffer, cmd->cmd.scan) != ERROR_OK)
+                                   return ERROR_JTAG_QUEUE_FAILED;
+                           if (buffer)
+                                   free(buffer);
+                           break;
+                   case JTAG_SLEEP:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("sleep %i", cmd->cmd.sleep->us);
+                           LOG_DEBUG("sleep %i", cmd->cmd.sleep->us);
 #endif
-                               jtag_sleep(cmd->cmd.sleep->us);
-                                       break;
-                       default:
-                               LOG_ERROR("BUG: unknown JTAG command type encountered");
-                               exit(-1);
+                           jtag_sleep(cmd->cmd.sleep->us);
+                           break;
+                   default:
+                           LOG_ERROR("BUG: unknown JTAG command type encountered");
+                           exit(-1);
                }
 
                cmd = cmd->next;
@@ -180,8 +174,7 @@ static int usbprog_init(void)
        usbprog_jtag_handle = usbprog_jtag_open();
 
        tms_chain_index = 0;
-       if (usbprog_jtag_handle == 0)
-       {
+       if (usbprog_jtag_handle == 0) {
                LOG_ERROR("Can't find USB JTAG Interface! Please check connection and permissions.");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -205,8 +198,7 @@ static void usbprog_end_state(tap_state_t state)
 {
        if (tap_is_state_stable(state))
                tap_set_end_state(state);
-       else
-       {
+       else {
                LOG_ERROR("BUG: %i is not a valid end state", state);
                exit(-1);
        }
@@ -214,15 +206,9 @@ static void usbprog_end_state(tap_state_t state)
 
 static void usbprog_state_move(void)
 {
-       int i = 0, tms = 0;
        uint8_t tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
-       int tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
 
        usbprog_jtag_write_tms(usbprog_jtag_handle, (char)tms_scan);
-       for (i = 0; i < tms_count; i++)
-       {
-               tms = (tms_scan >> i) & 1;
-       }
 
        tap_set_state(tap_get_end_state());
 }
@@ -237,23 +223,20 @@ static void usbprog_path_move(struct pathmove_command *cmd)
        usbprog_jtag_tms_send(usbprog_jtag_handle);
 
        state_count = 0;
-       while (num_states)
-       {
-               if (tap_state_transition(tap_get_state(), false) == cmd->path[state_count])
-               {
+       while (num_states) {
+               if (tap_state_transition(tap_get_state(), false) == cmd->path[state_count]) {
                        /* LOG_INFO("1"); */
                        usbprog_write(0, 0, 0);
                        usbprog_write(1, 0, 0);
-               }
-               else if (tap_state_transition(tap_get_state(), true) == cmd->path[state_count])
-               {
+               } else if (tap_state_transition(tap_get_state(),
+                                  true) == cmd->path[state_count]) {
                        /* LOG_INFO("2"); */
                        usbprog_write(0, 1, 0);
                        usbprog_write(1, 1, 0);
-               }
-               else
-               {
-                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(tap_get_state()), tap_state_name(cmd->path[state_count]));
+               } else {
+                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition",
+                               tap_state_name(tap_get_state()),
+                               tap_state_name(cmd->path[state_count]));
                        exit(-1);
                }
 
@@ -270,32 +253,28 @@ static void usbprog_runtest(int num_cycles)
        int i;
 
        /* only do a state_move when we're not already in IDLE */
-       if (tap_get_state() != TAP_IDLE)
-       {
+       if (tap_get_state() != TAP_IDLE) {
                usbprog_end_state(TAP_IDLE);
                usbprog_state_move();
        }
 
        /* execute num_cycles */
-       if (num_cycles > 0)
-       {
+       if (num_cycles > 0) {
                usbprog_jtag_tms_send(usbprog_jtag_handle);
                usbprog_write(0, 0, 0);
-       }
-       else
-       {
+       } else {
                usbprog_jtag_tms_send(usbprog_jtag_handle);
                /* LOG_INFO("NUM CYCLES %i",num_cycles); */
        }
 
-       for (i = 0; i < num_cycles; i++)
-       {
+       for (i = 0; i < num_cycles; i++) {
                usbprog_write(1, 0, 0);
                usbprog_write(0, 0, 0);
        }
 
 #ifdef _DEBUG_JTAG_IO_
-       LOG_DEBUG("runtest: cur_state %s end_state %s", tap_state_name(tap_get_state()), tap_state_name(tap_get_end_state()));
+       LOG_DEBUG("runtest: cur_state %s end_state %s", tap_state_name(
+                       tap_get_state()), tap_state_name(tap_get_end_state()));
 #endif
 
        /* finish in end_state */
@@ -323,14 +302,20 @@ static void usbprog_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, int
 
        usbprog_jtag_tms_send(usbprog_jtag_handle);
 
-       void (*f)(struct usbprog_jtag *usbprog_jtag, char * buffer, int size);
+       void (*f)(struct usbprog_jtag *usbprog_jtag, char *buffer_local, int size);
        switch (type) {
-       case SCAN_OUT: f = &usbprog_jtag_write_tdi; break;
-       case SCAN_IN: f = &usbprog_jtag_read_tdo; break;
-       case SCAN_IO: f = &usbprog_jtag_write_and_read; break;
-       default:
-               LOG_ERROR("unknown scan type: %i", type);
-               exit(-1);
+               case SCAN_OUT:
+                       f = &usbprog_jtag_write_tdi;
+                       break;
+               case SCAN_IN:
+                       f = &usbprog_jtag_read_tdo;
+                       break;
+               case SCAN_IO:
+                       f = &usbprog_jtag_write_and_read;
+                       break;
+               default:
+                       LOG_ERROR("unknown scan type: %i", type);
+                       exit(-1);
        }
        f(usbprog_jtag_handle, (char *)buffer, scan_size);
 
@@ -357,7 +342,7 @@ static void usbprog_write(int tck, int tms, int tdi)
        if (tck)
                output_value |= (1 << TCK_BIT);
 
-       usbprog_jtag_write_slice(usbprog_jtag_handle,output_value);
+       usbprog_jtag_write_slice(usbprog_jtag_handle, output_value);
 }
 
 /* (1) assert or (0) deassert reset lines */
@@ -380,7 +365,7 @@ static void usbprog_reset(int trst, int srst)
 
 struct usb_bus *busses;
 
-struct usbprog_jtagusbprog_jtag_open(void)
+struct usbprog_jtag *usbprog_jtag_open(void)
 {
        usb_set_debug(10);
        usb_init();
@@ -411,20 +396,18 @@ static void usbprog_jtag_close(struct usbprog_jtag *usbprog_jtag)
 
 static unsigned char usbprog_jtag_message(struct usbprog_jtag *usbprog_jtag, char *msg, int msglen)
 {
-       int res = usb_bulk_write(usbprog_jtag->usb_handle, 3, msg,msglen, 100);
-       if ((msg[0] == 2) || (msg[0] == 1) || (msg[0] == 4) || (msg[0] == 0) || \
-                       (msg[0] == 6) || (msg[0] == 0x0A) || (msg[0] == 9))
+       int res = usb_bulk_write(usbprog_jtag->usb_handle, 3, msg, msglen, 100);
+       if ((msg[0] == 2) || (msg[0] == 1) || (msg[0] == 4) || (msg[0] == 0) || \
+           (msg[0] == 6) || (msg[0] == 0x0A) || (msg[0] == 9))
                return 1;
-       if (res == msglen)
-       {
+       if (res == msglen) {
                /* LOG_INFO("HALLLLOOO %i",(int)msg[0]); */
-               res =  usb_bulk_read(usbprog_jtag->usb_handle, 0x82, msg, 2, 100);
+               res = usb_bulk_read(usbprog_jtag->usb_handle, 0x82, msg, 2, 100);
                if (res > 0)
                        return (unsigned char)msg[1];
                else
                        return -1;
-       }
-       else
+       } else
                return -1;
        return 0;
 }
@@ -434,7 +417,7 @@ static void usbprog_jtag_init(struct usbprog_jtag *usbprog_jtag)
        usbprog_jtag_set_direction(usbprog_jtag, 0xFE);
 }
 
-static void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
+static void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char *buffer, int size)
 {
        char tmp[64];   /* fastes packet size for usb controller */
        int send_bits, bufindex = 0, fillindex = 0, i, loops;
@@ -442,16 +425,12 @@ static void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char
        char swap;
        /* 61 byte can be transfered (488 bit) */
 
-       while (size > 0)
-       {
-               if (size > 488)
-               {
+       while (size > 0) {
+               if (size > 488) {
                        send_bits = 488;
                        size = size - 488;
                        loops = 61;
-               }
-               else
-               {
+               } else {
                        send_bits = size;
                        loops = size / 8;
                        loops++;
@@ -460,36 +439,31 @@ static void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char
                tmp[0] = WRITE_AND_READ;
                tmp[1] = (char)(send_bits >> 8);        /* high */
                tmp[2] = (char)(send_bits);                     /* low */
-               i = 0;
 
-               for (i = 0; i < loops; i++)
-               {
+               for (i = 0; i < loops; i++) {
                        tmp[3 + i] = buffer[bufindex];
                        bufindex++;
                }
 
-               if (usb_bulk_write(usbprog_jtag->usb_handle, 3, tmp, 64, 1000) == 64)
-               {
+               if (usb_bulk_write(usbprog_jtag->usb_handle, 3, tmp, 64, 1000) == 64) {
                        /* LOG_INFO("HALLLLOOO2 %i",(int)tmp[0]); */
                        usleep(1);
                        int timeout = 0;
-                       while (usb_bulk_read(usbprog_jtag->usb_handle, 0x82, tmp, 64, 1000) < 1)
-                       {
+                       while (usb_bulk_read(usbprog_jtag->usb_handle, 0x82, tmp, 64, 1000) < 1) {
                                timeout++;
                                if (timeout > 10)
                                        break;
                        }
 
-                       for (i = 0; i < loops; i++)
-                       {
-                               swap =  tmp[3 + i];
+                       for (i = 0; i < loops; i++) {
+                               swap = tmp[3 + i];
                                buffer[fillindex++] = swap;
                        }
                }
        }
 }
 
-static void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
+static void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char *buffer, int size)
 {
        char tmp[64];   /* fastes packet size for usb controller */
        int send_bits, fillindex = 0, i, loops;
@@ -497,16 +471,12 @@ static void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buff
        char swap;
        /* 61 byte can be transfered (488 bit) */
 
-       while (size > 0)
-       {
-               if (size > 488)
-               {
+       while (size > 0) {
+               if (size > 488) {
                        send_bits = 488;
                        size = size - 488;
                        loops = 61;
-               }
-               else
-               {
+               } else {
                        send_bits = size;
                        loops = size / 8;
                        loops++;
@@ -521,37 +491,31 @@ static void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buff
                /* LOG_INFO("HALLLLOOO3 %i",(int)tmp[0]); */
                int timeout = 0;
                usleep(1);
-               while (usb_bulk_read(usbprog_jtag->usb_handle, 0x82, tmp, 64, 10) < 1)
-               {
+               while (usb_bulk_read(usbprog_jtag->usb_handle, 0x82, tmp, 64, 10) < 1) {
                        timeout++;
                        if (timeout > 10)
                                break;
                }
 
-               for (i = 0; i < loops; i++)
-               {
+               for (i = 0; i < loops; i++) {
                        swap = tmp[3 + i];
                        buffer[fillindex++] = swap;
                }
        }
 }
 
-static void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
+static void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char *buffer, int size)
 {
        char tmp[64];   /* fastes packet size for usb controller */
        int send_bits, bufindex = 0, i, loops;
 
        /* 61 byte can be transfered (488 bit) */
-       while (size > 0)
-       {
-               if (size > 488)
-               {
+       while (size > 0) {
+               if (size > 488) {
                        send_bits = 488;
                        size = size - 488;
                        loops = 61;
-               }
-               else
-               {
+               } else {
                        send_bits = size;
                        loops = size/8;
                        /* if (loops == 0) */
@@ -561,10 +525,8 @@ static void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buf
                tmp[0] = WRITE_TDI;
                tmp[1] = (char)(send_bits >> 8);        /* high */
                tmp[2] = (char)(send_bits);                     /* low */
-               i = 0;
 
-               for (i = 0; i < loops; i++)
-               {
+               for (i = 0; i < loops; i++) {
                        tmp[3 + i] = buffer[bufindex];
                        bufindex++;
                }
@@ -585,7 +547,7 @@ static void usbprog_jtag_set_direction(struct usbprog_jtag *usbprog_jtag, unsign
        usbprog_jtag_message(usbprog_jtag, tmp, 2);
 }
 
-static void usbprog_jtag_write_slice(struct usbprog_jtag *usbprog_jtag,unsigned char value)
+static void usbprog_jtag_write_slice(struct usbprog_jtag *usbprog_jtag, unsigned char value)
 {
        char tmp[2];
        tmp[0] = PORT_SET;
@@ -603,7 +565,7 @@ static unsigned char usbprog_jtag_get_port(struct usbprog_jtag *usbprog_jtag)
 }
 #endif
 
-static void usbprog_jtag_set_bit(struct usbprog_jtag *usbprog_jtag,int bit, int value)
+static void usbprog_jtag_set_bit(struct usbprog_jtag *usbprog_jtag, int bit, int value)
 {
        char tmp[3];
        tmp[0] = PORT_SETBIT;
@@ -639,8 +601,7 @@ static void usbprog_jtag_tms_send(struct usbprog_jtag *usbprog_jtag)
 {
        int i;
        /* LOG_INFO("TMS SEND"); */
-       if (tms_chain_index > 0)
-       {
+       if (tms_chain_index > 0) {
                char tmp[tms_chain_index + 2];
                tmp[0] = WRITE_TMS_CHAIN;
                tmp[1] = (char)(tms_chain_index);
@@ -652,9 +613,9 @@ static void usbprog_jtag_tms_send(struct usbprog_jtag *usbprog_jtag)
 }
 
 struct jtag_interface usbprog_interface = {
-               .name = "usbprog",
-               .execute_queue = &usbprog_execute_queue,
-               .speed = &usbprog_speed,
-               .init = &usbprog_init,
-               .quit = &usbprog_quit
-       };
+       .name = "usbprog",
+
+       .execute_queue = usbprog_execute_queue,
+       .init = usbprog_init,
+       .quit = usbprog_quit
+};