X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fzy1000%2Fzy1000.c;h=8e896380c2ae29d7063eeb3fc344d1939ac747f6;hp=33947332bb563a5dfd1fda94e0f0c97d320c74c3;hb=8b994145b849c40b0a195c3fb332b9770b2f9097;hpb=6d1d58a1fc3dfd60e9cac89460b5a6e438d11efa diff --git a/src/jtag/zy1000/zy1000.c b/src/jtag/zy1000/zy1000.c index 33947332bb..8e896380c2 100644 --- a/src/jtag/zy1000/zy1000.c +++ b/src/jtag/zy1000/zy1000.c @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2007-2008 by Øyvind Harboe * + * Copyright (C) 2007-2008 by Øyvind Harboe * * * * 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 * @@ -28,7 +28,7 @@ #include -#define ZYLIN_VERSION "1.52" +#define ZYLIN_VERSION "1.54" #define ZYLIN_DATE __DATE__ #define ZYLIN_TIME __TIME__ #define ZYLIN_OPENOCD "$Revision$" @@ -283,6 +283,14 @@ static int jim_zy1000_version(Jim_Interp *interp, int argc, Jim_Obj *const *argv { version_str = ZYLIN_DATE; } + else if (strcmp("pcb", str) == 0) + { +#ifdef CYGPKG_HAL_NIOS2 + version_str="c"; +#else + version_str="b"; +#endif + } else { return JIM_ERR; @@ -295,6 +303,37 @@ static int jim_zy1000_version(Jim_Interp *interp, int argc, Jim_Obj *const *argv } +#ifdef CYGPKG_HAL_NIOS2 +static int jim_zy1000_writefirmware(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +{ + if (argc != 2) + return JIM_ERR; + + int length; + int stat; + const char *str = Jim_GetString(argv[1], &length); + + /* BUG!!!! skip header! */ + void *firmware_address=0x4000000; + int firmware_length=0x100000; + + if (length>firmware_length) + return JIM_ERR; + + void *err_addr; + + if ((stat = flash_erase((void *)firmware_address, firmware_length, (void **)&err_addr)) != 0) + { + return JIM_ERR; + } + + if ((stat = flash_program(firmware_address, str, length, (void **)&err_addr)) != 0) + return JIM_ERR; + + return JIM_OK; +} +#endif + static int zylinjtag_Jim_Command_powerstatus(Jim_Interp *interp, int argc, @@ -324,6 +363,11 @@ int zy1000_register_commands(struct command_context_s *cmd_ctx) Jim_CreateCommand(interp, "powerstatus", zylinjtag_Jim_Command_powerstatus, NULL, NULL); +#ifdef CYGPKG_HAL_NIOS2 + Jim_CreateCommand(interp, "updatezy1000firmware", jim_zy1000_writefirmware, NULL, NULL); +#endif + + return ERROR_OK; } @@ -412,7 +456,12 @@ static void shiftValueInnerFlip(const tap_state_t state, const tap_state_t endSt extern int jtag_check_value(uint8_t *captured, void *priv); -static __inline void scanFields(int num_fields, const scan_field_t *fields, tap_state_t shiftState, tap_state_t end_state) +static void gotoEndState(tap_state_t end_state) +{ + setCurrentState(end_state); +} + +static __inline void scanFields(int num_fields, const scan_field_t *fields, tap_state_t shiftState, int pause) { int i; int j; @@ -444,10 +493,10 @@ static __inline void scanFields(int num_fields, const scan_field_t *fields, tap_ { k = 32; /* we have more to shift out */ - } else if (i == num_fields-1) + } else if (pause&&(i == num_fields-1)) { /* this was the last to shift out this time */ - pause_state = end_state; + pause_state = (shiftState==TAP_DRSHIFT)?TAP_DRPAUSE:TAP_IRPAUSE; } // we have (num_bits + 7)/8 bytes of bits to toggle out. @@ -497,14 +546,7 @@ int interface_jtag_add_ir_scan(int num_fields, const scan_field_t *fields, tap_s for (tap = jtag_tap_next_enabled(NULL); tap!= NULL; tap = nextTap) { nextTap = jtag_tap_next_enabled(tap); - tap_state_t end_state; - if (nextTap == NULL) - { - end_state = state; - } else - { - end_state = TAP_IRSHIFT; - } + int pause = (nextTap==NULL); int found = 0; @@ -517,7 +559,7 @@ int interface_jtag_add_ir_scan(int num_fields, const scan_field_t *fields, tap_s { found = 1; - scanFields(1, fields + j, TAP_IRSHIFT, end_state); + scanFields(1, fields + j, TAP_IRSHIFT, pause); /* update device information */ buf_cpy(fields[j].out_value, tap->cur_instr, scan_size); @@ -535,12 +577,13 @@ int interface_jtag_add_ir_scan(int num_fields, const scan_field_t *fields, tap_s memset(&tmp, 0, sizeof(tmp)); tmp.out_value = ones; tmp.num_bits = scan_size; - scanFields(1, &tmp, TAP_IRSHIFT, end_state); + scanFields(1, &tmp, TAP_IRSHIFT, pause); /* update device information */ buf_cpy(tmp.out_value, tap->cur_instr, scan_size); tap->bypass = 1; } } + gotoEndState(state); return ERROR_OK; } @@ -551,7 +594,8 @@ int interface_jtag_add_ir_scan(int num_fields, const scan_field_t *fields, tap_s int interface_jtag_add_plain_ir_scan(int num_fields, const scan_field_t *fields, tap_state_t state) { - scanFields(num_fields, fields, TAP_IRSHIFT, state); + scanFields(num_fields, fields, TAP_IRSHIFT, 1); + gotoEndState(state); return ERROR_OK; } @@ -567,14 +611,7 @@ int interface_jtag_add_dr_scan(int num_fields, const scan_field_t *fields, tap_s { nextTap = jtag_tap_next_enabled(tap); int found = 0; - tap_state_t end_state; - if (nextTap == NULL) - { - end_state = state; - } else - { - end_state = TAP_DRSHIFT; - } + int pause = (nextTap==NULL); for (j = 0; j < num_fields; j++) { @@ -582,7 +619,7 @@ int interface_jtag_add_dr_scan(int num_fields, const scan_field_t *fields, tap_s { found = 1; - scanFields(1, fields + j, TAP_DRSHIFT, end_state); + scanFields(1, fields+j, TAP_DRSHIFT, pause); } } if (!found) @@ -593,18 +630,20 @@ int interface_jtag_add_dr_scan(int num_fields, const scan_field_t *fields, tap_s tmp.out_value = NULL; tmp.in_value = NULL; - scanFields(1, &tmp, TAP_DRSHIFT, end_state); + scanFields(1, &tmp, TAP_DRSHIFT, pause); } else { } } + gotoEndState(state); return ERROR_OK; } int interface_jtag_add_plain_dr_scan(int num_fields, const scan_field_t *fields, tap_state_t state) { - scanFields(num_fields, fields, TAP_DRSHIFT, state); + scanFields(num_fields, fields, TAP_DRSHIFT, 1); + gotoEndState(state); return ERROR_OK; }