]> git.sur5r.net Git - openocd/blobdiff - src/jtag/usbprog.c
- updated cortex_m3 docs regarding luminary reset behaviour
[openocd] / src / jtag / usbprog.c
index 661b3b3499017d2e37a38cc9e16e35ac435e23e1..c0fae956f581cfe6991aae455e05aaffe6252f35 100644 (file)
@@ -1,14 +1,6 @@
 /***************************************************************************
- *   Copyright (C) 2007 by Benedikt Sauter sauter@ixbat.de                        *
- *   based on Dominic Rath's amt_jtagaccel.c                                      *
- *                                                                                                            * 
- *   usbprog is a free programming adapter. You can easily install            *
- *   different firmware versions from an "online pool" over USB.              * 
- *   The adapter can be used for programming and debugging AVR and ARM     *
- *   processors, as USB to RS232 converter, as JTAG interface or as        *
- *   simple I/O interface (5 lines).                                                      *
- *                                                                                                            *
- *   http://www.embedded-projects.net/usbprog                                         *
+ *   Copyright (C) 2007 by Benedikt Sauter                                 *
+ *   sauter@ixbat.de                                                       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
+/*
+ * This file is based on Dominic Rath's amt_jtagaccel.c.
+ *
+ * usbprog is a free programming adapter. You can easily install
+ * different firmware versions from an "online pool" over USB.
+ * The adapter can be used for programming and debugging AVR and ARM
+ * processors, as USB to RS232 converter, as JTAG interface or as
+ * simple I/O interface (5 lines).
+ *
+ * http://www.embedded-projects.net/usbprog
+ */
+
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -60,12 +64,11 @@ void usbprog_path_move(pathmove_command_t *cmd);
 void usbprog_runtest(int num_cycles);
 void usbprog_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size);
 
-jtag_interface_t usbprog_interface = 
+jtag_interface_t usbprog_interface =
 {
        .name = "usbprog",
        .execute_queue = usbprog_execute_queue,
-       .support_pathmove = 0,
-       .speed = usbprog_speed, 
+       .speed = usbprog_speed,
        .register_commands = usbprog_register_commands,
        .init = usbprog_init,
        .quit = usbprog_quit
@@ -83,7 +86,7 @@ jtag_interface_t usbprog_interface =
 #define WRITE_TMS      0x09
 #define WRITE_TMS_CHAIN 0x0A
 
-struct usbprog_jtag 
+struct usbprog_jtag
 {
        struct usb_dev_handle* usb_handle;
 };
@@ -130,21 +133,21 @@ int usbprog_execute_queue(void)
        int scan_size;
        enum scan_type type;
        u8 *buffer;
-       
+
        while (cmd)
        {
                switch (cmd->type)
                {
                        case JTAG_END_STATE:
 #ifdef _DEBUG_JTAG_IO_
-                               DEBUG("end_state: %i", cmd->cmd.end_state->end_state);
+                               LOG_DEBUG("end_state: %i", cmd->cmd.end_state->end_state);
 #endif
                                if (cmd->cmd.end_state->end_state != -1)
                                        usbprog_end_state(cmd->cmd.end_state->end_state);
                                break;
                        case JTAG_RESET:
 #ifdef _DEBUG_JTAG_IO_
-                               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)
                                {
@@ -154,7 +157,7 @@ int usbprog_execute_queue(void)
                                break;
                        case JTAG_RUNTEST:
 #ifdef _DEBUG_JTAG_IO_
-                               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
                                if (cmd->cmd.runtest->end_state != -1)
                                        usbprog_end_state(cmd->cmd.runtest->end_state);
@@ -162,7 +165,7 @@ int usbprog_execute_queue(void)
                                break;
                        case JTAG_STATEMOVE:
 #ifdef _DEBUG_JTAG_IO_
-                               DEBUG("statemove end in %i", cmd->cmd.statemove->end_state);
+                               LOG_DEBUG("statemove end in %i", cmd->cmd.statemove->end_state);
 #endif
                                if (cmd->cmd.statemove->end_state != -1)
                                        usbprog_end_state(cmd->cmd.statemove->end_state);
@@ -170,14 +173,14 @@ int usbprog_execute_queue(void)
                                break;
                        case JTAG_PATHMOVE:
 #ifdef _DEBUG_JTAG_IO_
-                               DEBUG("pathmove: %i states, end in %i", cmd->cmd.pathmove->num_states, 
+                               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:
 #ifdef _DEBUG_JTAG_IO_
-                               DEBUG("scan end in %i", cmd->cmd.scan->end_state);
+                               LOG_DEBUG("scan end in %i", cmd->cmd.scan->end_state);
 #endif
                                if (cmd->cmd.scan->end_state != -1)
                                        usbprog_end_state(cmd->cmd.scan->end_state);
@@ -191,38 +194,38 @@ int usbprog_execute_queue(void)
                                break;
                        case JTAG_SLEEP:
 #ifdef _DEBUG_JTAG_IO_
-                               DEBUG("sleep %i", cmd->cmd.sleep->us);
+                               LOG_DEBUG("sleep %i", cmd->cmd.sleep->us);
 #endif
                                jtag_sleep(cmd->cmd.sleep->us);
                                        break;
                        default:
-                               ERROR("BUG: unknown JTAG command type encountered");
+                               LOG_ERROR("BUG: unknown JTAG command type encountered");
                                exit(-1);
                }
-                       
+
                cmd = cmd->next;
        }
-       
+
        return ERROR_OK;
 }
 
 int usbprog_init(void)
 {
        usbprog_jtag_handle = usbprog_jtag_open();
-       
+
        tms_chain_index = 0;
        if (usbprog_jtag_handle == 0)
        {
-               ERROR("Can't find USB JTAG Interface! Please check connection and permissions.");
+               LOG_ERROR("Can't find USB JTAG Interface! Please check connection and permissions.");
                return ERROR_JTAG_INIT_FAILED;
        }
-       
-       INFO("USB JTAG Interface ready!");
-       
+
+       LOG_INFO("USB JTAG Interface ready!");
+
        usbprog_jtag_init(usbprog_jtag_handle);
        usbprog_reset(0, 0);
        usbprog_write(0, 0, 0);
-       
+
        return ERROR_OK;
 }
 
@@ -238,22 +241,22 @@ void usbprog_end_state(enum tap_state state)
                end_state = state;
        else
        {
-               ERROR("BUG: %i is not a valid end state", state);
+               LOG_ERROR("BUG: %i is not a valid end state", state);
                exit(-1);
        }
 }
 
 void usbprog_state_move(void)
-{      
+{
        int i = 0, tms = 0;
        u8 tms_scan = TAP_MOVE(cur_state, end_state);
-       
+
        usbprog_jtag_write_tms(usbprog_jtag_handle, (char)tms_scan);
        for (i = 0; i < 7; i++)
        {
                tms = (tms_scan >> i) & 1;
        }
-       
+
        cur_state = end_state;
 }
 
@@ -261,47 +264,47 @@ void usbprog_path_move(pathmove_command_t *cmd)
 {
        int num_states = cmd->num_states;
        int state_count;
-       
+
        state_count = 0;
        while (num_states)
        {
                if (tap_transitions[cur_state].low == cmd->path[state_count])
                {
-                       //INFO("1");
+                       /* LOG_INFO("1"); */
                        usbprog_write(0, 0, 0);
                        usbprog_write(1, 0, 0);
                }
                else if (tap_transitions[cur_state].high == cmd->path[state_count])
                {
-                       //INFO("2");
+                       /* LOG_INFO("2"); */
                        usbprog_write(0, 1, 0);
                        usbprog_write(1, 1, 0);
                }
                else
                {
-                       ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings[cur_state], tap_state_strings[cmd->path[state_count]]);
+                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings[cur_state], tap_state_strings[cmd->path[state_count]]);
                        exit(-1);
                }
-               
+
                cur_state = cmd->path[state_count];
                state_count++;
                num_states--;
        }
-       
+
        end_state = cur_state;
 }
 
 void usbprog_runtest(int num_cycles)
 {
        int i;
-       
+
        /* only do a state_move when we're not already in RTI */
        if (cur_state != TAP_RTI)
        {
                usbprog_end_state(TAP_RTI);
                usbprog_state_move();
        }
-       
+
        /* execute num_cycles */
        if (num_cycles > 0)
        {
@@ -311,15 +314,15 @@ void usbprog_runtest(int num_cycles)
        else
        {
                usbprog_jtag_tms_send(usbprog_jtag_handle);
-               //INFO("NUM CYCLES %i",num_cycles);
+               /* LOG_INFO("NUM CYCLES %i",num_cycles); */
        }
-       
+
        for (i = 0; i < num_cycles; i++)
        {
                usbprog_write(1, 0, 0);
                usbprog_write(0, 0, 0);
        }
-       
+
        /* finish in end_state */
        /*
        usbprog_end_state(saved_end_state);
@@ -331,19 +334,19 @@ void usbprog_runtest(int num_cycles)
 void usbprog_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
 {
        enum tap_state saved_end_state = end_state;
-       
+
        if (ir_scan)
                usbprog_end_state(TAP_SI);
        else
                usbprog_end_state(TAP_SD);
-       
-       //usbprog_jtag_tms_send(usbprog_jtag_handle);
-       
+
+       /* usbprog_jtag_tms_send(usbprog_jtag_handle); */
+
        usbprog_state_move();
        usbprog_end_state(saved_end_state);
-       
+
        usbprog_jtag_tms_send(usbprog_jtag_handle);
-       
+
        if (type == SCAN_OUT)
        {
                usbprog_jtag_write_tdi(usbprog_jtag_handle,buffer, scan_size);
@@ -356,12 +359,12 @@ void usbprog_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
        {
                usbprog_jtag_write_and_read(usbprog_jtag_handle,buffer, scan_size);
        }
-       
+
        if (ir_scan)
                cur_state = TAP_PI;
        else
                cur_state = TAP_PD;
-       
+
        if (cur_state != end_state)
                usbprog_state_move();
 }
@@ -371,27 +374,27 @@ void usbprog_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
 void usbprog_write(int tck, int tms, int tdi)
 {
        unsigned char output_value=0x00;
-       
+
        if (tms)
                output_value |= (1<<TMS_BIT);
        if (tdi)
                output_value |= (1<<TDI_BIT);
        if (tck)
                output_value |= (1<<TCK_BIT);
-       
+
        usbprog_jtag_write_slice(usbprog_jtag_handle,output_value);
 }
 
 /* (1) assert or (0) deassert reset lines */
 void usbprog_reset(int trst, int srst)
 {
-       DEBUG("trst: %i, srst: %i", trst, srst);
-       
+       LOG_DEBUG("trst: %i, srst: %i", trst, srst);
+
        if (trst)
                usbprog_jtag_set_bit(usbprog_jtag_handle, 5, 0);
        else
                usbprog_jtag_set_bit(usbprog_jtag_handle, 5, 1);
-       
+
        if (srst)
                usbprog_jtag_set_bit(usbprog_jtag_handle, 4, 0);
        else
@@ -406,20 +409,20 @@ struct usbprog_jtag* usbprog_jtag_open()
 {
        struct usb_bus *bus;
        struct usb_device *dev;
-       
+
        struct usbprog_jtag *tmp;
-       
+
        tmp = (struct usbprog_jtag*)malloc(sizeof(struct usbprog_jtag));
-       
-       usb_set_debug(10);      
+
+       usb_set_debug(10);
        usb_init();
        usb_find_busses();
        usb_find_devices();
-       
+
        busses = usb_get_busses();
-       
+
        /* find usbprog_jtag device in usb bus */
-       
+
        for (bus = busses; bus; bus = bus->next)
        {
                for (dev = bus->devices; dev; dev = dev->next)
@@ -433,7 +436,7 @@ struct usbprog_jtag* usbprog_jtag_open()
                                usb_set_altinterface(tmp->usb_handle, 0);
                                return tmp;
                        }
-               } 
+               }
        }
        return 0;
 }
@@ -449,14 +452,14 @@ unsigned char usbprog_jtag_message(struct usbprog_jtag *usbprog_jtag, char *msg,
        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;  
+               return 1;
        if (res == msglen)
        {
-               //INFO("HALLLLOOO %i",(int)msg[0]);
+               /* LOG_INFO("HALLLLOOO %i",(int)msg[0]); */
                res =  usb_bulk_read(usbprog_jtag->usb_handle, 0x82, msg, 2, 100);
                if (res > 0)
                        return (unsigned char)msg[1];
-               else 
+               else
                        return -1;
        }
        else
@@ -471,14 +474,14 @@ void usbprog_jtag_init(struct usbprog_jtag *usbprog_jtag)
 
 void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
 {
-       char tmp[64];   // fastes packet size for usb controller
+       char tmp[64];   /* fastes packet size for usb controller */
        int send_bits, bufindex = 0, fillindex = 0, i, loops;
-       
+
        char swap;
-       // 61 byte can be transfered (488 bit)
-       
+       /* 61 byte can be transfered (488 bit) */
+
        while (size > 0)
-       {  
+       {
                if (size > 488)
                {
                        send_bits = 488;
@@ -493,19 +496,19 @@ void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char * buffe
                        size = 0;
                }
                tmp[0] = WRITE_AND_READ;
-               tmp[1] = (char)(send_bits >> 8);        // high 
-               tmp[2] = (char)(send_bits);                     // low
-               i = 0; 
-               
+               tmp[1] = (char)(send_bits >> 8);        /* high */
+               tmp[2] = (char)(send_bits);                     /* low */
+               i = 0;
+
                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)
                {
-                       //INFO("HALLLLOOO2 %i",(int)tmp[0]);
+                       /* 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)
@@ -513,27 +516,27 @@ void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char * buffe
                                timeout++;
                                if (timeout > 10)
                                        break;
-                       }       
-                       
+                       }
+
                        for (i = 0; i < loops; i++)
                        {
                                swap =  tmp[3 + i];
                                buffer[fillindex++] = swap;
-                       } 
+                       }
                }
        }
 }
 
 void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
 {
-       char tmp[64];   // fastes packet size for usb controller
+       char tmp[64];   /* fastes packet size for usb controller */
        int send_bits, fillindex = 0, i, loops;
 
        char swap;
-       // 61 byte can be transfered (488 bit)
-    
+       /* 61 byte can be transfered (488 bit) */
+
        while (size > 0)
-       {  
+       {
                if (size > 488)
                {
                        send_bits = 488;
@@ -548,12 +551,12 @@ void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buffer, int
                        size = 0;
                }
                tmp[0] = WRITE_AND_READ;
-               tmp[1] = (char)(send_bits >> 8);        // high 
-               tmp[2] = (char)(send_bits);                     // low
-    
+               tmp[1] = (char)(send_bits >> 8);        /* high */
+               tmp[2] = (char)(send_bits);                     /* low */
+
                usb_bulk_write(usbprog_jtag->usb_handle, 3, tmp, 3, 1000);
-    
-               //INFO("HALLLLOOO3 %i",(int)tmp[0]);
+
+               /* 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)
@@ -567,16 +570,16 @@ void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buffer, int
                {
                        swap = tmp[3 + i];
                        buffer[fillindex++] = swap;
-               } 
+               }
        }
 }
 
 void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
 {
-       char tmp[64];   // fastes packet size for usb controller
+       char tmp[64];   /* fastes packet size for usb controller */
        int send_bits, bufindex = 0, i, loops;
 
-       // 61 byte can be transfered (488 bit)
+       /* 61 byte can be transfered (488 bit) */
        while (size > 0)
        {
                if (size > 488)
@@ -589,15 +592,15 @@ void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buffer, in
                {
                        send_bits = size;
                        loops = size/8;
-                       //if(loops==0)
+                       /* if(loops==0) */
                        loops++;
                        size = 0;
                }
                tmp[0] = WRITE_TDI;
-               tmp[1] = (char)(send_bits >> 8);        // high 
-               tmp[2] = (char)(send_bits);                     // low
-               i = 0; 
-               
+               tmp[1] = (char)(send_bits >> 8);        /* high */
+               tmp[2] = (char)(send_bits);                     /* low */
+               i = 0;
+
                for (i = 0; i < loops; i++)
                {
                        tmp[3 + i] = buffer[bufindex];
@@ -641,7 +644,7 @@ void usbprog_jtag_set_bit(struct usbprog_jtag *usbprog_jtag,int bit, int value)
        char tmp[3];
        tmp[0] = PORT_SETBIT;
        tmp[1] = (char)bit;
-       if (value == 1)  
+       if (value == 1)
                tmp[2] = 0x01;
        else
                tmp[2] = 0x00;
@@ -653,7 +656,7 @@ int usbprog_jtag_get_bit(struct usbprog_jtag *usbprog_jtag, int bit)
        char tmp[2];
        tmp[0] = PORT_GETBIT;
        tmp[1] = (char)bit;
-       
+
        if (usbprog_jtag_message(usbprog_jtag, tmp, 2) > 0)
                return 1;
        else
@@ -669,7 +672,7 @@ void usbprog_jtag_tms_collect(char tms_scan)
 void usbprog_jtag_tms_send(struct usbprog_jtag *usbprog_jtag)
 {
        int i;
-       //INFO("TMS SEND");
+       /* LOG_INFO("TMS SEND"); */
        if (tms_chain_index > 0)
        {
                char tmp[tms_chain_index + 2];