On 02/06/2010 09:20 AM, Mike Frysinger wrote: > On Friday 05 February 2010 01:23:28 Jie Zhang wrote: >> gdbproxy does not work with the latest UrJTAG. > > how about this patch ? seems to work for me ...
I think the concept of "endianness" does not apply in JTAG. It is not defined in the standard. I prefer to "SHIFT_ORDER_STANDARD" and "SHIFT_ORDER_REVERSED". Or "SHIFT_LSB_FIRST" and "SHIFT_MSB_FIRST". Jie > -mike > > --- include/urjtag/data_register.h > +++ include/urjtag/data_register.h > @@ -25,6 +25,7 @@ > #ifndef URJ_DATA_REGISTER_H > #define URJ_DATA_REGISTER_H > > +#include "jtag.h" > #include "types.h" > > #define URJ_DATA_REGISTER_MAXLEN 32 > @@ -38,13 +39,24 @@ struct URJ_DATA_REGISTER > }; > > urj_data_register_t *urj_part_data_register_alloc (const char *name, int > len); > +urj_data_register_t *urj_part_data_register_alloc_endian (const char *name, > int len, urj_endian_t); > void urj_part_data_register_free (urj_data_register_t *dr); > > /** > - * allocate a data register and initialize the relevant<code>part</code> > parts > + * Allocate a big endian data register and initialize the relevant > + *<code>part</code> parts. > * > * @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error > */ > int urj_part_data_register_define (urj_part_t *part, const char *name, int > len); > > +/** > + * Allocate a data register with a specific endian and initialize the > relevant > + *<code>part</code> parts. > + * > + * @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error > + */ > +int urj_part_data_register_define_endian (urj_part_t *part, const char *name, > + int len, urj_endian_t endian); > + > #endif /* URJ_DATA_REGISTER_H */ > --- include/urjtag/tap_register.h > +++ include/urjtag/tap_register.h > @@ -25,6 +25,7 @@ > #ifndef URJ_TAP_REGISTER_H > #define URJ_TAP_REGISTER_H > > +#include "jtag.h" > #include "types.h" > #include<stdint.h> > > @@ -33,9 +34,11 @@ struct URJ_TAP_REGISTER > char *data; /* (public, r/w) register data */ > int len; /* (public, r/o) register length */ > char *string; /* (private) string representation of register data > */ > + urj_endian_t endian;/* (private) endianness of the register */ > }; > > urj_tap_register_t *urj_tap_register_alloc (int len); > +urj_tap_register_t *urj_tap_register_alloc_endian (int len, urj_endian_t); > urj_tap_register_t *urj_tap_register_duplicate (const urj_tap_register_t > *tr); > void urj_tap_register_free (urj_tap_register_t *tr); > urj_tap_register_t *urj_tap_register_fill (urj_tap_register_t *tr, int val); > --- src/tap/register.c > +++ src/tap/register.c > @@ -28,6 +28,7 @@ > #include<stdlib.h> > #include<string.h> > > +#include<urjtag/jtag.h> > #include<urjtag/error.h> > #include<urjtag/log.h> > #include<urjtag/tap_register.h> > @@ -158,7 +159,7 @@ urj_tap_register_set_string (urj_tap_reg > int > urj_tap_register_set_value (urj_tap_register_t *tr, uint64_t val) > { > - unsigned int bit; > + int i; > > if (val>> tr->len) > { > @@ -168,8 +169,12 @@ urj_tap_register_set_value (urj_tap_regi > return URJ_STATUS_FAIL; > } > > - for (bit = 0; bit< tr->len; ++bit) > - tr->data[tr->len - 1 - bit] = !!(val& (1<< (tr->len - 1 - bit))); > + if (tr->endian == URJ_ENDIAN_BIG) > + for (i = 0; i< tr->len; ++i) > + tr->data[tr->len - 1 - i] = (val>> (tr->len - 1 - i))& 1; > + else > + for (i = 0; i< tr->len; ++i) > + tr->data[i] = (val>> (tr->len - 1 - i))& 1; > > return URJ_STATUS_OK; > } > @@ -191,22 +196,21 @@ urj_tap_register_get_string (const urj_t > uint64_t > urj_tap_register_get_value (const urj_tap_register_t *tr) > { > + uint64_t v; > int i; > - uint64_t l, b; > > if (!tr) > return 0; > > - l = 0; > - b = 1; > - for (i = 0; i< tr->len; ++i) > - { > - if (tr->data[i]& 1) > - l |= b; > - b<<= 1; > - } > + v = 0; > + if (tr->endian == URJ_ENDIAN_BIG) > + for (i = tr->len - 1; i>= 0; --i) > + v = (v<< 1) | tr->data[i]; > + else > + for (i = 0; i< tr->len; ++i) > + v = (v<< 1) | tr->data[i]; > > - return l; > + return v; > } > > int > --- src/cmd/cmd_register.c > +++ src/cmd/cmd_register.c > @@ -43,12 +43,13 @@ cmd_register_run (urj_chain_t *chain, ch > { > urj_part_t *part; > long unsigned len; > + urj_endian_t endian = URJ_ENDIAN_BIG; > > - if (urj_cmd_params (params) != 3) > + if (urj_cmd_params (params)< 3 || urj_cmd_params (params)> 4) > { > urj_error_set (URJ_ERROR_SYNTAX, > - "%s: #parameters should be %d, not %d", > - params[0], 3, urj_cmd_params (params)); > + _("%s: #parameters should be %d to %d, not %d"), > + params[0], 3, 4, urj_cmd_params (params)); > return URJ_STATUS_FAIL; > } > > @@ -62,18 +63,29 @@ cmd_register_run (urj_chain_t *chain, ch > if (urj_cmd_get_number (params[2],&len) != URJ_STATUS_OK) > return URJ_STATUS_FAIL; > > - return urj_part_data_register_define (part, params[1], len); > + if (urj_cmd_params (params) == 4) > + { > + endian = urj_endian_from_string (params[3]); > + if (endian == URJ_ENDIAN_UNKNOWN) > + { > + urj_error_set (URJ_ERROR_SYNTAX, _("%s: invalid endian"), > params[0]); > + return URJ_STATUS_FAIL; > + } > + } > + > + return urj_part_data_register_define_endian (part, params[1], len, > endian); > } > > static void > cmd_register_help (void) > { > urj_log (URJ_LOG_LEVEL_NORMAL, > - _("Usage: %s NAME LENGTH\n" > + _("Usage: %s NAME LENGTH [ENDIAN]\n" > "Define new data register with specified NAME and LENGTH.\n" > "\n" > "NAME Data register name\n" > - "LENGTH Data register length\n"), > + "LENGTH Data register length\n" > + "ENDIAN Data register endianness (default: Big > Endian)\n"), > "register"); > } > > --- src/part/data_register.c > +++ src/part/data_register.c > @@ -34,7 +34,8 @@ > #include<urjtag/error.h> > > urj_data_register_t * > -urj_part_data_register_alloc (const char *name, int len) > +urj_part_data_register_alloc_endian (const char *name, int len, > + urj_endian_t endian) > { > urj_data_register_t *dr; > > @@ -79,6 +80,12 @@ urj_part_data_register_alloc (const char > return dr; > } > > +urj_data_register_t * > +urj_part_data_register_alloc (const char *name, int len) > +{ > + return urj_part_data_register_alloc_endian (name, len, URJ_ENDIAN_BIG); > +} > + > void > urj_part_data_register_free (urj_data_register_t *dr) > { > @@ -91,7 +98,8 @@ urj_part_data_register_free (urj_data_re > } > > int > -urj_part_data_register_define (urj_part_t *part, const char *name, int len) > +urj_part_data_register_define_endian (urj_part_t *part, const char *name, > + int len, urj_endian_t endian) > { > urj_data_register_t *dr; > > @@ -102,7 +110,7 @@ urj_part_data_register_define (urj_part_ > return URJ_STATUS_FAIL; > } > > - dr = urj_part_data_register_alloc (name, len); > + dr = urj_part_data_register_alloc_endian (name, len, endian); > if (!dr) > // retain error state > return URJ_STATUS_FAIL; > @@ -133,3 +141,9 @@ urj_part_data_register_define (urj_part_ > > return URJ_STATUS_OK; > } > + > +int > +urj_part_data_register_define (urj_part_t *part, const char *name, int len) > +{ > + return urj_part_data_register_define_endian (part, name, len, > URJ_ENDIAN_BIG); > +} > --- data/analog/bf533/bf533 > +++ data/analog/bf533/bf533 > @@ -161,13 +161,13 @@ signal VROUT0 > register BSR 197 > register BR 1 > register DIR 32 > -register DBGSTAT 16 > -register DBGCTL 16 > -register EMUIR 32 > -register EMUIR64 64 > -register EMUDAT 32 > -register EMUDAT40 40 > -register EMUPC 32 > +register DBGSTAT 16 little > +register DBGCTL 16 little > +register EMUIR 32 little > +register EMUIR64 64 little > +register EMUDAT 32 little > +register EMUDAT40 40 little > +register EMUPC 32 little > > instruction length 5 > > --- data/analog/bf506/bf506 > +++ data/analog/bf506/bf506 > @@ -82,13 +82,13 @@ signal VDDINT5 > register BSR 119 > register BR 1 > register DIR 32 > -register DBGSTAT 16 > -register DBGCTL 16 > -register EMUIR 32 > -register EMUIR64 64 > -register EMUDAT 32 > -register EMUDAT40 40 > -register EMUPC 32 > +register DBGSTAT 16 little > +register DBGCTL 16 little > +register EMUIR 32 little > +register EMUIR64 64 little > +register EMUDAT 32 little > +register EMUDAT40 40 little > +register EMUPC 32 little > > instruction length 5 > > --- data/analog/bf561/bf561 > +++ data/analog/bf561/bf561 > @@ -235,13 +235,13 @@ signal GND_EXT18 > register BSR 355 > register BR 1 > register DIR 32 > -register DBGSTAT 16 > -register DBGCTL 16 > -register EMUIR 32 > -register EMUIR64 64 > -register EMUDAT 32 > -register EMUDAT40 40 > -register EMUPC 32 > +register DBGSTAT 16 little > +register DBGCTL 16 little > +register EMUIR 32 little > +register EMUIR64 64 little > +register EMUDAT 32 little > +register EMUDAT40 40 little > +register EMUPC 32 little > > instruction length 5 > > --- data/analog/bf518/bf518 > +++ data/analog/bf518/bf518 > @@ -176,13 +176,13 @@ signal VDDMEM7 > register BSR 200 > register BR 1 > register DIR 32 > -register DBGSTAT 16 > -register DBGCTL 16 > -register EMUIR 32 > -register EMUIR64 64 > -register EMUDAT 32 > -register EMUDAT40 40 > -register EMUPC 32 > +register DBGSTAT 16 little > +register DBGCTL 16 little > +register EMUIR 32 little > +register EMUIR64 64 little > +register EMUDAT 32 little > +register EMUDAT40 40 little > +register EMUPC 32 little > > instruction length 5 > > --- data/analog/bf527/bf527 > +++ data/analog/bf527/bf527 > @@ -290,13 +290,13 @@ signal AGND1 > register BSR 233 > register BR 1 > register DIR 32 > -register DBGSTAT 16 > -register DBGCTL 16 > -register EMUIR 32 > -register EMUIR64 64 > -register EMUDAT 32 > -register EMUDAT40 40 > -register EMUPC 32 > +register DBGSTAT 16 little > +register DBGCTL 16 little > +register EMUIR 32 little > +register EMUIR64 64 little > +register EMUDAT 32 little > +register EMUDAT40 40 little > +register EMUPC 32 little > > instruction length 5 > > --- data/analog/bf537/bf537 > +++ data/analog/bf537/bf537 > @@ -183,13 +183,13 @@ signal VROUT0 > register BSR 261 > register BR 1 > register DIR 32 > -register DBGSTAT 16 > -register DBGCTL 16 > -register EMUIR 32 > -register EMUIR64 64 > -register EMUDAT 32 > -register EMUDAT40 40 > -register EMUPC 32 > +register DBGSTAT 16 little > +register DBGCTL 16 little > +register EMUIR 32 little > +register EMUIR64 64 little > +register EMUDAT 32 little > +register EMUDAT40 40 little > +register EMUPC 32 little > > instruction length 5 > > --- data/analog/bf538/bf538 > +++ data/analog/bf538/bf538 > @@ -316,13 +316,13 @@ signal VROUT1 > register BSR 325 > register BR 1 > register DIR 32 > -register DBGSTAT 16 > -register DBGCTL 16 > -register EMUIR 32 > -register EMUIR64 64 > -register EMUDAT 32 > -register EMUDAT40 40 > -register EMUPC 32 > +register DBGSTAT 16 little > +register DBGCTL 16 little > +register EMUIR 32 little > +register EMUIR64 64 little > +register EMUDAT 32 little > +register EMUDAT40 40 little > +register EMUPC 32 little > > instruction length 5 > > --- data/analog/bf548/bf548 > +++ data/analog/bf548/bf548 > @@ -401,13 +401,13 @@ signal USB_XI > register BSR 636 > register BR 1 > register DIR 32 > -register DBGSTAT 16 > -register DBGCTL 16 > -register EMUIR 32 > -register EMUIR64 64 > -register EMUDAT 32 > -register EMUDAT40 40 > -register EMUPC 32 > +register DBGSTAT 16 little > +register DBGCTL 16 little > +register EMUIR 32 little > +register EMUIR64 64 little > +register EMUDAT 32 little > +register EMUDAT40 40 little > +register EMUPC 32 little > > instruction length 5 > ------------------------------------------------------------------------------ The Planet: dedicated and managed hosting, cloud storage, colocation Stay online with enterprise data centers and the best network in the business Choose flexible plans and management services without long-term contracts Personal 24x7 support from experience hosting pros just a phone call away. http://p.sf.net/sfu/theplanet-com _______________________________________________ UrJTAG-development mailing list UrJTAG-development@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/urjtag-development