diff options
author | drath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2007-08-10 19:44:06 +0000 |
---|---|---|
committer | drath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2007-08-10 19:44:06 +0000 |
commit | 20e4e77cdf366dedac21ff5670c54291feadfc05 (patch) | |
tree | 95363c4dc5940d7e0e94be81ba76b73e92ff1cf3 /src/jtag/usbprog.c | |
parent | 835e6440b8d1d26b4e041be7edab200ab2c572ee (diff) |
- renamed M5960 USB JTAG to "flyswatter"
- make ep93xx and at91rm9200 bitbang JTAG interfaces dependant on ARM host (thanks to Vincent Palatin)
- various whitespace fixes
- removed various warnings
- add support for Debian GNU/kFreeBSD (thanks to Uwe Hermann)
- fix OpenOCD compilation for various platforms (thanks to Uwe Hermann and Vincent Palatin)
- switched order of JTAG chain examination and validation (examine first, then multiple validation tries even if examination failed)
- added target_request subsystem to handle requests from the target (debug messages and tracepoints implemented, future enhancements might include
semihosting, all ARM7/9 only for now)
- added support for GDB vFlashXXX packets (thanks to Pavel Chromy)
- added support for receiving data via ARM7/9 DCC
- reworked flash writing. the 'flash write' command is now deprecated and replaced by 'flash write_binary' (old syntax and behaviour) and 'flash
write_image' (write image files (bin, hex, elf, s19) to a target).
- added support for AMD/ST/SST 29F400B non-cfi flashes
git-svn-id: svn://svn.berlios.de/openocd/trunk@190 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/jtag/usbprog.c')
-rw-r--r-- | src/jtag/usbprog.c | 351 |
1 files changed, 175 insertions, 176 deletions
diff --git a/src/jtag/usbprog.c b/src/jtag/usbprog.c index cdf32704..4c39a8ff 100644 --- a/src/jtag/usbprog.c +++ b/src/jtag/usbprog.c @@ -129,83 +129,83 @@ int usbprog_register_commands(struct command_context_s *cmd_ctx) int usbprog_execute_queue(void) { - jtag_command_t *cmd = jtag_command_queue; /* currently processed command */ - int scan_size; - enum scan_type type; - u8 *buffer; - - while (cmd) - { - switch (cmd->type) - { - case JTAG_END_STATE: + jtag_command_t *cmd = jtag_command_queue; /* currently processed command */ + 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); +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: +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); + DEBUG("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst); #endif - if (cmd->cmd.reset->trst == 1) - { - cur_state = TAP_TLR; - } - usbprog_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst); - break; - case JTAG_RUNTEST: + if (cmd->cmd.reset->trst == 1) + { + cur_state = TAP_TLR; + } + usbprog_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst); + 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); + 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); - usbprog_runtest(cmd->cmd.runtest->num_cycles); - break; - case JTAG_STATEMOVE: + if (cmd->cmd.runtest->end_state != -1) + usbprog_end_state(cmd->cmd.runtest->end_state); + usbprog_runtest(cmd->cmd.runtest->num_cycles); + break; + case JTAG_STATEMOVE: #ifdef _DEBUG_JTAG_IO_ - DEBUG("statemove end in %i", cmd->cmd.statemove->end_state); + 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); - usbprog_state_move(); - break; - case JTAG_PATHMOVE: + if (cmd->cmd.statemove->end_state != -1) + usbprog_end_state(cmd->cmd.statemove->end_state); + usbprog_state_move(); + break; + case JTAG_PATHMOVE: #ifdef _DEBUG_JTAG_IO_ - DEBUG("pathmove: %i states, end in %i", cmd->cmd.pathmove->num_states, - cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]); + 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_ - DEBUG("scan end in %i", cmd->cmd.scan->end_state); + 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); - 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: + if (cmd->cmd.scan->end_state != -1) + 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_ - DEBUG("sleep %i", cmd->cmd.sleep->us); + DEBUG("sleep %i", cmd->cmd.sleep->us); #endif - jtag_sleep(cmd->cmd.sleep->us); - break; - default: - ERROR("BUG: unknown JTAG command type encountered"); - exit(-1); - } - cmd = cmd->next; - } - - return ERROR_OK; + jtag_sleep(cmd->cmd.sleep->us); + break; + default: + ERROR("BUG: unknown JTAG command type encountered"); + exit(-1); + } + cmd = cmd->next; + } + + return ERROR_OK; } @@ -218,9 +218,9 @@ int usbprog_init(void) ERROR("Can't find USB JTAG Interface! Please check connection and permissions."); return ERROR_JTAG_INIT_FAILED; } - + INFO("USB JTAG Interface ready!"); - + usbprog_jtag_init(usbprog_jtag_handle); usbprog_reset(0, 0); usbprog_write(0, 0, 0); @@ -230,7 +230,7 @@ int usbprog_init(void) int usbprog_quit(void) { - + return ERROR_OK; } @@ -249,69 +249,70 @@ void usbprog_end_state(enum tap_state state) void usbprog_state_move(void) { - int i=0, tms=0; - u8 tms_scan = TAP_MOVE(cur_state, end_state); + 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; + 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; } 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]) - { + 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"); - usbprog_write(0, 0, 0); - usbprog_write(1, 0, 0); - } - else if (tap_transitions[cur_state].high == cmd->path[state_count]) - { + usbprog_write(0, 0, 0); + usbprog_write(1, 0, 0); + } + else if (tap_transitions[cur_state].high == cmd->path[state_count]) + { 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]]); - exit(-1); - } - - cur_state = cmd->path[state_count]; - state_count++; - num_states--; - } - - end_state = cur_state; + 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]]); + exit(-1); + } + + cur_state = cmd->path[state_count]; + state_count++; + num_states--; + } + + end_state = cur_state; } void usbprog_runtest(int num_cycles) { - int i; + int i; - enum tap_state saved_end_state = end_state; + /* + enum tap_state saved_end_state = end_state; + */ - /* 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(); - } + if (cur_state != TAP_RTI) + { + usbprog_end_state(TAP_RTI); + usbprog_state_move(); + } - /* execute num_cycles */ + /* execute num_cycles */ if(num_cycles>0) { usbprog_write(0, 0, 0); @@ -320,86 +321,85 @@ void usbprog_runtest(int num_cycles) usbprog_jtag_tms_send(usbprog_jtag_handle); } - for (i = 0; i < num_cycles; i++) - { - usbprog_write(1, 0, 0); - usbprog_write(0, 0, 0); - } + for (i = 0; i < num_cycles; i++) + { + usbprog_write(1, 0, 0); + usbprog_write(0, 0, 0); + } - /* finish in end_state */ + /* finish in end_state */ /* usbprog_end_state(saved_end_state); if (cur_state != end_state) usbprog_state_move(); - */ + */ } void usbprog_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size) { - enum tap_state saved_end_state = end_state; - int bit_cnt; + enum tap_state saved_end_state = end_state; - if (ir_scan) - usbprog_end_state(TAP_SI); - else - usbprog_end_state(TAP_SD); + if (ir_scan) + usbprog_end_state(TAP_SI); + else + usbprog_end_state(TAP_SD); - usbprog_state_move(); - usbprog_end_state(saved_end_state); + 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); - } - if (type == SCAN_IN) { - usbprog_jtag_read_tdo(usbprog_jtag_handle,buffer, scan_size); - } - if (type == SCAN_IO) { - usbprog_jtag_write_and_read(usbprog_jtag_handle,buffer, scan_size); - } - - if (ir_scan) - cur_state = TAP_PI; - else - cur_state = TAP_PD; + if (type == SCAN_OUT) { + usbprog_jtag_write_tdi(usbprog_jtag_handle, (char*)buffer, scan_size); + } + if (type == SCAN_IN) { + usbprog_jtag_read_tdo(usbprog_jtag_handle, (char*)buffer, scan_size); + } + if (type == SCAN_IO) { + usbprog_jtag_write_and_read(usbprog_jtag_handle, (char*)buffer, scan_size); + } + + if (ir_scan) + cur_state = TAP_PI; + else + cur_state = TAP_PD; - if (cur_state != end_state) - usbprog_state_move(); + if (cur_state != end_state) + usbprog_state_move(); } /*************** jtag wrapper functions *********************/ void usbprog_write(int tck, int tms, int tdi) { - unsigned char output_value=0x00; + 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); + 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); + 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); + 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(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 - usbprog_jtag_set_bit(usbprog_jtag_handle,4,1); + if(srst) + usbprog_jtag_set_bit(usbprog_jtag_handle,4,0); + else + usbprog_jtag_set_bit(usbprog_jtag_handle,4,1); } @@ -410,7 +410,6 @@ void usbprog_reset(int trst, int srst) struct usbprog_jtag* usbprog_jtag_open() { struct usb_bus *busses; - struct usb_dev_handle* usb_handle; struct usb_bus *bus; struct usb_device *dev; @@ -476,11 +475,11 @@ 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 - int send_bits,bufindex=0,fillindex=0,i,j,complete=size,loops; + int send_bits, bufindex = 0, fillindex = 0, i, loops; char swap; // 61 byte can be transfered (488 bit) - + while(size > 0) { if(size > 488) { send_bits = 488; @@ -501,9 +500,9 @@ void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char * buffe tmp[3+i]=buffer[bufindex]; bufindex++; } - + usb_bulk_write(usbprog_jtag->usb_handle,3,tmp,64,1000); - + while(usb_bulk_read(usbprog_jtag->usb_handle,0x82, tmp, 64, 1000) < 1); for(i=0;i<loops ;i++) { @@ -517,11 +516,11 @@ void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char * buffe 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,bufindex=0,fillindex=0,i,j,complete=size,loops; + int send_bits, fillindex = 0, i, loops; char swap; // 61 byte can be transfered (488 bit) - + while(size > 0) { if(size > 488) { send_bits = 488; @@ -536,9 +535,9 @@ void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buffer, int tmp[0] = WRITE_AND_READ; tmp[1] = (char)(send_bits>>8); // high tmp[2] = (char)(send_bits); // low - + usb_bulk_write(usbprog_jtag->usb_handle,3,tmp,3,1000); - + while(usb_bulk_read(usbprog_jtag->usb_handle,0x82, tmp, 64, 10) < 1); for(i=0;i<loops ;i++) { @@ -550,10 +549,10 @@ void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buffer, int 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,fillindex=0,i,j,complete=size,loops; - char swap; - // 61 byte can be transfered (488 bit) + 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) { send_bits = 488; @@ -562,13 +561,13 @@ void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buffer, in } else { 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 + tmp[1] = (char)(send_bits>>8); /* high */ + tmp[2] = (char)(send_bits); /* low */ i=0; for(i=0;i < loops ;i++) { |